diff --git a/AI/Traffic/C/CAI.xml b/AI/Traffic/C/CAI.xml
index b542a8e28..911fa1aa5 100644
--- a/AI/Traffic/C/CAI.xml
+++ b/AI/Traffic/C/CAI.xml
@@ -1,9973 +1,10492 @@
-
+
-
- Aircraft/A320/A320-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-320
- 320
- 0
- 17
- gate
- jet_transport
- ZS-GAW
- false
-
-
- Aircraft/A320/A320-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-320
- 320
- 0
- 17
- gate
- jet_transport
- ZS-GAZ
- false
-
-
- Aircraft/A320/A320-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-320
- 320
- 0
- 17
- gate
- jet_transport
- ZS-GAO
- false
-
-
- Aircraft/A320/A320-Corendon.xml
- CAI
- CAI
- HEGN
- CAI-320
- 320
- 0
- 17
- gate
- jet_transport
- ER-00001
- false
-
-
- Aircraft/738/738-Corendon.xml
- SEK
- SEK
- EHBK
- CAI-734
- 738
- 0
- 14
- gate
- jet_transport
- YR-SEB
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-MKS
- false
-
-
- Aircraft/738/738-Corendon.xml
- CXI
- CXI
- LGIR
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- 9H-TJA
- false
-
-
- Aircraft/738/738-Corendon.xml
- CXI
- CXI
- LGIR
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- 9H-TJG
- false
-
-
- Aircraft/738/738-Corendon.xml
- CND
- CND
- EHAM
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- PH-CDE
- false
-
-
- Aircraft/738/738-Corendon.xml
- CND
- CND
- EHAM
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- PH-CDF
- false
-
-
- Aircraft/738/738-Corendon.xml
- CND
- CND
- EHAM
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- PH-CDH
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- EHBK
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-COR
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJI
- false
-
-
- Aircraft/738/738-Detur.xml
- CAI
- CAI
- EBBR
- DET-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJJ
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJM
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- OEMA
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJN
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJO
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJP
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJS
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJT
- false
-
-
- Aircraft/738/738-Corendon.xml
- CAI
- CAI
- LTAI
- CAI-738
- 738
- 0
- 14
- gate
- jet_transport
- TC-TJU
- false
-
-
- XC020
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC020
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC020
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC020
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC020
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC021
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC022
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC023
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC024
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC027
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC040
- CAI-320
- IFR
-
- EHEH
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC041
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHEH
-
-
- WEEK
-
-
- XC040
- CAI-320
- IFR
-
- EHEH
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC041
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHEH
-
-
- WEEK
-
-
- XC040
- CAI-738
- IFR
-
- EHEH
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC041
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHEH
-
-
- WEEK
-
-
- XC040
- CAI-320
- IFR
-
- EHEH
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC041
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHEH
-
-
- WEEK
-
-
- XC049
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHRD
-
-
- WEEK
-
-
- XC050
- CAI-738
- IFR
-
- EHRD
-
-
- 210
-
- LHGG
-
-
- WEEK
-
-
- XC050
- CAI-738
- IFR
-
- EHGG
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC049
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHGG
-
-
- WEEK
-
-
- XC050
- CAI-738
- IFR
-
- EHGG
-
-
- 220
-
- LHRD
-
-
- WEEK
-
-
- XC050
- CAI-738
- IFR
-
- EHRD
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC105
- CAI-738
- IFR
-
- LTBS
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC106
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTBS
-
-
- WEEK
-
-
- XC105
- CAI-738
- IFR
-
- LTBS
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC106
- CAI-738
- IFR
-
- EHAM
-
-
- 390
-
- LTBS
-
-
- WEEK
-
-
- XC121
- DET-738
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC122
- DET-738
- IFR
-
- EBBR
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC131
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LWSK
-
-
- WEEK
-
-
- XC132
- CAI-738
- IFR
-
- LWSK
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC133
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRCL
-
-
- WEEK
-
-
- XC134
- CAI-738
- IFR
-
- LRCL
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC135
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRTM
-
-
- WEEK
-
-
- XC136
- CAI-738
- IFR
-
- LRTM
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC153
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LROD
-
-
- WEEK
-
-
- XC154
- CAI-320
- IFR
-
- LROD
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC157
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LROP
-
-
- WEEK
-
-
- XC158
- CAI-320
- IFR
-
- LROP
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC161
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPWA
-
-
- WEEK
-
-
- XC162
- CAI-738
- IFR
-
- EPWA
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC163
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPPO
-
-
- WEEK
-
-
- XC164
- CAI-738
- IFR
-
- EPPO
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC165
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESSA
-
-
- WEEK
-
-
- XC166
- CAI-738
- IFR
-
- ESSA
-
-
- 380
-
- EDJA
-
-
- WEEK
-
-
- XC166
- CAI-738
- IFR
-
- EDJA
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC167
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPKT
-
-
- WEEK
-
-
- XC168
- CAI-738
- IFR
-
- EPKT
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC169
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPKK
-
-
- WEEK
-
-
- XC170
- CAI-738
- IFR
-
- EPKK
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC171
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESSP
-
-
- WEEK
-
-
- XC172
- CAI-738
- IFR
-
- ESSP
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC176
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LOWG
-
-
- WEEK
-
-
- XC177
- CAI-738
- IFR
-
- LOWG
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC178
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LOWL
-
-
- WEEK
-
-
- XC179
- CAI-738
- IFR
-
- LOWL
-
-
- 390
-
- LTAI
-
-
- WEEK
-
-
- XC201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC223
- DET-738
- IFR
-
- LTFE
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC224
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC233
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRCL
-
-
- WEEK
-
-
- XC234
- CAI-738
- IFR
-
- LRCL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC249
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- BKPR
-
-
- WEEK
-
-
- XC250
- CAI-738
- IFR
-
- BKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC251
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EYVI
-
-
- WEEK
-
-
- XC252
- CAI-738
- IFR
-
- EYVI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC251
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EYVI
-
-
- WEEK
-
-
- XC252
- CAI-320
- IFR
-
- EYVI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC253
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LQSA
-
-
- WEEK
-
-
- XC254
- CAI-320
- IFR
-
- LQSA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC255
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EETN
-
-
- WEEK
-
-
- XC256
- CAI-738
- IFR
-
- EETN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC255
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EETN
-
-
- WEEK
-
-
- XC256
- CAI-738
- IFR
-
- EETN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC267
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LBSF
-
-
- WEEK
-
-
- XC268
- CAI-738
- IFR
-
- LBSF
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC321
- DET-738
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC322
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC323
- DET-738
- IFR
-
- LTFE
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC324
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC345
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LZKZ
-
-
- WEEK
-
-
- XC346
- CAI-738
- IFR
-
- LZKZ
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC349
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- BKPR
-
-
- WEEK
-
-
- XC350
- CAI-738
- IFR
-
- BKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC353
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LHBP
-
-
- WEEK
-
-
- XC354
- CAI-738
- IFR
-
- LHBP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC355
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EPKT
-
-
- WEEK
-
-
- XC356
- CAI-320
- IFR
-
- EPKT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC361
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPWA
-
-
- WEEK
-
-
- XC362
- CAI-738
- IFR
-
- EPWA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC363
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPKT
-
-
- WEEK
-
-
- XC364
- CAI-738
- IFR
-
- EPKT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC371
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EYVI
-
-
- WEEK
-
-
- XC372
- CAI-320
- IFR
-
- EYVI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC373
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LHDC
-
-
- WEEK
-
-
- XC374
- CAI-738
- IFR
-
- LHDC
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC380
- CAI-738
- IFR
-
- LTAI
-
-
- 140
-
- LTFG
-
-
- WEEK
-
-
- XC387
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPWA
-
-
- WEEK
-
-
- XC388
- CAI-738
- IFR
-
- EPWA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC431
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRIA
-
-
- WEEK
-
-
- XC432
- CAI-738
- IFR
-
- LRIA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC441
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC442
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC441
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC442
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC441
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC442
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC443
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC444
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC443
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC444
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC443
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC444
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC445
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC446
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC445
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC446
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC445
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC446
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC447
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC448
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC447
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC448
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC447
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC448
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC451
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LZSL
-
-
- WEEK
-
-
- XC452
- CAI-738
- IFR
-
- LZSL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC463
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC463
- CAI-738
- IFR
-
- EDDV
-
-
- 300
-
- EDJA
-
-
- WEEK
-
-
- XC464
- CAI-738
- IFR
-
- EDJA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC473
- CAI-738
- IFR
-
- LTFG
-
-
- 380
-
- EKBI
-
-
- WEEK
-
-
- XC474
- CAI-738
- IFR
-
- EKBI
-
-
- 370
-
- LTFG
-
-
- WEEK
-
-
- XC487
- CAI-738
- IFR
-
- LTFG
-
-
- 380
-
- EKCH
-
-
- WEEK
-
-
- XC488
- CAI-738
- IFR
-
- EKCH
-
-
- 370
-
- LTFG
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC493
- CAI-738
- IFR
-
- LTAI
-
-
- 310
-
- LLBG
-
-
- WEEK
-
-
- XC494
- CAI-738
- IFR
-
- LLBG
-
-
- 320
-
- LTAI
-
-
- WEEK
-
-
- XC531
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LWSK
-
-
- WEEK
-
-
- XC532
- CAI-738
- IFR
-
- LWSK
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC533
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRCL
-
-
- WEEK
-
-
- XC534
- CAI-738
- IFR
-
- LRCL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC549
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- BKPR
-
-
- WEEK
-
-
- XC550
- CAI-738
- IFR
-
- BKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC551
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LKPR
-
-
- WEEK
-
-
- XC552
- CAI-738
- IFR
-
- LKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC553
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LRTR
-
-
- WEEK
-
-
- XC554
- CAI-738
- IFR
-
- LRTR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC553
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LHBP
-
-
- WEEK
-
-
- XC554
- CAI-738
- IFR
-
- LHBP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC571
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESGG
-
-
- WEEK
-
-
- XC572
- CAI-738
- IFR
-
- ESGG
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC573
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ENGM
-
-
- WEEK
-
-
- XC574
- CAI-738
- IFR
-
- ENGM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC580
- CAI-738
- IFR
-
- LTFG
-
-
- 150
-
- LTAI
-
-
- WEEK
-
-
- XC587
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EKYT
-
-
- WEEK
-
-
- XC588
- CAI-738
- IFR
-
- EKYT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC592
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- XC591
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC596
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- XC595
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC621
- DET-738
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC622
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC645
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- BKPR
-
-
- WEEK
-
-
- XC646
- CAI-738
- IFR
-
- BKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC647
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LZIB
-
-
- WEEK
-
-
- XC648
- CAI-738
- IFR
-
- LZIB
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC647
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LZIB
-
-
- WEEK
-
-
- XC648
- CAI-738
- IFR
-
- LZIB
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC655
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPKT
-
-
- WEEK
-
-
- XC656
- CAI-738
- IFR
-
- EPKT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC661
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPRZ
-
-
- WEEK
-
-
- XC662
- CAI-738
- IFR
-
- EPRZ
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC663
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPWR
-
-
- WEEK
-
-
- XC664
- CAI-738
- IFR
-
- EPWR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC667
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPKT
-
-
- WEEK
-
-
- XC668
- CAI-738
- IFR
-
- EPKT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC669
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EPWA
-
-
- WEEK
-
-
- XC670
- CAI-320
- IFR
-
- EPWA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC671
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EFHK
-
-
- WEEK
-
-
- XC672
- CAI-738
- IFR
-
- EFHK
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC673
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESGG
-
-
- WEEK
-
-
- XC674
- CAI-738
- IFR
-
- ESGG
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC685
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESSA
-
-
- WEEK
-
-
- XC686
- CAI-738
- IFR
-
- ESSA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC687
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EPWA
-
-
- WEEK
-
-
- XC688
- CAI-738
- IFR
-
- EPWA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC723
- DET-738
- IFR
-
- LTFE
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC724
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC749
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- ESSA
-
-
- WEEK
-
-
- XC750
- CAI-738
- IFR
-
- ESSA
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC753
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LRSV
-
-
- WEEK
-
-
- XC754
- CAI-320
- IFR
-
- LRSV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC773
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- ESGG
-
-
- WEEK
-
-
- XC774
- CAI-320
- IFR
-
- ESGG
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC781
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EKBI
-
-
- WEEK
-
-
- XC782
- CAI-738
- IFR
-
- EKBI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC785
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EKCH
-
-
- WEEK
-
-
- XC786
- CAI-738
- IFR
-
- EKCH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC801
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC802
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC801
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC802
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC803
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC804
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC851
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LKPR
-
-
- WEEK
-
-
- XC852
- CAI-738
- IFR
-
- LKPR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC867
- CAI-738
- IFR
-
- LCEN
-
-
- 240
-
- LTAI
-
-
- WEEK
-
-
- XC868
- CAI-738
- IFR
-
- LTAI
-
-
- 250
-
- LCEN
-
-
- WEEK
-
-
- XC867
- CAI-738
- IFR
-
- LCEN
-
-
- 240
-
- LTAI
-
-
- WEEK
-
-
- XC868
- CAI-738
- IFR
-
- LTAI
-
-
- 250
-
- LCEN
-
-
- WEEK
-
-
- XC901
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LATI
-
-
- WEEK
-
-
- XC902
- CAI-320
- IFR
-
- LATI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC901
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- LATI
-
-
- WEEK
-
-
- XC902
- CAI-320
- IFR
-
- LATI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC901
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- LATI
-
-
- WEEK
-
-
- XC902
- CAI-738
- IFR
-
- LATI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC990
- CAI-738
- IFR
-
- LTAI
-
-
- 180
-
- LCEN
-
-
- WEEK
-
-
- XC991
- CAI-738
- IFR
-
- LCEN
-
-
- 170
-
- LTAI
-
-
- WEEK
-
-
- XC991
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EKCH
-
-
- WEEK
-
-
- XC992
- CAI-738
- IFR
-
- EKCH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC992
- CAI-738
- IFR
-
- LTAI
-
-
- 180
-
- LCEN
-
-
- WEEK
-
-
- XC993
- CAI-738
- IFR
-
- LCEN
-
-
- 170
-
- LTAI
-
-
- WEEK
-
-
- XC993
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EKBI
-
-
- WEEK
-
-
- XC993
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAU
-
-
- WEEK
-
-
- XC994
- CAI-738
- IFR
-
- EKBI
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC994
- CAI-738
- IFR
-
- LTAI
-
-
- 180
-
- LCEN
-
-
- WEEK
-
-
- XC994
- CAI-738
- IFR
-
- LTAU
-
-
- 370
-
- EHAM
-
-
- WEEK
-
-
- XC995
- CAI-738
- IFR
-
- LCEN
-
-
- 170
-
- LTAI
-
-
- WEEK
-
-
- XC1181
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1182
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1183
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHRD
-
-
- WEEK
-
-
- XC1184
- CAI-320
- IFR
-
- EHRD
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1271
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDC
-
-
- WEEK
-
-
- XC1272
- CAI-738
- IFR
-
- EDDC
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1281
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1282
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1283
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHRD
-
-
- WEEK
-
-
- XC1284
- CAI-738
- IFR
-
- EHRD
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1333
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDLP
-
-
- WEEK
-
-
- XC1334
- CAI-738
- IFR
-
- EDLP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1383
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC1384
- CAI-320
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1481
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1482
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1483
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHEH
-
-
- WEEK
-
-
- XC1484
- CAI-320
- IFR
-
- EHEH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1581
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1582
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1681
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1682
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1725
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1726
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1781
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1782
- CAI-320
- IFR
-
- EBBR
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC1882
- CAI-738
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1905
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC1906
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC1951
- CAI-738
- IFR
-
- LGRP
-
-
- 180
-
- LGKO
-
-
- WEEK
-
-
- XC1951
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC1952
- CAI-738
- IFR
-
- EBBR
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- XC1983
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDE
-
-
- WEEK
-
-
- XC1984
- CAI-738
- IFR
-
- EDDE
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2187
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDSB
-
-
- WEEK
-
-
- XC2188
- CAI-738
- IFR
-
- EDSB
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2271
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XC2272
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2407
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XC2408
- CAI-738
- IFR
-
- EDDL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2535
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDH
-
-
- WEEK
-
-
- XC2536
- CAI-738
- IFR
-
- EDDH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC2882
- CAI-738
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2905
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC2906
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC2953
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC2954
- CAI-738
- IFR
-
- EBBR
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XC3041
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XC3042
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC3703
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDS
-
-
- WEEK
-
-
- XC3704
- CAI-320
- IFR
-
- EDDS
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC3793
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- GMMN
-
-
- WEEK
-
-
- XC3794
- CAI-738
- IFR
-
- GMMN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC3807
- CAI-738
- IFR
-
- LTFG
-
-
- 380
-
- EDDK
-
-
- WEEK
-
-
- XC3808
- CAI-738
- IFR
-
- EDDK
-
-
- 370
-
- LTFG
-
-
- WEEK
-
-
- XC3881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC3882
- CAI-738
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC3905
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC3906
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4055
- CAI-738
- IFR
-
- LTAR
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4056
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTBZ
-
-
- WEEK
-
-
- XC4057
- CAI-738
- IFR
-
- LTBZ
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4058
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTBZ
-
-
- WEEK
-
-
- XC4059
- CAI-738
- IFR
-
- LTBZ
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4060
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTCR
-
-
- WEEK
-
-
- XC4061
- CAI-738
- IFR
-
- LTCR
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4062
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTFC
-
-
- WEEK
-
-
- XC4063
- CAI-738
- IFR
-
- LTFC
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4064
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTBR
-
-
- WEEK
-
-
- XC4065
- CAI-738
- IFR
-
- LTBR
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4066
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTCR
-
-
- WEEK
-
-
- XC4067
- CAI-738
- IFR
-
- LTCR
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4068
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTBR
-
-
- WEEK
-
-
- XC4069
- CAI-738
- IFR
-
- LTBR
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4070
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTBJ
-
-
- WEEK
-
-
- XC4071
- CAI-738
- IFR
-
- LTAN
-
-
- 380
-
- OEMA
-
-
- WEEK
-
-
- XC4072
- CAI-738
- IFR
-
- OEMA
-
-
- 370
-
- LTCR
-
-
- WEEK
-
-
- XC4271
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDC
-
-
- WEEK
-
-
- XC4272
- CAI-320
- IFR
-
- EDDC
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4333
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDLP
-
-
- WEEK
-
-
- XC4334
- CAI-738
- IFR
-
- EDLP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4535
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDH
-
-
- WEEK
-
-
- XC4536
- CAI-320
- IFR
-
- EDDH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC4882
- CAI-738
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4905
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC4906
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC4951
- DET-738
- IFR
-
- LGRP
-
-
- 180
-
- LGKO
-
-
- WEEK
-
-
- XC4951
- DET-738
- IFR
-
- LGKO
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC4952
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- XC4953
- DET-738
- IFR
-
- LGIR
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC4954
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XC4955
- DET-738
- IFR
-
- LTFE
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC4956
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- XC4953
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDE
-
-
- WEEK
-
-
- XC4954
- CAI-320
- IFR
-
- EDDE
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5271
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XC5272
- CAI-320
- IFR
-
- EDDT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5333
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDLP
-
-
- WEEK
-
-
- XC5334
- CAI-738
- IFR
-
- EDLP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5407
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XC5408
- CAI-320
- IFR
-
- EDDL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5807
- CAI-738
- IFR
-
- LTFG
-
-
- 380
-
- EDDK
-
-
- WEEK
-
-
- XC5808
- CAI-738
- IFR
-
- EDDK
-
-
- 370
-
- LTFG
-
-
- WEEK
-
-
- XC5881
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC5882
- CAI-320
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5905
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC5906
- CAI-320
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC5945
- DET-738
- IFR
-
- LBBG
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC5946
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LBBG
-
-
- WEEK
-
-
- XC6187
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDSB
-
-
- WEEK
-
-
- XC6188
- CAI-738
- IFR
-
- EDSB
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC6272
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDC
-
-
- WEEK
-
-
- XC6272
- CAI-738
- IFR
-
- EDDC
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC6333
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDLP
-
-
- WEEK
-
-
- XC6334
- CAI-320
- IFR
-
- EDLP
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC6881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC6882
- CAI-320
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC6905
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC6906
- CAI-320
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC6953
- DET-738
- IFR
-
- LGIR
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC6954
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XC7271
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XC7272
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7407
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XC7408
- CAI-320
- IFR
-
- EDDL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7535
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDH
-
-
- WEEK
-
-
- XC7536
- CAI-738
- IFR
-
- EDDH
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7703
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDS
-
-
- WEEK
-
-
- XC7704
- CAI-738
- IFR
-
- EDDS
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7881
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XC7882
- CAI-738
- IFR
-
- EDDV
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7905
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XC7906
- CAI-320
- IFR
-
- EDDN
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC7955
- DET-738
- IFR
-
- HEGN
-
-
- 380
-
- EBBR
-
-
- WEEK
-
-
- XC7956
- DET-738
- IFR
-
- EBBR
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XC8182
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- USSS
-
-
- 24Hr
-
-
- XC8183
- CAI-738
- IFR
-
- USSS
-
-
- 380
-
- LTAI
-
-
- 24Hr
-
-
- XC8185
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URKK
-
-
- WEEK
-
-
- XC8186
- CAI-738
- IFR
-
- URKK
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8185
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URKK
-
-
- WEEK
-
-
- XC8186
- CAI-738
- IFR
-
- URKK
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8185
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URKK
-
-
- WEEK
-
-
- XC8186
- CAI-738
- IFR
-
- URKK
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8197
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URMM
-
-
- WEEK
-
-
- XC8198
- CAI-738
- IFR
-
- URMM
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8197
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URMM
-
-
- WEEK
-
-
- XC8198
- CAI-738
- IFR
-
- URMM
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8197
- CAI-738
- IFR
-
- LTAI
-
-
- 370
-
- URMM
-
-
- WEEK
-
-
- XC8198
- CAI-738
- IFR
-
- URMM
-
-
- 380
-
- LTAI
-
-
- WEEK
-
-
- XC8857
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XC8858
- CAI-320
- IFR
-
- EDDL
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC9335
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EDDS
-
-
- WEEK
-
-
- XC9336
- CAI-738
- IFR
-
- EDDS
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC9337
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EDDM
-
-
- WEEK
-
-
- XC9338
- CAI-320
- IFR
-
- EDDM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC9921
- CAI-320
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC9922
- CAI-320
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- XC9921
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XC9922
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- CD020
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- CD025
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD020
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- CD026
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD106
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTBS
-
-
- WEEK
-
-
- CD105
- CAI-738
- IFR
-
- LTBS
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD106
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTBS
-
-
- WEEK
-
-
- CD105
- CAI-738
- IFR
-
- LTBS
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD111
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGMT
-
-
- WEEK
-
-
- CD112
- CAI-738
- IFR
-
- LGMT
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD113
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEPA
-
-
- WEEK
-
-
- CD114
- CAI-738
- IFR
-
- LEPA
-
-
- 160
-
- LEIB
-
-
- WEEK
-
-
- CD114
- CAI-738
- IFR
-
- LEIB
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD113
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LIEA
-
-
- WEEK
-
-
- CD114
- CAI-738
- IFR
-
- LIEA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD113
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LIEA
-
-
- WEEK
-
-
- CD114
- CAI-738
- IFR
-
- LIEA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD115
- CAI-734
- IFR
-
- EHBK
-
-
- 350
-
- LGZA
-
-
- WEEK
-
-
- CD116
- CAI-734
- IFR
-
- LGZA
-
-
- 360
-
- EHBK
-
-
- WEEK
-
-
- CD115
- CAI-734
- IFR
-
- EHBK
-
-
- 350
-
- LBBG
-
-
- WEEK
-
-
- CD116
- CAI-734
- IFR
-
- LBBG
-
-
- 360
-
- EHBK
-
-
- WEEK
-
-
- CD117
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGSM
-
-
- WEEK
-
-
- CD118
- CAI-738
- IFR
-
- LGSM
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD191
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEMG
-
-
- WEEK
-
-
- CD192
- CAI-738
- IFR
-
- LEMG
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD193
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LICC
-
-
- WEEK
-
-
- CD194
- CAI-738
- IFR
-
- LICC
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD195
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LBBG
-
-
- WEEK
-
-
- CD196
- CAI-738
- IFR
-
- LBBG
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD195
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LBBG
-
-
- WEEK
-
-
- CD196
- CAI-738
- IFR
-
- LBBG
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD197
- CAI-734
- IFR
-
- EHBK
-
-
- 350
-
- LGIR
-
-
- WEEK
-
-
- CD198
- CAI-734
- IFR
-
- LGIR
-
-
- 360
-
- EHBK
-
-
- WEEK
-
-
- CD202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- CD201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- CD201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- CD201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD202
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- CD201
- CAI-738
- IFR
-
- LTFE
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD211
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD212
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD213
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD214
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD213
- CAI-734
- IFR
-
- EHBK
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD214
- CAI-734
- IFR
-
- LGIR
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD215
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LIEA
-
-
- WEEK
-
-
- CD216
- CAI-738
- IFR
-
- LIEA
-
-
- 310
-
- LICT
-
-
- WEEK
-
-
- CD216
- CAI-738
- IFR
-
- LICT
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD215
- CAI-734
- IFR
-
- EHBK
-
-
- 350
-
- LWOH
-
-
- WEEK
-
-
- CD216
- CAI-734
- IFR
-
- LWOH
-
-
- 360
-
- EHBK
-
-
- WEEK
-
-
- CD217
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- CD218
- CAI-738
- IFR
-
- HEGN
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD217
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- CD218
- CAI-738
- IFR
-
- HEGN
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD291
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LIEA
-
-
- WEEK
-
-
- CD292
- CAI-738
- IFR
-
- LIEA
-
-
- 310
-
- LICT
-
-
- WEEK
-
-
- CD292
- CAI-738
- IFR
-
- LICT
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD293
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD294
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD295
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD296
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD297
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LWOH
-
-
- WEEK
-
-
- CD298
- CAI-738
- IFR
-
- LWOH
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD311
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD312
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD313
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- CD314
- CAI-738
- IFR
-
- LGRP
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD315
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- CD316
- CAI-738
- IFR
-
- LGRP
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD317
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGZA
-
-
- WEEK
-
-
- CD318
- CAI-738
- IFR
-
- LGZA
-
-
- 200
-
- LGKR
-
-
- WEEK
-
-
- CD318
- CAI-738
- IFR
-
- LGKR
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD391
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEIB
-
-
- WEEK
-
-
- CD392
- CAI-738
- IFR
-
- LEIB
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD392
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGKR
-
-
- WEEK
-
-
- CD393
- CAI-738
- IFR
-
- LGKR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD395
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGZA
-
-
- WEEK
-
-
- CD396
- CAI-738
- IFR
-
- LGZA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD397
- CAI-734
- IFR
-
- EHBK
-
-
- 350
-
- LGRP
-
-
- WEEK
-
-
- CD398
- CAI-734
- IFR
-
- LGRP
-
-
- 360
-
- EHBK
-
-
- WEEK
-
-
- CD411
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEPA
-
-
- WEEK
-
-
- CD412
- CAI-738
- IFR
-
- LEPA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD413
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD414
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD415
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LICC
-
-
- WEEK
-
-
- CD416
- CAI-738
- IFR
-
- LICC
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD491
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD492
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD493
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LPFR
-
-
- WEEK
-
-
- CD494
- CAI-738
- IFR
-
- LPFR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD495
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LPFR
-
-
- WEEK
-
-
- CD496
- CAI-738
- IFR
-
- LPFR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD495
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGMT
-
-
- WEEK
-
-
- CD496
- CAI-738
- IFR
-
- LGMT
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD497
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGSM
-
-
- WEEK
-
-
- CD498
- CAI-738
- IFR
-
- LGSM
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD511
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD512
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD515
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LEPA
-
-
- WEEK
-
-
- CD516
- CAI-738
- IFR
-
- LEPA
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD515
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LPFR
-
-
- WEEK
-
-
- CD516
- CAI-738
- IFR
-
- LPFR
-
-
- 280
-
- LEMG
-
-
- WEEK
-
-
- CD516
- CAI-738
- IFR
-
- LEMG
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD517
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LBBG
-
-
- WEEK
-
-
- CD518
- CAI-738
- IFR
-
- LBBG
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD591
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGZA
-
-
- WEEK
-
-
- CD592
- CAI-738
- IFR
-
- LGZA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD591
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LTAI
-
-
- WEEK
-
-
- CD592
- CAI-738
- IFR
-
- LTAI
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD593
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LWOH
-
-
- WEEK
-
-
- CD594
- CAI-738
- IFR
-
- LWOH
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD595
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LPFR
-
-
- WEEK
-
-
- CD596
- CAI-738
- IFR
-
- LPFR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD611
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEPA
-
-
- WEEK
-
-
- CD612
- CAI-738
- IFR
-
- LEPA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD613
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LPFR
-
-
- WEEK
-
-
- CD614
- CAI-738
- IFR
-
- LPFR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD615
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- CD616
- CAI-738
- IFR
-
- LGRP
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD617
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- CD618
- CAI-738
- IFR
-
- HEGN
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD691
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGRP
-
-
- WEEK
-
-
- CD692
- CAI-738
- IFR
-
- LGRP
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD693
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LEIB
-
-
- WEEK
-
-
- CD694
- CAI-738
- IFR
-
- LEIB
-
-
- 120
-
- LEPA
-
-
- WEEK
-
-
- CD694
- CAI-738
- IFR
-
- LEPA
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD695
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD696
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD697
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LEIB
-
-
- WEEK
-
-
- CD698
- CAI-738
- IFR
-
- LEIB
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD711
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LIEA
-
-
- WEEK
-
-
- CD712
- CAI-738
- IFR
-
- LIEA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD713
- CAI-734
- IFR
-
- EHBK
-
-
- 370
-
- LTFE
-
-
- WEEK
-
-
- CD714
- CAI-734
- IFR
-
- LTFE
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD715
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD716
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD717
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LICT
-
-
- WEEK
-
-
- CD718
- CAI-738
- IFR
-
- LICT
-
-
- 260
-
- DTNH
-
-
- WEEK
-
-
- CD718
- CAI-738
- IFR
-
- DTNH
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD773
- CAI-734
- IFR
-
- EHBK
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD774
- CAI-734
- IFR
-
- LGKO
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD791
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGZA
-
-
- WEEK
-
-
- CD792
- CAI-738
- IFR
-
- LGZA
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD793
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- CD794
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- CD795
- CAI-738
- IFR
-
- EHBK
-
-
- 370
-
- LBBG
-
-
- WEEK
-
-
- CD796
- CAI-738
- IFR
-
- LBBG
-
-
- 380
-
- EHBK
-
-
- WEEK
-
-
- CD797
- CAI-738
- IFR
-
- EHAM
-
-
- 370
-
- LGKO
-
-
- WEEK
-
-
- CD798
- CAI-738
- IFR
-
- LGKO
-
-
- 380
-
- EHAM
-
-
- WEEK
-
-
- XR151
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHGG
-
-
- WEEK
-
-
- XR152
- CAI-738
- IFR
-
- EHGG
-
-
- 200
-
- EHRD
-
-
- WEEK
-
-
- XR152
- CAI-738
- IFR
-
- EHRD
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR153
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR154
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR155
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDLP
-
-
- WEEK
-
-
- XR251
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR252
- CAI-738
- IFR
-
- EDDP
-
-
- 240
-
- EDDS
-
-
- WEEK
-
-
- XR252
- CAI-738
- IFR
-
- EDDS
-
-
- 380
-
- LGIR
-
-
- WEEK
-
-
- XR256
- CAI-738
- IFR
-
- EDLP
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR257
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XR353
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XR354
- CAI-738
- IFR
-
- EDDL
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR355
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EYVI
-
-
- WEEK
-
-
- XR356
- CAI-738
- IFR
-
- EYVI
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR358
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR451
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHGG
-
-
- WEEK
-
-
- XR452
- CAI-738
- IFR
-
- EHGG
-
-
- 200
-
- EHRD
-
-
- WEEK
-
-
- XR452
- CAI-738
- IFR
-
- EHRD
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR453
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDS
-
-
- WEEK
-
-
- XR454
- CAI-738
- IFR
-
- EDDS
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR457
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDN
-
-
- WEEK
-
-
- XR551
- CAI-734
- IFR
-
- LGIR
-
-
- 380
-
- EDSB
-
-
- WEEK
-
-
- XR552
- CAI-734
- IFR
-
- EDSB
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR553
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR554
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR558
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR651
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR652
- CAI-738
- IFR
-
- EDDP
-
-
- 240
-
- EDDS
-
-
- WEEK
-
-
- XR652
- CAI-738
- IFR
-
- EDDS
-
-
- 380
-
- LGIR
-
-
- WEEK
-
-
- XR653
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XR654
- CAI-738
- IFR
-
- EDDL
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR656
- CAI-738
- IFR
-
- EDLP
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR751
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDV
-
-
- WEEK
-
-
- XR752
- CAI-738
- IFR
-
- EDDV
-
-
- 270
-
- EDDN
-
-
- WEEK
-
-
- XR752
- CAI-738
- IFR
-
- EDDN
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR753
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDL
-
-
- WEEK
-
-
- XR754
- CAI-738
- IFR
-
- EDDL
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR1001
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LBWN
-
-
- WEEK
-
-
- XR1002
- CAI-738
- IFR
-
- LBWN
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR1001
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LGTS
-
-
- WEEK
-
-
- XR1002
- CAI-738
- IFR
-
- LGTS
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR1001
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LGTS
-
-
- WEEK
-
-
- XR1002
- CAI-738
- IFR
-
- LGTS
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR1003
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LGTS
-
-
- WEEK
-
-
- XR1004
- CAI-738
- IFR
-
- LGTS
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR1911
- CAI-320
- IFR
-
- HEMA
-
-
- 380
-
- EDDM
-
-
- WEEK
-
-
- XR1912
- CAI-320
- IFR
-
- EDDM
-
-
- 370
-
- HEMA
-
-
- WEEK
-
-
- XR1917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDM
-
-
- WEEK
-
-
- XR1918
- CAI-320
- IFR
-
- EDDM
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR2003
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LIPQ
-
-
- WEEK
-
-
- XR2004
- CAI-738
- IFR
-
- LIPQ
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR2911
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- LFSB
-
-
- WEEK
-
-
- XR2912
- CAI-320
- IFR
-
- LFSB
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR2917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR2918
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR3001
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LZTT
-
-
- WEEK
-
-
- XR3002
- CAI-738
- IFR
-
- LZTT
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR3003
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LDZD
-
-
- WEEK
-
-
- XR3004
- CAI-738
- IFR
-
- LDZD
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR3917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDH
-
-
- WEEK
-
-
- XR3918
- CAI-320
- IFR
-
- EDDH
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR4003
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR4004
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR4003
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR4004
- CAI-738
- IFR
-
- EDDT
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR4911
- CAI-320
- IFR
-
- HEMA
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR4912
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- HEMA
-
-
- WEEK
-
-
- XR4917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR4918
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR5001
- CAI-738
- IFR
-
- LLBG
-
-
- 380
-
- LGIR
-
-
- WEEK
-
-
- XR5201
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- LOWW
-
-
- WEEK
-
-
- XR5202
- CAI-738
- IFR
-
- LOWW
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR5203
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EDDK
-
-
- WEEK
-
-
- XR5204
- CAI-738
- IFR
-
- EDDK
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR5911
- CAI-320
- IFR
-
- HEMA
-
-
- 380
-
- EDDM
-
-
- WEEK
-
-
- XR5912
- CAI-320
- IFR
-
- EDDM
-
-
- 370
-
- HEMA
-
-
- WEEK
-
-
- XR5917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDM
-
-
- WEEK
-
-
- XR5918
- CAI-320
- IFR
-
- EDDM
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR6002
- CAI-738
- IFR
-
- LGIR
-
-
- 370
-
- LLBG
-
-
- WEEK
-
-
- XR6201
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- LOWL
-
-
- WEEK
-
-
- XR6202
- CAI-738
- IFR
-
- LOWL
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR6203
- CAI-738
- IFR
-
- LGIR
-
-
- 380
-
- EHRD
-
-
- WEEK
-
-
- XR6204
- CAI-738
- IFR
-
- EHRD
-
-
- 370
-
- LGIR
-
-
- WEEK
-
-
- XR6911
- CAI-320
- IFR
-
- HEMA
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR6912
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- HEMA
-
-
- WEEK
-
-
- XR6917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDP
-
-
- WEEK
-
-
- XR6918
- CAI-320
- IFR
-
- EDDP
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
- XR7911
- CAI-320
- IFR
-
- HEMA
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR7912
- CAI-320
- IFR
-
- EDDT
-
-
- 370
-
- HEMA
-
-
- WEEK
-
-
- XR7917
- CAI-320
- IFR
-
- HEGN
-
-
- 380
-
- EDDT
-
-
- WEEK
-
-
- XR7918
- CAI-320
- IFR
-
- EDDT
-
-
- 370
-
- HEGN
-
-
- WEEK
-
-
\ No newline at end of file
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDN
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-CXA
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDG
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-CXB
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDL
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-CXC
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDLP
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJA
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ LFSB
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJB
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDL
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJC
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDV
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJD
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDK
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJE
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CXI
+ EDDK
+ CXI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ 9H-TJF
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CND
+ EHAM
+ CND-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ PH-CDE
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CND
+ EHAM
+ CND-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ PH-CDF
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CND
+ EHAM
+ CND-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ PH-CDH
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EBBR
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-COE
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EDDK
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-COH
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ HEGN
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-CON
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ HEGN
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-COR
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EDDK
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJI
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EDDV
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJJ
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EDDV
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJO
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJP
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAU
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJR
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJS
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ EDDG
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJT
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJU
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJV
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-738
+ 738
+ 0
+ 18
+ gate
+ jet_transport
+ TC-TJY
+ false
+
+
+ Aircraft/738/738-Corendon.xml
+ CAI
+ CAI
+ LTAI
+ CAI-7M8
+ 7M8
+ 0
+ 18
+ gate
+ jet_transport
+ TC-MKS
+ false
+
+
+ CORENDON 122
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 121
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 5114
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5107
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EHRD
+
+
+ WEEK
+
+
+ CORENDON 5108
+ CAI-738
+ IFR
+
+ EHRD
+
+
+ 395
+
+ LTFM
+
+
+ WEEK
+
+
+ CORENDON 1409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 1410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1041
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ CORENDON 1042
+ CAI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1121
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 911
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 1293
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 1294
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1909
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 5105
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 5106
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 2287
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1371
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ CORENDON 1372
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1903
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3598
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3511
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ CORENDON 3512
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3507
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 3508
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3591
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3576
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3503
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3504
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ TOURISTIC 195
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ ETNL
+
+
+ WEEK
+
+
+ TOURISTIC 196
+ CAI-738
+ IFR
+
+ ETNL
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 191
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ TOURISTIC 192
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 1904
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1407
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 1408
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1905
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ DUTCH CORENDON111
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ DUTCH CORENDON112
+ CND-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON519
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ DUTCH CORENDON520
+ CND-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON115
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 400
+
+ LEIB
+
+
+ WEEK
+
+
+ DUTCH CORENDON116
+ CND-738
+ IFR
+
+ LEIB
+
+
+ 390
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON193
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LICC
+
+
+ WEEK
+
+
+ DUTCH CORENDON194
+ CND-738
+ IFR
+
+ LICC
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON921
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 390
+
+ EYKA
+
+
+ WEEK
+
+
+ DUTCH CORENDON922
+ CND-738
+ IFR
+
+ EYKA
+
+
+ 400
+
+ EHEH
+
+
+ WEEK
+
+
+ DUTCH CORENDON922
+ CND-738
+ IFR
+
+ EHEH
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1594
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 1595
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1046
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 1047
+ CXI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1020
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 1021
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1010
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 1011
+ CXI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 800
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 153
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ TOURISTIC 154
+ CXI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 165
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDSB
+
+
+ WEEK
+
+
+ TOURISTIC 166
+ CXI-738
+ IFR
+
+ EDSB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 155
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ TOURISTIC 4010
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LIEO
+
+
+ WEEK
+
+
+ TOURISTIC 4011
+ CXI-738
+ IFR
+
+ LIEO
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4012
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4013
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4014
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTCG
+
+
+ WEEK
+
+
+ CORENDON 4015
+ CXI-738
+ IFR
+
+ LTCG
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 7283
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 7284
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 164
+ CXI-738
+ IFR
+
+ EDLP
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 157
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDNY
+
+
+ WEEK
+
+
+ TOURISTIC 158
+ CXI-738
+ IFR
+
+ EDNY
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 159
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDLV
+
+
+ WEEK
+
+
+ TOURISTIC 160
+ CXI-738
+ IFR
+
+ EDLV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ CORENDON 4016
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAS
+
+
+ WEEK
+
+
+ CORENDON 4017
+ CXI-738
+ IFR
+
+ LTAS
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4018
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAF
+
+
+ WEEK
+
+
+ CORENDON 4019
+ CXI-738
+ IFR
+
+ LTAF
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 2112
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 2113
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2118
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGSA
+
+
+ WEEK
+
+
+ TOURISTIC 2119
+ CXI-738
+ IFR
+
+ LGSA
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9025
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 9026
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9047
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 9048
+ CXI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 1271
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDC
+
+
+ WEEK
+
+
+ CORENDON 1272
+ CAI-7M8
+ IFR
+
+ EDDC
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1891
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDR
+
+
+ WEEK
+
+
+ CORENDON 1892
+ CAI-7M8
+ IFR
+
+ EDDR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2322
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2321
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 2992
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTBY
+
+
+ WEEK
+
+
+ CORENDON 1976
+ CAI-738
+ IFR
+
+ LTFM
+
+
+ 400
+
+ LGAV
+
+
+ WEEK
+
+
+ CORENDON 991
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ LTFM
+
+
+ WEEK
+
+
+ CORENDON 991
+ CAI-738
+ IFR
+
+ LTFM
+
+
+ 400
+
+ DAUH
+
+
+ WEEK
+
+
+ CORENDON 991
+ CAI-738
+ IFR
+
+ DAUH
+
+
+ 400
+
+ GLRB
+
+
+ WEEK
+
+
+ CORENDON 992
+ CAI-738
+ IFR
+
+ GLRB
+
+
+ 390
+
+ DFFD
+
+
+ WEEK
+
+
+ CORENDON 992
+ CAI-738
+ IFR
+
+ DFFD
+
+
+ 390
+
+ LTFM
+
+
+ WEEK
+
+
+ CORENDON 1220
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2187
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDSB
+
+
+ WEEK
+
+
+ CORENDON 2188
+ CAI-738
+ IFR
+
+ EDSB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2707
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 912
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2903
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 2103
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 2102
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2371
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ CORENDON 2372
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2910
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2407
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 2408
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1221
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 5203
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 400
+
+ LTAN
+
+
+ WEEK
+
+
+ CORENDON 5203
+ CAI-738
+ IFR
+
+ LTAN
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 5204
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 2904
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 2410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3592
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3505
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 3506
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3527
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 3528
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3583
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 3584
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3523
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3524
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3593
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 291
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDR
+
+
+ WEEK
+
+
+ TOURISTIC 292
+ CAI-738
+ IFR
+
+ EDDR
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 2105
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2104
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 2906
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2543
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ ETNL
+
+
+ WEEK
+
+
+ CORENDON 2544
+ CAI-738
+ IFR
+
+ ETNL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2701
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ CORENDON 2702
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON217
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ DUTCH CORENDON218
+ CND-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON291
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ DUTCH CORENDON292
+ CND-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON211
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ DUTCH CORENDON212
+ CND-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1012
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 1013
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1082
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 1083
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1024
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 1025
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 256
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 261
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ TOURISTIC 262
+ CXI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 257
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ TOURISTIC 358
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4020
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEIB
+
+
+ WEEK
+
+
+ TOURISTIC 4021
+ CXI-738
+ IFR
+
+ LEIB
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4022
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4023
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4024
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAJ
+
+
+ WEEK
+
+
+ CORENDON 4025
+ CXI-738
+ IFR
+
+ LTAJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 7281
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 7282
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 225
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 226
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 235
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ TOURISTIC 236
+ CXI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4026
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 4027
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 2182
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 2183
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2106
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 2107
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9027
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 9028
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9023
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCRR
+
+
+ WEEK
+
+
+ TOURISTIC 9024
+ CXI-738
+ IFR
+
+ GCRR
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 2535
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDH
+
+
+ WEEK
+
+
+ CORENDON 2536
+ CAI-7M8
+ IFR
+
+ EDDH
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 2881
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 2991
+ CAI-738
+ IFR
+
+ LTBY
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 3224
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3223
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 1976
+ CAI-738
+ IFR
+
+ LGAV
+
+
+ 390
+
+ LTFM
+
+
+ WEEK
+
+
+ CORENDON 992
+ CAI-738
+ IFR
+
+ LTFM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1321
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 3708
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 8165
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EPKT
+
+
+ WEEK
+
+
+ CORENDON 8166
+ CAI-738
+ IFR
+
+ EPKT
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3903
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3904
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3407
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3408
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3707
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 3101
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDNY
+
+
+ WEEK
+
+
+ CORENDON 3102
+ CAI-738
+ IFR
+
+ EDNY
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3703
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 3704
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3905
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 1320
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 8185
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 390
+
+ USSS
+
+
+ WEEK
+
+
+ CORENDON 8186
+ CAI-738
+ IFR
+
+ USSS
+
+
+ 400
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 8161
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EPWA
+
+
+ WEEK
+
+
+ CORENDON 8162
+ CAI-738
+ IFR
+
+ EPWA
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3531
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 3532
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3539
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3540
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3594
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3535
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 3536
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3595
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3596
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ TOURISTIC 395
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LOWW
+
+
+ WEEK
+
+
+ TOURISTIC 396
+ CAI-738
+ IFR
+
+ LOWW
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 391
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ TOURISTIC 392
+ CAI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 397
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 398
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 3881
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ DUTCH CORENDON931
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON932
+ CND-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1084
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 1085
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1030
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 1031
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1032
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 1033
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 353
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ TOURISTIC 354
+ CXI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4030
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4031
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4032
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTCC
+
+
+ WEEK
+
+
+ CORENDON 4033
+ CXI-738
+ IFR
+
+ LTCC
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 367
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 368
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 385
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ TOURISTIC 386
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4034
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 4035
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4036
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTFH
+
+
+ WEEK
+
+
+ CORENDON 4047
+ CXI-738
+ IFR
+
+ LTFH
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 2194
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 2195
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2240
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 2241
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 9033
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAS
+
+
+ WEEK
+
+
+ CORENDON 9034
+ CXI-738
+ IFR
+
+ LTAS
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9035
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 9036
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 3882
+ CAI-7M8
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3103
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ CORENDON 3104
+ CAI-7M8
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3143
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 3144
+ CAI-7M8
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 901
+ CAI-738
+ IFR
+
+ LTFM
+
+
+ 395
+
+ LTCJ
+
+
+ WEEK
+
+
+ CORENDON 902
+ CAI-738
+ IFR
+
+ LTCJ
+
+
+ 405
+
+ LTFM
+
+
+ WEEK
+
+
+ CORENDON 1420
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4983
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ CORENDON 4984
+ CAI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4905
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 4904
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1941
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 4708
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4271
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDC
+
+
+ WEEK
+
+
+ CORENDON 4272
+ CAI-738
+ IFR
+
+ EDDC
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4881
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 4906
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4407
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4408
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4903
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 455
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 395
+
+ LLBG
+
+
+ WEEK
+
+
+ CORENDON 456
+ CAI-738
+ IFR
+
+ LLBG
+
+
+ 405
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 8187
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 390
+
+ USSS
+
+
+ WEEK
+
+
+ CORENDON 8188
+ CAI-738
+ IFR
+
+ USSS
+
+
+ 400
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5403
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 5404
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 4103
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 4104
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4337
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDW
+
+
+ WEEK
+
+
+ CORENDON 4338
+ CAI-738
+ IFR
+
+ EDDW
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 3545
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3546
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3515
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3549
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDH
+
+
+ WEEK
+
+
+ CORENDON 3550
+ CAI-738
+ IFR
+
+ EDDH
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3547
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 3548
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ TOURISTIC 497
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ TOURISTIC 498
+ CAI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 493
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 494
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 4882
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4221
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHBK
+
+
+ WEEK
+
+
+ CORENDON 4222
+ CAI-738
+ IFR
+
+ EHBK
+
+
+ 400
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 4222
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4333
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDLP
+
+
+ WEEK
+
+
+ CORENDON 5334
+ CAI-738
+ IFR
+
+ EDLP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON495
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LIEA
+
+
+ WEEK
+
+
+ DUTCH CORENDON496
+ CND-738
+ IFR
+
+ LIEA
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON411
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ DUTCH CORENDON412
+ CND-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON405
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTBS
+
+
+ WEEK
+
+
+ DUTCH CORENDON406
+ CND-738
+ IFR
+
+ LTBS
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1094
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 1095
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1070
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 1071
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1090
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 1091
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1080
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 1081
+ CXI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 487
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EGKK
+
+
+ WEEK
+
+
+ TOURISTIC 488
+ CXI-738
+ IFR
+
+ EGKK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 463
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDLP
+
+
+ WEEK
+
+
+ TOURISTIC 564
+ CXI-738
+ IFR
+
+ EDLP
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4040
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGKR
+
+
+ WEEK
+
+
+ TOURISTIC 4041
+ CXI-738
+ IFR
+
+ LGKR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4042
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4043
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4046
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAC
+
+
+ WEEK
+
+
+ TOURISTIC 7285
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 7286
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 437
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 438
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 465
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ TOURISTIC 466
+ CXI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 469
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 4044
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 4045
+ CXI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4048
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTCG
+
+
+ WEEK
+
+
+ TOURISTIC 2114
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 2115
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2140
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 2141
+ CXI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9015
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 9016
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9017
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 9018
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 4377
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDLV
+
+
+ WEEK
+
+
+ CORENDON 4378
+ CAI-7M8
+ IFR
+
+ EDLV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 4409
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4410
+ CAI-7M8
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5222
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5333
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDLP
+
+
+ WEEK
+
+
+ CORENDON 6334
+ CAI-738
+ IFR
+
+ EDLP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 902
+ CAI-738
+ IFR
+
+ LTFM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5371
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ CORENDON 5372
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1951
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 5906
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5221
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 5992
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTBY
+
+
+ WEEK
+
+
+ CORENDON 1942
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 543
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHBK
+
+
+ WEEK
+
+
+ CORENDON 544
+ CAI-738
+ IFR
+
+ EHBK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9951
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 5882
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5881
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 6882
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5904
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5703
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 5704
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5707
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 5541
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHEH
+
+
+ WEEK
+
+
+ CORENDON 5542
+ CAI-738
+ IFR
+
+ EHEH
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5383
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDR
+
+
+ WEEK
+
+
+ CORENDON 5384
+ CAI-738
+ IFR
+
+ EDDR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5501
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EHRD
+
+
+ WEEK
+
+
+ CORENDON 5502
+ CAI-738
+ IFR
+
+ EHRD
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5503
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 5504
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 4338
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 390
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5507
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ CORENDON 5508
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 3516
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3553
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 3552
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3585
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3586
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3587
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 3559
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 3560
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3557
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 3558
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3555
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 595
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDNY
+
+
+ WEEK
+
+
+ TOURISTIC 596
+ CAI-738
+ IFR
+
+ EDNY
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 591
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ TOURISTIC 592
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 593
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 594
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 5409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 5410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON517
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 400
+
+ LEIB
+
+
+ WEEK
+
+
+ DUTCH CORENDON518
+ CND-738
+ IFR
+
+ LEIB
+
+
+ 390
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON501
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ DUTCH CORENDON502
+ CND-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ LGKO
+
+
+ WEEK
+
+
+ DUTCH CORENDON502
+ CND-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON595
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON596
+ CND-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1050
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 1051
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1056
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 1057
+ CXI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1052
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 1053
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1054
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCRR
+
+
+ WEEK
+
+
+ TOURISTIC 1055
+ CXI-738
+ IFR
+
+ GCRR
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 1048
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAC
+
+
+ WEEK
+
+
+ TOURISTIC 553
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ TOURISTIC 554
+ CXI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 551
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDSB
+
+
+ WEEK
+
+
+ TOURISTIC 552
+ CXI-738
+ IFR
+
+ EDSB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 561
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 4057
+ CXI-738
+ IFR
+
+ LTAC
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4050
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LIEO
+
+
+ WEEK
+
+
+ TOURISTIC 4051
+ CXI-738
+ IFR
+
+ LIEO
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4052
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4053
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4058
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAF
+
+
+ WEEK
+
+
+ CORENDON 4069
+ CXI-738
+ IFR
+
+ LTAF
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 7235
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 7236
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 570
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 557
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDNY
+
+
+ WEEK
+
+
+ TOURISTIC 558
+ CXI-738
+ IFR
+
+ EDNY
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 573
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ LSZH
+
+
+ WEEK
+
+
+ TOURISTIC 574
+ CXI-738
+ IFR
+
+ LSZH
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 563
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 4059
+ CXI-738
+ IFR
+
+ LTCG
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4054
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAS
+
+
+ WEEK
+
+
+ CORENDON 4055
+ CXI-738
+ IFR
+
+ LTAS
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4506
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEIB
+
+
+ WEEK
+
+
+ TOURISTIC 4507
+ CXI-738
+ IFR
+
+ LEIB
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 2158
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGSA
+
+
+ WEEK
+
+
+ TOURISTIC 2159
+ CXI-738
+ IFR
+
+ LGSA
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2214
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCRR
+
+
+ WEEK
+
+
+ TOURISTIC 2215
+ CXI-738
+ IFR
+
+ GCRR
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9051
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 9052
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9057
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 9058
+ CXI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 5041
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ CORENDON 5042
+ CAI-7M8
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5101
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDNY
+
+
+ WEEK
+
+
+ CORENDON 5102
+ CAI-7M8
+ IFR
+
+ EDNY
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5905
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 6103
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 6104
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6983
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ CORENDON 6984
+ CAI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9975
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ CORENDON 1952
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9697
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 9698
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9961
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 9962
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5991
+ CAI-738
+ IFR
+
+ LTBY
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 6992
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6991
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 622
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 9952
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9691
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 9692
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1621
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 1720
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3582
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3581
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 6410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6708
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6407
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 6408
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6909
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 6641
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHEH
+
+
+ WEEK
+
+
+ CORENDON 6642
+ CAI-738
+ IFR
+
+ EHEH
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 8191
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 390
+
+ USSS
+
+
+ WEEK
+
+
+ CORENDON 8192
+ CAI-738
+ IFR
+
+ USSS
+
+
+ 400
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5601
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 5602
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5603
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 5604
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5609
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 5605
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 5608
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAN
+
+
+ WEEK
+
+
+ CORENDON 5607
+ CAI-738
+ IFR
+
+ LTAN
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 5606
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 3588
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3541
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 3542
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3013
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 3014
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3556
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3561
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 3562
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3567
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDF
+
+
+ WEEK
+
+
+ CORENDON 3568
+ CAI-738
+ IFR
+
+ EDDF
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3565
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 695
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LOWW
+
+
+ WEEK
+
+
+ TOURISTIC 696
+ CAI-738
+ IFR
+
+ LOWW
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 691
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ TOURISTIC 692
+ CAI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 697
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LOWG
+
+
+ WEEK
+
+
+ TOURISTIC 698
+ CAI-738
+ IFR
+
+ LOWG
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 693
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDLV
+
+
+ WEEK
+
+
+ TOURISTIC 694
+ CAI-738
+ IFR
+
+ EDLV
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 6041
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ CORENDON 6042
+ CAI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6187
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDSB
+
+
+ WEEK
+
+
+ CORENDON 6188
+ CAI-738
+ IFR
+
+ EDSB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6707
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ DUTCH CORENDON691
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ DUTCH CORENDON692
+ CND-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON611
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ DUTCH CORENDON612
+ CND-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON965
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTFE
+
+
+ WEEK
+
+
+ DUTCH CORENDON966
+ CND-738
+ IFR
+
+ LTFE
+
+
+ 395
+
+ LTBS
+
+
+ WEEK
+
+
+ DUTCH CORENDON966
+ CND-738
+ IFR
+
+ LTBS
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON617
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ DUTCH CORENDON618
+ CND-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1066
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 1067
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1068
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 1069
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 1049
+ CXI-738
+ IFR
+
+ LTAC
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1088
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 1089
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1060
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 1061
+ CXI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 662
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 667
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 668
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 655
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ TOURISTIC 656
+ CXI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 661
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 4060
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LICA
+
+
+ WEEK
+
+
+ TOURISTIC 4061
+ CXI-738
+ IFR
+
+ LICA
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4062
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4063
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4066
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAJ
+
+
+ WEEK
+
+
+ TOURISTIC 7213
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 7214
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 7257
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 7258
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 664
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 601
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDE
+
+
+ WEEK
+
+
+ TOURISTIC 602
+ CXI-738
+ IFR
+
+ EDDE
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 605
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ TOURISTIC 606
+ CXI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 4064
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 4065
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 4067
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTFH
+
+
+ WEEK
+
+
+ TOURISTIC 2160
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ LIEO
+
+
+ WEEK
+
+
+ TOURISTIC 2161
+ CXI-738
+ IFR
+
+ LIEO
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2166
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 2167
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9621
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 9622
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9067
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 9068
+ CXI-738
+ IFR
+
+ GCLP
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 6906
+ CAI-7M8
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6271
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDC
+
+
+ WEEK
+
+
+ CORENDON 6272
+ CAI-7M8
+ IFR
+
+ EDDC
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9927
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 9926
+ CAI-7M8
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 6903
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 9976
+ CAI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9195
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 9196
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 995
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDW
+
+
+ WEEK
+
+
+ CORENDON 995
+ CAI-738
+ IFR
+
+ EDDW
+
+
+ 400
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 621
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ TOURISTIC 7994
+ CAI-738
+ IFR
+
+ EBBR
+
+
+ 400
+
+ GCLP
+
+
+ WEEK
+
+
+ TOURISTIC 7993
+ CAI-738
+ IFR
+
+ GCLP
+
+
+ 405
+
+ GCTS
+
+
+ WEEK
+
+
+ TOURISTIC 7993
+ CAI-738
+ IFR
+
+ GCTS
+
+
+ 390
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 622
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 475
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 395
+
+ LLBG
+
+
+ WEEK
+
+
+ CORENDON 476
+ CAI-738
+ IFR
+
+ LLBG
+
+
+ 405
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7313
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDW
+
+
+ WEEK
+
+
+ CORENDON 7314
+ CAI-738
+ IFR
+
+ EDDW
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7803
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDLV
+
+
+ WEEK
+
+
+ CORENDON 7804
+ CAI-738
+ IFR
+
+ EDLV
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1971
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ CORENDON 1972
+ CAI-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7543
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ ETNL
+
+
+ WEEK
+
+
+ CORENDON 7544
+ CAI-738
+ IFR
+
+ ETNL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7409
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 7410
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7910
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 9901
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ LOWW
+
+
+ WEEK
+
+
+ CORENDON 9902
+ CAI-738
+ IFR
+
+ LOWW
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 1966
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 390
+
+ LTCB
+
+
+ WEEK
+
+
+ CORENDON 1966
+ CAI-738
+ IFR
+
+ LTCB
+
+
+ 400
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7911
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ CORENDON 7912
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 993
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 994
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 5710
+ CAI-738
+ IFR
+
+ EDDV
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5705
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 5706
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTAU
+
+
+ WEEK
+
+
+ CORENDON 5606
+ CAI-738
+ IFR
+
+ LTAU
+
+
+ 400
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7535
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDH
+
+
+ WEEK
+
+
+ CORENDON 7536
+ CAI-738
+ IFR
+
+ EDDH
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7371
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDB
+
+
+ WEEK
+
+
+ CORENDON 7372
+ CAI-738
+ IFR
+
+ EDDB
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7881
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 3579
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDH
+
+
+ WEEK
+
+
+ CORENDON 3580
+ CAI-738
+ IFR
+
+ EDDH
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3513
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ CORENDON 3514
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3575
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ CORENDON 3566
+ CAI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3573
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDM
+
+
+ WEEK
+
+
+ CORENDON 3572
+ CAI-738
+ IFR
+
+ EDDM
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3577
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ CORENDON 3578
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LTBJ
+
+
+ WEEK
+
+
+ CORENDON 3597
+ CAI-738
+ IFR
+
+ LTBJ
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ TOURISTIC 791
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LOWL
+
+
+ WEEK
+
+
+ TOURISTIC 792
+ CAI-738
+ IFR
+
+ LOWL
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 797
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 798
+ CAI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ TOURISTIC 793
+ CAI-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 794
+ CAI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ CORENDON 7708
+ CAI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7703
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDS
+
+
+ WEEK
+
+
+ CORENDON 7704
+ CAI-738
+ IFR
+
+ EDDS
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 7909
+ CAI-738
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ DUTCH CORENDON711
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ DUTCH CORENDON712
+ CND-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ DUTCH CORENDON717
+ CND-738
+ IFR
+
+ EHAM
+
+
+ 400
+
+ EBBR
+
+
+ WEEK
+
+
+ DUTCH CORENDON717
+ CND-738
+ IFR
+
+ EBBR
+
+
+ 395
+
+ HEGN
+
+
+ WEEK
+
+
+ DUTCH CORENDON718
+ CND-738
+ IFR
+
+ HEGN
+
+
+ 405
+
+ EHAM
+
+
+ WEEK
+
+
+ TOURISTIC 1052
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ HESH
+
+
+ WEEK
+
+
+ TOURISTIC 1053
+ CXI-738
+ IFR
+
+ HESH
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1092
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 1093
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 1078
+ CXI-738
+ IFR
+
+ EDDK
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 1079
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDK
+
+
+ WEEK
+
+
+ TOURISTIC 762
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 787
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EGKK
+
+
+ WEEK
+
+
+ TOURISTIC 788
+ CXI-738
+ IFR
+
+ EGKK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 799
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDV
+
+
+ WEEK
+
+
+ CORENDON 4077
+ CXI-738
+ IFR
+
+ LTAJ
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 9114
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGRP
+
+
+ WEEK
+
+
+ TOURISTIC 9113
+ CXI-738
+ IFR
+
+ LGRP
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4070
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 395
+
+ LGKR
+
+
+ WEEK
+
+
+ TOURISTIC 4071
+ CXI-738
+ IFR
+
+ LGKR
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 7293
+ CXI-738
+ IFR
+
+ LFSB
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 7294
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ LFSB
+
+
+ WEEK
+
+
+ TOURISTIC 171
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EHBK
+
+
+ WEEK
+
+
+ TOURISTIC 172
+ CXI-738
+ IFR
+
+ EHBK
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 801
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDP
+
+
+ WEEK
+
+
+ TOURISTIC 802
+ CXI-738
+ IFR
+
+ EDDP
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 763
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDLP
+
+
+ WEEK
+
+
+ CORENDON 4078
+ CXI-738
+ IFR
+
+ LTFH
+
+
+ 405
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4074
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 4075
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 4072
+ CXI-738
+ IFR
+
+ EDDL
+
+
+ 400
+
+ LEPA
+
+
+ WEEK
+
+
+ TOURISTIC 4073
+ CXI-738
+ IFR
+
+ LEPA
+
+
+ 390
+
+ EDDL
+
+
+ WEEK
+
+
+ TOURISTIC 2178
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 395
+
+ LGKO
+
+
+ WEEK
+
+
+ TOURISTIC 2179
+ CXI-738
+ IFR
+
+ LGKO
+
+
+ 405
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 2174
+ CXI-738
+ IFR
+
+ EDDN
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 2175
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDN
+
+
+ WEEK
+
+
+ TOURISTIC 9077
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 395
+
+ LGIR
+
+
+ WEEK
+
+
+ TOURISTIC 9078
+ CXI-738
+ IFR
+
+ LGIR
+
+
+ 405
+
+ EDDG
+
+
+ WEEK
+
+
+ TOURISTIC 9071
+ CXI-738
+ IFR
+
+ EDDG
+
+
+ 400
+
+ GCFV
+
+
+ WEEK
+
+
+ TOURISTIC 9072
+ CXI-738
+ IFR
+
+ GCFV
+
+
+ 390
+
+ EDDG
+
+
+ WEEK
+
+
+ CORENDON 7904
+ CAI-7M8
+ IFR
+
+ EDDK
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
+ CORENDON 721
+ CAI-7M8
+ IFR
+
+ LTAI
+
+
+ 405
+
+ EBBR
+
+
+ WEEK
+
+
+ CORENDON 722
+ CAI-7M8
+ IFR
+
+ EBBR
+
+
+ 395
+
+ LTAI
+
+
+ WEEK
+
+
diff --git a/AI/foch_demo.xml b/AI/foch_demo.xml
index c05b0ff6d..eb571fe35 100644
--- a/AI/foch_demo.xml
+++ b/AI/foch_demo.xml
@@ -11,7 +11,7 @@
Carrier: R99 - Foch (LFTH)
- This scenario spawns the Foch aircraft carrier (Clemenceau-class) in the Mediterranean off Toulon.
+ This scenario spawns the Foch aircraft carrier (Clemenceau-class) in the Mediterranean off Toulon (near LFTH).
carrier
Foch
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/D.png b/Aircraft/Generic/Effects/CubeMaps/buildings/D.png
index 6f9707d52..c692d6bba 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/D.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/D.png differ
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/E.png b/Aircraft/Generic/Effects/CubeMaps/buildings/E.png
index 56df94924..5ef612d67 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/E.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/E.png differ
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/N.png b/Aircraft/Generic/Effects/CubeMaps/buildings/N.png
index 98e69e328..3790b2bba 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/N.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/N.png differ
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/S.png b/Aircraft/Generic/Effects/CubeMaps/buildings/S.png
index caea2e151..7669b55a3 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/S.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/S.png differ
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/U.png b/Aircraft/Generic/Effects/CubeMaps/buildings/U.png
index cba9b21e6..3178da119 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/U.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/U.png differ
diff --git a/Aircraft/Generic/Effects/CubeMaps/buildings/W.png b/Aircraft/Generic/Effects/CubeMaps/buildings/W.png
index 35797c9cd..63ee1a9c7 100644
Binary files a/Aircraft/Generic/Effects/CubeMaps/buildings/W.png and b/Aircraft/Generic/Effects/CubeMaps/buildings/W.png differ
diff --git a/Aircraft/Generic/Effects/Fuselagereflect.eff b/Aircraft/Generic/Effects/Fuselagereflect.eff
index da0134ef9..149013a8e 100644
--- a/Aircraft/Generic/Effects/Fuselagereflect.eff
+++ b/Aircraft/Generic/Effects/Fuselagereflect.eff
@@ -1,49 +1,156 @@
-
-
-
-
- Fuselagereflect
- Effects/reflect
-
-
- cubemap
-
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_px.png
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_nx.png
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_py.png
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_ny.png
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_pz.png
- Aircraft/Generic/Effects/CubeMaps/real.blue-sky/fair-sky_nz.png
-
-
-
- Aircraft/Generic/Effects/Rainbow.png
- linear-mipmap-linear
- repeat
- repeat
-
-
- Aircraft/Generic/Effects/FresnelLookUp.png
- linear-mipmap-linear
- repeat
- repeat
- normalized
-
-
- Aircraft/Generic/Effects/greymap.png
- linear-mipmap-linear
- repeat
- repeat
- normalized
-
- transparent
- smooth
- 0.1
- 0.1
- 0.1
- -0.2
- 0.1
- 0
-
-
-
+
+
+
+
+
+ Aircraft/Generic/Effects/Fuselagereflect
+ Effects/model-combined-deferred
+
+ 2
+ 1
+ 0
+ 1.0
+ 0
+ 0.1
+
+ 1
+ 1
+ 0.0
+ 0.0
+ 1.0
+
+
+
+ Aircraft/Generic/Effects/null_bumpspec.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ cubemap
+
+ Aircraft/Generic/Effects/CubeMaps/buildings/N.png
+ Aircraft/Generic/Effects/CubeMaps/buildings/S.png
+ Aircraft/Generic/Effects/CubeMaps/buildings/W.png
+ Aircraft/Generic/Effects/CubeMaps/buildings/E.png
+ Aircraft/Generic/Effects/CubeMaps/buildings/U.png
+ Aircraft/Generic/Effects/CubeMaps/buildings/D.png
+
+
+
+
+
+ 6
+ 7
+
+
+
+
+
+
+ tangent
+ 6
+
+
+ binormal
+ 7
+
+
+
+
+
+
+
+
+
+ tangent
+ 6
+
+
+ binormal
+ 7
+
+
+
+
+
+
+
+
+
+ tangent
+ 6
+
+
+ binormal
+ 7
+
+
+
+
+
+
diff --git a/Aircraft/Generic/Effects/null_bumpspec.png b/Aircraft/Generic/Effects/null_bumpspec.png
index 1a4650a8c..dc90955ec 100644
Binary files a/Aircraft/Generic/Effects/null_bumpspec.png and b/Aircraft/Generic/Effects/null_bumpspec.png differ
diff --git a/Aircraft/Generic/light.ac b/Aircraft/Generic/light.ac
new file mode 100644
index 000000000..8bf59a79f
--- /dev/null
+++ b/Aircraft/Generic/light.ac
@@ -0,0 +1,24 @@
+AC3Db
+MATERIAL "DefaultWhite" rgb 1 1 1 amb 1 1 1 emis 0 0 0 spec 0.5 0.5 0.5 shi 64 trans 0
+MATERIAL "DefaultWhite.001" rgb 1 1 1 amb 0.2 0.2 0.2 emis 0 0 0 spec 0.025 0.025 0.025 shi 50 trans 0.1
+OBJECT world
+kids 1
+OBJECT poly
+name "light"
+data 8
+Mesh.001
+crease 30.000000
+numvert 4
+-2e-06 -1 -1
+0 1 -1
+0 -1 1
+2e-06 1 1
+numsurf 1
+SURF 0x20
+mat 1
+refs 4
+1 0.0 0.0
+0 0.0 0.0
+2 0.0 0.0
+3 0.0 0.0
+kids 0
diff --git a/Aircraft/Generic/pointlight.xml b/Aircraft/Generic/pointlight.xml
new file mode 100644
index 000000000..fbdc0df2c
--- /dev/null
+++ b/Aircraft/Generic/pointlight.xml
@@ -0,0 +1,153 @@
+
+
+
+ light.ac
+
+
+
+ /controls/lighting/nav-lights
+ pointlight
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ 0.5
+ 0.5
+ 0.4
+
+
+ 1.0
+ 1.0
+ 1.0
+
+
+ 1.0
+ 0.7
+ 1.1
+
+ 0.75
+ 0.85
+ 0.9
+ 0.1
+ 1.5
+ 50
+
+
+
+ scale
+ 0.175
+ 0.175
+ 0.175
+
+
+
+ dist-scale
+ light
+
+
+ 0
+
+
+
+ 300
+ 4
+
+
+ 1500
+ 8
+
+
+
+
+
+ noshadow
+ light
+
+
+
+ select
+ light
+
+
+
+
+
+
+ Effects/pointlight
+ light
+ Effects/procedural-light
+
+
+ white
+
+
+
+
+
+
+
+ 1.0
+
+
+
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ point
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.0
+
+
+
+
+
+ 1.0
+
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Aircraft/Generic/spotlight.xml b/Aircraft/Generic/spotlight.xml
new file mode 100644
index 000000000..37343bcb2
--- /dev/null
+++ b/Aircraft/Generic/spotlight.xml
@@ -0,0 +1,157 @@
+
+
+
+ light.ac
+
+
+
+ /controls/lighting/nav-lights
+ spotlight
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ 0.5
+ 0.5
+ 0.4
+
+
+ 1.0
+ 1.0
+ 1.0
+
+
+ 1.0
+ 0.7
+ 1.1
+
+ 0.75
+ 0.85
+ 0.9
+ 0.1
+ 80
+ 0.5
+ 1.5
+ 50
+
+
+
+ scale
+ 0.175
+ 0.175
+ 0.175
+
+
+
+ dist-scale
+ light
+
+
+ 0
+
+
+
+ 300
+ 4
+
+
+ 1500
+ 8
+
+
+
+
+
+ noshadow
+ light
+
+
+
+ select
+ light
+
+
+
+
+
+
+ Effects/spotlight
+ light
+ Effects/procedural-light
+
+
+ white
+
+
+
+
+
+
+
+ 1.0
+
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ spot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.0
+
+
+
+
+
+ 1.0
+
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Aircraft/Instruments-3d/SCR-522C/Dialogs/radios.xml b/Aircraft/Instruments-3d/SCR-522C/Dialogs/radios.xml
index f0b97f64c..96f44e7b5 100644
--- a/Aircraft/Instruments-3d/SCR-522C/Dialogs/radios.xml
+++ b/Aircraft/Instruments-3d/SCR-522C/Dialogs/radios.xml
@@ -172,7 +172,8 @@
diff --git a/Aircraft/Instruments-3d/TR1133/Dialogs/radios.xml b/Aircraft/Instruments-3d/TR1133/Dialogs/radios.xml
index 3e060d381..5a5c12737 100644
--- a/Aircraft/Instruments-3d/TR1133/Dialogs/radios.xml
+++ b/Aircraft/Instruments-3d/TR1133/Dialogs/radios.xml
@@ -172,7 +172,8 @@
diff --git a/Aircraft/Instruments-3d/ar-6201/ar-6201-case.ac b/Aircraft/Instruments-3d/ar-6201/ar-6201-case.ac
new file mode 100644
index 000000000..5ec1310d4
--- /dev/null
+++ b/Aircraft/Instruments-3d/ar-6201/ar-6201-case.ac
@@ -0,0 +1,3271 @@
+AC3Db
+MATERIAL "ar6201" rgb 1.000 1.000 1.000 amb 0.800 0.800 0.800 emis 0.000 0.000 0.000 spec 0.500 0.500 0.500 shi 64 trans 0.000
+OBJECT world
+name "Blender_exporter_v3.3__ar-6201-case.ac"
+kids 1
+OBJECT poly
+name "ar6201.case"
+data 10
+Circle.001
+crease 40.0
+texture "ar-6201.png"
+numvert 447
+-0.16286 0.01402 0.03026
+-0.16207 0.01593 0.03026
+-0.16016 0.01672 0.03026
+-0.15825 0.01593 0.03026
+-0.15746 0.01402 0.03026
+-0.15825 0.01211 0.03026
+-0.16016 0.01132 0.03026
+-0.16207 0.01211 0.03026
+-0.16177 0.01402 0.03097
+-0.1613 0.01516 0.03097
+-0.16016 0.01563 0.03097
+-0.15902 0.01516 0.03097
+-0.15855 0.01402 0.03097
+-0.15902 0.01288 0.03097
+-0.16016 0.0124 0.03097
+-0.1613 0.01288 0.03097
+-0.16016 0.01402 0.03118
+-0.16286 -0.01745 0.03026
+-0.16207 -0.01554 0.03026
+-0.16016 -0.01475 0.03026
+-0.15825 -0.01554 0.03026
+-0.15746 -0.01745 0.03026
+-0.15825 -0.01936 0.03026
+-0.16016 -0.02015 0.03026
+-0.16207 -0.01936 0.03026
+-0.16177 -0.01745 0.03097
+-0.1613 -0.01631 0.03097
+-0.16016 -0.01584 0.03097
+-0.15902 -0.01631 0.03097
+-0.15855 -0.01745 0.03097
+-0.15902 -0.01859 0.03097
+-0.16016 -0.01907 0.03097
+-0.1613 -0.01859 0.03097
+-0.16016 -0.01745 0.03118
+-0.02541 0.01402 0.03026
+-0.02462 0.01593 0.03026
+-0.02271 0.01672 0.03026
+-0.0208 0.01593 0.03026
+-0.02001 0.01402 0.03026
+-0.0208 0.01211 0.03026
+-0.02271 0.01132 0.03026
+-0.02462 0.01211 0.03026
+-0.02433 0.01402 0.03097
+-0.02385 0.01516 0.03097
+-0.02271 0.01563 0.03097
+-0.02157 0.01516 0.03097
+-0.0211 0.01402 0.03097
+-0.02157 0.01288 0.03097
+-0.02271 0.0124 0.03097
+-0.02385 0.01288 0.03097
+-0.02271 0.01402 0.03118
+-0.02541 -0.01255 0.03026
+-0.02462 -0.01064 0.03026
+-0.02271 -0.00985 0.03026
+-0.0208 -0.01064 0.03026
+-0.02001 -0.01255 0.03026
+-0.0208 -0.01446 0.03026
+-0.02271 -0.01525 0.03026
+-0.02462 -0.01446 0.03026
+-0.02433 -0.01255 0.03097
+-0.02385 -0.01141 0.03097
+-0.02271 -0.01094 0.03097
+-0.02157 -0.01141 0.03097
+-0.0211 -0.01255 0.03097
+-0.02157 -0.01369 0.03097
+-0.02271 -0.01416 0.03097
+-0.02385 -0.01369 0.03097
+-0.02271 -0.01255 0.03118
+-0.16286 0.01402 -0.03025
+-0.16207 0.01593 -0.03025
+-0.16016 0.01672 -0.03025
+-0.15825 0.01593 -0.03025
+-0.15746 0.01402 -0.03025
+-0.15825 0.01211 -0.03025
+-0.16016 0.01132 -0.03025
+-0.16207 0.01211 -0.03025
+-0.16177 0.01402 -0.03096
+-0.1613 0.01516 -0.03096
+-0.16016 0.01563 -0.03096
+-0.15902 0.01516 -0.03096
+-0.15855 0.01402 -0.03096
+-0.15902 0.01288 -0.03096
+-0.16016 0.0124 -0.03096
+-0.1613 0.01288 -0.03096
+-0.16016 0.01402 -0.03117
+-0.16286 -0.01745 -0.03025
+-0.16207 -0.01554 -0.03025
+-0.16016 -0.01475 -0.03025
+-0.15825 -0.01554 -0.03025
+-0.15746 -0.01745 -0.03025
+-0.15825 -0.01936 -0.03025
+-0.16016 -0.02015 -0.03025
+-0.16207 -0.01936 -0.03025
+-0.16177 -0.01745 -0.03096
+-0.1613 -0.01631 -0.03096
+-0.16016 -0.01584 -0.03096
+-0.15902 -0.01631 -0.03096
+-0.15855 -0.01745 -0.03096
+-0.15902 -0.01859 -0.03096
+-0.16016 -0.01907 -0.03096
+-0.1613 -0.01859 -0.03096
+-0.16016 -0.01745 -0.03117
+-0.02541 0.01402 -0.03025
+-0.02462 0.01593 -0.03025
+-0.02271 0.01672 -0.03025
+-0.0208 0.01593 -0.03025
+-0.02001 0.01402 -0.03025
+-0.0208 0.01211 -0.03025
+-0.02271 0.01132 -0.03025
+-0.02462 0.01211 -0.03025
+-0.02433 0.01402 -0.03096
+-0.02385 0.01516 -0.03096
+-0.02271 0.01563 -0.03096
+-0.02157 0.01516 -0.03096
+-0.0211 0.01402 -0.03096
+-0.02157 0.01288 -0.03096
+-0.02271 0.0124 -0.03096
+-0.02385 0.01288 -0.03096
+-0.02271 0.01402 -0.03117
+-0.02541 -0.01255 -0.03025
+-0.02462 -0.01064 -0.03025
+-0.02271 -0.00985 -0.03025
+-0.0208 -0.01064 -0.03025
+-0.02001 -0.01255 -0.03025
+-0.0208 -0.01446 -0.03025
+-0.02271 -0.01525 -0.03025
+-0.02462 -0.01446 -0.03025
+-0.02433 -0.01255 -0.03096
+-0.02385 -0.01141 -0.03096
+-0.02271 -0.01094 -0.03096
+-0.02157 -0.01141 -0.03096
+-0.0211 -0.01255 -0.03096
+-0.02157 -0.01369 -0.03096
+-0.02271 -0.01416 -0.03096
+-0.02385 -0.01369 -0.03096
+-0.02271 -0.01255 -0.03117
+-0.16348 0.03006 0.0165
+-0.16269 0.03006 0.01459
+-0.16078 0.03006 0.01379
+-0.15887 0.03006 0.01459
+-0.15808 0.03006 0.0165
+-0.15887 0.03006 0.0184
+-0.16078 0.03006 0.0192
+-0.16269 0.03006 0.0184
+-0.16239 0.03077 0.0165
+-0.16192 0.03077 0.01535
+-0.16078 0.03077 0.01488
+-0.15964 0.03077 0.01535
+-0.15917 0.03077 0.0165
+-0.15964 0.03077 0.01764
+-0.16078 0.03077 0.01811
+-0.16192 0.03077 0.01764
+-0.16078 0.03098 0.0165
+-0.16348 0.03006 -0.00365
+-0.16269 0.03006 -0.00556
+-0.16078 0.03006 -0.00636
+-0.15887 0.03006 -0.00556
+-0.15808 0.03006 -0.00365
+-0.15887 0.03006 -0.00174
+-0.16078 0.03006 -0.00095
+-0.16269 0.03006 -0.00174
+-0.16239 0.03077 -0.00365
+-0.16192 0.03077 -0.00479
+-0.16078 0.03077 -0.00527
+-0.15964 0.03077 -0.00479
+-0.15917 0.03077 -0.00365
+-0.15964 0.03077 -0.00251
+-0.16078 0.03077 -0.00204
+-0.16192 0.03077 -0.00251
+-0.16078 0.03098 -0.00365
+-0.13303 0.03006 -0.0006
+-0.13224 0.03006 -0.00251
+-0.13033 0.03006 -0.0033
+-0.12842 0.03006 -0.00251
+-0.12763 0.03006 -0.0006
+-0.12842 0.03006 0.00131
+-0.13033 0.03006 0.0021
+-0.13224 0.03006 0.00131
+-0.13194 0.03077 -0.0006
+-0.13147 0.03077 -0.00174
+-0.13033 0.03077 -0.00221
+-0.12919 0.03077 -0.00174
+-0.12872 0.03077 -0.0006
+-0.12919 0.03077 0.00054
+-0.13033 0.03077 0.00101
+-0.13147 0.03077 0.00054
+-0.13033 0.03098 -0.0006
+-0.13303 0.03006 -0.02052
+-0.13224 0.03006 -0.02243
+-0.13033 0.03006 -0.02322
+-0.12842 0.03006 -0.02243
+-0.12763 0.03006 -0.02052
+-0.12842 0.03006 -0.01861
+-0.13033 0.03006 -0.01782
+-0.13224 0.03006 -0.01861
+-0.13194 0.03077 -0.02052
+-0.13147 0.03077 -0.02166
+-0.13033 0.03077 -0.02213
+-0.12919 0.03077 -0.02166
+-0.12872 0.03077 -0.02052
+-0.12919 0.03077 -0.01938
+-0.13033 0.03077 -0.01891
+-0.13147 0.03077 -0.01938
+-0.13033 0.03098 -0.02052
+-0.1007 0.03006 -0.02039
+-0.09991 0.03006 -0.0223
+-0.098 0.03006 -0.02309
+-0.09609 0.03006 -0.0223
+-0.0953 0.03006 -0.02039
+-0.09609 0.03006 -0.01848
+-0.098 0.03006 -0.01768
+-0.09991 0.03006 -0.01848
+-0.09961 0.03077 -0.02039
+-0.09914 0.03077 -0.02153
+-0.098 0.03077 -0.022
+-0.09686 0.03077 -0.02153
+-0.09639 0.03077 -0.02039
+-0.09686 0.03077 -0.01925
+-0.098 0.03077 -0.01877
+-0.09914 0.03077 -0.01925
+-0.098 0.03098 -0.02039
+-0.07421 0.03006 -0.02351
+-0.07342 0.03006 -0.02542
+-0.07151 0.03006 -0.02621
+-0.0696 0.03006 -0.02542
+-0.06881 0.03006 -0.02351
+-0.0696 0.03006 -0.0216
+-0.07151 0.03006 -0.02081
+-0.07342 0.03006 -0.0216
+-0.07312 0.03077 -0.02351
+-0.07265 0.03077 -0.02465
+-0.07151 0.03077 -0.02512
+-0.07037 0.03077 -0.02465
+-0.0699 0.03077 -0.02351
+-0.07037 0.03077 -0.02237
+-0.07151 0.03077 -0.0219
+-0.07265 0.03077 -0.02237
+-0.07151 0.03098 -0.02351
+-0.07421 0.03006 0.02322
+-0.07342 0.03006 0.02131
+-0.07151 0.03006 0.02052
+-0.0696 0.03006 0.02131
+-0.06881 0.03006 0.02322
+-0.0696 0.03006 0.02513
+-0.07151 0.03006 0.02592
+-0.07342 0.03006 0.02513
+-0.07312 0.03077 0.02322
+-0.07265 0.03077 0.02208
+-0.07151 0.03077 0.02161
+-0.07037 0.03077 0.02208
+-0.0699 0.03077 0.02322
+-0.07037 0.03077 0.02436
+-0.07151 0.03077 0.02483
+-0.07265 0.03077 0.02436
+-0.07151 0.03098 0.02322
+-0.0149 -0.03066 0.02816
+-0.0149 -0.02844 0.03038
+-0.0149 -0.03001 0.02973
+-0.0149 0.02789 0.03038
+-0.0149 0.0301 0.02816
+-0.0149 0.02945 0.02973
+-0.0149 -0.02844 -0.03038
+-0.0149 -0.03066 -0.02816
+-0.0149 -0.03001 -0.02973
+-0.0149 0.0301 -0.02816
+-0.0149 0.02789 -0.03038
+-0.0149 0.02945 -0.02973
+-0.00214 -0.02844 0.03038
+-0.00214 -0.03066 0.02816
+-0.00214 -0.03001 0.02973
+-0.00214 0.0301 0.02816
+-0.00214 0.02789 0.03038
+-0.00214 0.02945 0.02973
+-0.00214 -0.03066 -0.02816
+-0.00214 -0.02844 -0.03038
+-0.00214 -0.03001 -0.02973
+-0.00214 0.02789 -0.03038
+-0.00214 0.0301 -0.02816
+-0.00214 0.02945 -0.02973
+-0.16607 -0.03066 0.02816
+-0.16607 -0.02844 0.03038
+-0.16829 -0.02844 0.02816
+-0.16607 -0.03001 0.02973
+-0.16735 -0.02972 0.02944
+-0.16764 -0.02844 0.02973
+-0.16764 -0.03001 0.02816
+-0.16607 0.02789 0.03038
+-0.16607 0.0301 0.02816
+-0.16829 0.02789 0.02816
+-0.16607 0.02945 0.02973
+-0.16735 0.02917 0.02944
+-0.16764 0.02945 0.02816
+-0.16764 0.02789 0.02973
+-0.16607 -0.03066 -0.02816
+-0.16829 -0.02844 -0.02816
+-0.16607 -0.02844 -0.03038
+-0.16764 -0.03001 -0.02816
+-0.16735 -0.02972 -0.02944
+-0.16764 -0.02844 -0.02973
+-0.16607 -0.03001 -0.02973
+-0.16607 0.0301 -0.02816
+-0.16607 0.02789 -0.03038
+-0.16829 0.02789 -0.02816
+-0.16607 0.02945 -0.02973
+-0.16735 0.02917 -0.02944
+-0.16764 0.02789 -0.02973
+-0.16764 0.02945 -0.02816
+-0.16747 -0.01032 -0.01905
+-0.16747 -0.02206 -0.01905
+-0.16747 -0.01032 0.01905
+-0.16747 -0.02206 0.01905
+-0.17355 -0.01032 -0.01905
+-0.17355 -0.02206 -0.01905
+-0.17355 -0.01032 0.01905
+-0.17355 -0.02206 0.01905
+-0.17355 -0.01119 -0.01813
+-0.17355 -0.02119 -0.01813
+-0.17355 -0.01119 0.01813
+-0.17355 -0.02119 0.01813
+-0.17207 -0.01119 -0.01813
+-0.17207 -0.02119 -0.01813
+-0.17207 -0.01119 0.01813
+-0.17207 -0.02119 0.01813
+-0.16831 0.01972 -0.02487
+-0.16831 0.0272 -0.02055
+-0.16831 0.0272 -0.01191
+-0.16831 0.01972 -0.00759
+-0.16831 0.01223 -0.01191
+-0.16831 0.01223 -0.02055
+-0.17075 0.01972 -0.02487
+-0.17075 0.0272 -0.02055
+-0.17075 0.0272 -0.01191
+-0.17075 0.01972 -0.00759
+-0.17075 0.01223 -0.01191
+-0.17075 0.01223 -0.02055
+-0.17144 0.01972 -0.02271
+-0.17144 0.0222 -0.02222
+-0.17144 0.0243 -0.02081
+-0.17144 0.02571 -0.01871
+-0.17144 0.0262 -0.01623
+-0.17144 0.02571 -0.01375
+-0.17144 0.0243 -0.01165
+-0.17144 0.0222 -0.01024
+-0.17144 0.01972 -0.00975
+-0.17144 0.01724 -0.01024
+-0.17144 0.01513 -0.01165
+-0.17144 0.01373 -0.01375
+-0.17144 0.01323 -0.01623
+-0.17144 0.01373 -0.01871
+-0.17144 0.01513 -0.02081
+-0.17144 0.01724 -0.02222
+-0.17144 0.01972 -0.02157
+-0.17144 0.02176 -0.02116
+-0.17144 0.02349 -0.02
+-0.17144 0.02465 -0.01827
+-0.17144 0.02505 -0.01623
+-0.17144 0.02465 -0.01419
+-0.17144 0.02349 -0.01246
+-0.17144 0.02176 -0.0113
+-0.17144 0.01972 -0.01089
+-0.17144 0.01768 -0.0113
+-0.17144 0.01594 -0.01246
+-0.17144 0.01479 -0.01419
+-0.17144 0.01438 -0.01623
+-0.17144 0.01479 -0.01827
+-0.17144 0.01594 -0.02
+-0.17144 0.01768 -0.02116
+-0.17411 0.01972 -0.02157
+-0.17411 0.02176 -0.02116
+-0.17411 0.02349 -0.02
+-0.17411 0.02465 -0.01827
+-0.17411 0.02505 -0.01623
+-0.17411 0.02465 -0.01419
+-0.17411 0.02349 -0.01246
+-0.17411 0.02176 -0.0113
+-0.17411 0.01972 -0.01089
+-0.17411 0.01768 -0.0113
+-0.17411 0.01594 -0.01246
+-0.17411 0.01479 -0.01419
+-0.17411 0.01438 -0.01623
+-0.17411 0.01479 -0.01827
+-0.17411 0.01594 -0.02
+-0.17411 0.01768 -0.02116
+-0.17411 0.02319 -0.01971
+-0.17411 0.02426 -0.01811
+-0.17411 0.02463 -0.01623
+-0.17411 0.0148 -0.01623
+-0.17411 0.01517 -0.01811
+-0.17411 0.01624 -0.01971
+-0.17411 0.01972 -0.02115
+-0.17411 0.0216 -0.02077
+-0.17411 0.02426 -0.01435
+-0.17411 0.02319 -0.01275
+-0.17411 0.0216 -0.01169
+-0.17411 0.01972 -0.01131
+-0.17411 0.01784 -0.01169
+-0.17411 0.01624 -0.01275
+-0.17411 0.01517 -0.01435
+-0.17411 0.01784 -0.02077
+-0.18388 0.01972 -0.02115
+-0.18388 0.0216 -0.02077
+-0.18388 0.02319 -0.01971
+-0.18388 0.02426 -0.01811
+-0.18388 0.02463 -0.01623
+-0.18388 0.02426 -0.01435
+-0.18388 0.02319 -0.01275
+-0.18388 0.0216 -0.01169
+-0.18388 0.01972 -0.01131
+-0.18388 0.01784 -0.01169
+-0.18388 0.01624 -0.01275
+-0.18388 0.01517 -0.01435
+-0.18388 0.0148 -0.01623
+-0.18388 0.01517 -0.01811
+-0.18388 0.01624 -0.01971
+-0.18388 0.01784 -0.02077
+-0.18476 0.01972 -0.02079
+-0.18476 0.02146 -0.02045
+-0.18476 0.02295 -0.01946
+-0.18476 0.02393 -0.01798
+-0.18476 0.02428 -0.01623
+-0.18476 0.02393 -0.01448
+-0.18476 0.02295 -0.013
+-0.18476 0.02146 -0.01201
+-0.18476 0.01972 -0.01167
+-0.18476 0.01797 -0.01201
+-0.18476 0.01649 -0.013
+-0.18476 0.0155 -0.01448
+-0.18476 0.01515 -0.01623
+-0.18476 0.0155 -0.01798
+-0.18476 0.01649 -0.01946
+-0.18476 0.01797 -0.02045
+-0.16747 0.00613 -0.01905
+-0.16747 -0.00561 -0.01905
+-0.16747 0.00613 0.01905
+-0.16747 -0.00561 0.01905
+-0.17355 0.00613 -0.01905
+-0.17355 -0.00561 -0.01905
+-0.17355 0.00613 0.01905
+-0.17355 -0.00561 0.01905
+-0.17355 0.00526 -0.01813
+-0.17355 -0.00474 -0.01813
+-0.17355 0.00526 0.01813
+-0.17355 -0.00474 0.01813
+-0.17207 0.00526 -0.01813
+-0.17207 -0.00474 -0.01813
+-0.17207 0.00526 0.01813
+-0.17207 -0.00474 0.01813
+numsurf 420
+SURF 0X10
+mat 0
+refs 4
+5 0.096536 0.020035
+4 0.113221 0.060334
+12 0.090259 0.060334
+13 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+3 0.096536 0.100634
+2 0.056236 0.117319
+10 0.056236 0.094365
+11 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+1 0.015929 0.100634
+0 -0.000757 0.060334
+8 0.022197 0.060334
+9 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+0 -0.000757 0.060334
+7 0.015929 0.020035
+15 0.032166 0.036265
+8 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+6 0.056236 0.003349
+5 0.096536 0.020035
+13 0.080298 0.036265
+14 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+4 0.113221 0.060334
+3 0.096536 0.100634
+11 0.080298 0.084404
+12 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+2 0.056236 0.117319
+1 0.015929 0.100634
+9 0.032166 0.084404
+10 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+7 0.015929 0.020035
+6 0.056236 0.003349
+14 0.056236 0.026304
+15 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+8 0.022197 0.060334
+15 0.032166 0.036265
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+14 0.056236 0.026304
+13 0.080298 0.036265
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+12 0.090259 0.060334
+11 0.080298 0.084404
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+10 0.056236 0.094365
+9 0.032166 0.084404
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+15 0.032166 0.036265
+14 0.056236 0.026304
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+13 0.080298 0.036265
+12 0.090259 0.060334
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+11 0.080298 0.084404
+10 0.056236 0.094365
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+9 0.032166 0.084404
+8 0.022197 0.060334
+16 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+22 0.096536 0.020035
+21 0.113221 0.060334
+29 0.090259 0.060334
+30 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+20 0.096536 0.100634
+19 0.056236 0.117319
+27 0.056236 0.094365
+28 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+18 0.015929 0.100634
+17 -0.000757 0.060334
+25 0.022197 0.060334
+26 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+17 -0.000757 0.060334
+24 0.015929 0.020035
+32 0.032166 0.036265
+25 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+23 0.056236 0.003349
+22 0.096536 0.020035
+30 0.080298 0.036265
+31 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+21 0.113221 0.060334
+20 0.096536 0.100634
+28 0.080298 0.084404
+29 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+19 0.056236 0.117319
+18 0.015929 0.100634
+26 0.032166 0.084404
+27 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+24 0.015929 0.020035
+23 0.056236 0.003349
+31 0.056236 0.026304
+32 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+25 0.022197 0.060334
+32 0.032166 0.036265
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+31 0.056236 0.026304
+30 0.080298 0.036265
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+29 0.090259 0.060334
+28 0.080298 0.084404
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+27 0.056236 0.094365
+26 0.032166 0.084404
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+32 0.032166 0.036265
+31 0.056236 0.026304
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+30 0.080298 0.036265
+29 0.090259 0.060334
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+28 0.080298 0.084404
+27 0.056236 0.094365
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+26 0.032166 0.084404
+25 0.022197 0.060334
+33 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+39 0.096536 0.020035
+38 0.113221 0.060334
+46 0.090259 0.060334
+47 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+37 0.096536 0.100634
+36 0.056236 0.117319
+44 0.056236 0.094365
+45 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+35 0.015929 0.100634
+34 -0.000757 0.060334
+42 0.022197 0.060334
+43 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+34 -0.000757 0.060334
+41 0.015929 0.020035
+49 0.032166 0.036265
+42 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+40 0.056236 0.003349
+39 0.096536 0.020035
+47 0.080298 0.036265
+48 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+38 0.113221 0.060334
+37 0.096536 0.100634
+45 0.080298 0.084404
+46 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+36 0.056236 0.117319
+35 0.015929 0.100634
+43 0.032166 0.084404
+44 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+41 0.015929 0.020035
+40 0.056236 0.003349
+48 0.056236 0.026304
+49 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+42 0.022197 0.060334
+49 0.032166 0.036265
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+48 0.056236 0.026304
+47 0.080298 0.036265
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+46 0.090259 0.060334
+45 0.080298 0.084404
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+44 0.056236 0.094365
+43 0.032166 0.084404
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+49 0.032166 0.036265
+48 0.056236 0.026304
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+47 0.080298 0.036265
+46 0.090259 0.060334
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+45 0.080298 0.084404
+44 0.056236 0.094365
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+43 0.032166 0.084404
+42 0.022197 0.060334
+50 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+56 0.096536 0.020035
+55 0.113221 0.060334
+63 0.090259 0.060334
+64 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+54 0.096536 0.100634
+53 0.056236 0.117319
+61 0.056236 0.094365
+62 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+52 0.015929 0.100634
+51 -0.000757 0.060334
+59 0.022197 0.060334
+60 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+51 -0.000757 0.060334
+58 0.015929 0.020035
+66 0.032166 0.036265
+59 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+57 0.056236 0.003349
+56 0.096536 0.020035
+64 0.080298 0.036265
+65 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+55 0.113221 0.060334
+54 0.096536 0.100634
+62 0.080298 0.084404
+63 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+53 0.056236 0.117319
+52 0.015929 0.100634
+60 0.032166 0.084404
+61 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+58 0.015929 0.020035
+57 0.056236 0.003349
+65 0.056236 0.026304
+66 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+59 0.022197 0.060334
+66 0.032166 0.036265
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+65 0.056236 0.026304
+64 0.080298 0.036265
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+63 0.090259 0.060334
+62 0.080298 0.084404
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+61 0.056236 0.094365
+60 0.032166 0.084404
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+66 0.032166 0.036265
+65 0.056236 0.026304
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+64 0.080298 0.036265
+63 0.090259 0.060334
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+62 0.080298 0.084404
+61 0.056236 0.094365
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+60 0.032166 0.084404
+59 0.022197 0.060334
+67 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+73 0.096536 0.020035
+72 0.113221 0.060334
+80 0.090259 0.060334
+81 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+71 0.096536 0.100634
+70 0.056236 0.117319
+78 0.056236 0.094365
+79 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+69 0.015929 0.100634
+68 -0.000757 0.060334
+76 0.022197 0.060334
+77 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+68 -0.000757 0.060334
+75 0.015929 0.020035
+83 0.032166 0.036265
+76 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+74 0.056236 0.003349
+73 0.096536 0.020035
+81 0.080298 0.036265
+82 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+72 0.113221 0.060334
+71 0.096536 0.100634
+79 0.080298 0.084404
+80 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+70 0.056236 0.117319
+69 0.015929 0.100634
+77 0.032166 0.084404
+78 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+75 0.015929 0.020035
+74 0.056236 0.003349
+82 0.056236 0.026304
+83 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+76 0.022197 0.060334
+83 0.032166 0.036265
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+82 0.056236 0.026304
+81 0.080298 0.036265
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+80 0.090259 0.060334
+79 0.080298 0.084404
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+78 0.056236 0.094365
+77 0.032166 0.084404
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+83 0.032166 0.036265
+82 0.056236 0.026304
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+81 0.080298 0.036265
+80 0.090259 0.060334
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+79 0.080298 0.084404
+78 0.056236 0.094365
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+77 0.032166 0.084404
+76 0.022197 0.060334
+84 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+90 0.096536 0.020035
+89 0.113221 0.060334
+97 0.090259 0.060334
+98 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+88 0.096536 0.100634
+87 0.056236 0.117319
+95 0.056236 0.094365
+96 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+86 0.015929 0.100634
+85 -0.000757 0.060334
+93 0.022197 0.060334
+94 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+85 -0.000757 0.060334
+92 0.015929 0.020035
+100 0.032166 0.036265
+93 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+91 0.056236 0.003349
+90 0.096536 0.020035
+98 0.080298 0.036265
+99 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+89 0.113221 0.060334
+88 0.096536 0.100634
+96 0.080298 0.084404
+97 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+87 0.056236 0.117319
+86 0.015929 0.100634
+94 0.032166 0.084404
+95 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+92 0.015929 0.020035
+91 0.056236 0.003349
+99 0.056236 0.026304
+100 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+93 0.022197 0.060334
+100 0.032166 0.036265
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+99 0.056236 0.026304
+98 0.080298 0.036265
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+97 0.090259 0.060334
+96 0.080298 0.084404
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+95 0.056236 0.094365
+94 0.032166 0.084404
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+100 0.032166 0.036265
+99 0.056236 0.026304
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+98 0.080298 0.036265
+97 0.090259 0.060334
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+96 0.080298 0.084404
+95 0.056236 0.094365
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+94 0.032166 0.084404
+93 0.022197 0.060334
+101 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+107 0.096536 0.020035
+106 0.113221 0.060334
+114 0.090259 0.060334
+115 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+105 0.096536 0.100634
+104 0.056236 0.117319
+112 0.056236 0.094365
+113 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+103 0.015929 0.100634
+102 -0.000757 0.060334
+110 0.022197 0.060334
+111 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+102 -0.000757 0.060334
+109 0.015929 0.020035
+117 0.032166 0.036265
+110 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+108 0.056236 0.003349
+107 0.096536 0.020035
+115 0.080298 0.036265
+116 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+106 0.113221 0.060334
+105 0.096536 0.100634
+113 0.080298 0.084404
+114 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+104 0.056236 0.117319
+103 0.015929 0.100634
+111 0.032166 0.084404
+112 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+109 0.015929 0.020035
+108 0.056236 0.003349
+116 0.056236 0.026304
+117 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+110 0.022197 0.060334
+117 0.032166 0.036265
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+116 0.056236 0.026304
+115 0.080298 0.036265
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+114 0.090259 0.060334
+113 0.080298 0.084404
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+112 0.056236 0.094365
+111 0.032166 0.084404
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+117 0.032166 0.036265
+116 0.056236 0.026304
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+115 0.080298 0.036265
+114 0.090259 0.060334
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+113 0.080298 0.084404
+112 0.056236 0.094365
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+111 0.032166 0.084404
+110 0.022197 0.060334
+118 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+124 0.096536 0.020035
+123 0.113221 0.060334
+131 0.090259 0.060334
+132 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+122 0.096536 0.100634
+121 0.056236 0.117319
+129 0.056236 0.094365
+130 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+120 0.015929 0.100634
+119 -0.000757 0.060334
+127 0.022197 0.060334
+128 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+119 -0.000757 0.060334
+126 0.015929 0.020035
+134 0.032166 0.036265
+127 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+125 0.056236 0.003349
+124 0.096536 0.020035
+132 0.080298 0.036265
+133 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+123 0.113221 0.060334
+122 0.096536 0.100634
+130 0.080298 0.084404
+131 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+121 0.056236 0.117319
+120 0.015929 0.100634
+128 0.032166 0.084404
+129 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+126 0.015929 0.020035
+125 0.056236 0.003349
+133 0.056236 0.026304
+134 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+127 0.022197 0.060334
+134 0.032166 0.036265
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+133 0.056236 0.026304
+132 0.080298 0.036265
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+131 0.090259 0.060334
+130 0.080298 0.084404
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+129 0.056236 0.094365
+128 0.032166 0.084404
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+134 0.032166 0.036265
+133 0.056236 0.026304
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+132 0.080298 0.036265
+131 0.090259 0.060334
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+130 0.080298 0.084404
+129 0.056236 0.094365
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+128 0.032166 0.084404
+127 0.022197 0.060334
+135 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+141 0.096536 0.020035
+140 0.113221 0.060334
+148 0.090259 0.060334
+149 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+139 0.096536 0.100634
+138 0.056236 0.117319
+146 0.056236 0.094365
+147 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+137 0.015929 0.100634
+136 -0.000757 0.060334
+144 0.022197 0.060334
+145 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+136 -0.000757 0.060334
+143 0.015929 0.020035
+151 0.032166 0.036265
+144 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+142 0.056236 0.003349
+141 0.096536 0.020035
+149 0.080298 0.036265
+150 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+140 0.113221 0.060334
+139 0.096536 0.100634
+147 0.080298 0.084404
+148 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+138 0.056236 0.117319
+137 0.015929 0.100634
+145 0.032166 0.084404
+146 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+143 0.015929 0.020035
+142 0.056236 0.003349
+150 0.056236 0.026304
+151 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+144 0.022197 0.060334
+151 0.032166 0.036265
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+150 0.056236 0.026304
+149 0.080298 0.036265
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+148 0.090259 0.060334
+147 0.080298 0.084404
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+146 0.056236 0.094365
+145 0.032166 0.084404
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+151 0.032166 0.036265
+150 0.056236 0.026304
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+149 0.080298 0.036265
+148 0.090259 0.060334
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+147 0.080298 0.084404
+146 0.056236 0.094365
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+145 0.032166 0.084404
+144 0.022197 0.060334
+152 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+158 0.096536 0.020035
+157 0.113221 0.060334
+165 0.090259 0.060334
+166 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+156 0.096536 0.100634
+155 0.056236 0.117319
+163 0.056236 0.094365
+164 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+154 0.015929 0.100634
+153 -0.000757 0.060334
+161 0.022197 0.060334
+162 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+153 -0.000757 0.060334
+160 0.015929 0.020035
+168 0.032166 0.036265
+161 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+159 0.056236 0.003349
+158 0.096536 0.020035
+166 0.080298 0.036265
+167 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+157 0.113221 0.060334
+156 0.096536 0.100634
+164 0.080298 0.084404
+165 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+155 0.056236 0.117319
+154 0.015929 0.100634
+162 0.032166 0.084404
+163 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+160 0.015929 0.020035
+159 0.056236 0.003349
+167 0.056236 0.026304
+168 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+161 0.022197 0.060334
+168 0.032166 0.036265
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+167 0.056236 0.026304
+166 0.080298 0.036265
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+165 0.090259 0.060334
+164 0.080298 0.084404
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+163 0.056236 0.094365
+162 0.032166 0.084404
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+168 0.032166 0.036265
+167 0.056236 0.026304
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+166 0.080298 0.036265
+165 0.090259 0.060334
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+164 0.080298 0.084404
+163 0.056236 0.094365
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+162 0.032166 0.084404
+161 0.022197 0.060334
+169 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+175 0.096536 0.020035
+174 0.113221 0.060334
+182 0.090259 0.060334
+183 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+173 0.096536 0.100634
+172 0.056236 0.117319
+180 0.056236 0.094365
+181 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+171 0.015929 0.100634
+170 -0.000757 0.060334
+178 0.022197 0.060334
+179 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+170 -0.000757 0.060334
+177 0.015929 0.020035
+185 0.032166 0.036265
+178 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+176 0.056236 0.003349
+175 0.096536 0.020035
+183 0.080298 0.036265
+184 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+174 0.113221 0.060334
+173 0.096536 0.100634
+181 0.080298 0.084404
+182 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+172 0.056236 0.117319
+171 0.015929 0.100634
+179 0.032166 0.084404
+180 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+177 0.015929 0.020035
+176 0.056236 0.003349
+184 0.056236 0.026304
+185 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+178 0.022197 0.060334
+185 0.032166 0.036265
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+184 0.056236 0.026304
+183 0.080298 0.036265
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+182 0.090259 0.060334
+181 0.080298 0.084404
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+180 0.056236 0.094365
+179 0.032166 0.084404
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+185 0.032166 0.036265
+184 0.056236 0.026304
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+183 0.080298 0.036265
+182 0.090259 0.060334
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+181 0.080298 0.084404
+180 0.056236 0.094365
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+179 0.032166 0.084404
+178 0.022197 0.060334
+186 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+192 0.096536 0.020035
+191 0.113221 0.060334
+199 0.090259 0.060334
+200 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+190 0.096536 0.100634
+189 0.056236 0.117319
+197 0.056236 0.094365
+198 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+188 0.015929 0.100634
+187 -0.000757 0.060334
+195 0.022197 0.060334
+196 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+187 -0.000757 0.060334
+194 0.015929 0.020035
+202 0.032166 0.036265
+195 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+193 0.056236 0.003349
+192 0.096536 0.020035
+200 0.080298 0.036265
+201 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+191 0.113221 0.060334
+190 0.096536 0.100634
+198 0.080298 0.084404
+199 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+189 0.056236 0.117319
+188 0.015929 0.100634
+196 0.032166 0.084404
+197 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+194 0.015929 0.020035
+193 0.056236 0.003349
+201 0.056236 0.026304
+202 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+195 0.022197 0.060334
+202 0.032166 0.036265
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+201 0.056236 0.026304
+200 0.080298 0.036265
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+199 0.090259 0.060334
+198 0.080298 0.084404
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+197 0.056236 0.094365
+196 0.032166 0.084404
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+202 0.032166 0.036265
+201 0.056236 0.026304
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+200 0.080298 0.036265
+199 0.090259 0.060334
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+198 0.080298 0.084404
+197 0.056236 0.094365
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+196 0.032166 0.084404
+195 0.022197 0.060334
+203 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+209 0.096536 0.020035
+208 0.113221 0.060334
+216 0.090259 0.060334
+217 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+207 0.096536 0.100634
+206 0.056236 0.117319
+214 0.056236 0.094365
+215 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+205 0.015929 0.100634
+204 -0.000757 0.060334
+212 0.022197 0.060334
+213 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+204 -0.000757 0.060334
+211 0.015929 0.020035
+219 0.032166 0.036265
+212 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+210 0.056236 0.003349
+209 0.096536 0.020035
+217 0.080298 0.036265
+218 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+208 0.113221 0.060334
+207 0.096536 0.100634
+215 0.080298 0.084404
+216 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+206 0.056236 0.117319
+205 0.015929 0.100634
+213 0.032166 0.084404
+214 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+211 0.015929 0.020035
+210 0.056236 0.003349
+218 0.056236 0.026304
+219 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+212 0.022197 0.060334
+219 0.032166 0.036265
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+218 0.056236 0.026304
+217 0.080298 0.036265
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+216 0.090259 0.060334
+215 0.080298 0.084404
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+214 0.056236 0.094365
+213 0.032166 0.084404
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+219 0.032166 0.036265
+218 0.056236 0.026304
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+217 0.080298 0.036265
+216 0.090259 0.060334
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+215 0.080298 0.084404
+214 0.056236 0.094365
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+213 0.032166 0.084404
+212 0.022197 0.060334
+220 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+226 0.096536 0.020035
+225 0.113221 0.060334
+233 0.090259 0.060334
+234 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+224 0.096536 0.100634
+223 0.056236 0.117319
+231 0.056236 0.094365
+232 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+222 0.015929 0.100634
+221 -0.000757 0.060334
+229 0.022197 0.060334
+230 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+221 -0.000757 0.060334
+228 0.015929 0.020035
+236 0.032166 0.036265
+229 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+227 0.056236 0.003349
+226 0.096536 0.020035
+234 0.080298 0.036265
+235 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+225 0.113221 0.060334
+224 0.096536 0.100634
+232 0.080298 0.084404
+233 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+223 0.056236 0.117319
+222 0.015929 0.100634
+230 0.032166 0.084404
+231 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+228 0.015929 0.020035
+227 0.056236 0.003349
+235 0.056236 0.026304
+236 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+229 0.022197 0.060334
+236 0.032166 0.036265
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+235 0.056236 0.026304
+234 0.080298 0.036265
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+233 0.090259 0.060334
+232 0.080298 0.084404
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+231 0.056236 0.094365
+230 0.032166 0.084404
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+236 0.032166 0.036265
+235 0.056236 0.026304
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+234 0.080298 0.036265
+233 0.090259 0.060334
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+232 0.080298 0.084404
+231 0.056236 0.094365
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+230 0.032166 0.084404
+229 0.022197 0.060334
+237 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+243 0.096536 0.020035
+242 0.113221 0.060334
+250 0.090259 0.060334
+251 0.080298 0.036265
+SURF 0X10
+mat 0
+refs 4
+241 0.096536 0.100634
+240 0.056236 0.117319
+248 0.056236 0.094365
+249 0.080298 0.084404
+SURF 0X10
+mat 0
+refs 4
+239 0.015929 0.100634
+238 -0.000757 0.060334
+246 0.022197 0.060334
+247 0.032166 0.084404
+SURF 0X10
+mat 0
+refs 4
+238 -0.000757 0.060334
+245 0.015929 0.020035
+253 0.032166 0.036265
+246 0.022197 0.060334
+SURF 0X10
+mat 0
+refs 4
+244 0.056236 0.003349
+243 0.096536 0.020035
+251 0.080298 0.036265
+252 0.056236 0.026304
+SURF 0X10
+mat 0
+refs 4
+242 0.113221 0.060334
+241 0.096536 0.100634
+249 0.080298 0.084404
+250 0.090259 0.060334
+SURF 0X10
+mat 0
+refs 4
+240 0.056236 0.117319
+239 0.015929 0.100634
+247 0.032166 0.084404
+248 0.056236 0.094365
+SURF 0X10
+mat 0
+refs 4
+245 0.015929 0.020035
+244 0.056236 0.003349
+252 0.056236 0.026304
+253 0.032166 0.036265
+SURF 0X10
+mat 0
+refs 3
+246 0.022197 0.060334
+253 0.032166 0.036265
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+252 0.056236 0.026304
+251 0.080298 0.036265
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+250 0.090259 0.060334
+249 0.080298 0.084404
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+248 0.056236 0.094365
+247 0.032166 0.084404
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+253 0.032166 0.036265
+252 0.056236 0.026304
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+251 0.080298 0.036265
+250 0.090259 0.060334
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+249 0.080298 0.084404
+248 0.056236 0.094365
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 3
+247 0.032166 0.084404
+246 0.022197 0.060334
+254 0.056236 0.060334
+SURF 0X10
+mat 0
+refs 4
+265 0.115009 0.981511
+261 0.115009 0.9398
+295 0.004702 0.9398
+301 0.004702 0.981511
+SURF 0X10
+mat 0
+refs 4
+281 0.073704 0.894021
+288 0.073704 0.951918
+302 0.015806 0.951918
+294 0.015806 0.894021
+SURF 0X10
+mat 0
+refs 4
+277 0.182609 0.962875
+264 0.173242 0.962875
+259 0.173242 0.920806
+270 0.182609 0.920806
+SURF 0X10
+mat 0
+refs 4
+256 0.115009 0.9398
+258 0.115009 0.981511
+286 0.004702 0.981511
+280 0.004702 0.9398
+SURF 0X10
+mat 0
+refs 4
+259 0.115241 0.932525
+264 0.115241 0.974594
+300 0.003986 0.974594
+287 0.003986 0.932525
+SURF 0X10
+mat 0
+refs 4
+262 0.173242 0.962875
+273 0.182609 0.962875
+268 0.182609 0.920806
+255 0.173242 0.920806
+SURF 0X10
+mat 0
+refs 4
+261 0.172981 0.928081
+265 0.172981 0.969792
+276 0.182268 0.969792
+274 0.182268 0.928081
+SURF 0X10
+mat 0
+refs 4
+267 0.182268 0.928081
+271 0.182268 0.969792
+258 0.172981 0.969792
+256 0.172981 0.928081
+SURF 0X10
+mat 0
+refs 4
+279 0.003986 0.932525
+282 0.003986 0.930868
+283 0.00303 0.930868
+285 0.00233 0.932524
+SURF 0X10
+mat 0
+refs 4
+280 0.004702 0.9398
+284 0.00306 0.9398
+283 0.00306 0.938852
+282 0.004702 0.938157
+SURF 0X10
+mat 0
+refs 4
+281 0.073704 0.894021
+285 0.073704 0.891741
+283 0.07502 0.891741
+284 0.075983 0.894021
+SURF 0X10
+mat 0
+refs 4
+286 0.004702 0.981511
+289 0.004702 0.983153
+290 0.003754 0.983153
+292 0.00306 0.981511
+SURF 0X10
+mat 0
+refs 4
+287 0.003986 0.932525
+291 0.00233 0.932524
+290 0.00233 0.931568
+289 0.003986 0.930868
+SURF 0X10
+mat 0
+refs 4
+288 0.073704 0.951918
+292 0.075983 0.951918
+290 0.075983 0.953234
+291 0.073704 0.954198
+SURF 0X10
+mat 0
+refs 4
+293 0.003986 0.974594
+296 0.00233 0.974594
+297 0.00233 0.97555
+299 0.003986 0.97625
+SURF 0X10
+mat 0
+refs 4
+294 0.015806 0.894021
+298 0.013527 0.894021
+297 0.013527 0.892705
+296 0.015806 0.891741
+SURF 0X10
+mat 0
+refs 4
+295 0.004702 0.9398
+299 0.004702 0.938157
+297 0.003754 0.938157
+298 0.00306 0.9398
+SURF 0X10
+mat 0
+refs 4
+300 0.003986 0.974594
+303 0.003986 0.97625
+304 0.00303 0.97625
+306 0.00233 0.974594
+SURF 0X10
+mat 0
+refs 4
+301 0.004702 0.981511
+305 0.00306 0.981511
+304 0.00306 0.982459
+303 0.004702 0.983153
+SURF 0X10
+mat 0
+refs 4
+302 0.015806 0.951918
+306 0.015806 0.954198
+304 0.01449 0.954198
+305 0.013527 0.951918
+SURF 0X10
+mat 0
+refs 4
+273 0.182609 0.962875
+262 0.173242 0.962875
+263 0.173242 0.964532
+275 0.182609 0.964532
+SURF 0X10
+mat 0
+refs 4
+275 0.182268 0.926439
+263 0.172981 0.926439
+261 0.172981 0.928081
+274 0.182268 0.928081
+SURF 0X10
+mat 0
+refs 4
+264 0.173242 0.962875
+277 0.182609 0.962875
+278 0.182609 0.964532
+266 0.173242 0.964532
+SURF 0X10
+mat 0
+refs 4
+266 0.172981 0.971434
+278 0.182268 0.971434
+276 0.182268 0.969792
+265 0.172981 0.969792
+SURF 0X10
+mat 0
+refs 4
+255 0.173242 0.920806
+268 0.182609 0.920806
+269 0.182609 0.919149
+257 0.173242 0.919149
+SURF 0X10
+mat 0
+refs 4
+257 0.172981 0.926439
+269 0.182268 0.926439
+267 0.182268 0.928081
+256 0.172981 0.928081
+SURF 0X10
+mat 0
+refs 4
+270 0.182609 0.920806
+259 0.173242 0.920806
+260 0.173242 0.919149
+272 0.182609 0.919149
+SURF 0X10
+mat 0
+refs 4
+272 0.182268 0.971434
+260 0.172981 0.971434
+258 0.172981 0.969792
+271 0.182268 0.969792
+SURF 0X10
+mat 0
+refs 4
+293 0.003986 0.974594
+279 0.003986 0.932525
+285 0.00233 0.932524
+296 0.00233 0.974594
+SURF 0X10
+mat 0
+refs 4
+296 0.015806 0.891741
+285 0.073704 0.891741
+281 0.073704 0.894021
+294 0.015806 0.894021
+SURF 0X10
+mat 0
+refs 4
+280 0.004702 0.9398
+286 0.004702 0.981511
+292 0.00306 0.981511
+284 0.00306 0.9398
+SURF 0X10
+mat 0
+refs 4
+284 0.075983 0.894021
+292 0.075983 0.951918
+288 0.073704 0.951918
+281 0.073704 0.894021
+SURF 0X10
+mat 0
+refs 4
+287 0.003986 0.932525
+300 0.003986 0.974594
+306 0.00233 0.974594
+291 0.00233 0.932524
+SURF 0X10
+mat 0
+refs 4
+291 0.073704 0.954198
+306 0.015806 0.954198
+302 0.015806 0.951918
+288 0.073704 0.951918
+SURF 0X10
+mat 0
+refs 4
+301 0.004702 0.981511
+295 0.004702 0.9398
+298 0.00306 0.9398
+305 0.00306 0.981511
+SURF 0X10
+mat 0
+refs 4
+305 0.013527 0.951918
+298 0.013527 0.894021
+294 0.015806 0.894021
+302 0.015806 0.951918
+SURF 0X10
+mat 0
+refs 4
+265 0.115009 0.981511
+301 0.004702 0.981511
+303 0.004702 0.983153
+266 0.115009 0.983153
+SURF 0X10
+mat 0
+refs 4
+266 0.115241 0.97625
+303 0.003986 0.97625
+300 0.003986 0.974594
+264 0.115241 0.974594
+SURF 0X10
+mat 0
+refs 4
+286 0.004702 0.981511
+258 0.115009 0.981511
+260 0.115009 0.983153
+289 0.004702 0.983153
+SURF 0X10
+mat 0
+refs 4
+289 0.003986 0.930868
+260 0.115241 0.930868
+259 0.115241 0.932525
+287 0.003986 0.932525
+SURF 0X10
+mat 0
+refs 4
+256 0.115009 0.9398
+280 0.004702 0.9398
+282 0.004702 0.938157
+257 0.115009 0.938157
+SURF 0X10
+mat 0
+refs 4
+257 0.115241 0.930868
+282 0.003986 0.930868
+279 0.003986 0.932525
+255 0.115241 0.932524
+SURF 0X10
+mat 0
+refs 4
+295 0.004702 0.9398
+261 0.115009 0.9398
+263 0.115009 0.938157
+299 0.004702 0.938157
+SURF 0X10
+mat 0
+refs 4
+299 0.003986 0.97625
+263 0.115241 0.97625
+262 0.115241 0.974594
+293 0.003986 0.974594
+SURF 0X10
+mat 0
+refs 4
+262 0.115241 0.974594
+255 0.115241 0.932524
+279 0.003986 0.932525
+293 0.003986 0.974594
+SURF 0X0
+mat 0
+refs 4
+318 0.097801 0.890251
+316 0.051019 0.91284
+320 0.052858 0.913996
+322 0.099599 0.891546
+SURF 0X0
+mat 0
+refs 4
+309 0.105754 0.911517
+310 0.10644 0.893641
+314 0.099114 0.888328
+313 0.098321 0.90637
+SURF 0X0
+mat 0
+refs 4
+312 0.050002 0.912117
+311 0.048635 0.929403
+315 0.049864 0.927586
+316 0.051019 0.91284
+SURF 0X0
+mat 0
+refs 4
+311 0.048635 0.929403
+312 0.050002 0.912117
+308 0.057508 0.916836
+307 0.05625 0.933969
+SURF 0X0
+mat 0
+refs 4
+309 0.105754 0.911517
+313 0.098321 0.90637
+311 0.048635 0.929403
+307 0.05625 0.933969
+SURF 0X0
+mat 0
+refs 4
+314 0.099114 0.888328
+310 0.10644 0.893641
+308 0.057508 0.916836
+312 0.050002 0.912117
+SURF 0X0
+mat 0
+refs 4
+311 0.048635 0.929403
+313 0.098321 0.90637
+317 0.097112 0.90561
+315 0.049864 0.927586
+SURF 0X0
+mat 0
+refs 4
+314 0.099114 0.888328
+312 0.050002 0.912117
+316 0.051019 0.91284
+318 0.097801 0.890251
+SURF 0X0
+mat 0
+refs 4
+313 0.098321 0.90637
+314 0.099114 0.888328
+318 0.097801 0.890251
+317 0.097112 0.90561
+SURF 0X0
+mat 0
+refs 4
+321 0.098933 0.90687
+322 0.099599 0.891546
+320 0.052858 0.913996
+319 0.051726 0.92871
+SURF 0X0
+mat 0
+refs 4
+317 0.097112 0.90561
+318 0.097801 0.890251
+322 0.099599 0.891546
+321 0.098933 0.90687
+SURF 0X0
+mat 0
+refs 4
+316 0.051019 0.91284
+315 0.049864 0.927586
+319 0.051726 0.92871
+320 0.052858 0.913996
+SURF 0X0
+mat 0
+refs 4
+315 0.049864 0.927586
+317 0.097112 0.90561
+321 0.098933 0.90687
+319 0.051726 0.92871
+SURF 0X10
+mat 0
+refs 4
+323 0.044539 0.982176
+328 0.050803 0.968323
+334 0.04767 0.966637
+329 0.04137 0.980558
+SURF 0X10
+mat 0
+refs 4
+327 0.061707 0.963812
+326 0.066509 0.973398
+332 0.063367 0.971688
+333 0.058588 0.962079
+SURF 0X10
+mat 0
+refs 4
+325 0.060086 0.987662
+324 0.049022 0.991923
+330 0.045828 0.99033
+331 0.056905 0.986025
+SURF 0X10
+mat 0
+refs 4
+328 0.050803 0.968323
+327 0.061707 0.963812
+333 0.058588 0.962079
+334 0.04767 0.966637
+SURF 0X10
+mat 0
+refs 4
+326 0.066509 0.973398
+325 0.060086 0.987662
+331 0.056905 0.986025
+332 0.063367 0.971688
+SURF 0X10
+mat 0
+refs 4
+324 0.049022 0.991923
+323 0.044539 0.982176
+329 0.04137 0.980558
+330 0.045828 0.99033
+SURF 0X10
+mat 0
+refs 3
+329 0.04137 0.980558
+350 0.044078 0.97485
+335 0.04315 0.979012
+SURF 0X10
+mat 0
+refs 3
+334 0.04767 0.966637
+350 0.044078 0.97485
+329 0.04137 0.980558
+SURF 0X10
+mat 0
+refs 3
+334 0.04767 0.966637
+348 0.048898 0.967532
+349 0.046093 0.970827
+SURF 0X10
+mat 0
+refs 3
+334 0.04767 0.966637
+347 0.052084 0.965457
+348 0.048898 0.967532
+SURF 0X10
+mat 0
+refs 3
+333 0.058588 0.962079
+346 0.055178 0.964922
+347 0.052084 0.965457
+SURF 0X10
+mat 0
+refs 3
+333 0.058588 0.962079
+345 0.057712 0.966028
+346 0.055178 0.964922
+SURF 0X10
+mat 0
+refs 3
+333 0.058588 0.962079
+344 0.059291 0.968628
+345 0.057712 0.966028
+SURF 0X10
+mat 0
+refs 3
+332 0.063367 0.971688
+343 0.059656 0.972339
+344 0.059291 0.968628
+SURF 0X10
+mat 0
+refs 3
+332 0.063367 0.971688
+342 0.058738 0.976591
+343 0.059656 0.972339
+SURF 0X10
+mat 0
+refs 3
+331 0.056905 0.986025
+342 0.058738 0.976591
+332 0.063367 0.971688
+SURF 0X10
+mat 0
+refs 3
+331 0.056905 0.986025
+340 0.053789 0.984063
+341 0.056674 0.980716
+SURF 0X10
+mat 0
+refs 3
+331 0.056905 0.986025
+339 0.050541 0.986113
+340 0.053789 0.984063
+SURF 0X10
+mat 0
+refs 3
+330 0.045828 0.99033
+338 0.047437 0.986557
+339 0.050541 0.986113
+SURF 0X10
+mat 0
+refs 3
+330 0.045828 0.99033
+337 0.044951 0.98535
+338 0.047437 0.986557
+SURF 0X10
+mat 0
+refs 3
+330 0.045828 0.99033
+336 0.043452 0.982697
+337 0.044951 0.98535
+SURF 0X10
+mat 0
+refs 3
+329 0.04137 0.980558
+335 0.04315 0.979012
+336 0.043452 0.982697
+SURF 0X10
+mat 0
+refs 3
+334 0.04767 0.966637
+349 0.046093 0.970827
+350 0.044078 0.97485
+SURF 0X10
+mat 0
+refs 3
+334 0.04767 0.966637
+333 0.058588 0.962079
+347 0.052084 0.965457
+SURF 0X10
+mat 0
+refs 3
+333 0.058588 0.962079
+332 0.063367 0.971688
+344 0.059291 0.968628
+SURF 0X10
+mat 0
+refs 3
+331 0.056905 0.986025
+341 0.056674 0.980716
+342 0.058738 0.976591
+SURF 0X10
+mat 0
+refs 3
+331 0.056905 0.986025
+330 0.045828 0.99033
+339 0.050541 0.986113
+SURF 0X10
+mat 0
+refs 3
+330 0.045828 0.99033
+329 0.04137 0.980558
+336 0.043452 0.982697
+SURF 0X10
+mat 0
+refs 4
+348 0.048898 0.967532
+347 0.052084 0.965457
+363 0.051949 0.96726
+364 0.049322 0.968966
+SURF 0X10
+mat 0
+refs 4
+341 0.056674 0.980716
+340 0.053789 0.984063
+356 0.053348 0.982573
+357 0.055717 0.979821
+SURF 0X10
+mat 0
+refs 4
+349 0.046093 0.970827
+348 0.048898 0.967532
+364 0.049322 0.968966
+365 0.047008 0.971682
+SURF 0X10
+mat 0
+refs 4
+342 0.058738 0.976591
+341 0.056674 0.980716
+357 0.055717 0.979821
+358 0.057412 0.976434
+SURF 0X10
+mat 0
+refs 4
+350 0.044078 0.97485
+349 0.046093 0.970827
+365 0.047008 0.971682
+366 0.045346 0.975001
+SURF 0X10
+mat 0
+refs 4
+343 0.059656 0.972339
+342 0.058738 0.976591
+358 0.057412 0.976434
+359 0.058168 0.972941
+SURF 0X10
+mat 0
+refs 4
+336 0.043452 0.982697
+335 0.04315 0.979012
+351 0.044582 0.978433
+352 0.044835 0.981468
+SURF 0X10
+mat 0
+refs 4
+335 0.04315 0.979012
+350 0.044078 0.97485
+366 0.045346 0.975001
+351 0.044582 0.978433
+SURF 0X10
+mat 0
+refs 4
+344 0.059291 0.968628
+343 0.059656 0.972339
+359 0.058168 0.972941
+360 0.057873 0.969888
+SURF 0X10
+mat 0
+refs 4
+337 0.044951 0.98535
+336 0.043452 0.982697
+352 0.044835 0.981468
+353 0.046075 0.983648
+SURF 0X10
+mat 0
+refs 4
+345 0.057712 0.966028
+344 0.059291 0.968628
+360 0.057873 0.969888
+361 0.056579 0.967743
+SURF 0X10
+mat 0
+refs 4
+338 0.047437 0.986557
+337 0.044951 0.98535
+353 0.046075 0.983648
+354 0.048125 0.984634
+SURF 0X10
+mat 0
+refs 4
+346 0.055178 0.964922
+345 0.057712 0.966028
+361 0.056579 0.967743
+362 0.054497 0.966826
+SURF 0X10
+mat 0
+refs 4
+339 0.050541 0.986113
+338 0.047437 0.986557
+354 0.048125 0.984634
+355 0.050679 0.984262
+SURF 0X10
+mat 0
+refs 4
+347 0.052084 0.965457
+346 0.055178 0.964922
+362 0.054497 0.966826
+363 0.051949 0.96726
+SURF 0X10
+mat 0
+refs 4
+340 0.053789 0.984063
+339 0.050541 0.986113
+355 0.050679 0.984262
+356 0.053348 0.982573
+SURF 0X10
+mat 0
+refs 4
+363 0.051949 0.96726
+362 0.054497 0.966826
+378 0.05101 0.964929
+379 0.048461 0.965372
+SURF 0X10
+mat 0
+refs 4
+356 0.053348 0.982573
+355 0.050679 0.984262
+371 0.047141 0.982449
+372 0.049816 0.980745
+SURF 0X10
+mat 0
+refs 4
+364 0.049322 0.968966
+363 0.051949 0.96726
+379 0.048461 0.965372
+380 0.045829 0.967094
+SURF 0X10
+mat 0
+refs 4
+357 0.055717 0.979821
+356 0.053348 0.982573
+372 0.049816 0.980745
+373 0.052193 0.977975
+SURF 0X10
+mat 0
+refs 4
+365 0.047008 0.971682
+364 0.049322 0.968966
+380 0.045829 0.967094
+381 0.043506 0.969827
+SURF 0X10
+mat 0
+refs 4
+358 0.057412 0.976434
+357 0.055717 0.979821
+373 0.052193 0.977975
+374 0.053898 0.974568
+SURF 0X10
+mat 0
+refs 4
+366 0.045346 0.975001
+365 0.047008 0.971682
+381 0.043506 0.969827
+382 0.041834 0.973165
+SURF 0X10
+mat 0
+refs 4
+359 0.058168 0.972941
+358 0.057412 0.976434
+374 0.053898 0.974568
+375 0.054665 0.971058
+SURF 0X10
+mat 0
+refs 4
+352 0.044835 0.981468
+351 0.044582 0.978433
+367 0.041061 0.976613
+368 0.041305 0.97966
+SURF 0X10
+mat 0
+refs 4
+351 0.044582 0.978433
+366 0.045346 0.975001
+382 0.041834 0.973165
+367 0.041061 0.976613
+SURF 0X10
+mat 0
+refs 4
+360 0.057873 0.969888
+359 0.058168 0.972941
+375 0.054665 0.971058
+376 0.054378 0.967993
+SURF 0X10
+mat 0
+refs 4
+353 0.046075 0.983648
+352 0.044835 0.981468
+368 0.041305 0.97966
+369 0.042539 0.981846
+SURF 0X10
+mat 0
+refs 4
+361 0.056579 0.967743
+360 0.057873 0.969888
+376 0.054378 0.967993
+377 0.05309 0.965844
+SURF 0X10
+mat 0
+refs 4
+354 0.048125 0.984634
+353 0.046075 0.983648
+369 0.042539 0.981846
+370 0.044586 0.982831
+SURF 0X10
+mat 0
+refs 4
+362 0.054497 0.966826
+361 0.056579 0.967743
+377 0.05309 0.965844
+378 0.05101 0.964929
+SURF 0X10
+mat 0
+refs 4
+355 0.050679 0.984262
+354 0.048125 0.984634
+370 0.044586 0.982831
+371 0.047141 0.982449
+SURF 0X10
+mat 0
+refs 4
+369 0.042539 0.981846
+368 0.041305 0.97966
+390 0.041813 0.979207
+383 0.042952 0.98122
+SURF 0X10
+mat 0
+refs 4
+377 0.05309 0.965844
+376 0.054378 0.967993
+395 0.053859 0.968456
+396 0.052674 0.966474
+SURF 0X10
+mat 0
+refs 4
+370 0.044586 0.982831
+369 0.042539 0.981846
+383 0.042952 0.98122
+384 0.044839 0.982125
+SURF 0X10
+mat 0
+refs 4
+378 0.05101 0.964929
+377 0.05309 0.965844
+396 0.052674 0.966474
+397 0.050759 0.965628
+SURF 0X10
+mat 0
+refs 4
+371 0.047141 0.982449
+370 0.044586 0.982831
+384 0.044839 0.982125
+385 0.047194 0.981771
+SURF 0X10
+mat 0
+refs 4
+379 0.048461 0.965372
+378 0.05101 0.964929
+397 0.050759 0.965628
+386 0.048409 0.966035
+SURF 0X10
+mat 0
+refs 4
+372 0.049816 0.980745
+371 0.047141 0.982449
+385 0.047194 0.981771
+391 0.049657 0.9802
+SURF 0X10
+mat 0
+refs 4
+380 0.045829 0.967094
+379 0.048461 0.965372
+386 0.048409 0.966035
+387 0.045983 0.96762
+SURF 0X10
+mat 0
+refs 4
+373 0.052193 0.977975
+372 0.049816 0.980745
+391 0.049657 0.9802
+392 0.051845 0.977649
+SURF 0X10
+mat 0
+refs 4
+381 0.043506 0.969827
+380 0.045829 0.967094
+387 0.045983 0.96762
+388 0.04384 0.970141
+SURF 0X10
+mat 0
+refs 4
+374 0.053898 0.974568
+373 0.052193 0.977975
+392 0.051845 0.977649
+393 0.053415 0.974512
+SURF 0X10
+mat 0
+refs 4
+382 0.041834 0.973165
+381 0.043506 0.969827
+388 0.04384 0.970141
+398 0.042299 0.973219
+SURF 0X10
+mat 0
+refs 4
+375 0.054665 0.971058
+374 0.053898 0.974568
+393 0.053415 0.974512
+394 0.054122 0.97128
+SURF 0X10
+mat 0
+refs 4
+368 0.041305 0.97966
+367 0.041061 0.976613
+389 0.041586 0.976399
+390 0.041813 0.979207
+SURF 0X10
+mat 0
+refs 4
+367 0.041061 0.976613
+382 0.041834 0.973165
+398 0.042299 0.973219
+389 0.041586 0.976399
+SURF 0X10
+mat 0
+refs 4
+376 0.054378 0.967993
+375 0.054665 0.971058
+394 0.054122 0.97128
+395 0.053859 0.968456
+SURF 0X10
+mat 0
+refs 4
+386 0.048409 0.966035
+397 0.050759 0.965628
+410 0.037669 0.958525
+411 0.035315 0.958964
+SURF 0X10
+mat 0
+refs 4
+391 0.049657 0.9802
+385 0.047194 0.981771
+403 0.033925 0.974958
+404 0.036406 0.973335
+SURF 0X10
+mat 0
+refs 4
+387 0.045983 0.96762
+386 0.048409 0.966035
+411 0.035315 0.958964
+412 0.032871 0.960602
+SURF 0X10
+mat 0
+refs 4
+392 0.051845 0.977649
+391 0.049657 0.9802
+404 0.036406 0.973335
+405 0.038623 0.970719
+SURF 0X10
+mat 0
+refs 4
+388 0.04384 0.970141
+387 0.045983 0.96762
+412 0.032871 0.960602
+413 0.030702 0.963185
+SURF 0X10
+mat 0
+refs 4
+393 0.053415 0.974512
+392 0.051845 0.977649
+405 0.038623 0.970719
+406 0.040228 0.967516
+SURF 0X10
+mat 0
+refs 4
+398 0.042299 0.973219
+388 0.04384 0.970141
+413 0.030702 0.963185
+414 0.029126 0.966328
+SURF 0X10
+mat 0
+refs 4
+394 0.054122 0.97128
+393 0.053415 0.974512
+406 0.040228 0.967516
+407 0.04097 0.964225
+SURF 0X10
+mat 0
+refs 4
+390 0.041813 0.979207
+389 0.041586 0.976399
+399 0.028379 0.969564
+400 0.028574 0.972413
+SURF 0X10
+mat 0
+refs 4
+389 0.041586 0.976399
+398 0.042299 0.973219
+414 0.029126 0.966328
+399 0.028379 0.969564
+SURF 0X10
+mat 0
+refs 4
+395 0.053859 0.968456
+394 0.054122 0.97128
+407 0.04097 0.964225
+408 0.040738 0.96136
+SURF 0X10
+mat 0
+refs 4
+383 0.042952 0.98122
+390 0.041813 0.979207
+400 0.028574 0.972413
+401 0.02969 0.974445
+SURF 0X10
+mat 0
+refs 4
+396 0.052674 0.966474
+395 0.053859 0.968456
+408 0.040738 0.96136
+409 0.039575 0.959361
+SURF 0X10
+mat 0
+refs 4
+384 0.044839 0.982125
+383 0.042952 0.98122
+401 0.02969 0.974445
+402 0.031566 0.975343
+SURF 0X10
+mat 0
+refs 4
+397 0.050759 0.965628
+396 0.052674 0.966474
+409 0.039575 0.959361
+410 0.037669 0.958525
+SURF 0X10
+mat 0
+refs 4
+385 0.047194 0.981771
+384 0.044839 0.982125
+402 0.031566 0.975343
+403 0.033925 0.974958
+SURF 0X10
+mat 0
+refs 4
+409 0.039575 0.959361
+408 0.040738 0.96136
+424 0.039096 0.961113
+425 0.03802 0.959255
+SURF 0X10
+mat 0
+refs 4
+402 0.031566 0.975343
+401 0.02969 0.974445
+417 0.028831 0.973285
+418 0.030573 0.974116
+SURF 0X10
+mat 0
+refs 4
+410 0.037669 0.958525
+409 0.039575 0.959361
+425 0.03802 0.959255
+426 0.036253 0.958477
+SURF 0X10
+mat 0
+refs 4
+403 0.033925 0.974958
+402 0.031566 0.975343
+418 0.030573 0.974116
+419 0.032762 0.973753
+SURF 0X10
+mat 0
+refs 4
+411 0.035315 0.958964
+410 0.037669 0.958525
+426 0.036253 0.958477
+427 0.034068 0.958886
+SURF 0X10
+mat 0
+refs 4
+404 0.036406 0.973335
+403 0.033925 0.974958
+419 0.032762 0.973753
+420 0.035065 0.972242
+SURF 0X10
+mat 0
+refs 4
+412 0.032871 0.960602
+411 0.035315 0.958964
+427 0.034068 0.958886
+428 0.031797 0.96041
+SURF 0X10
+mat 0
+refs 4
+405 0.038623 0.970719
+404 0.036406 0.973335
+420 0.035065 0.972242
+421 0.037124 0.96981
+SURF 0X10
+mat 0
+refs 4
+413 0.030702 0.963185
+412 0.032871 0.960602
+428 0.031797 0.96041
+429 0.029779 0.962815
+SURF 0X10
+mat 0
+refs 4
+406 0.040228 0.967516
+405 0.038623 0.970719
+421 0.037124 0.96981
+422 0.038615 0.966832
+SURF 0X10
+mat 0
+refs 4
+414 0.029126 0.966328
+413 0.030702 0.963185
+429 0.029779 0.962815
+430 0.028313 0.965739
+SURF 0X10
+mat 0
+refs 4
+407 0.04097 0.964225
+406 0.040228 0.967516
+422 0.038615 0.966832
+423 0.039308 0.963775
+SURF 0X10
+mat 0
+refs 4
+400 0.028574 0.972413
+399 0.028379 0.969564
+415 0.027616 0.96875
+416 0.027796 0.971399
+SURF 0X10
+mat 0
+refs 4
+399 0.028379 0.969564
+414 0.029126 0.966328
+430 0.028313 0.965739
+415 0.027616 0.96875
+SURF 0X10
+mat 0
+refs 4
+408 0.040738 0.96136
+407 0.04097 0.964225
+423 0.039308 0.963775
+424 0.039096 0.961113
+SURF 0X10
+mat 0
+refs 4
+401 0.02969 0.974445
+400 0.028574 0.972413
+416 0.027796 0.971399
+417 0.028831 0.973285
+SURF 0X10
+mat 0
+refs 16
+416 0.027796 0.971399
+415 0.027616 0.96875
+430 0.028313 0.965739
+429 0.029779 0.962815
+428 0.031797 0.96041
+427 0.034068 0.958886
+426 0.036253 0.958477
+425 0.03802 0.959255
+424 0.039096 0.961113
+423 0.039308 0.963775
+422 0.038615 0.966832
+421 0.037124 0.96981
+420 0.035065 0.972242
+419 0.032762 0.973753
+418 0.030573 0.974116
+417 0.028831 0.973285
+SURF 0X0
+mat 0
+refs 4
+442 0.096659 0.915708
+440 0.049105 0.937272
+444 0.050983 0.938374
+446 0.098495 0.916945
+SURF 0X0
+mat 0
+refs 4
+433 0.104763 0.937395
+434 0.105474 0.918839
+438 0.097996 0.913762
+437 0.097173 0.932499
+SURF 0X0
+mat 0
+refs 4
+436 0.048075 0.936478
+435 0.046657 0.954391
+439 0.047908 0.952553
+440 0.049105 0.937272
+SURF 0X0
+mat 0
+refs 4
+435 0.046657 0.954391
+436 0.048075 0.936478
+432 0.055736 0.940979
+431 0.054434 0.958724
+SURF 0X0
+mat 0
+refs 4
+433 0.104763 0.937395
+437 0.097173 0.932499
+435 0.046657 0.954391
+431 0.054434 0.958724
+SURF 0X0
+mat 0
+refs 4
+438 0.097996 0.913762
+434 0.105474 0.918839
+432 0.055736 0.940979
+436 0.048075 0.936478
+SURF 0X0
+mat 0
+refs 4
+435 0.046657 0.954391
+437 0.097173 0.932499
+441 0.095944 0.931658
+439 0.047908 0.952553
+SURF 0X0
+mat 0
+refs 4
+438 0.097996 0.913762
+436 0.048075 0.936478
+440 0.049105 0.937272
+442 0.096659 0.915708
+SURF 0X0
+mat 0
+refs 4
+437 0.097173 0.932499
+438 0.097996 0.913762
+442 0.096659 0.915708
+441 0.095944 0.931658
+SURF 0X0
+mat 0
+refs 4
+445 0.097803 0.932857
+446 0.098495 0.916945
+444 0.050983 0.938374
+443 0.04981 0.95362
+SURF 0X0
+mat 0
+refs 4
+441 0.095944 0.931658
+442 0.096659 0.915708
+446 0.098495 0.916945
+445 0.097803 0.932857
+SURF 0X0
+mat 0
+refs 4
+440 0.049105 0.937272
+439 0.047908 0.952553
+443 0.04981 0.95362
+444 0.050983 0.938374
+SURF 0X0
+mat 0
+refs 4
+439 0.047908 0.952553
+441 0.095944 0.931658
+445 0.097803 0.932857
+443 0.04981 0.95362
+kids 0
diff --git a/Aircraft/Instruments-3d/ar-6201/ar-6201.png b/Aircraft/Instruments-3d/ar-6201/ar-6201.png
index dbc160601..916043e86 100644
Binary files a/Aircraft/Instruments-3d/ar-6201/ar-6201.png and b/Aircraft/Instruments-3d/ar-6201/ar-6201.png differ
diff --git a/Aircraft/Instruments-3d/ar-6201/src/ar-6201.xcf b/Aircraft/Instruments-3d/ar-6201/src/ar-6201.xcf
index 16f54ae1e..7622785c3 100644
Binary files a/Aircraft/Instruments-3d/ar-6201/src/ar-6201.xcf and b/Aircraft/Instruments-3d/ar-6201/src/ar-6201.xcf differ
diff --git a/Effects/galaxy.eff b/Effects/galaxy.eff
new file mode 100644
index 000000000..b4d444a67
--- /dev/null
+++ b/Effects/galaxy.eff
@@ -0,0 +1,168 @@
+
+
+
+ Effects/galaxy
+
+
+
+
+
+
+
+
+
+
+
+
+ -50.0
+
+
+
+
+
+
+
+
+
+
+
+ /sim/rendering/shader-effects
+
+ 3.0
+ /sim/rendering/shaders/quality-level
+
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+
+
+
+
+
+
+
+ Shaders/galaxy.vert
+ Shaders/filters-ALS.vert
+ Shaders/galaxy.frag
+ Shaders/noise.frag
+ Shaders/filters-ALS.frag
+
+
+
+
+ milkyway
+ sampler-2d
+ 0
+
+
+
+
+
+ gamma
+ float
+
+
+
+ brightness
+ float
+
+
+
+ use_filtering
+ bool
+
+
+
+ use_night_vision
+ bool
+
+
+
+ delta_T
+ float
+
+
+
+ fact_grey
+ float
+
+
+
+ fact_black
+ float
+
+
+
+ use_IR_vision
+ bool
+
+
+
+
+ field_of_view
+ float
+
+
+
+ display_xsize
+ int
+
+
+
+ display_ysize
+ int
+
+
+
+ moonlight
+ float
+
+
+
+ mudarksky
+ float
+
+
+
+ mugxybulge
+ float
+
+
+
+ altitude
+ float
+
+
+
+ atmosphere_top
+ float
+
+
+
+
+
+
+
+
+
+
+
+
+ hdr-geometry
+
+
diff --git a/Effects/marker-pin.eff b/Effects/marker-pin.eff
new file mode 100644
index 000000000..22707ea34
--- /dev/null
+++ b/Effects/marker-pin.eff
@@ -0,0 +1,32 @@
+
+
+ Effects/marker-pin
+
+
+
+
+
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+
+
+ back
+
+
+ Shaders/marker-pin.vert
+ Shaders/marker-pin.frag
+
+
+
+
+
diff --git a/Effects/model-combined-transparent.eff b/Effects/model-combined-transparent.eff
index 06d55d2d3..cde96d51f 100644
--- a/Effects/model-combined-transparent.eff
+++ b/Effects/model-combined-transparent.eff
@@ -5,5 +5,5 @@ It's kept for backwards compatibility and should not be used on new projects.
-->
Effects/model-combined-transparent
- Effects/model-transparent
+ Effects/model-combined
diff --git a/Effects/ws30-overlay.eff b/Effects/ws30-overlay.eff
new file mode 100644
index 000000000..3f72a4fc3
--- /dev/null
+++ b/Effects/ws30-overlay.eff
@@ -0,0 +1,967 @@
+
+
+
+ Effects/ws30-overlay
+ Effects/ws30
+
+
+
+
+
+ Textures/Terrain/mixedforest-hires.png
+ 2d
+ nearest-mipmap-nearest
+ nearest
+ repeat
+ repeat
+ normalized
+
+
+
+
+ Textures/Terrain/grass_hires.png
+ 2d
+ nearest-mipmap-nearest
+ nearest
+ repeat
+ repeat
+ normalized
+
+
+ 1.5
+ 1.0
+ 1.0
+ 0.5
+ 0.5
+ 0.5
+ 0.5
+ 0.8
+ 0.5
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+ /sim/rendering/shaders/skydome
+
+
+ 6.0
+ /sim/rendering/shaders/landmass
+
+
+ 6.0
+ /sim/rendering/shaders/transition
+
+
+ 1.0
+ /sim/rendering/shaders/vegetation-effects
+
+
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+ GL_EXT_geometry_shader4
+
+
+
+
+ true
+
+
+
+
+
+
+ ambient-and-diffuse
+
+
+
+ smooth
+ back
+
+
+
+
+
+
+
+
+ 1
+
+ nearest-mipmap-nearest
+ nearest-mipmap-nearest
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ Shaders/ws30-ALS-ultra.vert
+ Shaders/filters-ALS.vert
+ Shaders/shadows-include.vert
+ Shaders/ws30-ALS-ultra.frag
+ Shaders/ws30-ALS-landclass-search-functions.frag
+ Shaders/noise.frag
+ Shaders/cloud-shadowfunc.frag
+ Shaders/hazes.frag
+ Shaders/secondary_lights.frag
+ Shaders/filters-ALS.frag
+ Shaders/shadows-include.frag
+ Shaders/clustered-include.frag
+
+
+ quality_level
+ int
+
+
+
+ grain_strength
+ float
+
+
+
+ intrinsic_wetness
+ float
+
+
+
+ transition_model
+ float
+
+
+
+ hires_overlay_bias
+ float
+
+
+
+ dot_density
+ float
+
+
+
+ dot_size
+ float
+
+
+
+ dust_resistance
+ float
+
+
+
+ visibility
+ float
+
+
+
+ avisibility
+ float
+
+
+
+ hazeLayerAltitude
+ float
+
+
+
+ scattering
+ float
+
+
+
+ ground_scattering
+ float
+
+
+
+ terminator
+ float
+
+
+
+ terrain_alt
+ float
+
+
+
+ overcast
+ float
+
+
+
+ eye_alt
+ float
+
+
+
+ eye_lat
+ float
+
+
+
+ eye_lon
+ float
+
+
+
+ snowlevel
+ float
+
+
+
+ snow_thickness_factor
+ float
+
+
+
+ dust_cover_factor
+ float
+
+
+
+ lichen_cover_factor
+ float
+
+
+
+ wetness
+ float
+
+
+
+ fogstructure
+ float
+
+
+
+ cloud_self_shading
+ float
+
+
+
+ moonlight
+ float
+
+
+
+ season
+ float
+
+
+
+ air_pollution
+ float
+
+
+
+
+ view_pitch_offset
+ float
+
+
+
+ view_heading_offset
+ float
+
+
+
+ field_of_view
+ float
+
+
+
+ landing_light1_offset
+ float
+
+
+
+ landing_light2_offset
+ float
+
+
+
+ landing_light3_offset
+ float
+
+
+
+
+ gamma
+ float
+
+
+
+ brightness
+ float
+
+
+
+ use_night_vision
+ bool
+
+
+
+ use_IR_vision
+ bool
+
+
+
+ use_filtering
+ bool
+
+
+
+ delta_T
+ float
+
+
+
+ fact_grey
+ float
+
+
+
+ fact_black
+ float
+
+
+
+
+ cloudpos1_x
+ float
+
+
+
+ cloudpos1_y
+ float
+
+
+
+ cloudpos2_x
+ float
+
+
+
+ cloudpos2_y
+ float
+
+
+
+ cloudpos3_x
+ float
+
+
+
+ cloudpos3_y
+ float
+
+
+
+ cloudpos4_x
+ float
+
+
+
+ cloudpos4_y
+ float
+
+
+
+ cloudpos5_x
+ float
+
+
+
+ cloudpos5_y
+ float
+
+
+
+ cloudpos6_x
+ float
+
+
+
+ cloudpos6_y
+ float
+
+
+
+ cloudpos7_x
+ float
+
+
+
+ cloudpos7_y
+ float
+
+
+
+ cloudpos8_x
+ float
+
+
+
+ cloudpos8_y
+ float
+
+
+
+ cloudpos9_x
+ float
+
+
+
+ cloudpos9_y
+ float
+
+
+
+ cloudpos10_x
+ float
+
+
+
+ cloudpos10_y
+ float
+
+
+
+ cloudpos11_x
+ float
+
+
+
+ cloudpos11_y
+ float
+
+
+
+ cloudpos12_x
+ float
+
+
+
+ cloudpos12_y
+ float
+
+
+
+ cloudpos13_x
+ float
+
+
+
+ cloudpos13_y
+ float
+
+
+
+ cloudpos14_x
+ float
+
+
+
+ cloudpos14_y
+ float
+
+
+
+ cloudpos15_x
+ float
+
+
+
+ cloudpos15_y
+ float
+
+
+
+ cloudpos16_x
+ float
+
+
+
+ cloudpos16_y
+ float
+
+
+
+ cloudpos17_x
+ float
+
+
+
+ cloudpos17_y
+ float
+
+
+
+ cloudpos18_x
+ float
+
+
+
+ cloudpos18_y
+ float
+
+
+
+ cloudpos19_x
+ float
+
+
+
+ cloudpos19_y
+ float
+
+
+
+ cloudpos20_x
+ float
+
+
+
+ cloudpos20_y
+ float
+
+
+
+ WindE
+ float
+
+
+
+ WindN
+ float
+
+
+
+ use_searchlight
+ int
+
+
+
+ use_landing_light
+ int
+
+
+
+ use_alt_landing_light
+ int
+
+
+
+ display_xsize
+ int
+
+
+
+ display_ysize
+ int
+
+
+
+ wind_effects
+ int
+
+
+
+ cloud_shadow_flag
+ int
+
+
+
+ rock_strata
+ int
+
+
+
+ raise_vertex
+ bool
+
+
+
+ landclass
+ sampler-2d
+ 0
+
+
+ textureArray
+ sampler-2d
+ 1
+
+
+ perlin
+ sampler-2d
+ 6
+
+
+ swatch_size
+ int
+
+ 2000
+
+
+ colorMode
+ int
+ 2
+
+
+
+
+ shadow_tex
+ sampler-2d
+ 10
+
+
+ shadows_enabled
+ bool
+
+
+
+
+
+ sun_atlas_size
+ int
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+ ambient-and-diffuse
+
+
+ smooth
+
+
+ back
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ Shaders/ws30-overlay-ALS.vert
+ Shaders/ws30-overlay-ALS.geom
+ Shaders/terrain-overlay-ALS.frag
+ Shaders/noise.frag
+ Shaders/filters-ALS.frag
+ Shaders/cloud-shadowfunc.frag
+ Shaders/shadows-include.frag
+ 96
+ triangles
+ triangle-strip
+
+
+ overlayPrimaryTex
+ sampler-2d
+ 7
+
+
+ overlaySecondaryTex
+ sampler-2d
+ 8
+
+
+ visibility
+ float
+
+
+
+ avisibility
+ float
+
+
+
+ scattering
+ float
+
+
+
+ overlay_bias
+ float
+
+
+
+ overlay_max_height
+ float
+
+
+
+ overlay_hardness
+ float
+
+
+
+ overlay_secondary_hardness
+ float
+
+
+
+ overlay_density
+ float
+
+
+
+ overlay_secondary_density
+ float
+
+
+
+ overlay_scale
+ float
+
+
+
+ overlay_brightness_top
+ float
+
+
+
+ overlay_brightness_bottom
+ float
+
+
+
+ overlay_steepness_factor
+ float
+
+
+
+ season
+ float
+
+
+
+ dust_cover_factor
+ float
+
+
+
+ wetness
+ float
+
+
+
+ snowlevel
+ float
+
+
+
+ snow_thickness_factor
+ float
+
+
+
+
+
+ cloudpos_n_x
+ float
+
+
+
+ cloudpos_n_y
+ float
+
+
+
+
+
+
+ gamma
+ float
+
+
+
+ brightness
+ float
+
+
+
+ use_night_vision
+ bool
+
+
+
+ use_IR_vision
+ bool
+
+
+
+ use_filtering
+ bool
+
+
+
+ delta_T
+ float
+
+
+
+ fact_grey
+ float
+
+
+
+ fact_black
+ float
+
+
+
+
+ display_xsize
+ int
+
+
+
+ display_ysize
+ int
+
+
+
+ overlay_autumn_flag
+ int
+
+
+
+ overlay_secondary_flag
+ int
+
+
+
+ cloud_shadow_flag
+ int
+
+
+
+
+ shadow_tex
+ sampler-2d
+ 10
+
+
+ shadows_enabled
+ bool
+
+
+
+
+
+ sun_atlas_size
+ int
+
+
+
+
+
+
+
+ true
+
+ one-minus-src-alpha
+
+
+
+ false
+
+
+
+
diff --git a/Effects/ws30-railway.eff b/Effects/ws30-railway.eff
new file mode 100644
index 000000000..76b84d361
--- /dev/null
+++ b/Effects/ws30-railway.eff
@@ -0,0 +1,20 @@
+
+
+ Effects/ws30-railway
+ Effects/terrain-default
+
+ 0.8
+ 0.25
+
+
+
+
+
+
+ 2.0
+ 1.0
+
+
+
+
+
diff --git a/Effects/ws30-road-high.eff b/Effects/ws30-road-high.eff
new file mode 100644
index 000000000..b2ebc7f6d
--- /dev/null
+++ b/Effects/ws30-road-high.eff
@@ -0,0 +1,9 @@
+
+
+ Effects/ws30-road-high
+ Effects/ws30-road
+
+ 1.2
+ 3.0
+
+
diff --git a/Effects/ws30-road-mid.eff b/Effects/ws30-road-mid.eff
new file mode 100644
index 000000000..5bf054231
--- /dev/null
+++ b/Effects/ws30-road-mid.eff
@@ -0,0 +1,9 @@
+
+
+ Effects/ws30-road-mid
+ Effects/ws30-road
+
+ 0.8
+ 0.25
+
+
diff --git a/Effects/ws30-road.eff b/Effects/ws30-road.eff
new file mode 100644
index 000000000..81e235fb0
--- /dev/null
+++ b/Effects/ws30-road.eff
@@ -0,0 +1,813 @@
+
+
+ Effects/ws30-road
+ Effects/terrain-default
+
+
+
+ 0.2 .2 0.2 1.0
+
+
+ .8 .8 .8 1.0
+
+
+ 0.0 0.0 0.0 1.0
+
+
+ 0.0 0.0 0.0 1.0
+
+ 1.2
+ diffuse
+
+
+
+ Textures/osm2city/roads_LM.png
+ 2d
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Textures/Cars/cars.png
+ 2d
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Textures/Cars/cars-metadata.png
+ 2d
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+ 0
+ 50
+ 1
+ 0
+ 0.941 0.682 0.086
+
+
+
+
+
+
+
+
+
+
+ 6
+ 7
+
+
+
+
+
+ /sim/rendering/shaders/skydome
+ /sim/rendering/shaders/model
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Shaders/ws30-ALS-ultra.vert
+ Shaders/filters-ALS.vert
+ Shaders/shadows-include.vert
+ Shaders/road-ALS-ultra.frag
+ Shaders/cloud-shadowfunc.frag
+ Shaders/hazes.frag
+ Shaders/secondary_lights.frag
+ Shaders/noise.frag
+ Shaders/filters-ALS.frag
+ Shaders/shadows-include.frag
+ Shaders/clustered-include.frag
+
+ tangent
+ 6
+
+
+ binormal
+ 7
+
+
+ orthophotoTexCoord
+ 14
+
+
+
+
+
+ BaseTex
+ sampler-2d
+ 0
+
+
+
+ CarMetaTex
+ sampler-2d
+ 1
+
+
+
+ NormalTex
+ sampler-2d
+ 2
+
+
+
+ CarTex
+ sampler-2d
+ 3
+
+
+
+
+ road_traffic_enabled
+ int
+
+
+
+
+
+
+ road_traffic_density
+ float
+
+
+
+
+
+
+ road_traffic_variation
+ float
+
+
+
+
+
+
+ road_traffic_direction
+ int
+
+
+
+
+
+
+
+
+ streetlight_color
+ float-vec3
+
+
+
+
+
+
+ streetlight_factor
+ float
+
+
+
+
+
+
+
+
+ grain_texture_enabled
+ int
+
+
+
+
+
+
+ grain_magnification
+ float
+
+
+
+
+
+
+
+ rain_enabled
+ int
+
+
+
+
+
+
+ snowlevel
+ float
+
+
+
+
+ snow_thickness_factor
+ float
+
+
+
+
+
+ amb_correction
+ float
+
+
+
+
+
+
+ hdg
+ float
+
+
+
+
+
+
+ pitch
+ float
+
+
+
+
+
+
+ roll
+ float
+
+
+
+
+
+
+
+ visibility
+ float
+
+
+
+
+
+ avisibility
+ float
+
+
+
+
+
+ hazeLayerAltitude
+ float
+
+
+
+
+
+ scattering
+ float
+
+
+
+
+
+ terminator
+ float
+
+
+
+
+
+ ground_scattering
+ float
+
+
+
+
+
+ terminator
+ float
+
+
+
+
+
+ terrain_alt
+ float
+
+
+
+
+
+ overcast
+ float
+
+
+
+
+
+ eye_alt
+ float
+
+
+
+
+
+ cloud_self_shading
+ float
+
+
+
+ moonlight
+ float
+
+
+
+ air_pollution
+ float
+
+
+
+ rain_norm
+ float
+
+
+
+ wetness
+ float
+
+
+
+ view_pitch_offset
+ float
+
+
+
+ view_heading_offset
+ float
+
+
+
+ field_of_view
+ float
+
+
+
+ landing_light1_offset
+ float
+
+
+
+ landing_light2_offset
+ float
+
+
+
+ landing_light3_offset
+ float
+
+
+
+ gamma
+ float
+
+
+
+ brightness
+ float
+
+
+
+ use_filtering
+ bool
+
+
+
+ use_night_vision
+ bool
+
+
+
+ use_IR_vision
+ bool
+
+
+
+ delta_T
+ float
+
+
+
+ fact_grey
+ float
+
+
+
+ fact_black
+ float
+
+
+
+
+
+ cloudpos1_x
+ float
+
+
+
+ cloudpos1_y
+ float
+
+
+
+ cloudpos2_x
+ float
+
+
+
+ cloudpos2_y
+ float
+
+
+
+ cloudpos3_x
+ float
+
+
+
+ cloudpos3_y
+ float
+
+
+
+ cloudpos4_x
+ float
+
+
+
+ cloudpos4_y
+ float
+
+
+
+ cloudpos5_x
+ float
+
+
+
+ cloudpos5_y
+ float
+
+
+
+ cloudpos6_x
+ float
+
+
+
+ cloudpos6_y
+ float
+
+
+
+ cloudpos7_x
+ float
+
+
+
+ cloudpos7_y
+ float
+
+
+
+ cloudpos8_x
+ float
+
+
+
+ cloudpos8_y
+ float
+
+
+
+ cloudpos9_x
+ float
+
+
+
+ cloudpos9_y
+ float
+
+
+
+ cloudpos10_x
+ float
+
+
+
+ cloudpos10_y
+ float
+
+
+
+ cloudpos11_x
+ float
+
+
+
+ cloudpos11_y
+ float
+
+
+
+ cloudpos12_x
+ float
+
+
+
+ cloudpos12_y
+ float
+
+
+
+ cloudpos13_x
+ float
+
+
+
+ cloudpos13_y
+ float
+
+
+
+ cloudpos14_x
+ float
+
+
+
+ cloudpos14_y
+ float
+
+
+
+ cloudpos15_x
+ float
+
+
+
+ cloudpos15_y
+ float
+
+
+
+ cloudpos16_x
+ float
+
+
+
+ cloudpos16_y
+ float
+
+
+
+ cloudpos17_x
+ float
+
+
+
+ cloudpos17_y
+ float
+
+
+
+ cloudpos18_x
+ float
+
+
+
+ cloudpos18_y
+ float
+
+
+
+ cloudpos19_x
+ float
+
+
+
+ cloudpos19_y
+ float
+
+
+
+ cloudpos20_x
+ float
+
+
+
+ cloudpos20_y
+ float
+
+
+
+ cloud_shadow_flag
+ int
+
+
+
+ use_searchlight
+ int
+
+
+
+ use_landing_light
+ int
+
+
+
+ use_alt_landing_light
+ int
+
+
+
+ display_xsize
+ int
+
+
+
+ display_ysize
+ int
+
+
+
+
+
+ shadow_tex
+ sampler-2d
+ 10
+
+
+ shadows_enabled
+ bool
+
+
+
+
+
+ sun_atlas_size
+ int
+
+
+
+
+
+
+
+
+
diff --git a/Effects/ws30.eff b/Effects/ws30.eff
index fee8ac9bd..898b2315d 100644
--- a/Effects/ws30.eff
+++ b/Effects/ws30.eff
@@ -5,28 +5,28 @@
- 0.2 .2 0.2 1.0
-
+ 0.2 .2 0.2 1.0
+
- .8 .8 .8 1.0
-
+ .8 .8 .8 1.0
+
- 0.0 0.0 0.0 1.0
-
+ 0.0 0.0 0.0 1.0
+
- 0.0 0.0 0.0 1.0
-
+ 0.0 0.0 0.0 1.0
+
1.2
-
- Textures/perlin.png
- 2d
- nearest
- repeat
- repeat
- normalized
-
+
+ Textures/perlin.png
+ 2d
+ nearest
+ repeat
+ repeat
+ normalized
+
Textures/Terrain/snow3.png
@@ -107,6 +107,16 @@
+
+
+
+
+
+
+
+
+
+
-
+
+
@@ -285,6 +299,7 @@
Shaders/shadows-include.vert
Shaders/ws30-ALS-ultra.frag
Shaders/ws30-ALS-landclass-search-functions.frag
+ Shaders/ws30-water.frag
Shaders/noise.frag
Shaders/cloud-shadowfunc.frag
Shaders/hazes.frag
@@ -293,6 +308,11 @@
Shaders/shadows-include.frag
Shaders/clustered-include.frag
+
+ quality_level
+ int
+
+
visibility
float
@@ -338,12 +358,12 @@
float
-
+
eye_lat
float
-
+
eye_lon
float
@@ -354,9 +374,9 @@
- snow_thickness_factor
- float
-
+ snow_thickness_factor
+ float
+
dust_cover_factor
@@ -364,9 +384,9 @@
- lichen_cover_factor
- float
-
+ lichen_cover_factor
+ float
+
wetness
@@ -481,220 +501,294 @@
float
-
+
cloudpos2_x
float
-
+
cloudpos2_y
float
-
+
cloudpos3_x
float
-
+
cloudpos3_y
float
-
+
cloudpos4_x
float
-
+
cloudpos4_y
float
-
+
cloudpos5_x
float
-
+
cloudpos5_y
float
-
+
cloudpos6_x
float
-
+
cloudpos6_y
float
-
+
cloudpos7_x
float
-
+
cloudpos7_y
float
-
+
cloudpos8_x
float
-
+
cloudpos8_y
float
-
+
cloudpos9_x
float
-
+
cloudpos9_y
float
-
+
cloudpos10_x
float
-
+
cloudpos10_y
float
-
+
cloudpos11_x
float
-
+
cloudpos11_y
float
-
+
cloudpos12_x
float
-
+
cloudpos12_y
float
-
+
cloudpos13_x
float
-
+
cloudpos13_y
float
-
+
cloudpos14_x
float
-
+
cloudpos14_y
float
-
+
cloudpos15_x
float
-
+
cloudpos15_y
float
-
+
cloudpos16_x
float
-
+
cloudpos16_y
float
-
+
cloudpos17_x
float
-
+
cloudpos17_y
float
-
+
cloudpos18_x
float
-
+
cloudpos18_y
float
-
+
cloudpos19_x
float
-
+
cloudpos19_y
float
-
+
cloudpos20_x
float
-
+
cloudpos20_y
float
+
+ saturation
+ float
+
+
- WindE
- float
-
+ WindE
+ float
+
- WindN
- float
-
+ WindN
+ float
+
- use_searchlight
- int
-
+ WaveFreq
+ float
+
+
+
- use_landing_light
- int
-
+ WaveAmp
+ float
+
+
+
- use_alt_landing_light
- int
-
+ WaveSharp
+ float
+
+
+
+
+
+ WaveAngle
+ float
+
+
+
+
+
+ WaveFactor
+ float
+
+
+
+
+
+ WaveDAngle
+ float
+
+
+
+
+
+
+ sea_r
+ float
+
+
+
+
+
+ sea_g
+ float
+
+
+
+
+
+ sea_b
+ float
+
+
+
+
+
+ ocean_flag
+ int
+
+
+
+ use_searchlight
+ int
+
+
+
+ use_landing_light
+ int
+
+
+
+ use_alt_landing_light
+ int
+
display_xsize
@@ -717,9 +811,9 @@
- raise_vertex
- bool
-
+ raise_vertex
+ bool
+
landclass
@@ -882,6 +976,7 @@
Shaders/shadows-include.vert
Shaders/ws30-ALS-detailed.frag
Shaders/ws30-ALS-landclass-search-functions.frag
+ Shaders/ws30-water.frag
Shaders/noise.frag
Shaders/hazes.frag
Shaders/filters-ALS.frag
@@ -939,9 +1034,9 @@
- snow_thickness_factor
- float
-
+ snow_thickness_factor
+ float
+
dust_cover_factor
@@ -949,9 +1044,9 @@
- lichen_cover_factor
- float
-
+ lichen_cover_factor
+ float
+
wetness
@@ -983,7 +1078,94 @@
float
-
+
+ saturation
+ float
+
+
+
+ WindE
+ float
+
+
+
+
+
+ WindN
+ float
+
+
+
+
+
+ WaveFreq
+ float
+
+
+
+
+
+ WaveAmp
+ float
+
+
+
+
+
+ WaveSharp
+ float
+
+
+
+
+
+ WaveAngle
+ float
+
+
+
+
+
+ WaveFactor
+ float
+
+
+
+
+
+ WaveDAngle
+ float
+
+
+
+
+
+
+ sea_r
+ float
+
+
+
+
+
+ sea_g
+ float
+
+
+
+
+
+ sea_b
+ float
+
+
+
+
+
+ ocean_flag
+ int
+
+
gamma
float
@@ -1182,12 +1364,23 @@
Shaders/shadows-include.vert
Shaders/ws30-ALS.frag
Shaders/ws30-ALS-landclass-search-functions.frag
+ Shaders/ws30-water.frag
Shaders/hazes.frag
Shaders/noise.frag
Shaders/filters-ALS.frag
Shaders/shadows-include.frag
Shaders/clustered-include.frag
+
+ tquality_level
+ int
+
+
+
+ cloud_self_shading
+ float
+
+
visibility
float
@@ -1248,6 +1441,94 @@
float
+
+ saturation
+ float
+
+
+
+ WindE
+ float
+
+
+
+
+
+ WindN
+ float
+
+
+
+
+
+ WaveFreq
+ float
+
+
+
+
+
+ WaveAmp
+ float
+
+
+
+
+
+ WaveSharp
+ float
+
+
+
+
+
+ WaveAngle
+ float
+
+
+
+
+
+ WaveFactor
+ float
+
+
+
+
+
+ WaveDAngle
+ float
+
+
+
+
+
+
+ sea_r
+ float
+
+
+
+
+
+ sea_g
+ float
+
+
+
+
+
+ sea_b
+ float
+
+
+
+
+
+ ocean_flag
+ int
+
+
gamma
@@ -1421,7 +1702,7 @@
Shaders/include_fog.vert
Shaders/shadows-include.vert
Shaders/ws30.vert
- Shaders/include_fog.frag
+ Shaders/include_fog.frag
Shaders/ws30-q1.frag
Shaders/shadows-include.frag
Shaders/clustered-include.frag
@@ -1515,7 +1796,7 @@
Shaders/include_fog.vert
Shaders/shadows-include.vert
Shaders/ws30.vert
- Shaders/include_fog.frag
+ Shaders/include_fog.frag
Shaders/ws30.frag
Shaders/shadows-include.frag
Shaders/clustered-include.frag
diff --git a/Environment/environment.xml b/Environment/environment.xml
index a48fa2bba..43b58c35c 100644
--- a/Environment/environment.xml
+++ b/Environment/environment.xml
@@ -486,6 +486,7 @@
0.0
0.0
1.0
+ false
0.0
0.0
0.0
@@ -531,5 +532,7 @@
- 4.5
+ 22.0
+ 20.3
+
diff --git a/Geodata/README.koppen b/Geodata/README.koppen
index 50c3d84b4..2cb3686f9 100644
--- a/Geodata/README.koppen
+++ b/Geodata/README.koppen
@@ -6,9 +6,13 @@ Download: http://koeppen-geiger.vu-wien.ac.at/Rcode/Map_KG-Global.zip
World terrain elevation data:
https://visibleearth.nasa.gov/images/73934/topography
+Total precipitations per annum, over land:
+https://commons.wikimedia.org/wiki/File:World_precip_annual.png
+
The red channel of the image contans the Köppen-Geiger code.
The green channel of the image contains the world elevation map.
+The blue channel of the image contains annual precipitation.
ASICII
CODE description
diff --git a/Geodata/koppen-geiger.png b/Geodata/koppen-geiger.png
index f73a9d7aa..0563e80e0 100644
Binary files a/Geodata/koppen-geiger.png and b/Geodata/koppen-geiger.png differ
diff --git a/Materials/base/materials-base.xml b/Materials/base/materials-base.xml
index 57da4c70c..76d12b3ab 100644
--- a/Materials/base/materials-base.xml
+++ b/Materials/base/materials-base.xml
@@ -635,7 +635,7 @@
ws30Road
osm2city/roads.png
-
+ Effects/ws30-road-mid
0.25
0.375
0.75
@@ -663,7 +663,7 @@
ws30Freeway
osm2city/roads.png
- Effects/terrain-default
+ Effects/ws30-road-high
0.625
0.75
1.0
@@ -725,7 +725,7 @@
ws30Railway
osm2city/roads.png
- Effects/terrain-default
+ Effects/ws30-railway
0
0.125
0.5
diff --git a/Materials/default/global-summer.xml b/Materials/default/global-summer.xml
index cce38c3c1..e5ef84493 100644
--- a/Materials/default/global-summer.xml
+++ b/Materials/default/global-summer.xml
@@ -278,7 +278,13 @@
Estuary
Watercourse
Saline
- Terrain/water-lake.png
+
+ Terrain/water-lake.png
+ Terrain/frozen_lake.png
+
+
+
+
400
400
@@ -300,7 +306,7 @@
1.0
1.2
- 0
+ /environment/surface/ice-cover
1.5
0.6
diff --git a/Materials/regions/europe.xml b/Materials/regions/europe.xml
index 09f2a4fa4..736cac277 100644
--- a/Materials/regions/europe.xml
+++ b/Materials/regions/europe.xml
@@ -157,9 +157,9 @@
Terrain/irrcrop.png
Terrain/irrcrop.mask.png
- 0
- 8000.0
-
+ 0
+ 8000.0
+
3000
3000
1
@@ -185,6 +185,7 @@
0
8000.0
+ 0.5
2000
2000
@@ -250,6 +251,9 @@
8
15.0
10.0
+
+ 0.8
+
@@ -271,6 +275,7 @@
1
0.2
-1.0
+ 0.8
1024
1024
@@ -331,6 +336,9 @@
8
15.0
10.0
+
+ 0.9
+
@@ -408,6 +416,9 @@
8
20.0
12.0
+
+ 0.1
+
@@ -434,6 +445,9 @@
8
20.0
12.0
+
+ 0.1
+
@@ -516,6 +530,7 @@
1
1.4
0.6
+ 0.8
2000
2000
@@ -550,6 +565,7 @@
1
1.4
0.6
+ 0.8
2000
2000
diff --git a/Materials/regions/global-summer.xml b/Materials/regions/global-summer.xml
index a9f493fab..dd704b892 100644
--- a/Materials/regions/global-summer.xml
+++ b/Materials/regions/global-summer.xml
@@ -96,6 +96,9 @@
15.0
1
1
+
+ 0.8
+
@@ -115,6 +118,9 @@
15.0
1
0.85
+
+ 0.8
+
@@ -133,6 +139,9 @@
15.0
1
0.95
+
+ 0.8
+
@@ -152,6 +161,9 @@
18.0
1
1
+
+ 0.9
+
@@ -169,6 +181,9 @@
15.0
1
1
+
+ 0.9
+
@@ -185,6 +200,9 @@
8.0
1
1
+
+ 0.8
+
@@ -291,6 +309,9 @@
8
25.0
15.0
+
+ 0.8
+
@@ -312,6 +333,9 @@
1.0
+
+ 0.8
+
@@ -339,6 +363,9 @@
1.0
+
+ 0.9
+
@@ -370,6 +397,9 @@
8
12.0
7.0
+
+ 0.7
+
@@ -389,6 +419,9 @@
Ocean
Effects/water
Terrain/water.png
+
+ 0.8
+
@@ -420,6 +453,9 @@
0
1.5
0.6
+
+ 0.8
+
@@ -431,7 +467,14 @@
Estuary
Watercourse
Saline
- Terrain/water-lake.png
+
+ Terrain/water-lake.png
+ Terrain/frozen_lake.png
+
+
+
+ 0.8
+
400
400
@@ -453,7 +496,7 @@
1.0
1.2
- 0
+ /environment/surface/ice-cover
1.5
0.6
@@ -670,6 +713,9 @@
8
20.0
12.0
+
+ 0.7
+
@@ -701,6 +747,9 @@
8
20.0
12.0
+
+ 0.8
+
@@ -730,6 +779,9 @@
8
20.0
12.0
+
+ 0.8
+
@@ -854,6 +906,9 @@
8
20.0
12.0
+
+ 0.7
+
@@ -876,6 +931,9 @@
8
20.0
12.0
+
+ 0.8
+
diff --git a/Nasal/canvas/map/APS.symbol b/Nasal/canvas/map/APS.symbol
index e54f4639d..46c54a8d4 100644
--- a/Nasal/canvas/map/APS.symbol
+++ b/Nasal/canvas/map/APS.symbol
@@ -5,7 +5,7 @@ var parents = [SVGSymbol];
var __self__ = caller(0)[0];
DotSym.makeinstance( name, __self__ );
-var svg_path = "Nasal/canvas/map/Images/boeingAirplane.svg";
+var svg_path = "Nasal/canvas/map/Images/outlinedAirplane.svg";
var element_id = "airplane";
# Rotate with the main aircraft.
diff --git a/Nasal/canvas/map/Images/outlinedAirplane.svg b/Nasal/canvas/map/Images/outlinedAirplane.svg
new file mode 100644
index 000000000..e51b6db1c
--- /dev/null
+++ b/Nasal/canvas/map/Images/outlinedAirplane.svg
@@ -0,0 +1,86 @@
+
+
+
+
diff --git a/Nasal/canvas/map/RTE.lcontroller b/Nasal/canvas/map/RTE.lcontroller
index 2c5f12507..a5d250fc4 100644
--- a/Nasal/canvas/map/RTE.lcontroller
+++ b/Nasal/canvas/map/RTE.lcontroller
@@ -25,7 +25,7 @@ var new = func(layer) {
map: layer.map,
listeners: [],
};
- layer.searcher._equals = func(l,r) 0; # TODO: create model objects instead?
+ layer.searcher._equals = func(l,r) return (l == r);
append(m.listeners, setlistener(layer.options.active_node, func m.layer.update() ),
setlistener(layer.options.wp_num, func m.layer.update() ));
diff --git a/Nasal/geo.nas b/Nasal/geo.nas
index 6426acb8b..f65712e0f 100644
--- a/Nasal/geo.nas
+++ b/Nasal/geo.nas
@@ -330,11 +330,20 @@ var tile_path = func(lat, lon) {
var put_model = func(path, c, arg...) {
- call(_put_model, [path] ~ (isa(c, Coord) ? c.latlon() : [c]) ~ arg);
+ call(_put_model, [path, nil] ~ (isa(c, Coord) ? c.latlon() : [c]) ~ arg);
+}
+
+var put_marker = func(label, c, arg...) {
+ if (isa(c, Coord)) {
+ call(_put_marker, [label] ~ c.latlon() ~ arg);
+ }
+ else {
+ call(_put_marker, [label, c] ~ arg);
+ }
}
-var _put_model = func(path, lat, lon, elev_m = nil, hdg = 0, pitch = 0, roll = 0) {
+var _put_model = func(path, label, lat, lon, elev_m = nil, hdg = 0, pitch = 0, roll = 0) {
if (elev_m == nil)
elev_m = elevation(lat, lon);
if (elev_m == nil)
@@ -346,6 +355,42 @@ var _put_model = func(path, lat, lon, elev_m = nil, hdg = 0, pitch = 0, roll = 0
return props.globals.getNode(n.getNode("property").getValue());
}
+var _put_marker = func(label, lat, lon, elev = nil, color = nil, text_height_m = 1, pin_height_m = 1000, pin_tip_height_m = 0) {
+ params = {
+ "internal-model": "marker",
+ "heading-deg": 0, "pitch-deg": 0, "roll-deg": 0,
+ "marker": {
+ "text": label,
+ "color": color,
+ "size": text_height_m,
+ "height": pin_height_m,
+ "tip-height": pin_tip_height_m,
+ },
+ };
+ if (isnum(lat)) {
+ params['latitude-deg'] = lat;
+ }
+ elsif (isscalar(lat)) {
+ params['latitude-deg-prop'] = lat;
+ }
+ if (isnum(lon)) {
+ params['longitude-deg'] = lon;
+ }
+ elsif (isscalar(lon)) {
+ params['longitude-deg-prop'] = lon;
+ }
+ if (isnum(elev)) {
+ params['elevation-ft'] = elev;
+ }
+ elsif (isscalar(elev)) {
+ params['elevation-ft-prop'] = elev;
+ }
+ if (color == nil)
+ color = [1, 1, 1];
+ fgcommand("add-model", var n = props.Node.new(params));
+ return props.globals.getNode(n.getNode("property").getValue());
+}
+
var elevation = func(lat, lon, maxalt = 10000) {
var d = geodinfo(lat, lon, maxalt);
diff --git a/Nasal/loadpriority.xml b/Nasal/loadpriority.xml
index 8207fa881..4a04a300d 100644
--- a/Nasal/loadpriority.xml
+++ b/Nasal/loadpriority.xml
@@ -56,4 +56,5 @@ geo.nas <- view.nas
multiplayer.nas
geo.nas
view.nas
+ markerpins.nas
diff --git a/Nasal/markerpins.nas b/Nasal/markerpins.nas
new file mode 100644
index 000000000..6d7cde5de
--- /dev/null
+++ b/Nasal/markerpins.nas
@@ -0,0 +1,215 @@
+var pin_update_timer = nil;
+
+var navPins = {};
+var poiPins = {};
+var trafficPins = {};
+var trafficAddListener = nil;
+var trafficRemoveListener = nil;
+
+var enabled = {
+ master: 0,
+ airports: 0,
+ navaids: 0,
+ fixes: 0,
+ pois: 0,
+ traffic: 0,
+ };
+
+var update_pins = func () {
+ var navs = [];
+ if (enabled.master) {
+ if (enabled.airports) {
+ airports = findAirportsWithinRange(50);
+ navs = navs ~ airports;
+ }
+ if (enabled.navaids) {
+ navaids = findNavaidsWithinRange(50, "vor") ~
+ findNavaidsWithinRange(50, "ndb") ~
+ findNavaidsWithinRange(20, "ils") ~
+ findNavaidsWithinRange(20, "loc");
+ navs = navs ~ navaids;
+ }
+ if (enabled.fixes) {
+ # navaids = findNavaidsWithinRange(50, "fix");
+ # navs = navs ~ navaids;
+ }
+ if (enabled.pois) {
+ navaids = findNavaidsWithinRange(50, "city") ~
+ findNavaidsWithinRange(15, "town") ~
+ findNavaidsWithinRange(5, "village");
+ navs = navs ~ navaids;
+ }
+ }
+
+ foreach (var k; keys(navPins)) {
+ navPins[k].alive = 0;
+ }
+ foreach (var nav; navs) {
+ var pin = navPins[nav.id];
+ if (pin == nil) {
+ var color = [1, 1, 1];
+ var height = 600;
+ var fsize = 128;
+ var elevation = nav.elevation;
+ if (elevation == nil or elevation == 0) {
+ elevation = geo.elevation(nav.lat, nav.lon);
+ }
+ if (elevation == nil) {
+ continue;
+ }
+ elevation = elevation * M2FT;
+ if (ghosttype(nav) == "airport") {
+ color = [1, 0, 0];
+ fsize = 256;
+ height = 1200;
+ }
+ else {
+ if (nav.type == "VOR") {
+ color = [0, 0.5, 1];
+ fsize = 160;
+ height = 900;
+ }
+ elsif (nav.type == "NDB") {
+ color = [0.5, 0.25, 0];
+ fsize = 128;
+ height = 700;
+ }
+ elsif (nav.type == "LOC" or nav.type == "ILS") {
+ color = [0, 1, 1];
+ fsize = 32;
+ height = 50;
+ }
+ elsif (nav.type == "FIX") {
+ color = [1, 1, 0];
+ fsize = 64;
+ height = 900;
+ }
+ elsif (nav.type == "city") {
+ color = [1, 1, 1];
+ fsize = 256;
+ height = 600;
+ }
+ elsif (nav.type == "town") {
+ color = [1, 1, 1];
+ fsize = 128;
+ height = 300;
+ }
+ elsif (nav.type == "village") {
+ color = [1, 1, 1];
+ fsize = 64;
+ height = 150;
+ }
+ }
+ pin = {
+ marker: geo.put_marker(nav.id, nav.lat, nav.lon, elevation, color, fsize, height),
+ };
+ navPins[nav.id] = pin;
+ }
+ navPins[nav.id].alive = 1;
+ }
+ foreach (var k; keys(navPins)) {
+ if (!navPins[k].alive) {
+ navPins[k].marker.remove();
+ delete(navPins, k);
+ }
+ }
+};
+
+var toggleTrafficPins = func (node) {
+ if (node.getBoolValue()) {
+ # turn on
+ print("Traffic pins on");
+ var modelsNode = props.getNode('/ai/models');
+ var nodes = modelsNode.getChildren('multiplayer') ~
+ modelsNode.getChildren('swift') ~
+ modelsNode.getChildren('aircraft');
+ foreach (var k; keys(trafficPins)) {
+ trafficPins[k].alive = 0;
+ }
+ var addTraffic = func (node, retry=3) {
+ var nodeID = node.getName() ~ ':' ~ node.getIndex();
+ var callsign = node.getValue('callsign');
+ printf("Adding traffic: %s [%s]", nodeID, node.getValue('callsign'));
+ if (callsign == nil) {
+ if (retry > 0) {
+ # try again in 1 second
+ settimer(func { addTraffic(node, retry-1); }, 1);
+ }
+ else {
+ printf("Giving up on %s", nodeID);
+ }
+ }
+ else {
+ var pin = trafficPins[nodeID];
+ if (pin == nil) {
+ var elev_prop = node.getPath() ~ '/position/altitude-ft';
+ var lat_prop = node.getPath() ~ '/position/latitude-deg';
+ var lon_prop = node.getPath() ~ '/position/longitude-deg';
+ pin = {
+ marker: geo.put_marker(callsign, lat_prop, lon_prop, elev_prop, [1,1,0], 10, 15, 5),
+ };
+ trafficPins[nodeID] = pin;
+ }
+ trafficPins[nodeID].alive = 1;
+ }
+ };
+ foreach (var node; nodes) {
+ if (node.getValue('valid')) {
+ addTraffic(node);
+ }
+ }
+ trafficRemoveListener = setlistener('/ai/models/model-removed', func(n) {
+ var path = n.getValue();
+ var node = props.getNode(path);
+ var nodeID = node.getName() ~ ':' ~ node.getIndex();
+ if (trafficPins[nodeID] != nil) {
+ trafficPins[nodeID].marker.remove();
+ delete(trafficPins, nodeID);
+ }
+ });
+ trafficAddListener = setlistener('/ai/models/model-added', func (n) {
+ var path = n.getValue();
+ var node = props.getNode(path);
+ addTraffic(node);
+ });
+ foreach (var k; keys(trafficPins)) {
+ if (!trafficPins[k].alive) {
+ trafficPins[l].marker.remove();
+ delete(trafficPins, k);
+ }
+ }
+ }
+ else {
+ # turn off
+ print("Traffic pins off");
+ if (trafficAddListener != nil) removelistener(trafficAddListener);
+ if (trafficRemoveListener != nil) removelistener(trafficRemoveListener);
+ foreach (var k; keys(trafficPins)) {
+ trafficPins[k].marker.remove();
+ }
+ trafficPins = {};
+ }
+};
+
+var fdm_init_listener = setlistener("/sim/signals/fdm-initialized", func {
+ removelistener(fdm_init_listener); # uninstall, so we are only called once
+
+ foreach (var k; ['master', 'airports', 'navaids', 'fixes', 'pois', 'traffic']) {
+ var path = '/sim/marker-pins/' ~ k;
+ var node = props.getNode(path);
+ if (node == nil) {
+ node = props.getNode(path, 1);
+ node.setBoolValue(0);
+ node.setAttribute('userarchive', 'y');
+ }
+ if (k == 'traffic') {
+ setlistener(path, toggleTrafficPins, 1, 0);
+ }
+ else {
+ setlistener(path, (func (key) { return func (p) { enabled[key] = p.getBoolValue(); }; })(k), 1, 0);
+ }
+ }
+ var timer = maketimer(1, update_pins);
+
+ timer.start();
+});
diff --git a/Nasal/multiplayer.nas b/Nasal/multiplayer.nas
index d49306b26..4a28218ec 100644
--- a/Nasal/multiplayer.nas
+++ b/Nasal/multiplayer.nas
@@ -195,12 +195,13 @@ var dialog = {
me.font = nil;
}
- me.header = ["view", " callsign", " model", func dialog.dist_hdr, func dialog.alt_hdr ~ " ", "", " brg", "chat", "ignore" ~ " ", " code", "ver", "airport", " set"];
+ me.header = ["view", " callsign", " model", func dialog.dist_hdr, " ", func dialog.alt_hdr ~ " ", "", " brg", "chat", "ignore" ~ " ", " code", "ver", "airport", " set"];
me.columns = [
{ type: "checkbox", legend: "", property: "view", halign: "right", "pref-height": 14, "pref-width": 14, callback: "multiplayer.view_select", argprop: "callsign", },
{ type: "text", property: "callsign", format: " %s", label: "-----------", halign: "fill" },
{ type: "text", property: "model-short", format: " %s", label: "--------------", halign: "fill" },
{ type: "text", property: func dialog.dist_node, format:" %8.2f", label: "---------", halign: "right" },
+ { type: "text", property: "distance_delta", format: "%s", label: "--", halign: "right" },
{ type: "text", property: func dialog.alt_node, format:" %7.0f", label: "---------", halign: "right" },
{ type: "text", property: "ascent_descent", format: "%s", label: "-", halign: "right" },
{ type: "text", property: "bearing-to", format: " %3.0f", label: "----", halign: "right" },
@@ -290,6 +291,7 @@ var dialog = {
var row = 0;
var col = 0;
+ # First row is column headers.
foreach (var h; me.header) {
var w = content.addChild("text");
var l = typeof(h) == "func" ? h() : h;
@@ -301,6 +303,7 @@ var dialog = {
}
row += 2;
var odd = 1;
+ # Add a row for each multiplayer aircraft.
foreach (var mp; model.list) {
var col = 0;
var color = me.fg[2];
@@ -424,12 +427,20 @@ var dialog = {
else ascent_descent = '';
}
+ distance_delta_text = ' ';
+ var distance_km_old = n.getValue('distance-to-km');
+ if (distance_km_old != nil) {
+ var distance_delta = distance - distance_km_old * 1000;
+ if (distance_delta > 10) distance_delta_text = ' +';
+ if (distance_delta < -10) distance_delta_text = ' -';
+ }
n.setValues({
"model-short": n.getNode("model-installed").getValue() ? mp.model : "[" ~ mp.model ~ "]",
"set-loaded": set_loaded ? " *" : " ",
"bearing-to": self.course_to(ac),
"distance-to-km": distance / 1000.0,
"distance-to-nm": distance * M2NM,
+ "distance_delta": distance_delta_text,
"position/altitude-m": n.getNode("position/altitude-ft").getValue() * FT2M,
"ascent_descent": ascent_descent,
"controls/invisible": contains(ignore, mp.callsign),
diff --git a/Nasal/screenshot.nas b/Nasal/screenshot.nas
new file mode 100644
index 000000000..280445d2a
--- /dev/null
+++ b/Nasal/screenshot.nas
@@ -0,0 +1,202 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2009 by Torsten Renk
+# Copyright (C) 2013 by penta
+# Copyright (C) 2022 by Erik Hofman
+#
+# Based on:
+# https://forum.flightgear.org/viewtopic.php?f=6&t=6380&p=53863#p53681
+# https://forum.flightgear.org/viewtopic.php?f=19&t=7713&start=15#p180816
+
+var rotatescreen = func(heading_deg, pitch_deg, roll_deg)
+{
+ setprop("/sim/current-view/goal-heading-offset-deg", heading_deg);
+ setprop("/sim/current-view/heading-offset-deg", heading_deg);
+ setprop("/sim/current-view/goal-pitch-offset-deg", pitch_deg);
+ setprop("/sim/current-view/pitch-offset-deg", pitch_deg);
+ setprop("/sim/current-view/goal-roll-offset-deg", roll_deg);
+ setprop("/sim/current-view/roll-offset-deg", roll_deg);
+}
+
+var takescreen = func(heading_deg, pitch_deg)
+{
+ print ("taking screen with heading= ", heading_deg, " and pitch= ", pitch_deg);
+ var success = fgcommand("screen-capture");
+ if (success)
+ {
+ print ("screen taken with heading= ", heading_deg, " and pitch= ", pitch_deg);
+ }
+ else
+ {
+ print("screen not taken");
+ }
+}
+
+var i=0;
+var j=0;
+var k=0;
+var tick_time=3;
+var width = getprop("/sim/startup/xsize");
+var height = getprop("/sim/startup/ysize");
+var menubarvalue=getprop("/sim/menubar/visibility");
+var znearvalue=("sim/rendering/camera-group/znear");
+var fovvalue=getprop("/sim/current-view/field-of-view");
+var freezemvalue=getprop("/sim/freeze/master");
+var freezecvalue=getprop("/sim/freeze/clock");
+var headingvalue=getprop("/sim/current-view/heading-offset-deg");
+var pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
+var rollvalue=getprop("/sim/current-view/roll-offset-deg");
+
+var cube_screen_ticks = func()
+{
+ if (i==0 or i==2)
+ {
+ roll_deg=0;
+ heading_deg=headingvalue;
+ if (i==0) pitch_deg=-90;
+ else pitch_deg=90;
+ }
+ else
+ {
+ pitch_deg=0;
+ heading_deg=headingvalue-90*j;
+ roll_deg = -270+j*90;
+ }
+ if (k==0)
+ {
+ k = 1;
+ rotatescreen(heading_deg, pitch_deg, roll_deg);
+ settimer(cube_screen_ticks, tick_time, tick_time);
+ }
+ elsif (k==1)
+ {
+ if (i<3)
+ {
+ k = 0;
+ takescreen(heading_deg, pitch_deg);
+ if (i==0 or i==2) {
+ i=i+1;
+ settimer(cube_screen_ticks, tick_time, tick_time);
+ }
+ else if (i==1)
+ {
+ if (j<3)
+ {
+ j=j+1;
+ settimer(cube_screen_ticks, tick_time, tick_time);
+ }
+ else {
+ i=i+1;
+ settimer(cube_screen_ticks, tick_time, tick_time);
+ }
+ }
+ }
+ else
+ {
+ setprop("/sim/menubar/visibility", menubarvalue);
+ setprop("/sim/current-view/field-of-view", fovvalue);
+ setprop("/sim/current-view/heading-offset-deg", headingvalue);
+ setprop("/sim/current-view/pitch-offset-deg", pitchvalue);
+ setprop("/sim/freeze/master", freezemvalue);
+ setprop("/sim/freeze/clock", freezecvalue);
+ }
+ }
+}
+
+var panorama_screen_ticks = func()
+{
+ if (i==0) {
+ pitch_deg=-45;
+ } else {
+ pitch_deg=45;
+ }
+ heading_deg=j*(-90);
+ if (k==0)
+ {
+ k=1;
+ rotatescreen(heading_deg, pitch_deg, 0);
+ settimer(panorama_screen_ticks, tick_time, tick_time);
+ }
+ else if (k==1)
+ {
+ k=0;
+ takescreen(heading_deg, pitch_deg);
+ if (j!=3)
+ {
+ j=j+1;
+ settimer(panorama_screen_ticks, tick_time, tick_time);
+ }
+ else
+ {
+ if (i==0)
+ {
+ i=i+1;
+ j=0;
+ settimer(panorama_screen_ticks, tick_time, tick_time);
+ }
+ else
+ {
+ k=2;
+ settimer(panorama_screen_ticks, tick_time, tick_time);
+ }
+ }
+ }
+ else
+ {
+ setprop("/sim/menubar/visibility", menubarvalue);
+ setprop("/sim/current-view/field-of-view", fovvalue);
+ setprop("/sim/current-view/heading-offset-deg", headingvalue);
+ setprop("/sim/current-view/pitch-offset-deg", pitchvalue);
+ setprop("/sim/current-view/roll-offset-deg", rollvalue);
+ setprop("/sim/freeze/master", freezemvalue);
+ setprop("/sim/freeze/clock", freezecvalue);
+ }
+}
+
+var make_cubemap = func()
+{
+ width = getprop("/sim/startup/xsize");
+ height = getprop("/sim/startup/ysize");
+ menubarvalue=getprop("/sim/menubar/visibility");
+ znearvalue=("sim/rendering/camera-group/znear");
+ fovvalue=getprop("/sim/current-view/field-of-view");
+ freezemvalue=getprop("/sim/freeze/master");
+ freezecvalue=getprop("/sim/freeze/clock");
+ headingvalue=getprop("/sim/current-view/heading-offset-deg");
+ pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
+ rollvalue=getprop("/sim/current-view/roll-offset-deg");
+
+ setprop("/sim/menubar/visibility", 'false');
+ setprop("/sim/rendering/camera-group/znear",0.03);
+ setprop("/sim/current-view/field-of-view", 170);
+ setprop("/sim/freeze/master",'true');
+ setprop("/sim/freeze/clock",'true');
+
+ i=0;
+ j=0;
+ k=0;
+ cube_screen_ticks();
+}
+
+var make_panorama = func()
+{
+ menubarvalue=getprop("/sim/menubar/visibility");
+ znearvalue=("sim/rendering/camera-group/znear");
+ fovvalue=getprop("/sim/current-view/field-of-view");
+ freezemvalue=getprop("/sim/freeze/master");
+ freezecvalue=getprop("/sim/freeze/clock");
+ headingvalue=getprop("/sim/current-view/heading-offset-deg");
+ pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
+ rollvalue=getprop("/sim/current-view/roll-offset-deg");
+
+ setprop("/sim/menubar/visibility", 'false');
+ setprop("/sim/rendering/camera-group/znear",0.03);
+ setprop("/sim/current-view/field-of-view", 120);
+ setprop("/sim/freeze/master",'true');
+ setprop("/sim/freeze/clock",'true');
+
+ i=0;
+ j=0;
+ k=0;
+ panorama_screen_ticks();
+}
diff --git a/Shaders/galaxy.frag b/Shaders/galaxy.frag
new file mode 100644
index 000000000..23389eee7
--- /dev/null
+++ b/Shaders/galaxy.frag
@@ -0,0 +1,218 @@
+// -*-C++-*-
+//
+// Chris Ringeval (November 2021)
+//
+
+#version 120
+
+
+varying vec3 eye2VertInEyeSpace;
+varying vec3 eye2ZenithInEyeSpace;
+varying vec3 eye2MoonInEyeSpace;
+
+uniform sampler2D milkyway;
+
+uniform float moonlight;
+uniform float mudarksky;
+uniform float altitude;
+uniform float atmosphere_top;
+
+uniform float fg_ZenithSkyBrightness;
+uniform float mugxybulge;
+
+
+// conversion factor to recover moon logI in lux
+const float max_loglux = -0.504030345621;
+const float min_loglux = -4.399646345620;
+// conversion factor to recover moon logI in footcandle
+const float luxtofootcandle = -1.0319696543787917;
+
+// the log10 of Mie + Rayleight scattering function at minimum,
+// i.e., for a Moon-Sky distance of 90 degrees
+const float logf90 = 5.399285;
+
+//extinction coefficient at Maunea Kea (2800m asl), in mag/airmass
+const float k2800 = 0.172;
+
+
+// cos(3pi/5), at asl 0m, any light source < -18 degrees above the horizon does
+// not light-up atmosphere -> zenital angle > 108 degrees.
+const float cosUnvisible = -0.309016994374947;
+
+
+// D65 white multiplied by rhodopic response function and converted
+// to linear sRGB is [-0.321, 0.656, 0.455], i.e. out of gammut. We
+// desaturate along red to mimic night vision color blindness
+// (see https://github.com/eatdust/spectroll)
+const vec4 nightColor = vec4(0.0,0.977,0.776,1.0);
+
+
+
+vec3 filter_combined (in vec3 color) ;
+
+
+float log10(in float x){
+ return 0.434294481903252*log(x);
+}
+
+
+//Rayleight + Mie scattering in unit of the minimal scattering at
+//90 degrees (const f90)
+float scattering_angular_dependency(in float cosMoonSep) {
+
+ float fR = 0.913514*(1.06 + cosMoonSep*cosMoonSep);
+
+ float moonSepRad = acos(cosMoonSep);
+
+ float fM = 5.63268*pow(10.0,-moonSepRad*1.432394);
+
+ return fR + fM;
+
+}
+
+float airmass_angular_dependency(in float sineZenithDistanceSquare) {
+
+ return 1.0/sqrt(1.0 - 0.96*sineZenithDistanceSquare);
+
+}
+
+
+//log10 of the moon illuminance in footcandles
+float log10_moon_illuminance_fc(in float Inorm){
+
+ return (max_loglux-min_loglux)*(Inorm-1.0) + max_loglux + luxtofootcandle ;
+}
+
+
+//in mag/arcsec^2 from flux in nano Lambert
+float magnitude_from_lognL(in float logBnL){
+ return 26.3313 - 2.5*logBnL;
+}
+
+
+void main()
+{
+
+
+ //unit vectors
+ vec3 uViewDir = normalize(eye2VertInEyeSpace);
+ vec3 uZenithDir = normalize(eye2ZenithInEyeSpace);
+ vec3 uMoonDir = normalize(eye2MoonInEyeSpace);
+
+
+ // the intrinsic sky brightness without the Moon at
+ // zenith set in simgear and propagated as uniform
+
+ float muzenithsky = fg_ZenithSkyBrightness;
+
+
+ vec4 fragColor;
+
+
+
+ // the galaxy is visible only if
+ if (muzenithsky >= mugxybulge) {
+
+
+
+ // texture look-up
+ vec4 texel = texture2D(milkyway, gl_TexCoord[0].st);
+
+
+
+ float cosZenithView = max(dot(uZenithDir,uViewDir),0.0);
+
+ float sineZenithDist2 = 1.0 - pow(cosZenithView,2);
+
+ float Xview = airmass_angular_dependency(sineZenithDist2);
+
+
+ float k = k2800 * max(0.0,(atmosphere_top - altitude)/(atmosphere_top - 2800.0));
+
+
+
+ // add angular dependence from scattering within the atmosphere
+
+ float musky = muzenithsky + k*(Xview-1.0);
+
+ // main effect: airglow coming from the van Rhijn layer (height 130km)
+ //
+ // https://ui.adsabs.harvard.edu/abs/1986PASP...98..364G/abstract
+ //
+ // We smoothstep airglow to zero while approaching 130km of altitude
+
+ musky = musky - 2.5*log10(0.4+0.6*Xview) * (1.0 - smoothstep(0.0,130000.0,altitude));
+
+
+
+ // Moon illumination of the atmosphere, we use the same model as in
+ // simgear (see moonpos.cxx), based on Publ. Astron. Soc. Pacif.
+ // 103(667), 1033-1039 (DOI: http://dx.doi.org/10.1086/132921).
+ //
+ // https://ui.adsabs.harvard.edu/abs/1991PASP..103.1033K/abstract
+ //
+ // The altitude damping effect is encoded in k and the moon
+ // scattering smoothly disappears with altitude as k->0. Only smoothstep added to
+ // smooth the moon rising effects
+
+ float cosZenithMoon = dot(uZenithDir,uMoonDir);
+ float dmumoon = 0.0;
+
+ // Include values under the horizon to smooth the Moon rising jumps effect
+ if (cosZenithMoon >= cosUnvisible) {
+
+ //however, we use the math only with sane input: cosZenithMoon >= 0
+ float sineZenithMoon2 = 1.0 - pow(max(cosZenithMoon,0.0),2.0);
+
+ float Xmoon = airmass_angular_dependency(sineZenithMoon2);
+
+ float cosMoonView = dot(uMoonDir,uViewDir);
+
+ float moon_logI = log10_moon_illuminance_fc(moonlight);
+
+ // log10(Bmoon) with Bmoon in nanoLambert
+ float logBnL = logf90 + log10(scattering_angular_dependency(cosMoonView)) \
+ + moon_logI - 0.4*k*Xmoon + log10(1.0-pow(10.0,-0.4*k*Xview));
+
+ // sky brightness from the moon in mag/arcsec^2
+ float mumoon = magnitude_from_lognL(logBnL);
+
+ //relative flux w.r.t background
+ float Brel = pow(10.0,0.4*(musky-mumoon));
+
+ // artificial smoothing for the moon between -18 degrees and 0
+ Brel = Brel*smoothstep(cosUnvisible,0.0,cosZenithMoon);
+
+ dmumoon = - 2.5*log10(1.0 + Brel);
+
+
+ }
+
+ // final angle dependent sky brightness
+ musky = musky + dmumoon;
+
+ // we put the damping in the colors as to keep alpha channel to 1
+ // for the ALS filters to not being affected
+
+ fragColor.rgb = texel.rgb * nightColor.rgb * (musky-mugxybulge)/musky;
+ fragColor.a = 1.0;
+
+ //For debugging and testing, uncomment. The red shows sky low surface brightness
+ //fragColor.r = 8*(musky-mugxybulge)/musky;
+
+ }
+
+ else {
+ // galaxy is invisible, too much sky brightness, color the night sphere is black
+
+ fragColor = vec4(0.0,0.0,0.0,1.0);
+
+ }
+
+
+
+ fragColor.rgb = filter_combined(fragColor.rgb);
+
+ gl_FragColor = clamp(fragColor,0.0,1.0);
+
+}
diff --git a/Shaders/galaxy.vert b/Shaders/galaxy.vert
new file mode 100644
index 000000000..bb784eede
--- /dev/null
+++ b/Shaders/galaxy.vert
@@ -0,0 +1,29 @@
+// -*-C++-*-
+//
+// Chris Ringeval (Novermber 2021)
+//
+
+#version 120
+
+
+uniform vec3 fg_CameraWorldUp;
+uniform mat4 osg_ViewMatrix;
+
+varying vec3 eye2VertInEyeSpace;
+varying vec3 eye2ZenithInEyeSpace;
+varying vec3 eye2MoonInEyeSpace;
+
+uniform vec3 fg_MoonDirection;
+
+
+void main()
+{
+
+ eye2VertInEyeSpace = (gl_ModelViewMatrix * gl_Vertex - vec4(0.0,0.0,0.0,1.0)).xyz;
+ eye2ZenithInEyeSpace = (osg_ViewMatrix * vec4(fg_CameraWorldUp,0.0)).xyz;
+ eye2MoonInEyeSpace = fg_MoonDirection;
+
+ gl_Position = ftransform();
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+}
+
diff --git a/Shaders/hazes.frag b/Shaders/hazes.frag
index e8b457071..de3df3b5c 100644
--- a/Shaders/hazes.frag
+++ b/Shaders/hazes.frag
@@ -2,102 +2,260 @@
#version 120
uniform float air_pollution;
+uniform int quality_level;
+uniform float fogstructure;
+uniform float cloud_self_shading;
+uniform float scattering;
+uniform float terminator;
+uniform float terrain_alt;
+uniform float overcast;
+uniform float eye_alt;
-// standard ALS fog function with exp(-d/D) fading and cutoff at low altitude and exp(-d^2/D^2) at high altitude
+const float terminator_width = 200000.0;
+const float EarthRadius = 5800000.0;
+
+varying vec3 relPos;
+varying vec4 light_diffuse_comp;
+varying vec3 normal;
+varying vec3 worldPos;
+
+float Noise2D(in vec2 coord, in float wavelength);
+vec3 filter_combined (in vec3 color) ;
+float Noise3D(in vec3 coord, in float wavelength);
const float AtmosphericScaleHeight = 8500.0;
+// Development tools:
+// Reduce haze to almost zero, while preserving lighting. Useful for observing distant tiles.
+// Keeps the calculation overhead. This can be used for profiling.
+// Possible values: 0:Normal, 1:Reduced haze.
+ const int reduce_haze_without_removing_calculation_overhead = 0;
+
+// standard ALS fog function with exp(-d/D) fading and cutoff at low altitude and exp(-d^2/D^2) at high altitude
float fog_func (in float targ, in float alt)
{
+ float fade_mix;
+ targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn
-float fade_mix;
-
-// for large altitude > 30 km, we switch to some component of quadratic distance fading to
-// create the illusion of improved visibility range
-
-targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn
-
-
-if (alt < 30000.0)
- {return exp(-targ - targ * targ * targ * targ);}
-else if (alt < 50000.0)
- {
- fade_mix = (alt - 30000.0)/20000.0;
- return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0));
- }
-else
- {
- return exp(- targ * targ - pow(targ,4.0));
- }
+ // for large altitude > 30 km, we switch to some component of quadratic distance fading to
+ // create the illusion of improved visibility range
+ if (alt < 30000.0) {
+ return exp(-targ - targ * targ * targ * targ);
+ } else if (alt < 50000.0) {
+ fade_mix = (alt - 30000.0)/20000.0;
+ return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0));
+ } else {
+ return exp(- targ * targ - pow(targ,4.0));
+ }
}
// altitude correction for exponential drop in atmosphere density
-
float alt_factor(in float eye_alt, in float vertex_alt)
{
-float h0 = AtmosphericScaleHeight;
-float h1 = min(eye_alt,vertex_alt);
-float h2 = max(eye_alt,vertex_alt);
+ float h0 = AtmosphericScaleHeight;
+ float h1 = min(eye_alt,vertex_alt);
+ float h2 = max(eye_alt,vertex_alt);
-
-if ((h2-h1) < 200.0) // use a Taylor-expanded version
- {
- return 0.5 * (exp(-h2/h0) + exp(-h1/h0));
- }
-else
- {
- return h0/(h2-h1) * (exp(-h1/h0) - exp(-h2/h0));
- }
+ if ((h2-h1) < 200.0) // use a Taylor-expanded version
+ {
+ return 0.5 * (exp(-h2/h0) + exp(-h1/h0));
+ } else {
+ return h0/(h2-h1) * (exp(-h1/h0) - exp(-h2/h0));
+ }
}
-
// Rayleigh in-scatter function
-
float rayleigh_in_func(in float dist, in float air_pollution, in float avisibility, in float eye_alt, in float vertex_alt)
{
-
-float fade_length = avisibility * (2.5 - 2.2 * sqrt(air_pollution));
-
-fade_length = fade_length / alt_factor(eye_alt, vertex_alt);
-
-return 1.0-exp(-dist/max(15000.0,fade_length));
+ float fade_length = avisibility * (2.5 - 2.2 * sqrt(air_pollution));
+ fade_length = fade_length / alt_factor(eye_alt, vertex_alt);
+ return 1.0-exp(-dist/max(15000.0,fade_length));
}
-
// Rayleigh out-scattering color shift
-
vec3 rayleigh_out_shift(in vec3 color, in float outscatter)
{
-color.r = color.r * (1.0 - 0.4 * outscatter);
-color.g = color.g * (1.0 - 0.8 * outscatter);
-color.b = color.b * (1.0 - 1.6 * outscatter);
-
-return color;
+ color.r = color.r * (1.0 - 0.4 * outscatter);
+ color.g = color.g * (1.0 - 0.8 * outscatter);
+ color.b = color.b * (1.0 - 1.6 * outscatter);
+ return color;
}
// the generalized logistic function used to compute lightcurves
-
float light_curve (in float x, in float a, in float b, in float c, in float d, in float e)
{
-x = x - 0.5;
-
-// use the asymptotics to shorten computations
-if (x > 30.0) {return e;}
-if (x < -15.0) {return 0.0;}
-
-return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
+ x = x - 0.5;
+ // use the asymptotics to shorten computations
+ if (x > 30.0) { return e; }
+ if (x < -15.0) { return 0.0; }
+ return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
}
// the haze color function
-
vec3 get_hazeColor(in float lightArg)
{
-vec3 hazeColor;
-hazeColor.r = light_curve(lightArg, 8.305e-06, 0.161, 4.827-3.0 *air_pollution, 3.04e-05, 1.0);
-hazeColor.g = light_curve(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
-hazeColor.b = light_curve(lightArg, 1.330e-05, 0.264, 1.527+ 2.0*air_pollution, 1.08e-05, 1.0);
-
-return hazeColor;
+ vec3 hazeColor;
+ hazeColor.r = light_curve(lightArg, 8.305e-06, 0.161, 4.827-3.0 *air_pollution, 3.04e-05, 1.0);
+ hazeColor.g = light_curve(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ hazeColor.b = light_curve(lightArg, 1.330e-05, 0.264, 1.527+ 2.0*air_pollution, 1.08e-05, 1.0);
+ return hazeColor;
}
+
+// Apply the ALS haze model to a given fragment
+vec4 applyHaze(inout vec4 fragColor,
+ inout vec3 hazeColor,
+ in vec3 secondary_light,
+ in float ct,
+ in float hazeLayerAltitude,
+ in float visibility,
+ in float avisibility,
+ in float dist,
+ in float lightArg,
+ in float mie_angle)
+{
+ float mvisibility = min(visibility,avisibility);
+
+ if (dist > 0.04 * mvisibility)
+ {
+ float transmission;
+ float vAltitude;
+ float delta_zv;
+ float H;
+ float distance_in_layer;
+ float transmission_arg;
+ float intensity;
+ float eShade;
+
+ float delta_z = hazeLayerAltitude - eye_alt;
+ float effective_scattering = min(scattering, cloud_self_shading);
+ float yprime_alt = light_diffuse_comp.a;
+ vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
+ vec3 lightDir = gl_LightSource[0].position.xyz;
+ vec3 n = normal;
+ n = normalize(n);
+
+ // we solve the geometry what part of the light path is attenuated normally and what is through the haze layer
+ if (delta_z > 0.0) { // we're inside the layer
+ if (ct < 0.0) { // we look down
+ distance_in_layer = dist;
+ vAltitude = min(distance_in_layer,mvisibility) * ct;
+ delta_zv = delta_z - vAltitude;
+ } else {
+ // we may look through upper layer edge
+ H = dist * ct;
+
+ if (H > delta_z) {
+ distance_in_layer = dist/H * delta_z;
+ } else {
+ distance_in_layer = dist;
+ }
+
+ vAltitude = min(distance_in_layer,visibility) * ct;
+ delta_zv = delta_z - vAltitude;
+ }
+ } else { // we see the layer from above, delta_z < 0.0
+ H = dist * -ct;
+ if (H < (-delta_z)) { // we don't see into the layer at all, aloft visibility is the only fading
+ distance_in_layer = 0.0;
+ delta_zv = 0.0;
+ } else {
+ vAltitude = H + delta_z;
+ distance_in_layer = vAltitude/H * dist;
+ vAltitude = min(distance_in_layer,visibility) * (-ct);
+ delta_zv = vAltitude;
+ }
+ }
+
+ if ((quality_level > 4) && (abs(delta_z) < 400.0)) {
+ float blur_thickness = 50.0;
+ float cphi = dot(vec3(0.0, 1.0, 0.0), relPos)/dist;
+ float ctlayer = delta_z/dist-0.01 + 0.02 * Noise2D(vec2(cphi,1.0),0.1) -0.01;
+ float ctblur = 0.035 ;
+ float blur_dist;
+
+ blur_dist = dist * (1.0-smoothstep(0.0,300.0,-delta_z)) * smoothstep(-400.0,-200.0, -delta_z);
+ blur_dist = blur_dist * smoothstep(ctlayer-4.0*ctblur, ctlayer-ctblur, ct) * (1.0-smoothstep(ctlayer+0.5*ctblur, ctlayer+ctblur, ct));
+ distance_in_layer = max(distance_in_layer, blur_dist);
+ }
+
+ // ground haze cannot be thinner than aloft visibility in the model,
+ // so we need to use aloft visibility otherwise
+ transmission_arg = (dist-distance_in_layer)/avisibility;
+ float eqColorFactor;
+
+ if (quality_level > 3) {
+ float noise_1500m = Noise3D(worldPos.xyz, 1500.0);
+ float noise_2000m = Noise3D(worldPos.xyz, 2000.0);
+ transmission_arg = transmission_arg + (distance_in_layer/(1.0 * mvisibility + 1.0 * mvisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) ));
+ } else {
+ transmission_arg = transmission_arg + (distance_in_layer/mvisibility);
+ }
+
+ // this combines the Weber-Fechner intensity
+ eqColorFactor = 1.0 - 0.1 * delta_zv/mvisibility - (1.0 - effective_scattering);
+ transmission = fog_func(transmission_arg, eye_alt);
+
+ // there's always residual intensity, we should never be driven to zero
+ if (eqColorFactor < 0.2) eqColorFactor = 0.2;
+
+ // now dim the light for haze
+ eShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt);
+
+ // Mie-like factor
+ if (lightArg < 10.0) {
+ intensity = length(hazeColor);
+ float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt));
+ hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) );
+ }
+
+ intensity = length(hazeColor);
+
+ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColor doesn't come out correctly
+ {
+ // high altitude desaturation of the haze color
+ hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, eye_alt)));
+
+ // blue hue of haze
+ hazeColor.x = hazeColor.x * 0.83;
+ hazeColor.y = hazeColor.y * 0.9;
+
+ // additional blue in indirect light
+ float fade_out = max(0.65 - 0.3 *overcast, 0.45);
+ intensity = length(hazeColor);
+ hazeColor = intensity * normalize(mix(hazeColor, 1.5* shadedFogColor, 1.0 -smoothstep(0.25, fade_out,eShade) ));
+
+ // change haze color to blue hue for strong fogging
+ hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothstep(0.5,0.9,eqColorFactor))));
+
+ // reduce haze intensity when looking at shaded surfaces, only in terminator region
+ float shadow = mix( min(1.0 + dot(n,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission));
+ hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator));
+ }
+
+ // don't let the light fade out too rapidly
+ lightArg = (terminator + 200000.0)/100000.0;
+ float minLightIntensity = min(0.2,0.16 * lightArg + 0.5);
+ vec3 minLight = minLightIntensity * vec3 (0.2, 0.3, 0.4);
+ hazeColor.rgb *= eqColorFactor * eShade;
+ hazeColor.rgb = max(hazeColor.rgb, minLight.rgb);
+
+ // Testing phase controls
+ if (reduce_haze_without_removing_calculation_overhead == 1)
+ {
+ transmission = 1.0 - (transmission/1000000.0);
+ }
+
+ // finally, mix fog in
+ if (quality_level > 4) {
+ float backscatter = 0.5* min(1.0,10000.0/(mvisibility*mvisibility));
+ fragColor.rgb = mix(hazeColor+secondary_light * backscatter , fragColor.rgb,transmission);
+ } else {
+ fragColor.rgb = mix(clamp(hazeColor,0.0,1.0) , clamp(fragColor.rgb,0.0,1.0),transmission);
+ }
+ } // end if (dist > 0.04 * mvisibility)
+
+ fragColor.rgb = filter_combined(fragColor.rgb);
+ return fragColor;
+}
\ No newline at end of file
diff --git a/Shaders/marker-pin.frag b/Shaders/marker-pin.frag
new file mode 100644
index 000000000..7367dd2e7
--- /dev/null
+++ b/Shaders/marker-pin.frag
@@ -0,0 +1,21 @@
+// -*-C++-*-
+
+#version 120
+
+uniform sampler2D texture;
+
+void main()
+{
+ vec4 color = gl_Color;
+ // vec4 color = vec4(1.0, 0.0, 0.0, 1.0);
+ vec4 texel;
+ vec4 fragColor;
+
+ texel = texture2D(texture, gl_TexCoord[0].st);
+
+ fragColor.rgb = color.rgb;
+ fragColor.a = texel.a * color.a;
+
+ gl_FragColor = fragColor;
+}
+
diff --git a/Shaders/marker-pin.vert b/Shaders/marker-pin.vert
new file mode 100644
index 000000000..2c5b22703
--- /dev/null
+++ b/Shaders/marker-pin.vert
@@ -0,0 +1,18 @@
+// -*-C++-*-
+
+// Shader that uses OpenGL state values to do per-pixel lighting
+//
+// The only light used is gl_LightSource[0], which is assumed to be
+// directional.
+//
+// Diffuse colors come from the gl_Color, ambient from the material. This is
+// equivalent to osg::Material::DIFFUSE.
+#version 120
+
+void main()
+{
+ gl_Position = ftransform();
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_FrontColor = gl_Color;
+ gl_BackColor = gl_Color;
+}
diff --git a/Shaders/water-ALS-high.frag b/Shaders/water-ALS-high.frag
index d7b3f0aa1..fb17c5a3f 100644
--- a/Shaders/water-ALS-high.frag
+++ b/Shaders/water-ALS-high.frag
@@ -563,7 +563,10 @@ void main(void)
// add ice
- vec4 ice_texel = texture2D(ice_texture, vec2(waterTex2) * 0.2 );
+ vec2 ice_tex_pos;
+ if (ocean_flag == 0) ice_tex_pos = gl_TexCoord[0].st * 0.1;
+ else ice_tex_pos = vec2(waterTex2) * 0.2;
+ vec4 ice_texel = texture2D(ice_texture, ice_tex_pos);
float nSum = 0.5 * (noise_250m + noise_50m);
float mix_factor = smoothstep(1.0 - ice_cover, 1.04-ice_cover, nSum);
diff --git a/Shaders/water-ALS.vert b/Shaders/water-ALS.vert
index a81dd65e9..d9346578c 100644
--- a/Shaders/water-ALS.vert
+++ b/Shaders/water-ALS.vert
@@ -87,6 +87,7 @@ void main(void)
mat4 RotationMatrix;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
rawPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz;
diff --git a/Shaders/ws30-ALS-detailed.frag b/Shaders/ws30-ALS-detailed.frag
index fb6782c8a..3ba6c462c 100644
--- a/Shaders/ws30-ALS-detailed.frag
+++ b/Shaders/ws30-ALS-detailed.frag
@@ -22,6 +22,9 @@
// Possible values: 0:Normal, 1:Just the texture.
const int remove_haze_and_lighting = 0;
+// Use built-in water shader. Use for testing impact of ws30-water.frag
+ const int water_shader = 1;
+
//
// End of test phase controls
//////////////////////////////////////////////////////////////////
@@ -43,7 +46,8 @@
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
-varying vec3 rawPos;
+varying vec2 ground_tex_coord;
+varying vec2 rawPos;
varying vec3 worldPos;
// Testing code:
//vec3 worldPos = vec3(5000.0, 6000.0, 7000.0) + vec3(vec2(rawPos), 600.0); // vec3(100.0, 10.0, 3.0);
@@ -91,6 +95,7 @@ uniform vec4 fg_specularArray[128];
uniform vec4 fg_textureLookup1[128];
uniform vec4 fg_textureLookup2[128];
uniform vec4 fg_materialParams1[128];
+uniform vec4 fg_materialParams3[128];
uniform mat4 fg_zUpTransform;
uniform vec3 fg_modelOffset;
@@ -143,38 +148,74 @@ vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
// From noise.frag
float rand2D(in vec2 co);
-// These functions, and other function they depend on, are defined
-// in ws30-ALS-landclass-search.frag.
-
-
// Create random landclasses without a texture lookup to stress test.
// Each square of square_size in m is assigned a random landclass value.
int get_random_landclass(in vec2 co, in vec2 tile_size);
+// End Test-phase code
+////////////////////////
+
+// These functions, and other function they depend on, are defined
+// in ws30-ALS-landclass-search.frag.
// Lookup a ground texture at a point based on the landclass at that point, without visible
// seams at coordinate discontinuities or at landclass boundaries where texture are switched.
// The partial derivatives of the tile_coord at the fragment is needed to adjust for
// the stretching of different textures, so that the correct mip-map level is looked
// up and there are no seams.
+// Texture types: 0: base texture, 1: grain texture, 2: gradient texture, 3 dot texture,
+// 4: mix texture, 5: detail texture.
-vec4 lookup_ground_texture_array(in vec2 tile_coord, in int landclass_id, in vec2 dx, in vec2 dy);
+vec4 lookup_ground_texture_array(in int texture_type, in vec2 ground_texture_coord, in int landclass_id,
+ in vec4 dFdx_and_dFdy);
// Look up the landclass id [0 .. 255] for this particular fragment.
// Lookup id of any neighbouring landclass that is within the search distance.
// Searches are performed in upto 4 directions right now, but only one landclass is looked up
-// Create a mix factor werighting the influences of nearby landclasses
-void get_landclass_id(in vec2 tile_coord,
- const in float landclass_texel_size_m, in vec2 dx, in vec2 dy,
+// Create a mix factor weighting the influences of nearby landclasses
+void get_landclass_id(in vec2 tile_coord, in vec4 dFdx_and_dFdy,
out int landclass_id, out ivec4 neighbor_landclass_ids,
out int num_unique_neighbors,out vec4 mix_factor
);
-// End Test-phase code
-////////////////////////
+// Look up the texel of the specified texture type (e.g. grain or detail textures) for this fragment
+// and any neighbor texels, then mix.
+vec4 get_mixed_texel(in int texture_type, in vec2 g_texture_coord,
+ in int landclass_id, in int num_unique_neighbors,
+ in ivec4 neighbor_texel_landclass_ids, in vec4 neighbor_mix_factors,
+ in vec4 dFdx_and_dFdy
+ );
+
+// Determine the texel and material parameters for a particular fragment,
+// Taking into account photoscenery etc.
+void get_material(in int landclass,
+ in vec2 ground_tex_coord,
+ in vec4 dxdy_gc,
+ out float mat_shininess,
+ out vec4 mat_ambient,
+ out vec4 mat_diffuse,
+ out vec4 mat_specular,
+ out vec4 dxdy,
+ out vec2 st
+ );
+
+// Apply the ALS haze model to a specific fragment
+vec4 applyHaze(inout vec4 fragColor,
+ inout vec3 hazeColor,
+ in vec3 secondary_light,
+ in float ct,
+ in float hazeLayerAltitude,
+ in float visibility,
+ in float avisibility,
+ in float dist,
+ in float lightArg,
+ in float mie_angle);
+
+// Procedurally generate a water texel for this fragment
+vec4 generateWaterTexel();
void main()
{
@@ -191,6 +232,8 @@ float dist = length(relPos);
// angle of view vector with horizon
float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
+// Altitude of fragment above sea level
+float msl_altitude = (relPos.z + eye_alt);
vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
@@ -208,6 +251,10 @@ float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
vec4 specular = vec4(0.0);
float intensity;
+ // Material/texel properties
+ float mat_shininess;
+ vec2 st;
+ vec4 mat_ambient, mat_diffuse, mat_specular, dxdy;
// get noise at different wavelengths
@@ -270,492 +317,273 @@ float noise_2000m = Noise3D(worldPos.xyz, 2000.0);
vec4 mfact;
- const float landclass_texel_size_m = 25.0;
- // Partial derivatives of s and t for this fragment,
+ // Partial derivatives of s and t of ground texture coords for this fragment,
// with respect to window (screen space) x and y axes.
// Used to pick mipmap LoD levels, and turn off unneeded procedural detail
- vec2 dx = dFdx(tile_coord);
- vec2 dy = dFdy(tile_coord);
-
- get_landclass_id(tile_coord, landclass_texel_size_m, dx, dy,
- lc, lc_n, num_unique_neighbors, mfact);
-
- // The landclass id is used to index into arrays containing
- // material parameters and textures for the landclass as
- // defined in the regional definitions
- float index = float(lc)/512.0;
- vec4 index_n = vec4(lc_n)/512.0;
-
- float mat_shininess = fg_dimensionsArray[lc].z;
- vec4 mat_ambient = fg_ambientArray[lc];
- vec4 mat_diffuse = fg_diffuseArray[lc];
- vec4 mat_specular = fg_specularArray[lc];
- vec2 st = gl_TexCoord[0].st;
-
- // Testing code:
- // Use rlc even when looking up textures to recreate the extra performance hit
- // so any performance difference between the two is due to the texture lookup
- // color.rgb = color.rgb+0.00001*float(get_random_landclass(tile_coord.st, tile_size));
+ // dFdx and dFdy are packed in a vec4 so multiplying everything
+ // to scale takes 1 instruction slot.
+ vec4 dxdy_gc = vec4(dFdx(ground_tex_coord) , dFdy(ground_tex_coord));
+ get_landclass_id(tile_coord, dxdy_gc, lc, lc_n, num_unique_neighbors, mfact);
+ get_material(lc, ground_tex_coord, dxdy_gc, mat_shininess, mat_ambient, mat_diffuse, mat_specular, dxdy, st);
if (fg_photoScenery) {
- // In the photoscenery case we don't have landclass or materials available, so we
- // just use constants for the material properties.
- mat_ambient = vec4(0.2,0.2,0.2,1.0);
- mat_diffuse = vec4(0.8,0.8,0.8,1.0);
- mat_specular = vec4(0.0,0.0,0.0,1.0);
-
texel = texture(landclass, vec2(gl_TexCoord[0].s, 1.0 - gl_TexCoord[0].t));
} else {
- // Color Mode is always AMBIENT_AND_DIFFUSE, which means
- // using a base colour of white for ambient/diffuse,
- // rather than the material color from ambientArray/diffuseArray.
- mat_ambient = vec4(1.0,1.0,1.0,1.0);
- mat_diffuse = vec4(1.0,1.0,1.0,1.0);
- mat_specular = fg_specularArray[lc];
- mat_shininess = fg_dimensionsArray[lc].z;
+ // Lookup the base texture texel for this fragment and any neighbors, with mixing
+ texel = get_mixed_texel(0, ground_tex_coord, lc, num_unique_neighbors, lc_n, mfact, dxdy_gc);
+ }
- // Different textures have different have different dimensions.
- vec2 atlas_dimensions = fg_dimensionsArray[lc].st;
- vec2 atlas_scale = vec2(fg_tileWidth / atlas_dimensions.s, fg_tileHeight / atlas_dimensions.t );
- st = atlas_scale * gl_TexCoord[0].st;
+ if ((water_shader == 1) && (fg_photoScenery == false) && fg_materialParams3[lc].x > 0.5) {
+ // This is a water fragment, so calculate the fragment color procedurally
+ fragColor = generateWaterTexel();
+ fragColor.rgb += getClusteredLightsContribution(eyePos.xyz, n, fragColor.rgb);
+ } else {
+ // Photoscenery or land fragment, so determine the shading and color normally
+ vec4 color = gl_Color * mat_ambient;
+ color.a = 1.0;
- // Look up ground textures by indexing into the texture array.
- // Different textures are stretched along the ground to different
- // lengths along each axes as set by and
- // regional definitions parameters
+ // Testing code: mix with green to show values of variables at each point
+ //vec4 green = vec4(0.0, 0.5, 0.0, 0.0);
+ //texel = mix(texel, green, (mfact[2]));
- // Look up texture coordinates and scale of ground textures
- // Landclass for this fragment
- texel = lookup_ground_texture_array(tile_coord, lc, dx, dy);
+ //mix_texel = texel;
+ //detail_texel = texel;
+ vec4 t = texel;
- // Mix texels - to work consistently it needs a more preceptual interpolation than mix()
- if (num_unique_neighbors != 0)
+ int flag = 1;
+ int mix_flag = 1;
+
+ float local_autumn_factor = texel.a;
+
+ if (fg_photoScenery) {
+ flag = 0;
+ mix_flag = 0;
+ }
+
+ float distortion_factor = 1.0;
+ vec2 stprime;
+
+ float noise_term;
+ float snow_alpha;
+
+ //float view_angle = abs(dot(normal, normalize(ecViewdir)));
+
+ if ((quality_level > 3)&&(msl_altitude +500.0 > snowlevel)) {
+ float sfactor;
+ snow_texel = vec4 (0.95, 0.95, 0.95, 1.0) * (0.9 + 0.1* noise_500m + 0.1* (1.0 - noise_10m) );
+ snow_texel.r = snow_texel.r * (0.9 + 0.05 * (noise_10m + noise_5m));
+ snow_texel.g = snow_texel.g * (0.9 + 0.05 * (noise_10m + noise_5m));
+ snow_texel.a = 1.0;
+ noise_term = 0.1 * (noise_500m-0.5);
+ sfactor = sqrt(2.0 * (1.0-steepness)/0.03) + abs(ct)/0.15;
+ noise_term = noise_term + 0.2 * (noise_50m -0.5) * (1.0 - smoothstep(18000.0*sfactor, 40000.0*sfactor, dist) ) ;
+ noise_term = noise_term + 0.3 * (noise_10m -0.5) * (1.0 - smoothstep(4000.0 * sfactor, 8000.0 * sfactor, dist) ) ;
+
+ if (dist < 3000.0*sfactor) {
+ noise_term = noise_term + 0.3 * (noise_5m -0.5) * (1.0 - smoothstep(1000.0 * sfactor, 3000.0 *sfactor, dist) );
+ }
+
+ snow_texel.a = snow_texel.a * 0.2+0.8* smoothstep(0.2,0.8, 0.3 +noise_term + snow_thickness_factor +0.0001*(msl_altitude -snowlevel) );
+
+ }
+
+ if ((tquality_level > 2) && (mix_flag == 1))
{
- // Closest neighbor landclass
- vec4 texel_closest = lookup_ground_texture_array(tile_coord, lc_n[0], dx, dy);
+ // Mix texture is material texture 15, which is mapped to the b channel of fg_textureLookup1
+ //int tex2 = int(fg_textureLookup1[lc].b * 255.0 + 0.5);
+ //mix_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ if (mix_texel.a < 0.1) { mix_flag = 0;}
+ //WS2: mix_texel = texture2D(mix_texture, gl_TexCoord[0].st * 1.3); // temp
- // Neighbor contributions
- vec4 texel_nc=texel_closest;
+ mix_texel = lookup_ground_texture_array(4, st * 1.3, lc, dxdy * 1.3);
+ if (mix_texel.a <0.1) {mix_flag = 0;}
+ }
- if (num_unique_neighbors > 1)
+ if (tquality_level > 3 && (flag == 1))
+ {
+ stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t);
+ //distortion_factor = 0.9375 + (1.0 * nvL[2]);
+ distortion_factor = 0.97 + 0.06 * noise_500m;
+ stprime = stprime * distortion_factor * 15.0;
+ if (quality_level > 4)
{
- // 2nd Closest neighbor landclass
- vec4 texel_2nd_closest = lookup_ground_texture_array(tile_coord, lc_n[1],
- dx, dy);
-
- texel_nc = mix(texel_closest, texel_2nd_closest, mfact[1]);
+ stprime = stprime + normalize(relPos).xy * 0.02 * (noise_10m + 0.5 * noise_5m - 0.75);
}
- texel = mix(texel, texel_nc, mfact[0]);
+ // Detail texture is material texture 11, which is mapped to the g channel of fg_textureLookup1
+ //int tex3 = int(fg_textureLookup1[lc].g * 255.0 + 0.5);
+ //detail_texel = texture(textureArray, vec3(stprime, tex3));
+ if (detail_texel.a < 0.1) { flag = 0;}
+ //WS2: detail_texel = texture2D(detail_texture, stprime); // temp
+
+ vec4 dxdy_prime = vec4(dFdx(stprime), dFdy(stprime));
+ detail_texel = lookup_ground_texture_array(5, stprime, lc, dxdy_prime);
}
- }
- vec4 color = gl_Color * mat_ambient;
- color.a = 1.0;
+ // texture preparation according to detail level
- // Testing code: mix with green to show values of variables at each point
- //vec4 green = vec4(0.0, 0.5, 0.0, 0.0);
- //texel = mix(texel, green, (mfact[2]));
+ // mix in hires texture patches
+ float dist_fact;
+ float nSum;
+ float mix_factor;
+ float transition_model = fg_materialParams1[lc].r;
+ float hires_overlay_bias = fg_materialParams1[lc].g;
- int flag = 1;
- int mix_flag = 1;
+ if (tquality_level > 2) {
+ // first the second texture overlay
+ // transition model 0: random patch overlay without any gradient information
+ // transition model 1: only gradient-driven transitions, no randomness
+
+
+ if (mix_flag == 1) {
+ // Random patch overlay weighting with noise
+ nSum = 0.18 * (2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m);
- float local_autumn_factor = texel.a;
+ // Increase the weighting for the mix_texel if more gradient-driven.
+ nSum = mix(nSum, 0.5, max(0.0, 2.0 * (transition_model - 0.5)));
- if (fg_photoScenery) {
- flag = 0;
- mix_flag = 0;
- }
-
- float distortion_factor = 1.0;
- vec2 stprime;
-
- float noise_term;
- float snow_alpha;
-
- //float view_angle = abs(dot(normal, normalize(ecViewdir)));
-
- if ((quality_level > 3)&&(rawPos.z +500.0 > snowlevel)) {
- float sfactor;
- snow_texel = vec4 (0.95, 0.95, 0.95, 1.0) * (0.9 + 0.1* noise_500m + 0.1* (1.0 - noise_10m) );
- snow_texel.r = snow_texel.r * (0.9 + 0.05 * (noise_10m + noise_5m));
- snow_texel.g = snow_texel.g * (0.9 + 0.05 * (noise_10m + noise_5m));
- snow_texel.a = 1.0;
- noise_term = 0.1 * (noise_500m-0.5);
- sfactor = sqrt(2.0 * (1.0-steepness)/0.03) + abs(ct)/0.15;
- noise_term = noise_term + 0.2 * (noise_50m -0.5) * (1.0 - smoothstep(18000.0*sfactor, 40000.0*sfactor, dist) ) ;
- noise_term = noise_term + 0.3 * (noise_10m -0.5) * (1.0 - smoothstep(4000.0 * sfactor, 8000.0 * sfactor, dist) ) ;
-
- if (dist < 3000.0*sfactor) {
- noise_term = noise_term + 0.3 * (noise_5m -0.5) * (1.0 - smoothstep(1000.0 * sfactor, 3000.0 *sfactor, dist) );
+ // Add the gradient element
+ nSum = nSum + 0.4 * (1.0 -smoothstep(0.9,0.95, abs(steepness)+ 0.05 * (noise_50m - 0.5))) * min(1.0, 2.0 * transition_model);
+ mix_factor = smoothstep(0.5, 0.54, nSum);
+ texel = mix(texel, mix_texel, mix_factor);
+ local_autumn_factor = texel.a;
}
- snow_texel.a = snow_texel.a * 0.2+0.8* smoothstep(0.2,0.8, 0.3 +noise_term + snow_thickness_factor +0.0001*(rawPos.z -snowlevel) );
-
}
- if ((tquality_level > 2) && (mix_flag == 1))
- {
- // Mix texture is material texture 15, which is mapped to the b channel of fg_textureLookup1
- int tex2 = int(fg_textureLookup1[lc].b * 255.0 + 0.5);
- mix_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
- if (mix_texel.a < 0.1) { mix_flag = 0;}
- }
-
- if (tquality_level > 3 && (flag == 1))
- {
- stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t);
- //distortion_factor = 0.9375 + (1.0 * nvL[2]);
- distortion_factor = 0.97 + 0.06 * noise_500m;
- stprime = stprime * distortion_factor * 15.0;
- if (quality_level > 4)
- {
- stprime = stprime + normalize(relPos).xy * 0.02 * (noise_10m + 0.5 * noise_5m - 0.75);
- }
-
- // Detail texture is material texture 11, which is mapped to the g channel of fg_textureLookup1
- int tex3 = int(fg_textureLookup1[lc].g * 255.0 + 0.5);
- detail_texel = texture(textureArray, vec3(stprime, tex3));
- if (detail_texel.a < 0.1) { flag = 0;}
- }
-
-// texture preparation according to detail level
-
-// mix in hires texture patches
-
-float dist_fact;
-float nSum;
-float mix_factor;
-float transition_model = fg_materialParams1[lc].r;
-float hires_overlay_bias = fg_materialParams1[lc].g;
-
-if (tquality_level > 2) {
- // first the second texture overlay
- // transition model 0: random patch overlay without any gradient information
- // transition model 1: only gradient-driven transitions, no randomness
-
-
- if (mix_flag == 1) {
- // Random patch overlay weighting with noise
- nSum = 0.18 * (2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m);
-
- // Increase the weighting for the mix_texel if more gradient-driven.
- nSum = mix(nSum, 0.5, max(0.0, 2.0 * (transition_model - 0.5)));
-
- // Add the gradient element
- nSum = nSum + 0.4 * (1.0 -smoothstep(0.9,0.95, abs(steepness)+ 0.05 * (noise_50m - 0.5))) * min(1.0, 2.0 * transition_model);
- mix_factor = smoothstep(0.5, 0.54, nSum);
- texel = mix(texel, mix_texel, mix_factor);
- local_autumn_factor = texel.a;
- }
-
-}
-
-if (tquality_level > 3) {
- // then the detail texture overlay
- if (dist < 40000.0)
- {
- if (flag == 1) {
- //noise_50m = Noise2D(rawPos.xy, 50.0);
- //noise_250m = Noise2D(rawPos.xy, 250.0);
- dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist));
- nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0;
- nSum = nSum - 0.08 * (1.0 -smoothstep(0.9,0.95, abs(steepness)));
- mix_factor = smoothstep(0.47, 0.54, nSum +hires_overlay_bias - dist_fact);
- if (mix_factor > 0.8) {mix_factor = 0.8;}
- texel = mix(texel, detail_texel,mix_factor);
- local_autumn_factor = texel.a;
+ if (tquality_level > 3) {
+ // then the detail texture overlay
+ if (dist < 40000.0)
+ {
+ if (flag == 1) {
+ //noise_50m = Noise2D(rawPos.xy, 50.0);
+ //noise_250m = Noise2D(rawPos.xy, 250.0);
+ dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist));
+ nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0;
+ nSum = nSum - 0.08 * (1.0 -smoothstep(0.9,0.95, abs(steepness)));
+ mix_factor = smoothstep(0.47, 0.54, nSum +hires_overlay_bias - dist_fact);
+ if (mix_factor > 0.8) {mix_factor = 0.8;}
+ texel = mix(texel, detail_texel,mix_factor);
+ local_autumn_factor = texel.a;
+ }
}
}
-}
-// autumn colors
+ // autumn colors
-float autumn_factor = season * 2.0 * (1.0 - local_autumn_factor) ;
+ float autumn_factor = season * 2.0 * (1.0 - local_autumn_factor) ;
-texel.r = min(1.0, (1.0 + 2.5 * autumn_factor) * texel.r);
-texel.g = texel.g;
-texel.b = max(0.0, (1.0 - 4.0 * autumn_factor) * texel.b);
+ texel.r = min(1.0, (1.0 + 2.5 * autumn_factor) * texel.r);
+ texel.g = texel.g;
+ texel.b = max(0.0, (1.0 - 4.0 * autumn_factor) * texel.b);
-if (local_autumn_factor < 1.0)
- {
- intensity = length(texel.rgb) * (1.0 - 0.5 * smoothstep(1.1,2.0,season));
- texel.rgb = intensity * normalize(mix(texel.rgb, vec3(0.23,0.17,0.08), smoothstep(1.1,2.0, season)));
- }
-
-
-
-const vec4 dust_color = vec4 (0.76, 0.71, 0.56, 1.0);
-const vec4 lichen_color = vec4 (0.17, 0.20, 0.06, 1.0);;
-//float snow_alpha;
-
-if (quality_level > 3)
- {
-
- // mix vegetation
- texel = mix(texel, lichen_color, 0.4 * lichen_cover_factor + 0.8 * lichen_cover_factor * 0.5 * (noise_10m + (1.0 - noise_5m)) );
- // mix dust
- texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) );
-
- // mix snow
- if (rawPos.z +500.0 > snowlevel)
- {
- snow_alpha = smoothstep(0.75, 0.85, abs(steepness));
- //texel = mix(texel, snow_texel, texel_snow_fraction);
- texel = mix(texel, snow_texel, snow_texel.a* smoothstep(snowlevel, snowlevel+200.0, snow_alpha * (rawPos.z)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0));
- }
- }
-else if (rawPos.z +500.0 > snowlevel)
- {
- float snow_alpha = 0.5+0.5* smoothstep(0.2,0.8, 0.3 + snow_thickness_factor +0.0001*(rawPos.z -snowlevel) );
-// texel = vec4(dot(vec3(0.2989, 0.5870, 0.1140), texel.rgb));
- texel = mix(texel, vec4(1.0), snow_alpha* smoothstep(snowlevel, snowlevel+200.0, (rawPos.z)));
- }
-
-
-
-// get distribution of water when terrain is wet
-
-float water_threshold1;
-float water_threshold2;
-float water_factor =0.0;
-
-
-if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0))
- {
- water_threshold1 = 1.0-0.5* wetness;
- water_threshold2 = 1.0 - 0.3 * wetness;
- water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness));
- }
-
-// darken wet terrain
-
- texel.rgb = texel.rgb * (1.0 - 0.6 * wetness);
-
-
-// light computations
-
-
- vec4 light_specular = gl_LightSource[0].specular;
-
- // If gl_Color.a == 0, this is a back-facing polygon and the
- // normal should be reversed.
- //n = (2.0 * gl_Color.a - 1.0) * normal;
- n = normal;//vec3 (nvec.x, nvec.y, sqrt(1.0 -pow(nvec.x,2.0) - pow(nvec.y,2.0) ));
- n = normalize(n);
-
- NdotL = dot(n, lightDir);
- if ((tquality_level > 3) && (mix_flag ==1)&& (dist < 2000.0) && (quality_level > 4))
- {
- noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05;
- noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05;
- NdotL = NdotL + 1.0 * (noisegrad_10m + 0.5* noisegrad_5m) * mix_factor/0.8 * (1.0 - smoothstep(1000.0, 2000.0, dist));
- }
-
-
- if (NdotL > 0.0) {
- float shadowmap = getShadowing();
- vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
- color += diffuse_term * NdotL * shadowmap;
- NdotHV = max(dot(n, halfVector), 0.0);
- if (mat_shininess > 0.0)
- specular.rgb = (mat_specular.rgb
- * light_specular.rgb
- * pow(NdotHV, mat_shininess)
- * shadowmap);
- }
- color.a = 1.0;//diffuse_term.a;
- // This shouldn't be necessary, but our lighting becomes very
- // saturated. Clamping the color before modulating by the texture
- // is closer to what the OpenGL fixed function pipeline does.
- color = clamp(color, 0.0, 1.0);
-
-
-
-
- fragColor = color * texel + specular;
- fragColor.rgb += getClusteredLightsContribution(eyePos.xyz, n, texel.rgb);
-
- // here comes the terrain haze model
-
- float delta_z = hazeLayerAltitude - eye_alt;
-
-
-if (dist > 0.04 * min(visibility,avisibility))
-//if ((gl_FragCoord.y > ylimit) || (gl_FragCoord.x < zlimit1) || (gl_FragCoord.x > zlimit2))
-//if (dist > 40.0)
-{
-
- alt = eye_alt;
-
-
- float transmission;
- float vAltitude;
- float delta_zv;
- float H;
- float distance_in_layer;
- float transmission_arg;
-
-
-
-
-// we solve the geometry what part of the light path is attenuated normally and what is through the haze layer
-
-if (delta_z > 0.0) // we're inside the layer
- {
- if (ct < 0.0) // we look down
- {
- distance_in_layer = dist;
- vAltitude = min(distance_in_layer,min(visibility, avisibility)) * ct;
- delta_zv = delta_z - vAltitude;
- }
- else // we may look through upper layer edge
- {
- H = dist * ct;
- if (H > delta_z) {distance_in_layer = dist/H * delta_z;}
- else {distance_in_layer = dist;}
- vAltitude = min(distance_in_layer,visibility) * ct;
- delta_zv = delta_z - vAltitude;
- }
- }
- else // we see the layer from above, delta_z < 0.0
- {
- H = dist * -ct;
- if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading
+ if (local_autumn_factor < 1.0)
{
- distance_in_layer = 0.0;
- delta_zv = 0.0;
- }
- else
+ intensity = length(texel.rgb) * (1.0 - 0.5 * smoothstep(1.1,2.0,season));
+ texel.rgb = intensity * normalize(mix(texel.rgb, vec3(0.23,0.17,0.08), smoothstep(1.1,2.0, season)));
+ }
+
+
+
+ const vec4 dust_color = vec4 (0.76, 0.71, 0.56, 1.0);
+ const vec4 lichen_color = vec4 (0.17, 0.20, 0.06, 1.0);;
+ //float snow_alpha;
+
+ if (quality_level > 3)
{
- vAltitude = H + delta_z;
- distance_in_layer = vAltitude/H * dist;
- vAltitude = min(distance_in_layer,visibility) * (-ct);
- delta_zv = vAltitude;
- }
- }
+
+ // mix vegetation
+ texel = mix(texel, lichen_color, 0.4 * lichen_cover_factor + 0.8 * lichen_cover_factor * 0.5 * (noise_10m + (1.0 - noise_5m)) );
+ // mix dust
+ texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) );
-
- // ground haze cannot be thinner than aloft visibility in the model,
- // so we need to use aloft visibility otherwise
- transmission_arg = (dist-distance_in_layer)/avisibility;
-
- float eqColorFactor;
+ // mix snow
+ if (msl_altitude +500.0 > snowlevel)
+ {
+ snow_alpha = smoothstep(0.75, 0.85, abs(steepness));
+ //texel = mix(texel, snow_texel, texel_snow_fraction);
+ texel = mix(texel, snow_texel, snow_texel.a* smoothstep(snowlevel, snowlevel+200.0, snow_alpha * (msl_altitude)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0));
+ }
+ }
+ else if (msl_altitude +500.0 > snowlevel)
+ {
+ float snow_alpha = 0.5+0.5* smoothstep(0.2,0.8, 0.3 + snow_thickness_factor +0.0001*(msl_altitude -snowlevel) );
+ // texel = vec4(dot(vec3(0.2989, 0.5870, 0.1140), texel.rgb));
+ texel = mix(texel, vec4(1.0), snow_alpha* smoothstep(snowlevel, snowlevel+200.0, (msl_altitude)));
+ }
-if (visibility < avisibility)
- {
- if (quality_level > 3)
- {
- transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) ));
+ // get distribution of water when terrain is wet
- }
- else
- {
- transmission_arg = transmission_arg + (distance_in_layer/visibility);
- }
- // this combines the Weber-Fechner intensity
- eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 - effective_scattering);
+ float water_threshold1;
+ float water_threshold2;
+ float water_factor =0.0;
- }
-else
- {
- if (quality_level > 3)
- {
- transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) ));
- }
- else
- {
- transmission_arg = transmission_arg + (distance_in_layer/avisibility);
- }
- // this combines the Weber-Fechner intensity
- eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 - effective_scattering);
- }
- transmission = fog_func(transmission_arg, alt);
+ if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0))
+ {
+ water_threshold1 = 1.0-0.5* wetness;
+ water_threshold2 = 1.0 - 0.3 * wetness;
+ water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness));
+ }
-// there's always residual intensity, we should never be driven to zero
-if (eqColorFactor < 0.2) eqColorFactor = 0.2;
+ // darken wet terrain
+ texel.rgb = texel.rgb * (1.0 - 0.6 * wetness);
+
+
+ // light computations
+
+
+ vec4 light_specular = gl_LightSource[0].specular;
+
+ // If gl_Color.a == 0, this is a back-facing polygon and the
+ // normal should be reversed.
+ //n = (2.0 * gl_Color.a - 1.0) * normal;
+ n = normal;//vec3 (nvec.x, nvec.y, sqrt(1.0 -pow(nvec.x,2.0) - pow(nvec.y,2.0) ));
+ n = normalize(n);
+
+ NdotL = dot(n, lightDir);
+ if ((tquality_level > 3) && (mix_flag ==1)&& (dist < 2000.0) && (quality_level > 4))
+ {
+ noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05;
+ noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05;
+ NdotL = NdotL + 1.0 * (noisegrad_10m + 0.5* noisegrad_5m) * mix_factor/0.8 * (1.0 - smoothstep(1000.0, 2000.0, dist));
+ }
+
+
+ if (NdotL > 0.0) {
+ float shadowmap = getShadowing();
+ vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
+ color += diffuse_term * NdotL * shadowmap;
+ NdotHV = max(dot(n, halfVector), 0.0);
+ if (mat_shininess > 0.0)
+ specular.rgb = (mat_specular.rgb
+ * light_specular.rgb
+ * pow(NdotHV, mat_shininess)
+ * shadowmap);
+ }
+ color.a = 1.0;//diffuse_term.a;
+ // This shouldn't be necessary, but our lighting becomes very
+ // saturated. Clamping the color before modulating by the texture
+ // is closer to what the OpenGL fixed function pipeline does.
+ color = clamp(color, 0.0, 1.0);
+
+ fragColor = color * texel + specular;
+ fragColor.rgb += getClusteredLightsContribution(eyePos.xyz, n, texel.rgb);
+ }
float lightArg = (terminator-yprime_alt)/100000.0;
vec3 hazeColor = get_hazeColor(lightArg);
-
- // now dim the light for haze
- eShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt);
-
-
-// Mie-like factor
-
- if (lightArg < 10.0)
- {
- intensity = length(hazeColor);
- float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt));
- hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) );
- }
-
-intensity = length(hazeColor);
-
-if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColor doesn't come out correctly
-{
-
-
- // high altitude desaturation of the haze color
- hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt)));
-
- // blue hue of haze
-
- hazeColor.x = hazeColor.x * 0.83;
- hazeColor.y = hazeColor.y * 0.9;
-
-
- // additional blue in indirect light
- float fade_out = max(0.65 - 0.3 *overcast, 0.45);
- intensity = length(hazeColor);
- hazeColor = intensity * normalize(mix(hazeColor, 1.5* shadedFogColor, 1.0 -smoothstep(0.25, fade_out,eShade) ));
-
- // change haze color to blue hue for strong fogging
-
- hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothstep(0.5,0.9,eqColorFactor))));
-
-
-
- // reduce haze intensity when looking at shaded surfaces, only in terminator region
- float shadow = mix( min(1.0 + dot(n,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission));
- hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator));
-
- // don't let the light fade out too rapidly
- lightArg = (terminator + 200000.0)/100000.0;
- float minLightIntensity = min(0.2,0.16 * lightArg + 0.5);
- vec3 minLight = minLightIntensity * vec3 (0.2, 0.3, 0.4);
- hazeColor *= eqColorFactor * eShade;
- hazeColor.rgb = max(hazeColor.rgb, minLight.rgb);
-
- }
-
-
-// Testing phase controls
-if (reduce_haze_without_removing_calculation_overhead == 1)
-{
-transmission = 1.0 - (transmission/1000000.0);
-}
-
-fragColor.rgb = mix(clamp(hazeColor,0.0,1.0) , clamp(fragColor.rgb,0.0,1.0),transmission);
-
- }
-
- fragColor.rgb = filter_combined(fragColor.rgb);
-
- gl_FragColor = fragColor;
-
+ gl_FragColor = applyHaze(fragColor, hazeColor, vec3(0.0), ct, hazeLayerAltitude, visibility, avisibility, dist, lightArg, mie_angle);
// Testing phase controls:
diff --git a/Shaders/ws30-ALS-detailed.vert b/Shaders/ws30-ALS-detailed.vert
index 0eb906e96..ead1bcca7 100644
--- a/Shaders/ws30-ALS-detailed.vert
+++ b/Shaders/ws30-ALS-detailed.vert
@@ -25,10 +25,12 @@ attribute vec2 orthophotoTexCoord;
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
-varying vec3 rawPos;
+varying vec2 ground_tex_coord;
+varying vec2 rawPos;
varying vec3 worldPos;
//varying vec2 orthoTexCoord;
varying vec4 eyePos;
+varying vec4 ecPosition;
// Sent packed into alpha channels
//varying float yprime_alt;
@@ -36,6 +38,19 @@ varying float mie_angle;
varying float steepness;
+// For water calculations
+varying float earthShade;
+varying vec3 lightdir;
+varying vec4 waterTex1;
+varying vec4 waterTex2;
+varying vec4 waterTex4;
+varying vec3 specular_light;
+
+uniform float osg_SimulationTime;
+uniform float WindN;
+uniform float WindE;
+
+
uniform int colorMode;
uniform float hazeLayerAltitude;
uniform float terminator;
@@ -55,7 +70,6 @@ uniform mat4 osg_ViewMatrixInverse;
uniform mat4 fg_zUpTransform;
uniform vec3 fg_modelOffset;
-float earthShade;
float yprime_alt;
//float mie_angle;
@@ -77,6 +91,14 @@ if (x < -15.0) {return 0.0;}
return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
}
+void createRotationMatrix(in float angle, out mat4 rotmat)
+{
+ rotmat = mat4( cos( angle ), -sin( angle ), 0.0, 0.0,
+ sin( angle ), cos( angle ), 0.0, 0.0,
+ 0.0 , 0.0 , 1.0, 0.0,
+ 0.0 , 0.0 , 0.0, 1.0 );
+}
+
void main()
{
@@ -95,7 +117,7 @@ void main()
float vertex_alt;
float scattering;
- rawPos = (fg_zUpTransform * gl_Vertex).xyz;
+ rawPos = (fg_zUpTransform * gl_Vertex).xy;
worldPos = fg_modelOffset + gl_Vertex.xyz;
eyePos = gl_ModelViewMatrix * gl_Vertex;
steepness = dot(normalize(vec3(fg_zUpTransform * vec4(gl_Normal,1.0))), vec3 (0.0, 0.0, 1.0));
@@ -104,12 +126,16 @@ void main()
// this code is copied from default.vert
//vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+ ecPosition = gl_ModelViewMatrix * gl_Vertex;
gl_Position = ftransform();
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
//orthoTexCoord = orthophotoTexCoord;
normal = gl_NormalMatrix * gl_Normal;
//nvec = (gl_NormalMatrix * gl_Normal).xy;
+ // Temporary value:
+ ground_tex_coord = gl_TexCoord[0].st;
+
// here start computations for the haze layer
// we need several geometrical quantities
@@ -126,9 +152,29 @@ void main()
float dist = length(relPos);
// altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m
- vertex_alt = max(rawPos.z,100.0);
+ vertex_alt = max(relPos.z,100.0);
scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
+ // Required for water calculations
+ lightdir = normalize(vec3(fg_zUpTransform * vec4(gl_ModelViewMatrixInverse * gl_LightSource[0].position)));
+ waterTex4 = vec4( ecPosition.xzy, 0.0 );
+
+ vec4 t1 = vec4(0.0, osg_SimulationTime * 0.005217, 0.0, 0.0);
+ vec4 t2 = vec4(0.0, osg_SimulationTime * -0.0012, 0.0, 0.0);
+
+ float Angle;
+
+ float windFactor = sqrt(WindE * WindE + WindN * WindN) * 0.05;
+ if (WindN == 0.0 && WindE == 0.0) {
+ Angle = 0.0;
+ } else {
+ Angle = atan(-WindN, WindE) - atan(1.0);
+ }
+
+ mat4 RotationMatrix;
+ createRotationMatrix(Angle, RotationMatrix);
+ waterTex1 = gl_MultiTexCoord0 * RotationMatrix - t1 * windFactor;
+ waterTex2 = gl_MultiTexCoord0 * RotationMatrix - t2 * windFactor;
// early culling of vertices which can't be seen due to ground haze despite being in aloft visibility range
@@ -193,6 +239,14 @@ if (terminator < 1000000.0) // the full, sunrise and sunset computation
light_ambient.b = light_ambient.r * 0.5/0.33; //light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.5);
light_ambient.a = 1.0;
+ // Water specular calculations
+ specular_light.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ specular_light.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ specular_light.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ specular_light = max(specular_light * scattering, vec3 (0.05, 0.05, 0.05));
+ intensity = length(specular_light.rgb);
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.1, 0.6,ground_scattering) ));
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.5, 0.7,earthShade)));
@@ -207,6 +261,13 @@ if (earthShade < 0.5)
light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) ));
}
+ // directional scattering for low sun
+ if (lightArg < 10.0) {
+ mie_angle = (0.5 * dot(normalize(relPos), lightdir) ) + 0.5;
+ } else {
+ mie_angle = 1.0;
+ }
+
// the haze gets the light at the altitude of the haze top if the vertex in view is below
// but the light at the vertex if the vertex is above
@@ -237,7 +298,9 @@ else // the faster, full-day version without lightfields
if (terminator > 3000000.0)
{light_diffuse = vec4 (1.0, 1.0, 1.0, 1.0);
- light_ambient = vec4 (0.33, 0.4, 0.5, 1.0); }
+ light_ambient = vec4 (0.33, 0.4, 0.5, 1.0);
+ specular_light = vec3 (1.0, 1.0, 1.0);
+ }
else
{
@@ -253,9 +316,16 @@ else // the faster, full-day version without lightfields
light_ambient.g = light_ambient.r * 0.4/0.33;
light_ambient.b = light_ambient.r * 0.5/0.33;
light_ambient.a = 1.0;
+
+ specular_light.b = 0.78 + lightArg * 0.21;
+ specular_light.g = 0.907 + lightArg * 0.091;
+ specular_light.r = 0.904 + lightArg * 0.092;
+
}
light_diffuse = light_diffuse * scattering;
+ specular_light = specular_light * scattering;
+
yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);
}
@@ -271,7 +341,8 @@ float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smooth
light_ambient.rgb = light_ambient.rgb * (1.0 - shade_depth);
light_diffuse.rgb = light_diffuse.rgb * (1.0 + 1.2 * shade_depth);
-
+ specular_light.rgb *= (1.0 + 1.2 * shade_depth);
+
if (use_IR_vision)
{
light_ambient.rgb = max(light_ambient.rgb, vec3 (0.5, 0.5, 0.5));
diff --git a/Shaders/ws30-ALS-landclass-search-functions.frag b/Shaders/ws30-ALS-landclass-search-functions.frag
index af480b089..ed5ee9647 100644
--- a/Shaders/ws30-ALS-landclass-search-functions.frag
+++ b/Shaders/ws30-ALS-landclass-search-functions.frag
@@ -110,7 +110,7 @@
// Enable large scale transitions: 1=on, 0=off
// Disable use landclass texel scale transition, if using this.
- const int enable_large_scale_transition_search = 0;
+ const int enable_large_scale_transition_search = 1;
// The search pattern is center + n points in four directions forming a cross.
@@ -124,7 +124,7 @@
// Note: transitions occur on both sides of the landclass borders.
// The width of the transition is equal to 2x this value.
// Default: 100m
- const float transition_search_distance_in_m = 100.0;
+ const float transition_search_distance_in_m = 25.0;
// Number of points to search in any direction, in addition to this fragment
// Default:4 points. Fewer points results in a less smooth transition (more banding)
@@ -158,8 +158,11 @@
// This works by changing the weighting in the transition region using a
// noise lookup
// Possibe values: 0=off, 1=on. Default:0
- const int grow_landclass_borders_with_large_scale_transition = 0;
+ const int grow_landclass_borders_with_large_scale_transition = 1;
+// Use the edge-hardness parameter from materials.xml to determine
+// weighting of the landclass in transitions
+ const int use_edge_hardness_with_large_scale_transition = 1;
//////////////////////////////////////////////////////////////////
@@ -181,7 +184,7 @@
// Possible values: 0 = texture source, 1 = math source
// The texture source still shows some tiling. The math source detiles better, but might
// be slightly slower.
- const int detiling_noise_type = 0;
+ const int detiling_noise_type = 1;
// Development tools - 2 controls, now located at the top of WS30-ALS-ultra.frag:
// 1. Reduce haze to almost zero, while preserving lighting. Useful for observing distant tiles.
@@ -190,6 +193,15 @@
// Useful for checking texture rendering and scenery.
// The compiler will likely optimise out the haze and lighting calculations.
//
+
+// Debugging: ground texture array lookup function
+// Possible values:
+// 0: Normal: TextureGrad() with partial derivatives. GLSL 1.30.
+// 1: textureLod() using partial derivatives to manually calculate LoD. GLSL 1.20
+// 2: texture() without partial derivatives. GLSL 1.20
+ const int tex_lookup_type = 0;
+
+//
// End of test phase controls
//////////////////////////////////////////////////////////////////
@@ -225,6 +237,7 @@
// Uniforms used by landclass search functions.
// If any uniforms change name or form, remember to update here and in fragment shaders.
+
uniform sampler2D landclass;
uniform sampler2DArray textureArray;
uniform sampler2D perlin;
@@ -253,6 +266,33 @@ vec2 tile_size = vec2(fg_tileHeight , fg_tileWidth);
float rand2D(in vec2 co);
float Noise2D(in vec2 coord, in float wavelength);
+// Generates a full precision 32 bit random number from 2 seeds
+// as well as 6 random integers between 0 and factor that are rescaled 0.0-1.0
+// by re-using the significant figures from the full precision number.
+// This avoids having to generate 6 random numbers when
+// limited variation is needed: say 6 numbers with 100 levels (i.e between 0 and 100).
+// Seed 2 is incremented so the function can be called again to generate
+// a different set of numbers
+float get6_rand_nums(in float PRNGseed1, inout float PRNGseed2, float factor, out float [6] random_integers)
+{
+
+ float r = fract(sin(dot(vec2(PRNGseed1,PRNGseed2),vec2(12.9898,78.233))) * 43758.5453);
+
+ // random number left over after extracting some decimal places
+ float rlo = r;
+ // To look at: can this be made simd friendly?
+ for (int i=0;i<6;i++)
+ {
+ rlo = (rlo*factor);
+ random_integers[i] = floor(rlo)/factor;
+ rlo = fract(rlo);
+ }
+
+ PRNGseed2+=1.0;
+ return r;
+}
+
+
// Create random landclasses without a texture lookup to stress test.
// Each square of square_size in m is assigned a random landclass value.
int get_random_landclass(in vec2 co, in vec2 tile_size)
@@ -263,17 +303,32 @@ int get_random_landclass(in vec2 co, in vec2 tile_size)
}
-// Look up texture coordinates and stretching scale of ground textures
-void get_ground_texture_data(in int lc, in vec2 tile_coord,
- out vec2 st, out vec2 g_texture_scale, inout vec2 dx, inout vec2 dy)
+/*
+// Look up stretching scale of ground textures for the base texture.
+// Note terrain default effect only has controls for the texture stretching dimensions for the base texture.
+// Non-base textures use hardcoded stretching of the ground texture coords, which are in units of meters.
+vec2 get_ground_texture_scale(in int lc)
{
// Look up stretching dimensions of ground textures in m - scaled to
// fit in [0..1], so rescale
vec2 g_texture_stretch_dim = fg_dimensionsArray[lc].st;
- g_texture_scale = tile_size.xy / g_texture_stretch_dim.xy;
+ return (tile_size.xy / g_texture_stretch_dim.xy);
+}
+*/
+
+
+// Look up texture coordinates and stretching scale of ground textures for the base texture.
+// Note terrain default effect only has controls for the texture stretching dimensions for the base texture.
+// Non-base textures use hardcoded stretching of the ground texture coords, which are in units of meters.
+void get_ground_texture_data(in int lc, in vec2 tile_coord,
+ out vec2 st, out vec2 g_texture_scale, inout vec4 dFdx_and_dFdy)
+{
+ // Look up stretching dimensions of ground textures in m - scaled to
+ // fit in [0..1], so rescale
+ vec2 g_texture_stretch_dim = fg_dimensionsArray[lc].st;
+ g_texture_scale = tile_size.xy / g_texture_stretch_dim.xy;
// Correct partial derivatives to account for stretching of different textures
- dx = dx * g_texture_scale;
- dy = dy * g_texture_scale;
+ dFdx_and_dFdy = dFdx_and_dFdy * vec4(g_texture_scale.st, g_texture_scale.st);
// Ground texture coords
st = g_texture_scale * tile_coord.st;
}
@@ -284,10 +339,12 @@ void get_ground_texture_data(in int lc, in vec2 tile_coord,
// Testing: if this or get_ground_texture_data used in final WS3 to handle
// many base texture lookups, see if optimising to handle many inputs helps
// (vectorising Noise2D versus just many texture calls)
-
+// To do: adjust for non-tile based ground coords.
vec2 detile_texcoords_with_perlin_noise(in vec2 st, in vec2 ground_texture_scale,
- in vec2 tile_coord, inout vec2 dx, inout vec2 dy)
+ in vec2 tile_coord, inout vec4 dFdx_and_dFdy)
{
+ vec4 dxdy = dFdx_and_dFdy;
+
vec2 pnoise;
// Ratio tile dimensions are stretched relative to s.
@@ -315,21 +372,25 @@ vec2 detile_texcoords_with_perlin_noise(in vec2 st, in vec2 ground_texture_scale
if (pnoise[0] >= 0.5)
{
+ // To do: fix once ground coords are no longer tile based
st = ground_texture_scale.st * (tile_coord * stretch_r).ts;
// Get back original partial derivatives by undoing
// previous texture stretching adjustment done in get_ground_data
- dx = dx / ground_texture_scale.st;
- dy = dy / ground_texture_scale.st;
+ dxdy = dxdy / vec4(ground_texture_scale.st, ground_texture_scale.st);
+
// Recalculate new derivatives
- dx = dx.ts * ground_texture_scale.st * stretch_r.ts;
- dy = dy.ts * ground_texture_scale.st * stretch_r.ts;
+ vec2 factor = ground_texture_scale.st * stretch_r.ts;
+ dxdy.st = dxdy.ts * factor;
+ dxdy.pq = dxdy.qp * factor;
}
if (pnoise[1] >= 0.5)
{
- st = -st; dx = -dx; dy = -dy;
+ st = -st; dxdy = -dxdy;
}
+
+ dFdx_and_dFdy = dxdy;
return st;
}
@@ -339,38 +400,130 @@ vec2 detile_texcoords_with_perlin_noise(in vec2 st, in vec2 ground_texture_scale
// The partial derivatives of the tile_coord at the fragment is needed to adjust for
// the stretching of different textures, so that the correct mip-map level is looked
// up and there are no seams.
+// Texture types: 0: base texture, 1: grain texture, 2: gradient texture, 3 dot texture,
+// 4: mix texture, 5: detail texture.
-vec4 lookup_ground_texture_array(in vec2 tile_coord, in int landclass_id,
- in vec2 dx, in vec2 dy)
+vec4 lookup_ground_texture_array(in int texture_type, in vec2 ground_texture_coord, in int landclass_id,
+ in vec4 dFdx_and_dFdy)
{
// Testing: may be able to save 1 or 2 op slots by combining dx/dy in a vec4 and
// using swizzles which are free, but mostly operations are working independenly on s and t.
// Only 1 place so far that just multiplies everything by a scalar.
vec2 st;
+ vec2 g_tex_coord = ground_texture_coord;
vec2 g_texture_scale;
vec4 texel;
int lc = landclass_id;
+ vec4 dxdy = dFdx_and_dFdy;
+
+ // Find the index of the specified texture type (e.g. mix or gradient texture ) in
+ // the ground texture lookup array.
+ // Since texture_type is a constant in the fragment shader, there should be no performance hit for branching.
- get_ground_texture_data(lc, tile_coord, st, g_texture_scale, dx, dy);
+ int tex_idx = 0;
+ int type = texture_type;
+
+ // Index for the base texture is contained fg_textureLookup1[lc].r
+ if (type == 0) tex_idx = int(uint(fg_textureLookup1[lc].r * 255.0 + 0.5));
+
+ // Grain texture is material texture slot 14, the index of which is mapped to the r channel of fg_textureLookup2
+ else if (type == 1) tex_idx = int(fg_textureLookup2[lc].r * 255.0 + 0.5);
+
+ // Gradient texture is material texture 13, the index of which is mapped to the a channel of fg_textureLookup1
+ else if (type == 2) tex_idx = int(fg_textureLookup1[lc].a * 255.0 + 0.5);
+
+ // Dot texture is material texture 15, the index of which is mapped to the g channel of fg_textureLookup2
+ else if (type == 3) tex_idx = int(fg_textureLookup2[lc].g * 255.0 + 0.5);
+
+ // Mix texture is material texture 12, the index of which is mapped to the b channel of fg_textureLookup1
+ else if (type == 4) tex_idx = int(fg_textureLookup1[lc].b * 255.0 + 0.5);
+
+ // Detail texture is material texture 11, the index of which is mapped to the g channel of fg_textureLookup1
+ else if (type == 5) tex_idx = int(fg_textureLookup1[lc].g * 255.0 + 0.5);
- st = detile_texcoords_with_perlin_noise(st, g_texture_scale, tile_coord, dx, dy);
+ if (type == 0)
+ {
+ // Scale normalised tile coords by stretching factor, and get info
+ vec2 tile_coord = g_tex_coord;
+ get_ground_texture_data(lc, tile_coord, st, g_texture_scale, dxdy);
+ st = detile_texcoords_with_perlin_noise(st, g_texture_scale, tile_coord, dxdy);
+ }
+ else
+ {
+ st = g_tex_coord;
+ }
- //texel = texture(textureArray, vec3(st, lc));
- //texel = textureLod(textureArray, vec3(st, lc), 12.0);
- uint tex1 = uint(fg_textureLookup1[lc].r * 255.0 + 0.5);
- texel = textureGrad(textureArray, vec3(st, tex1), dx, dy);
+
+ // Debugging: multiple texture lookup functions if there are issues
+ // with old GPUs and compilers.
+ if (tex_lookup_type == 0)
+ {
+ texel = textureGrad(textureArray, vec3(st, tex_idx), dxdy.st, dxdy.pq);
+ }
+ else if (tex_lookup_type == 1)
+ {
+ float lod = max(length(dxdy.sp), length(dxdy.tq));
+ lod = log2(lod);
+ texel = textureLod(textureArray, vec3(st, tex_idx), lod);
+ }
+ else texel = texture(textureArray, vec3(st, tex_idx));
+
+
+ //texel = textureGrad(textureArray, vec3(st, tex_idx), dxdy.st, dxdy.pq);
return texel;
}
+
+// Look up the texel of the specified texture type (e.g. grain or detail textures) for this fragment
+// and any neighbor texels, then mix.
+
+vec4 get_mixed_texel(in int texture_type, in vec2 g_texture_coord,
+ in int landclass_id, in int num_unique_neighbors,
+ in ivec4 neighbor_texel_landclass_ids, in vec4 neighbor_mix_factors,
+ in vec4 dFdx_and_dFdy
+ )
+{
+ vec2 st = g_texture_coord;
+ int lc = landclass_id;
+ ivec4 lc_n = neighbor_texel_landclass_ids;
+ // Not implemented yet
+ int type = texture_type;
+ vec4 dxdy = dFdx_and_dFdy;
+ vec4 mfact = neighbor_mix_factors;
+
+ vec4 texel = lookup_ground_texture_array(0, st, lc, dxdy);
+
+
+ // Mix texels - to work consistently it needs a more preceptual interpolation than mix()
+ if (num_unique_neighbors != 0)
+ {
+ // Closest neighbor landclass
+ vec4 texel_closest = lookup_ground_texture_array(0, st, lc_n[0], dxdy);
+
+ // Neighbor contributions
+ vec4 texel_nc=texel_closest;
+
+ if (num_unique_neighbors > 1)
+ {
+ // 2nd Closest neighbor landclass
+ vec4 texel_2nd_closest = lookup_ground_texture_array(0, st, lc_n[1], dxdy);
+
+ texel_nc = mix(texel_closest, texel_2nd_closest, mfact[1]);
+ }
+
+ texel = mix(texel, texel_nc, mfact[0]);
+ }
+ return texel;
+}
+
+
// Landclass sources: texture or random
int read_landclass_id(in vec2 tile_coord)
{
- vec2 dx = dFdx(tile_coord.st);
- vec2 dy = dFdy(tile_coord.st);
int lc;
- if (landclass_source == 0) lc = (int(texture2D(landclass, tile_coord.st).r * 255.0 + 0.5));
+ if (landclass_source == 0) lc = (int(texture2D(landclass, tile_coord.st).g * 255.0 + 0.5));
else lc = (get_random_landclass(tile_coord.st, tile_size));
return lc;
}
@@ -411,13 +564,14 @@ float get_growth_priority(in int current_landclass, in int neighbor_landclass1,
}
-
-int lookup_landclass_id(in vec2 tile_coord, in vec2 dx, in vec2 dy,
+int lookup_landclass_id(in vec2 tile_coord, in vec4 dFdx_and_dFdy,
out ivec4 neighbor_texel_landclass_ids,
out int number_of_unique_neighbors_found, out vec4 landclass_neighbor_texel_weights)
{
- // To do: fix landclass border artifacts, with all shaders. do small scale texel mixing for 2 neighbors
+ // To do: fix landclass border artifacts, with all shaders.
+
+ vec4 dxdy = dFdx_and_dFdy;
// Number of unique neighbours found
int num_n = 0;
@@ -622,7 +776,9 @@ if (remove_squareness_from_landclass_texture == 1)
// Turn neighbor growth off at longer ranges, otherwise there is flickering noise
// Testing: The exact cutoff could be done sooner to save some performance - needs
// to be part of a larger solution to similar issues. User should set a tolerance factor.
- float lod_factor = min(length(vec2(dx.s, dy.s)),length(vec2(dx.t, dy.t)));
+ // Effectively: lod_factor = min(length(vec2(dFdx(..).s, dFdy(..).s)),length(vec2(dFdx(..).t, dFdy(..).t)));
+ float lod_factor = min(length(vec2(dxdy.s, dxdy.p)),length(vec2(dxdy.t, dxdy.q)));
+
// Estimate of frequency of growth noise in texels - i.e. how many peaks and troughs fit in one texel
const float frequency_g_n = 1000.0;
const float cutoff = 1.0/frequency_g_n;
@@ -732,19 +888,20 @@ if ( (use_landclass_texel_scale_transition_only == 1) &&
// Searches are performed in upto 4 directions right now, but only one landclass is looked up
// Create a mix factor werighting the influences of nearby landclasses
-void get_landclass_id(in vec2 tile_coord,
- const in float landclass_texel_size_m, in vec2 dx, in vec2 dy,
+void get_landclass_id(in vec2 tile_coord, in vec4 dFdx_and_dFdy,
out int landclass_id, out ivec4 neighbor_landclass_ids,
out int num_unique_neighbors,out vec4 mix_factor
)
+
{
// Each tile has 1 texture containing landclass ids stetched over it
// Landclass source type: 0=texture, 1=random squares
- // Controls are defined at global scope. const int landclass_source
- float ts = landclass_texel_size_m;
+ // Controls are defined at global scope.
vec2 sz = tile_size;
+ vec4 dxdy = dFdx_and_dFdy;
+
// Number of unique neighbors found
int num_n = 0;
@@ -756,7 +913,12 @@ void get_landclass_id(in vec2 tile_coord,
// Number of unique neighbors in neighboring texels
int num_n_tx = 0;
- int lc = lookup_landclass_id(tile_coord, dx, dy, lc_n_tx, num_n_tx, lc_n_w);
+ int lc = lookup_landclass_id(tile_coord, dxdy, lc_n_tx, num_n_tx, lc_n_w);
+
+ float edge_hardness = 0.0;
+ if (use_edge_hardness_with_large_scale_transition == 1) {
+ edge_hardness = fg_dimensionsArray[lc].a;
+ }
// Neighbor landclass ids
ivec4 lc_n = ivec4(lc);
@@ -791,13 +953,14 @@ if ( (enable_large_scale_transition_search == 1) &&
// Transition search
-
const int n = num_search_points_in_a_direction;
const float search_dist = transition_search_distance_in_m;
vec2 step_size_m = vec2(search_dist/float(n));
- // step size in tile coords
- vec2 steps = step_size_m.st / tile_size.st;
+ // step size in tile coords. Modulated by the edge hardness which makes
+ // the step size smaller and hence the range of adjacent landclasses
+ // smaller.
+ vec2 steps = step_size_m.st / tile_size.st * (1.0 - edge_hardness);
vec2 c0 = tile_coord;
@@ -818,6 +981,11 @@ if ( (enable_large_scale_transition_search == 1) &&
// landclass.
+ // Testing: breaking the loop once the closest neighbour is found
+ // results in very slightly lower FPS on a 10 series GPU for 100m search
+ // distance and 4 points. May be faster on old GPUs with slow caching.
+
+
// +s direction
vec2 dir = vec2(steps.s, 0.0);
@@ -982,7 +1150,7 @@ if (grow_landclass_borders_with_large_scale_transition == 1)
// Decide whether to extrude furthest neighbor or closest neighbor onto lc
float grow_n1 = get_growth_priority(lc_n[0],lc_n[1]);
- mfact[1] = mfact[1]+((grow_n > 0.0)?neighbor_growth_mixf:+neighbor_growth_mixf);
+ mfact[1] = mfact[1]+((grow_n > 0.0)?neighbor_growth_mixf:-neighbor_growth_mixf);
mfact[1] = clamp(mfact[1],0.0,1.0);
@@ -1006,3 +1174,46 @@ if (grow_landclass_borders_with_large_scale_transition == 1)
// End Test-phase code
////////////////////////
+
+// Determine the texel and material parameters for a particular fragment,
+// Taking into account photoscenery etc.
+void get_material(in int landclass,
+ in vec2 ground_tex_coord,
+ in vec4 dxdy_gc,
+ out float mat_shininess,
+ out vec4 mat_ambient,
+ out vec4 mat_diffuse,
+ out vec4 mat_specular,
+ out vec4 dxdy,
+ out vec2 st
+ )
+{
+ // Calculate texture coords for ground textures
+ // Textures are stretched along the ground to different
+ // lengths along each axes as set by and
+ // regional definitions parameters.
+ vec2 stretch_dimensions = fg_dimensionsArray[landclass].st;
+ vec2 tileSize = vec2(fg_tileWidth, fg_tileHeight);
+ vec2 texture_scaling = tileSize.yx / stretch_dimensions.st;
+ st = texture_scaling.st * ground_tex_coord.st;
+
+ // Scale partial derivatives
+ dxdy = vec4(texture_scaling.st, texture_scaling.st) * dxdy_gc;
+
+ if (fg_photoScenery) {
+ // In the photoscenery case we don't have landclass or materials available, so we
+ // just use constants for the material properties.
+ mat_ambient = vec4(0.2,0.2,0.2,1.0);
+ mat_diffuse = vec4(0.8,0.8,0.8,1.0);
+ mat_specular = vec4(0.0,0.0,0.0,1.0);
+ mat_shininess = 1.2;
+ } else {
+ // Color Mode is always AMBIENT_AND_DIFFUSE, which means
+ // using a base colour of white for ambient/diffuse,
+ // rather than the material color from ambientArray/diffuseArray.
+ mat_ambient = vec4(1.0,1.0,1.0,1.0);
+ mat_diffuse = vec4(1.0,1.0,1.0,1.0);
+ mat_specular = fg_specularArray[landclass];
+ mat_shininess = fg_dimensionsArray[landclass].z;
+ }
+}
diff --git a/Shaders/ws30-ALS-ultra.frag b/Shaders/ws30-ALS-ultra.frag
index 3e174814a..9ebf488c1 100644
--- a/Shaders/ws30-ALS-ultra.frag
+++ b/Shaders/ws30-ALS-ultra.frag
@@ -5,63 +5,49 @@
#extension GL_EXT_texture_array : enable
// written by Thorsten Renk, Oct 2011, based on default.frag
-
//////////////////////////////////////////////////////////////////
// TEST PHASE TOGGLES AND CONTROLS
//
-
-// Development tools:
-// Reduce haze to almost zero, while preserving lighting. Useful for observing distant tiles.
-// Keeps the calculation overhead. This can be used for profiling.
-// Possible values: 0:Normal, 1:Reduced haze.
- const int reduce_haze_without_removing_calculation_overhead = 0;
-
// Remove haze and lighting and shows just the texture.
// Useful for checking texture rendering and scenery.
// The compiler will likely optimise out the haze and lighting calculations.
// Possible values: 0:Normal, 1:Just the texture.
- const int remove_haze_and_lighting = 0;
+const int remove_haze_and_lighting = 0;
+
+// Randomise texture lookups for 5 non-base textures e.g. mix_texture, detaile_texture etc.
+// Each landclass is assigned 5 random textures from the ground texture array.
+// This simulates a worst case possible texture lookup scenario, without needing access to material parameters.
+// This does not simulate multiple texture sets, of which there may be up-to 4.
+// The performance will likely be worse than in a real situation - there might be fewer textures
+// for mix, detail and other textures. This might be easier on the GPUs texture caches.
+// Possible values: 0: disabled (default),
+// 1: enabled,
+// 2: remove texture array lookups for 5 textures - only base texture + neighbour base textures
+const int randomise_texture_lookups = 0;
+
+// Use built-in water shader. Use for testing impact of ws30-water.frag
+const int water_shader = 1;
//
// End of test phase controls
//////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-// written by Thorsten Renk, Oct 2011, based on default.frag
// Ambient term comes in gl_Color.rgb.
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
-varying vec3 rawPos;
+varying vec2 ground_tex_coord;
varying vec3 worldPos;
-// Testing code:
-//vec3 worldPos = vec3(5000.0, 6000.0, 7000.0) + vec3(vec2(rawPos), 600.0); // vec3(100.0, 10.0, 3.0);
+varying vec2 rawPos;
varying vec3 ecViewdir;
varying vec2 grad_dir;
-//varying vec2 orthoTexCoord;
varying vec4 ecPosition;
-
+varying float steepness;
uniform sampler2D landclass;
uniform sampler2DArray textureArray;
uniform sampler2D perlin;
-
-varying float steepness;
-
-
-
uniform float visibility;
uniform float avisibility;
uniform float scattering;
@@ -89,7 +75,6 @@ uniform float osg_SimulationTime;
uniform int wind_effects;
uniform int cloud_shadow_flag;
-uniform int rock_strata;
uniform int use_searchlight;
uniform int use_landing_light;
uniform int use_alt_landing_light;
@@ -100,27 +85,29 @@ uniform int swatch_size; //in metres, typically 1000 or 2000
uniform float fg_tileWidth;
uniform float fg_tileHeight;
uniform bool fg_photoScenery;
-uniform vec4 fg_dimensionsArray[128];
+// Material parameters, from material definitions and effect defaults, for each landclass.
+// xsize and ysize
+uniform vec4 fg_dimensionsArray[128];
+// RGBA ambient color
uniform vec4 fg_ambientArray[128];
-uniform vec4 fg_diffuseArray[128];
+// RGBA diffuse color
+uniform vec4 fg_diffuseArray[128];
+// RGBA specular color
uniform vec4 fg_specularArray[128];
+// Indicies of textures in the ground texture array for different
+// texture slots (grain, gradient, dot, mix, detail) for each landclass
uniform vec4 fg_textureLookup1[128];
uniform vec4 fg_textureLookup2[128];
+// Each element of a vec4 contains a different materials parameter.
uniform vec4 fg_materialParams1[128];
uniform vec4 fg_materialParams2[128];
+uniform vec4 fg_materialParams3[128];
uniform mat4 fg_zUpTransform;
uniform vec3 fg_modelOffset;
-const float EarthRadius = 5800000.0;
const float terminator_width = 200000.0;
-// Testing phase: Why are these in global scope in WS2 shaders?
-//float alt;
-float eShade;
-float yprime_alt;
-float mie_angle;
-
float shadow_func (in float x, in float y, in float noise, in float dist);
float DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dot_density);
float Noise2D(in vec2 coord, in float wavelength);
@@ -147,9 +134,9 @@ vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
float detail_fade (in float scale, in float angle, in float dist)
{
-float fade_dist = 2000.0 * scale * angle/max(pow(steepness,4.0), 0.1);
-
-return 1.0 - smoothstep(0.5 * fade_dist, fade_dist, dist);
+ float fade_dist = 2000.0 * scale * angle/max(pow(steepness,4.0), 0.1);
+
+ return 1.0 - smoothstep(0.5 * fade_dist, fade_dist, dist);
}
//////////////////////////
@@ -159,538 +146,649 @@ return 1.0 - smoothstep(0.5 * fade_dist, fade_dist, dist);
// These should be sent as uniforms
// Tile dimensions in meters
-// vec2 tile_size = vec2(tile_width , tile_height);
+// vec2 tile_size = vec2(fg_tileWidth , fg_tileHeight);
// Testing: texture coords are sent flipped right now:
// Note tile_size is defined in the shader include: ws30-landclass-search-functions.frag.
-// vec2 tile_size = vec2(tile_height , tile_width);
+//vec2 tile_size = vec2(fg_tileHeight , fg_tileWidth);
+
+
+// Uniform array lookup functions example:
+// Access data[] as if it was a 1-d array of floats
+// with data sorted as rows of data values for each row of texture variants
+// using index for the relevant value
+/*
+float getFloatFromArrayData(int i)
+{
+ int n = int(floor(float(i/4.0)));
+ vec4 v4 = someArray[n];
+ int index_within_v4 = int(mod(float(i),4.0));
+ float value = v4[index_within_v4];
+ return value;
+}
+
+
+vec4 getVec4FromArrayData(int i)
+{
+ return (vec4(getFloatFromArrayData(i), getFloatFromArrayData(i+1), getFloatFromArrayData(i+2), getFloatFromArrayData(i+3)));
+}
+*/
+
+
// From noise.frag
float rand2D(in vec2 co);
-// These functions, and other function they depend on, are defined
-// in ws30-ALS-landclass-search.frag.
+
+// Generates a full precision 32 bit random number from 2 seeds
+// as well as 6 random integers between 0 and factor that are rescaled 0.0-1.0
+// by re-using the significant figures from the full precision number.
+// This avoids having to generate 6 random numbers when
+// limited variation is needed: say 6 numbers with 100 levels (i.e between 0 and 100).
+// Seed 2 is incremented so the function can be called again to generate
+// a different set of numbers
+float get6_rand_nums(in float PRNGseed1,
+ inout float PRNGseed2, float factor, out float [6] random_integers
+ );
+
// Create random landclasses without a texture lookup to stress test.
// Each square of square_size in m is assigned a random landclass value.
int get_random_landclass(in vec2 co, in vec2 tile_size);
+// End Test-phase code
+////////////////////////
+
+
+// These functions, and other function they depend on, are defined
+// in ws30-ALS-landclass-search.frag.
// Lookup a ground texture at a point based on the landclass at that point, without visible
// seams at coordinate discontinuities or at landclass boundaries where texture are switched.
// The partial derivatives of the tile_coord at the fragment is needed to adjust for
// the stretching of different textures, so that the correct mip-map level is looked
// up and there are no seams.
+// Texture types: 0: base texture, 1: grain texture, 2: gradient texture, 3 dot texture,
+// 4: mix texture, 5: detail texture.
-vec4 lookup_ground_texture_array(in vec2 tile_coord, in int landclass_id,
- in vec2 dx, in vec2 dy);
+vec4 lookup_ground_texture_array(in int texture_type, in vec2 ground_texture_coord, in int landclass_id,
+ in vec4 dFdx_and_dFdy);
// Look up the landclass id [0 .. 255] for this particular fragment.
// Lookup id of any neighbouring landclass that is within the search distance.
// Searches are performed in upto 4 directions right now, but only one landclass is looked up
// Create a mix factor werighting the influences of nearby landclasses
-void get_landclass_id(in vec2 tile_coord,
- const in float landclass_texel_size_m, in vec2 dx, in vec2 dy,
+void get_landclass_id(in vec2 tile_coord, in vec4 dFdx_and_dFdy,
out int landclass_id, out ivec4 neighbor_landclass_ids,
out int num_unique_neighbors,out vec4 mix_factor
);
-// End Test-phase code
-////////////////////////
+// Look up the texel of the specified texture type (e.g. grain or detail textures) for this fragment
+// and any neighbor texels, then mix.
+
+vec4 get_mixed_texel(in int texture_type, in vec2 g_texture_coord,
+ in int landclass_id, in int num_unique_neighbors,
+ in ivec4 neighbor_texel_landclass_ids, in vec4 neighbor_mix_factors,
+ in vec4 dFdx_and_dFdy
+ );
+
+// Determine the texel and material parameters for a particular fragment,
+// Taking into account photoscenery etc.
+void get_material(in int landclass,
+ in vec2 ground_tex_coord,
+ in vec4 dxdy_gc,
+ out float mat_shininess,
+ out vec4 mat_ambient,
+ out vec4 mat_diffuse,
+ out vec4 mat_specular,
+ out vec4 dxdy,
+ out vec2 st
+ );
+
+// Apply the ALS haze model to a specific fragment
+vec4 applyHaze(inout vec4 fragColor,
+ inout vec3 hazeColor,
+ in vec3 secondary_light,
+ in float ct,
+ in float hazeLayerAltitude,
+ in float visibility,
+ in float avisibility,
+ in float dist,
+ in float lightArg,
+ in float mie_angle);
+
+// Procedurally generate a water texel for this fragment
+vec4 generateWaterTexel();
void main()
{
-float alt;
-
-yprime_alt = light_diffuse_comp.a;
-//diffuse_term.a = 1.0;
-mie_angle = gl_Color.a;
-float effective_scattering = min(scattering, cloud_self_shading);
-
-// distance to fragment
-
-float dist = length(relPos);
-// angle of view vector with horizon
-float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
-// float altitude of fragment above sea level
-float msl_altitude = (relPos.z + eye_alt);
-
-
-// vec3 shadedFogColor = vec3(0.65, 0.67, 0.78);
- vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
+ float yprime_alt = light_diffuse_comp.a;
+ //diffuse_term.a = 1.0;
+ float mie_angle = gl_Color.a;
+ float effective_scattering = min(scattering, cloud_self_shading);
+
+ // distance to fragment
+ float dist = length(relPos);
+ // angle of view vector with horizon
+ float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
+ // float altitude of fragment above sea level
+ float msl_altitude = (relPos.z + eye_alt);
+
+
// this is taken from default.frag
- vec3 n;
float NdotL, NdotHV, fogFactor;
+ vec3 n = normalize(normal);
vec3 lightDir = gl_LightSource[0].position.xyz;
- vec3 halfVector = normalize(normalize(lightDir) + normalize(ecViewdir));
+ vec3 halfVector = normalize(normalize(lightDir) + normalize(ecViewdir));
+ vec3 secondary_light = vec3 (0.0,0.0,0.0);
+
+
+ // Material/texel properties
+ float mat_shininess;
+ vec2 st;
+ vec4 mat_ambient, mat_diffuse, mat_specular, dxdy;
vec4 texel;
- vec4 snow_texel;
+ vec4 snow_texel;
vec4 detail_texel;
vec4 mix_texel;
- vec4 grain_texel;
- vec4 dot_texel;
- vec4 gradient_texel;
- //vec4 foam_texel;
-
+ vec4 grain_texel;
+ vec4 dot_texel;
+ vec4 gradient_texel;
+
vec4 fragColor;
vec4 specular = vec4(0.0);
float intensity;
+
+ // Wind motion of the overlay noise simulating movement of vegetation and loose debris
+
+ vec2 windPos;
+
+ if (wind_effects > 1)
+ {
+ float windSpeed = length(vec2 (WindE,WindN)) /3.0480;
+ // interfering sine wave wind pattern
+ float sineTerm = sin(0.35 * windSpeed * osg_SimulationTime + 0.05 * (rawPos.x + rawPos.y));
+ sineTerm = sineTerm + sin(0.3 * windSpeed * osg_SimulationTime + 0.04 * (rawPos.x + rawPos.y));
+ sineTerm = sineTerm + sin(0.22 * windSpeed * osg_SimulationTime + 0.05 * (rawPos.x + rawPos.y));
+ sineTerm = sineTerm/3.0;
+ // non-linear amplification to simulate gusts
+ sineTerm = sineTerm * sineTerm;//smoothstep(0.2, 1.0, sineTerm);
+
+ // wind starts moving dust and leaves at around 8 m/s
+ float timeArg = 0.01 * osg_SimulationTime * windSpeed * smoothstep(8.0, 15.0, windSpeed);
+ timeArg = timeArg + 0.02 * sineTerm;
+
+ windPos = vec2 (rawPos.x + WindN * timeArg, rawPos.y + WindE * timeArg);
+ }
+ else
+ {
+ windPos = rawPos.xy;
+ }
+ // get noise at different wavelengths in units of swatch_size
+ // original assumed 4km texture.
+
+ // used: 5m, 5m gradient, 10m, 10m gradient: heightmap of the closeup terrain, 10m also snow
+ // 50m: detail texel
+ // 250m: detail texel
+ // 500m: distortion and overlay
+ // 1500m: overlay, detail, dust, fog
+ // 2000m: overlay, detail, snow, fog
+
+ // Perlin noise
+
+ float noise_10m = Noise2D(rawPos.xy, 10.0);
+ float noise_5m = Noise2D(rawPos.xy ,5.0);
+ float noise_2m = Noise2D(rawPos.xy ,2.0);
+ float noise_1m = Noise2D(rawPos.xy ,1.0);
+ float noise_01m = Noise2D(windPos.xy, 0.1);
+
+ // Noise relative to swatch size
+ float noise_25m = Noise2D(rawPos.xy, swatch_size*0.000625);
+ float noise_50m = Noise2D(rawPos.xy, swatch_size*0.00125);
+ float noise_250m = Noise3D(worldPos.xyz,swatch_size*0.0625);
+ float noise_500m = Noise3D(worldPos.xyz, swatch_size*0.125);
+ float noise_1500m = Noise3D(worldPos.xyz, swatch_size*0.3750);
+ float noise_2000m = Noise3D(worldPos.xyz, swatch_size*0.5);
+ float noise_4000m = Noise3D(worldPos.xyz, swatch_size);
-// Wind motion of the overlay noise simulating movement of vegetation and loose debris
+ float dotnoisegrad_10m;
+
-vec2 windPos;
+ // slope noise
+ float slopenoise_50m = SlopeLines2D(rawPos.xy, grad_dir, 50.0, steepness);
+ float slopenoise_100m = SlopeLines2D(rawPos.xy, grad_dir, 100.0, steepness);
+
+ float snownoise_25m = mix(noise_25m, slopenoise_50m, clamp(3.0*(1.0-steepness),0.0,1.0));
+ float snownoise_50m = mix(noise_50m, slopenoise_100m, clamp(3.0*(1.0-steepness),0.0,1.0));
+
+ // get the texels
+
+
-if (wind_effects > 1)
- {
- float windSpeed = length(vec2 (WindE,WindN)) /3.0480;
- // interfering sine wave wind pattern
- float sineTerm = sin(0.35 * windSpeed * osg_SimulationTime + 0.05 * (rawPos.x + rawPos.y));
- sineTerm = sineTerm + sin(0.3 * windSpeed * osg_SimulationTime + 0.04 * (rawPos.x + rawPos.y));
- sineTerm = sineTerm + sin(0.22 * windSpeed * osg_SimulationTime + 0.05 * (rawPos.x + rawPos.y));
- sineTerm = sineTerm/3.0;
- // non-linear amplification to simulate gusts
- sineTerm = sineTerm * sineTerm;//smoothstep(0.2, 1.0, sineTerm);
-
- // wind starts moving dust and leaves at around 8 m/s
- float timeArg = 0.01 * osg_SimulationTime * windSpeed * smoothstep(8.0, 15.0, windSpeed);
- timeArg = timeArg + 0.02 * sineTerm;
-
- windPos = vec2 (rawPos.x + WindN * timeArg, rawPos.y + WindE * timeArg);
- }
-else
- {
- windPos = rawPos.xy;
- }
-
-
-// get noise at different wavelengths in units of swatch_size
-// original assumed 4km texture.
-
-// used: 5m, 5m gradient, 10m, 10m gradient: heightmap of the closeup terrain, 10m also snow
-// 50m: detail texel
-// 250m: detail texel
-// 500m: distortion and overlay
-// 1500m: overlay, detail, dust, fog
-// 2000m: overlay, detail, snow, fog
-
-// Perlin noise
-
-float noise_10m = Noise2D(rawPos.xy, 10.0);
-float noise_5m = Noise2D(rawPos.xy ,5.0);
-float noise_2m = Noise2D(rawPos.xy ,2.0);
-float noise_1m = Noise2D(rawPos.xy ,1.0);
-float noise_01m = Noise2D(windPos.xy, 0.1);
-
-float noisegrad_10m;
-float noisegrad_5m;
-float noisegrad_2m;
-float noisegrad_1m;
-
-// Noise relative to swatch size
-
-float noise_25m = Noise2D(rawPos.xy, swatch_size*0.000625);
-float noise_50m = Noise2D(rawPos.xy, swatch_size*0.00125);
-
-
-float noise_250m = Noise3D(worldPos.xyz,swatch_size*0.0625);
-float noise_500m = Noise3D(worldPos.xyz, swatch_size*0.125);
-float noise_1500m = Noise3D(worldPos.xyz, swatch_size*0.3750);
-float noise_2000m = Noise3D(worldPos.xyz, swatch_size*0.5);
-float noise_4000m = Noise3D(worldPos.xyz, swatch_size);
-
-
-float dotnoisegrad_10m;
-
-
-// slope noise
-
-float slopenoise_50m = SlopeLines2D(rawPos.xy, grad_dir, 50.0, steepness);
-float slopenoise_100m = SlopeLines2D(rawPos.xy, grad_dir, 100.0, steepness);
-
-float snownoise_25m = mix(noise_25m, slopenoise_50m, clamp(3.0*(1.0-steepness),0.0,1.0));
-float snownoise_50m = mix(noise_50m, slopenoise_100m, clamp(3.0*(1.0-steepness),0.0,1.0));
-
-// get the texels
-
-
-
- float distortion_factor = 1.0;
- vec2 stprime;
- int flag = 1;
- int mix_flag = 1;
- float noise_term;
- float snow_alpha;
+ float distortion_factor = 1.0;
+ vec2 stprime;
+ int flag = 1;
+ int mix_flag = 1;
+ float noise_term;
+ float snow_alpha;
// Oct 27 2021:
// Geometry is in the form of roughly rectangular 'tiles'
// with a mesh forming a grid with regular spacing.
// Each vertex in the mesh is given an elevation
-
+
// Tile dimensions in m
// Testing: created from two float uniforms in global scope. Should be sent as a vec2
// vec2 tile_size
-
+
// Tile texture coordinates range [0..1] over the tile 'rectangle'
vec2 tile_coord = gl_TexCoord[0].st;
+ // Testing code: Coordinate used by ground texture arrays
+ //vec2 ground_tex_coord = gl_TexCoord[0].st;
+
// Test phase: Constants and toggles for transitions between landlcasses are defined at
- // the top of this file.
-
+ // the top landclass-search-functions.frag.
+ // There are some controls for haze and lighting at the top of this file.
+
// Look up the landclass id [0 .. 255] for this particular fragment
// and any neighbouring landclass that is close.
// Each tile has 1 texture containing landclass ids stetched over it.
-
+
// Landclass for current fragment, and up-to 4 neighboring landclasses - 2 used currently
int lc;
ivec4 lc_n;
-
+
int num_unique_neighbors = 0;
-
+
// Mix factor of base textures for 2 neighbour landclass(es)
vec4 mfact;
-
-
- const float landclass_texel_size_m = 25.0;
-
- // Partial derivatives of s and t for this fragment,
+
+ // Partial derivatives of s and t of ground texture coords for this fragment,
// with respect to window (screen space) x and y axes.
// Used to pick mipmap LoD levels, and turn off unneeded procedural detail
- vec2 dx = dFdx(tile_coord);
- vec2 dy = dFdy(tile_coord);
-
- get_landclass_id(tile_coord, landclass_texel_size_m, dx, dy,
- lc, lc_n, num_unique_neighbors, mfact);
-
- // The landclass id is used to index into arrays containing
- // material parameters and textures for the landclass as
- // defined in the regional definitions
- float index = float(lc)/512.0;
- vec4 index_n = vec4(lc_n)/512.0;
-
- float mat_shininess = fg_dimensionsArray[lc].z;
- vec4 mat_ambient = fg_ambientArray[lc];
- vec4 mat_diffuse = fg_diffuseArray[lc];
- vec4 mat_specular = fg_specularArray[lc];
- vec2 st = gl_TexCoord[0].st;
-
- // Testing code:
- // Use rlc even when looking up textures to recreate the extra performance hit
- // so any performance difference between the two is due to the texture lookup
- // color.rgb = color.rgb+0.00001*float(get_random_landclass(tile_coord.st, tile_size));
-
+ // dFdx and dFdy are packed in a vec4 so multiplying everything
+ // to scale takes 1 instruction slot.
+ vec4 dxdy_gc = vec4(dFdx(ground_tex_coord) , dFdy(ground_tex_coord));
+
+ get_landclass_id(tile_coord, dxdy_gc, lc, lc_n, num_unique_neighbors, mfact);
+ get_material(lc, ground_tex_coord, dxdy_gc, mat_shininess, mat_ambient, mat_diffuse, mat_specular, dxdy, st);
+
if (fg_photoScenery) {
- // In the photoscenery case we don't have landclass or materials available, so we
- // just use constants for the material properties.
- mat_ambient = vec4(0.2,0.2,0.2,1.0);
- mat_diffuse = vec4(0.8,0.8,0.8,1.0);
- mat_specular = vec4(0.0,0.0,0.0,1.0);
-
- texel = texture(landclass, vec2(gl_TexCoord[0].s, 1.0 - gl_TexCoord[0].t));
-
+ // The photoscenery orthophots are stored in the landclass texture
+ // and use normalised tile coordinates
+ texel = texture(landclass, vec2(tile_coord.s, 1.0 - tile_coord.t));
+
// Do not attempt any mixing
flag = 0;
mix_flag = 0;
} else {
- // Color Mode is always AMBIENT_AND_DIFFUSE, which means
- // using a base colour of white for ambient/diffuse,
- // rather than the material color from ambientArray/diffuseArray.
- mat_ambient = vec4(1.0,1.0,1.0,1.0);
- mat_diffuse = vec4(1.0,1.0,1.0,1.0);
- mat_specular = fg_specularArray[lc];
- mat_shininess = fg_dimensionsArray[lc].z;
-
-
- // Look up ground textures by indexing into the texture array.
- // Different textures are stretched along the ground to different
- // lengths along each axes as set by and
- // regional definitions parameters
- vec2 atlas_dimensions = fg_dimensionsArray[lc].st;
- vec2 atlas_scale = vec2(fg_tileWidth / atlas_dimensions.s, fg_tileHeight / atlas_dimensions.t );
- st = atlas_scale * gl_TexCoord[0].st;
-
- // Look up texture coordinates and scale of ground textures
-
- // Landclass for this fragment
-
- texel = lookup_ground_texture_array(tile_coord, lc, dx, dy);
-
- // Mix texels - to work consistently it needs a more preceptual interpolation than mix()
- if (num_unique_neighbors != 0)
- {
- // Closest neighbor landclass
- vec4 texel_closest = lookup_ground_texture_array(tile_coord, lc_n[0], dx, dy);
-
- // Neighbor contributions
- vec4 texel_nc=texel_closest;
-
- if (num_unique_neighbors > 1)
- {
- // 2nd Closest neighbor landclass
- vec4 texel_2nd_closest = lookup_ground_texture_array(tile_coord, lc_n[1], dx, dy);
-
- texel_nc = mix(texel_closest, texel_2nd_closest, mfact[1]);
- }
-
- texel = mix(texel, texel_nc, mfact[0]);
- }
+ // Lookup the base texture texel for this fragment and any neighbors, with mixing
+ texel = get_mixed_texel(0, ground_tex_coord, lc, num_unique_neighbors, lc_n, mfact, dxdy_gc);
}
-
+
vec4 color = gl_Color * mat_ambient;
color.a = 1.0;
-
+
// Testing code: mix with green to show values of variables at each point
//vec4 green = vec4(0.0, 0.5, 0.0, 0.0);
//texel = mix(texel, green, (mfact[2]));
- // Mix texture is material texture 12, which is mapped to the b channel of fg_textureLookup1
- int tex2 = int(fg_textureLookup1[lc].b * 255.0 + 0.5);
- mix_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
- if (mix_texel.a < 0.1) { mix_flag = 0;}
+ if ((water_shader == 1) && (fg_photoScenery == false) && fg_materialParams3[lc].x > 0.5) {
+ // This is a water fragment, so calculate the fragment color procedurally
+ // and mix with some sand colour if near an edge
+ //bool adjacentwater = fg_materialParams3[lc_n.x].x > 0.5;
+ //texel = mix(generateWaterTexel(), texel, adjacentwater ? 0.0 : smoothstep(0.1, 0.2, mfact[0]));
+ //texel = mix(generateWaterTexel(), vec4(0.6,0.6,0.4,1.0), adjacentwater ? 0.0 : smoothstep(0.1, 0.2, mfact[0]));
+ texel = mix(vec4(0.6,0.6,0.4,1.0), generateWaterTexel(), smoothstep(0.98,1.0,steepness));
+ fragColor = texel;
+ fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, fragColor.rgb);
+ } else {
+ // Lookup material parameters for the landclass at this fragment.
+ // Material parameters are from material definitions XML files (e.g. regional definitions in data/Materials/regions). They have the same names.
+ // These parameters are contained in arrays of uniforms fg_materialParams1 and fg_materialParams2.
+ // The uniforms are vec4s, and each parameter is mapped to a vec4 element (rgba channels).
+ // In WS2 these parameters were available as uniforms of the same name.
+ // Testing: The mapping is hardcoded at the moment.
+ float transition_model = fg_materialParams1[lc].r;
+ float hires_overlay_bias = fg_materialParams1[lc].g;
+ float grain_strength = fg_materialParams1[lc].b;
+ float intrinsic_wetness = fg_materialParams1[lc].a;
- // Dot texture is material texture 15, which is mapped to the g channel of fg_textureLookup2
- tex2 = int(fg_textureLookup2[lc].g * 255.0 + 0.5);
- dot_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ float dot_density = fg_materialParams2[lc].r;
+ float dot_size = fg_materialParams2[lc].g;
+ float dust_resistance = fg_materialParams2[lc].b;
+ int rock_strata = int(fg_materialParams2[lc].a);
- // Detail texture is material texture 11, which is mapped to the g channel of fg_textureLookup1
- tex2 = int(fg_textureLookup1[lc].g * 255.0 + 0.5);
- detail_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
- if (detail_texel.a < 0.1) { flag = 0;}
+ // dot noise
+ float dotnoise_2m = DotNoise2D(rawPos.xy, 2.0 * dot_size,0.5, dot_density);
+ float dotnoise_10m = DotNoise2D(rawPos.xy, 10.0 * dot_size, 0.5, dot_density);
+ float dotnoise_15m = DotNoise2D(rawPos.xy, 15.0 * dot_size, 0.33, dot_density);
- // Grain texture is material texture 14, which is mapped to the r channel of fg_textureLookup2
- tex2 = int(fg_textureLookup2[lc].r * 255.0 + 0.5);
- grain_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
- // Gradient texture is material texture 13, which is mapped to the a channel of fg_textureLookup1
- tex2 = int(fg_textureLookup1[lc].a * 255.0 + 0.5);
- gradient_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ // Testing code - set randomise_texture_lookups = 2 to only look up the base texture with no extra transitions.
+ detail_texel = texel;
+ mix_texel = texel;
+ grain_texel = texel;
+ dot_texel = texel;
+ gradient_texel = texel;
- // Other material parameters, which are mapped to various channels from fg_materialParams1 and fg_materialParams2
- float transition_model = fg_materialParams1[lc].r;
- float hires_overlay_bias = fg_materialParams1[lc].g;
- float grain_strength = fg_materialParams1[lc].b;
- float intrinsic_wetness = fg_materialParams1[lc].a;
- float dot_density = fg_materialParams2[lc].r;
- float dot_size = fg_materialParams2[lc].g;
- float dust_resistance = fg_materialParams2[lc].b;
- float rock_strata = fg_materialParams2[lc].a;
+ /*
+ // Texture lookup testing code:
+ // To test this block, uncomment it and turn off normal and random texture lookups
+ // by setting randomise_texture_lookups = 2 or more.
+
+ int tex2;
- // dot noise
- float dotnoise_2m = DotNoise2D(rawPos.xy, 2.0 * dot_size,0.5, dot_density);
- float dotnoise_10m = DotNoise2D(rawPos.xy, 10.0 * dot_size, 0.5, dot_density);
- float dotnoise_15m = DotNoise2D(rawPos.xy, 15.0 * dot_size, 0.33, dot_density);
- // Testing: WS2 code after this
+ // Grain texture is material texture 14, which is mapped to the r channel of fg_textureLookup2
+ tex2 = int(fg_textureLookup2[lc].r * 255.0 + 0.5);
+ grain_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+
+ // Gradient texture is material texture 13, which is mapped to the a channel of fg_textureLookup1
+ tex2 = int(fg_textureLookup1[lc].a * 255.0 + 0.5);
+ gradient_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+
+ // Dot texture is material texture 15, which is mapped to the g channel of fg_textureLookup2
+ tex2 = int(fg_textureLookup2[lc].g * 255.0 + 0.5);
+ dot_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ // Mix texture is material texture 12, which is mapped to the b channel of fg_textureLookup1
+ tex2 = int(fg_textureLookup1[lc].b * 255.0 + 0.5);
+ mix_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ if (mix_texel.a < 0.1) { mix_flag = 0;} // Disable if no index found
+
+ // Detail texture is material texture 11, which is mapped to the g channel of fg_textureLookup1
+ tex2 = int(fg_textureLookup1[lc].g * 255.0 + 0.5);
+ detail_texel = texture(textureArray, vec3(gl_TexCoord[0].st * 1.3, tex2));
+ if (detail_texel.a < 0.1) { flag = 0;} // Disable if no index found
+
+ //Examples of how lookup_ground_texture array is used with the above grain/gradient texture lookups:
+ //grain_texel = lookup_ground_texture_array(1, st * 1.3, lc, dxdy * 1.3);
+ //gradient_texel = lookup_ground_texture_array(2, st * 1.3, lc, dxdy * 1.3);
+ */
+
+
+ // Generate 6 random numbers
+
+ float pseed2 = 1.0;
+ int tex_id_lc[6];
+ float rn[6];
+ if (randomise_texture_lookups == 1)
+ {
+
+ get6_rand_nums(float(lc)*33245.31, pseed2, 47.0, rn);
+ for (int i=0;i<6;i++) tex_id_lc[i] = int(mod( (float(lc)+(rn[i]*47.0)+1.0) , 48.0));
+ }
+
+ //texel = mix(vec4(vec3(0.0),1.0), vec4(0.0,0.5,0.0,1.0), float(tex_id_lc[2])/48.0);
+
+ // WS2:
+ //grain_texel = texture2D(grain_texture, gl_TexCoord[0].st * 25.0);
+ //gradient_texel = texture2D(gradient_texture, gl_TexCoord[0].st * 4.0);
+ //stprime = gl_TexCoord[0].st * 80.0;
+ //stprime = stprime + normalize(relPos).xy * 0.01 * (dotnoise_10m + dotnoise_15m);
+ //dot_texel = texture2D(dot_texture, vec2 (stprime.y, stprime.x) );
+
+
+ if (randomise_texture_lookups == 0)
+ {
+ grain_texel = lookup_ground_texture_array(1, st * 25.0, lc, dxdy * 25.0);
+ gradient_texel = lookup_ground_texture_array(2, st * 4.0, lc, dxdy * 4.0);
+ }
+ else if (randomise_texture_lookups == 1)
+ {
+ grain_texel = lookup_ground_texture_array(0, st * 25.0, tex_id_lc[0], dxdy * 25.0);
+ gradient_texel = lookup_ground_texture_array(0, st * 4.0, tex_id_lc[1], dxdy * 4.0);
+ }
+
+ stprime = st * 80.0;
+ stprime = stprime + normalize(relPos).xy * 0.01 * (dotnoise_10m + dotnoise_15m);
+ vec4 dxdy_prime = vec4(dFdx(stprime), dFdy(stprime));
+
+ if (randomise_texture_lookups == 0)
+ {
+ dot_texel = lookup_ground_texture_array(3, stprime.ts, lc, dxdy_prime.tsqp);
+ }
+ else if (randomise_texture_lookups == 1)
+ {
+ dot_texel = lookup_ground_texture_array(0, stprime.ts, tex_id_lc[2], dxdy_prime.tsqp);
+ }
+
+ // Testing: WS2 code after this, except for random texture lookups and partial derivatives
+
float local_autumn_factor = texel.a;
-
-
- // we need to fade procedural structures when they get smaller than a single pixel, for this we need
- // to know under what angle we see the surface
+ // we need to fade procedural structures when they get smaller than a single pixel, for this we need
+ // to know under what angle we see the surface
float view_angle = abs(dot(normalize(normal), normalize(ecViewdir)));
- float sfactor = sqrt(2.0 * (1.0-steepness)/0.03) + abs(ct)/0.15;
-
- // the snow texel is generated procedurally
+ // the snow texel is generated procedurally
if (msl_altitude +500.0 > snowlevel)
- {
- snow_texel = vec4 (0.95, 0.95, 0.95, 1.0) * (0.9 + 0.1* noise_500m + 0.1* (1.0 - noise_10m) );
- snow_texel.r = snow_texel.r * (0.9 + 0.05 * (noise_10m + noise_5m));
- snow_texel.g = snow_texel.g * (0.9 + 0.05 * (noise_10m + noise_5m));
- snow_texel.a = 1.0;
- noise_term = 0.1 * (noise_500m-0.5) ;
- noise_term = noise_term + 0.2 * (snownoise_50m -0.5) * detail_fade(50.0, view_angle, 0.5*dist) ;
- noise_term = noise_term + 0.2 * (snownoise_25m -0.5) * detail_fade(25.0, view_angle, 0.5*dist) ;
- noise_term = noise_term + 0.3 * (noise_10m -0.5) * detail_fade(10.0, view_angle, 0.8*dist) ;
- noise_term = noise_term + 0.3 * (noise_5m - 0.5) * detail_fade(5.0, view_angle, dist);
- noise_term = noise_term + 0.15 * (noise_2m -0.5) * detail_fade(2.0, view_angle, dist);
- noise_term = noise_term + 0.08 * (noise_1m -0.5) * detail_fade(1.0, view_angle, dist);
- snow_texel.a = snow_texel.a * 0.2+0.8* smoothstep(0.2,0.8, 0.3 +noise_term + snow_thickness_factor +0.0001*(msl_altitude -snowlevel) );
- }
+ {
+ snow_texel = vec4 (0.95, 0.95, 0.95, 1.0) * (0.9 + 0.1* noise_500m + 0.1* (1.0 - noise_10m) );
+ snow_texel.r = snow_texel.r * (0.9 + 0.05 * (noise_10m + noise_5m));
+ snow_texel.g = snow_texel.g * (0.9 + 0.05 * (noise_10m + noise_5m));
+ snow_texel.a = 1.0;
+ noise_term = 0.1 * (noise_500m-0.5) ;
+ noise_term = noise_term + 0.2 * (snownoise_50m -0.5) * detail_fade(50.0, view_angle, 0.5*dist) ;
+ noise_term = noise_term + 0.2 * (snownoise_25m -0.5) * detail_fade(25.0, view_angle, 0.5*dist) ;
+ noise_term = noise_term + 0.3 * (noise_10m -0.5) * detail_fade(10.0, view_angle, 0.8*dist) ;
+ noise_term = noise_term + 0.3 * (noise_5m - 0.5) * detail_fade(5.0, view_angle, dist);
+ noise_term = noise_term + 0.15 * (noise_2m -0.5) * detail_fade(2.0, view_angle, dist);
+ noise_term = noise_term + 0.08 * (noise_1m -0.5) * detail_fade(1.0, view_angle, dist);
+ snow_texel.a = snow_texel.a * 0.2+0.8* smoothstep(0.2,0.8, 0.3 +noise_term + snow_thickness_factor +0.0001*(msl_altitude -snowlevel) );
+ }
+
+ if (mix_flag == 1)
+ {
+ //WS2: mix_texel = texture2D(mix_texture, gl_TexCoord[0].st * 1.3);
- // the hires overlay texture is loaded with parallax mapping
-
- if (flag == 1) {
- stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t);
- distortion_factor = 0.97 + 0.06 * noise_500m;
- stprime = stprime * distortion_factor * 15.0;
- stprime = stprime + normalize(relPos).xy * 0.022 * (noise_10m + 0.5 * noise_5m +0.25 * noise_2m - 0.875 );
-
- //detail_texel = texture2D(detail_texture, stprime); // temp
- }
+ if (randomise_texture_lookups == 0)
+ {
+ mix_texel = lookup_ground_texture_array(4, st * 1.3, lc, dxdy * 1.3);
+ }
+ else if (randomise_texture_lookups == 1)
+ {
+ mix_texel = lookup_ground_texture_array(0, st * 1.3, tex_id_lc[3], dxdy * 1.3);
+ }
+ if (mix_texel.a <0.1) {mix_flag = 0;}
+ }
+
+ // the hires overlay texture is loaded with parallax mapping
+
+ if (flag == 1)
+ {
+ stprime = vec2 (0.86*st.s + 0.5*st.t, 0.5*st.s - 0.86*st.t);
+ distortion_factor = 0.97 + 0.06 * noise_500m;
+ stprime = stprime * distortion_factor * 15.0;
+ stprime = stprime + normalize(relPos).xy * 0.022 * (noise_10m + 0.5 * noise_5m +0.25 * noise_2m - 0.875 );
+
+ //WS2: detail_texel = texture2D(detail_texture, stprime); // temp
+
+ dxdy_prime = vec4(dFdx(stprime), dFdy(stprime));
+ if (randomise_texture_lookups == 0)
+ {
+ detail_texel = lookup_ground_texture_array(5, stprime , lc, dxdy_prime);
+ }
+ else if (randomise_texture_lookups == 1)
+ {
+ detail_texel = lookup_ground_texture_array(0, stprime, tex_id_lc[4], dxdy_prime);
+ }
+ if (detail_texel.a <0.1) {flag = 0;}
+ } // End if (flag == 1)
+
+
+ // texture preparation according to detail level
+
+ // mix in hires texture patches
-// texture preparation according to detail level
-
-// mix in hires texture patches
-
-float dist_fact;
-float nSum;
-float mix_factor;
-
- // first the second texture overlay
- // transition model 0: random patch overlay without any gradient information
- // transition model 1: only gradient-driven transitions, no randomness
- if (mix_flag == 1) {
- nSum = 0.167 * (noise_4000m + 2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m);
- nSum = mix(nSum, 0.5, max(0.0, 2.0 * (transition_model - 0.5)));
- nSum = nSum + 0.4 * (1.0 -smoothstep(0.9,0.95, abs(steepness)+ 0.05 * (noise_50m - 0.5))) * min(1.0, 2.0 * transition_model);
- mix_factor = smoothstep(0.5, 0.54, nSum);
- texel = mix(texel, mix_texel, mix_factor);
- local_autumn_factor = texel.a;
- }
-
- // then the detail texture overlay
- mix_factor = 0.0;
- if ((flag == 1) && (dist < 40000.0)) {
- dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist));
- nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0;
- nSum = nSum - 0.08 * (1.0 -smoothstep(0.9,0.95, abs(steepness)));
- mix_factor = smoothstep(0.47, 0.54, nSum +hires_overlay_bias- dist_fact);
- if (mix_factor > 0.8) {mix_factor = 0.8;}
- texel = mix(texel, detail_texel,mix_factor);
- }
-
- // rock for very steep gradients
- if (gradient_texel.a > 0.0) {
- texel = mix(texel, gradient_texel, 1.0 - smoothstep(0.75,0.8,abs(steepness)+ 0.00002* msl_altitude + 0.05 * (noise_50m - 0.5)));
- local_autumn_factor = texel.a;
- }
+ float dist_fact;
+ float nSum;
+ float mix_factor;
+
+ // first the second texture overlay
+ // transition model 0: random patch overlay without any gradient information
+ // transition model 1: only gradient-driven transitions, no randomness
+
+ if (mix_flag == 1)
+ {
+ nSum = 0.167 * (noise_4000m + 2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m);
+ nSum = mix(nSum, 0.5, max(0.0, 2.0 * (transition_model - 0.5)));
+ nSum = nSum + 0.4 * (1.0 -smoothstep(0.9,0.95, abs(steepness)+ 0.05 * (noise_50m - 0.5))) * min(1.0, 2.0 * transition_model);
+ mix_factor = smoothstep(0.5, 0.54, nSum);
+ texel = mix(texel, mix_texel, mix_factor);
+ local_autumn_factor = texel.a;
+ }
+
+ // then the detail texture overlay
+ mix_factor = 0.0;
+ //WS2: condition was broken up - does it matter for dynamic branching?
+ if ((flag == 1) && (dist < 40000.0))
+ {
+ dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist));
+ nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0;
+ nSum = nSum - 0.08 * (1.0 -smoothstep(0.9,0.95, abs(steepness)));
+ mix_factor = smoothstep(0.47, 0.54, nSum +hires_overlay_bias- dist_fact);
+ if (mix_factor > 0.8) {mix_factor = 0.8;}
+ texel = mix(texel, detail_texel,mix_factor);
+ }
+
+ // rock for very steep gradients
+ if (gradient_texel.a > 0.0)
+ {
+ texel = mix(texel, gradient_texel, 1.0 - smoothstep(0.75,0.8,abs(steepness)+ 0.00002* msl_altitude + 0.05 * (noise_50m - 0.5)));
+ local_autumn_factor = texel.a;
+ }
- // strata noise
+ // strata noise
+ float stratnoise_50m;
+ float stratnoise_10m;
- float stratnoise_50m;
- float stratnoise_10m;
-
- if (rock_strata > 0.99) {
- stratnoise_50m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 50.0, 0.2);
- stratnoise_10m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 10.0, 0.2);
- stratnoise_50m = mix(stratnoise_50m, 1.0, smoothstep(0.8,0.9, steepness));
- stratnoise_10m = mix(stratnoise_10m, 1.0, smoothstep(0.8,0.9, steepness));
- texel *= (0.4 + 0.4 * stratnoise_50m + 0.2 * stratnoise_10m);
- }
-
- // the dot vegetation texture overlay
- texel.rgb = mix(texel.rgb, dot_texel.rgb, dot_texel.a * (dotnoise_10m + dotnoise_15m) * detail_fade(1.0 * (dot_size * (1.0 +0.1*dot_size)), view_angle,dist));
- texel.rgb = mix(texel.rgb, dot_texel.rgb, dot_texel.a * dotnoise_2m * detail_fade(0.1 * dot_size, view_angle,dist));
-
- // then the grain texture overlay
-
-
- texel.rgb = mix(texel.rgb, grain_texel.rgb, grain_strength * grain_texel.a * (1.0 - mix_factor) * (1.0-smoothstep(2000.0,5000.0, dist)));
-
- // for really hires, add procedural noise overlay
- texel.rgb = texel.rgb * (1.0 + 0.4 * (noise_01m-0.5) * detail_fade(0.1, view_angle, dist)) ;
-
-// autumn colors
-
-float autumn_factor = season * 2.0 * (1.0 - local_autumn_factor) ;
+ // Testing: if rock_strata parameter is not cast into int, need (rock_strata > 0.99)
+ if (rock_strata==1)
+ {
+ stratnoise_50m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 50.0, 0.2);
+ stratnoise_10m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 10.0, 0.2);
+ stratnoise_50m = mix(stratnoise_50m, 1.0, smoothstep(0.8,0.9, steepness));
+ stratnoise_10m = mix(stratnoise_10m, 1.0, smoothstep(0.8,0.9, steepness));
+ texel *= (0.4 + 0.4 * stratnoise_50m + 0.2 * stratnoise_10m);
+ }
+
+ // the dot vegetation texture overlay
+ texel.rgb = mix(texel.rgb, dot_texel.rgb, dot_texel.a * (dotnoise_10m + dotnoise_15m) * detail_fade(1.0 * (dot_size * (1.0 +0.1*dot_size)), view_angle,dist));
+ texel.rgb = mix(texel.rgb, dot_texel.rgb, dot_texel.a * dotnoise_2m * detail_fade(0.1 * dot_size, view_angle,dist));
+
+ // then the grain texture overlay
+ texel.rgb = mix(texel.rgb, grain_texel.rgb, grain_strength * grain_texel.a * (1.0 - mix_factor) * (1.0-smoothstep(2000.0,5000.0, dist)));
+
+ // for really hires, add procedural noise overlay
+ texel.rgb = texel.rgb * (1.0 + 0.4 * (noise_01m-0.5) * detail_fade(0.1, view_angle, dist)) ;
+
+ // autumn colors
+ float autumn_factor = season * 2.0 * (1.0 - local_autumn_factor) ;
+
+
+ texel.r = min(1.0, (1.0 + 2.5 * autumn_factor) * texel.r);
+ texel.g = texel.g;
+ texel.b = max(0.0, (1.0 - 4.0 * autumn_factor) * texel.b);
-texel.r = min(1.0, (1.0 + 2.5 * autumn_factor) * texel.r);
-texel.g = texel.g;
-texel.b = max(0.0, (1.0 - 4.0 * autumn_factor) * texel.b);
+ if (local_autumn_factor < 1.0)
+ {
+ intensity = length(texel.rgb) * (1.0 - 0.5 * smoothstep(1.1,2.0,season));
+ texel.rgb = intensity * normalize(mix(texel.rgb, vec3(0.23,0.17,0.08), smoothstep(1.1,2.0, season)));
+ }
+ // slope line overlay
+ texel.rgb = texel.rgb * (1.0 - 0.12 * slopenoise_50m - 0.08 * slopenoise_100m);
+
+ //const vec4 dust_color = vec4 (0.76, 0.71, 0.56, 1.0);
+ const vec4 dust_color = vec4 (0.76, 0.65, 0.45, 1.0);
+ const vec4 lichen_color = vec4 (0.17, 0.20, 0.06, 1.0);
+
+ // mix vegetation
+ float gradient_factor = smoothstep(0.5, 1.0, steepness);
+ texel = mix(texel, lichen_color, gradient_factor * (0.4 * lichen_cover_factor + 0.8 * lichen_cover_factor * 0.5 * (noise_10m + (1.0 - noise_5m))) );
+ // mix dust
+ texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor *dust_resistance + 3.0 * dust_cover_factor * dust_resistance *(((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) );
+
+ // mix snow
+ float snow_mix_factor = 0.0;
-if (local_autumn_factor < 1.0)
- {
- intensity = length(texel.rgb) * (1.0 - 0.5 * smoothstep(1.1,2.0,season));
- texel.rgb = intensity * normalize(mix(texel.rgb, vec3(0.23,0.17,0.08), smoothstep(1.1,2.0, season)));
- }
+ if (msl_altitude + 500.0 > snowlevel)
+ {
+ snow_alpha = smoothstep(0.75, 0.85, abs(steepness));
+ snow_mix_factor = snow_texel.a* smoothstep(snowlevel, snowlevel+200.0, snow_alpha * msl_altitude+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0);
+ texel = mix(texel, snow_texel, snow_mix_factor);
+ }
- // slope line overlay
- texel.rgb = texel.rgb * (1.0 - 0.12 * slopenoise_50m - 0.08 * slopenoise_100m);
+ // get distribution of water when terrain is wet
+ float combined_wetness = min(1.0, wetness + intrinsic_wetness);
+ float water_threshold1;
+ float water_threshold2;
+ float water_factor =0.0;
-//const vec4 dust_color = vec4 (0.76, 0.71, 0.56, 1.0);
-const vec4 dust_color = vec4 (0.76, 0.65, 0.45, 1.0);
-const vec4 lichen_color = vec4 (0.17, 0.20, 0.06, 1.0);
-
-// mix vegetation
-float gradient_factor = smoothstep(0.5, 1.0, steepness);
-texel = mix(texel, lichen_color, gradient_factor * (0.4 * lichen_cover_factor + 0.8 * lichen_cover_factor * 0.5 * (noise_10m + (1.0 - noise_5m))) );
-// mix dust
-texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor *dust_resistance + 3.0 * dust_cover_factor * dust_resistance *(((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) );
-
-
-// mix snow
-float snow_mix_factor = 0.0;
-
-if (msl_altitude +500.0 > snowlevel)
- {
- snow_alpha = smoothstep(0.75, 0.85, abs(steepness));
- snow_mix_factor = snow_texel.a* smoothstep(snowlevel, snowlevel+200.0, snow_alpha * msl_altitude+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0);
- texel = mix(texel, snow_texel, snow_mix_factor);
- }
-
-
-
-
-// get distribution of water when terrain is wet
-
-float combined_wetness = min(1.0, wetness + intrinsic_wetness);
-float water_threshold1;
-float water_threshold2;
-float water_factor =0.0;
-
-
-if ((dist < 5000.0) && (combined_wetness>0.0))
- {
- water_threshold1 = 1.0-0.5* combined_wetness;
- water_threshold2 = 1.0 - 0.3 * combined_wetness;
- water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness));
- }
-
-// darken wet terrain
+ if ((dist < 5000.0) && (combined_wetness>0.0))
+ {
+ water_threshold1 = 1.0-0.5* combined_wetness;
+ water_threshold2 = 1.0 - 0.3 * combined_wetness;
+ water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness));
+ }
+ // darken wet terrain
texel.rgb = texel.rgb * (1.0 - 0.6 * combined_wetness);
-
-
-// light computations
- vec4 light_specular = gl_LightSource[0].specular;
+ // light computations
+ vec4 light_specular = gl_LightSource[0].specular;
// If gl_Color.a == 0, this is a back-facing polygon and the
// normal should be reversed.
//n = (2.0 * gl_Color.a - 1.0) * normal;
- n = normal;//vec3 (nvec.x, nvec.y, sqrt(1.0 -pow(nvec.x,2.0) - pow(nvec.y,2.0) ));
+ vec3 n = normal;//vec3 (nvec.x, nvec.y, sqrt(1.0 -pow(nvec.x,2.0) - pow(nvec.y,2.0) ));
n = normalize(n);
NdotL = dot(n, lightDir);
-
- noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05;
- noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05;
- noisegrad_2m = (noise_2m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),2.0))/0.05;
- noisegrad_1m = (noise_1m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),1.0))/0.05;
- dotnoisegrad_10m = (dotnoise_10m - DotNoise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0 * dot_size,0.5, dot_density))/0.05;
+ float noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05;
+ float noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05;
+ float noisegrad_2m = (noise_2m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),2.0))/0.05;
+ float noisegrad_1m = (noise_1m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),1.0))/0.05;
+
+ dotnoisegrad_10m = (dotnoise_10m - DotNoise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0 * dot_size,0.5, dot_density))/0.05;
+
+
+ NdotL = NdotL + (noisegrad_10m * detail_fade(10.0, view_angle,dist) + 0.5* noisegrad_5m * detail_fade(5.0, view_angle,dist)) * mix_factor/0.8;
+ NdotL = NdotL + 0.15 * noisegrad_2m * mix_factor/0.8 * detail_fade(2.0,view_angle,dist);
+ NdotL = NdotL + 0.1 * noisegrad_2m * detail_fade(2.0,view_angle,dist);
+ NdotL = NdotL + 0.05 * noisegrad_1m * detail_fade(1.0, view_angle,dist);
+ NdotL = NdotL + (1.0-snow_mix_factor) * 0.3* dot_texel.a * (0.5* dotnoisegrad_10m * detail_fade(1.0 * dot_size, view_angle, dist) +0.5 * dotnoisegrad_10m * noise_01m * detail_fade(0.1, view_angle, dist)) ;
-
- NdotL = NdotL + (noisegrad_10m * detail_fade(10.0, view_angle,dist) + 0.5* noisegrad_5m * detail_fade(5.0, view_angle,dist)) * mix_factor/0.8;
- NdotL = NdotL + 0.15 * noisegrad_2m * mix_factor/0.8 * detail_fade(2.0,view_angle,dist);
- NdotL = NdotL + 0.1 * noisegrad_2m * detail_fade(2.0,view_angle,dist);
- NdotL = NdotL + 0.05 * noisegrad_1m * detail_fade(1.0, view_angle,dist);
- NdotL = NdotL + (1.0-snow_mix_factor) * 0.3* dot_texel.a * (0.5* dotnoisegrad_10m * detail_fade(1.0 * dot_size, view_angle, dist) +0.5 * dotnoisegrad_10m * noise_01m * detail_fade(0.1, view_angle, dist)) ;
-
- if (NdotL > 0.0) {
- float shadowmap = getShadowing();
- if (cloud_shadow_flag == 1) {NdotL = NdotL * shadow_func(relPos.x, relPos.y, 0.3 * noise_250m + 0.5 * noise_500m+0.2 * noise_1500m, dist);}
+ // Testing: Very temporary - reduce procedural normal map features with photoscenery active without breaking profiling as the controls are default (by request)
+ if (fg_photoScenery) NdotL = mix(dot(n, lightDir), NdotL, 0.00001);
+
+ if (NdotL > 0.0)
+ {
+ float shadowmap = getShadowing();
+ if (cloud_shadow_flag == 1) {NdotL = NdotL * shadow_func(relPos.x, relPos.y, 0.3 * noise_250m + 0.5 * noise_500m+0.2 * noise_1500m, dist);}
vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
color += diffuse_term * NdotL * shadowmap;
NdotHV = max(dot(n, halfVector), 0.0);
if (mat_shininess > 0.0)
- specular.rgb = ((mat_specular.rgb * 0.1 + (water_factor * vec3 (1.0, 1.0, 1.0)))
- * light_specular.rgb
- * pow(NdotHV, mat_shininess + (20.0 * water_factor))
- * shadowmap);
+ specular.rgb = ((mat_specular.rgb * 0.1 + (water_factor * vec3 (1.0, 1.0, 1.0)))
+ * light_specular.rgb
+ * pow(NdotHV, mat_shininess + (20.0 * water_factor))
+ * shadowmap);
}
color.a = 1.0;//diffuse_term.a; // as gl_Color.a and light_diffuse.comp.a were packed with other values
// This shouldn't be necessary, but our lighting becomes very
@@ -698,222 +796,47 @@ if ((dist < 5000.0) && (combined_wetness>0.0))
// is closer to what the OpenGL fixed function pipeline does.
color = clamp(color, 0.0, 1.0);
- vec3 secondary_light = vec3 (0.0,0.0,0.0);
- if (use_searchlight == 1)
- {
- secondary_light += searchlight();
- }
- if (use_landing_light == 1)
- {
- secondary_light += landing_light(landing_light1_offset, landing_light3_offset);
- }
- if (use_alt_landing_light == 1)
- {
- secondary_light += landing_light(landing_light2_offset, landing_light3_offset);
- }
- color.rgb +=secondary_light * light_distance_fading(dist);
+ if (use_searchlight == 1) {
+ secondary_light += searchlight();
+ }
+
+ if (use_landing_light == 1) {
+ secondary_light += landing_light(landing_light1_offset, landing_light3_offset);
+ }
+ if (use_alt_landing_light == 1) {
+ secondary_light += landing_light(landing_light2_offset, landing_light3_offset);
+ }
+ color.rgb += secondary_light * light_distance_fading(dist);
- fragColor = color * texel + specular;
- fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, texel.rgb);
+ fragColor = color * texel + specular;
+ fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, texel.rgb);
+ }
+
+ float lightArg = (terminator-yprime_alt)/100000.0;
+ vec3 hazeColor = get_hazeColor(lightArg);
+ // Rayleigh color shift due to out-scattering
+ float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, msl_altitude);
+ float outscatter = 1.0-exp(-dist/rayleigh_length);
+ fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter);
-
- float lightArg = (terminator-yprime_alt)/100000.0;
- vec3 hazeColor = get_hazeColor(lightArg);
-
-
-
-// Rayleigh color shift due to out-scattering
- float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z);
- float outscatter = 1.0-exp(-dist/rayleigh_length);
- fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter);
-
-// Rayleigh color shift due to in-scattering
-
- float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0);
- //float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade;
- float lightIntensity = length(hazeColor * effective_scattering) * rShade;
- vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity;
- float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z);
+ // Rayleigh color shift due to in-scattering
+
+ float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0);
+ //float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade;
+ float lightIntensity = length(hazeColor * effective_scattering) * rShade;
+ vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity;
+ float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, msl_altitude);
fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength);
-
-
-// here comes the terrain haze model
-
- float delta_z = hazeLayerAltitude - eye_alt;
-
- float mvisibility = min(visibility,avisibility);
-
- if (dist > 0.04 * mvisibility)
+
+ gl_FragColor = applyHaze(fragColor, hazeColor, secondary_light, ct, hazeLayerAltitude, visibility, avisibility, dist, lightArg, mie_angle);
+
+ // Testing phase controls:
+ if (remove_haze_and_lighting == 1)
{
-
- alt = eye_alt;
-
- float transmission;
- float vAltitude;
- float delta_zv;
- float H;
- float distance_in_layer;
- float transmission_arg;
-
-
-
-
- // we solve the geometry what part of the light path is attenuated normally and what is through the haze layer
- if (delta_z > 0.0) // we're inside the layer
- {
- if (ct < 0.0) // we look down
- {
- distance_in_layer = dist;
- vAltitude = min(distance_in_layer,mvisibility) * ct;
- delta_zv = delta_z - vAltitude;
- }
- else // we may look through upper layer edge
- {
- H = dist * ct;
- if (H > delta_z) {distance_in_layer = dist/H * delta_z;}
- else {distance_in_layer = dist;}
- vAltitude = min(distance_in_layer,visibility) * ct;
- delta_zv = delta_z - vAltitude;
- }
+ gl_FragColor = texel;
}
- else // we see the layer from above, delta_z < 0.0
- {
- H = dist * -ct;
- if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading
- {
- distance_in_layer = 0.0;
- delta_zv = 0.0;
- }
- else
- {
- vAltitude = H + delta_z;
- distance_in_layer = vAltitude/H * dist;
- vAltitude = min(distance_in_layer,visibility) * (-ct);
- delta_zv = vAltitude;
- }
- }
-
-// blur of the haze layer edge
-
-float blur_thickness = 50.0;
-float cphi = dot(vec3(0.0, 1.0, 0.0), relPos)/dist;
-float ctlayer = delta_z/dist-0.01 + 0.02 * Noise2D(vec2(cphi,1.0),0.1) -0.01;
-float ctblur = 0.035 ;
-
-float blur_dist;
-
-if (abs(delta_z) < 400.0)
- {
- blur_dist = dist * (1.0-smoothstep(0.0,300.0,-delta_z)) * smoothstep(-400.0,-200.0, -delta_z);
- blur_dist = blur_dist * smoothstep(ctlayer-4.0*ctblur, ctlayer-ctblur, ct) * (1.0-smoothstep(ctlayer+0.5*ctblur, ctlayer+ctblur, ct));
- distance_in_layer = max(distance_in_layer, blur_dist);
- }
-
-
- // ground haze cannot be thinner than aloft visibility in the model,
- // so we need to use aloft visibility otherwise
- transmission_arg = (dist-distance_in_layer)/avisibility;
-
- float eqColorFactor;
-
-if (visibility < avisibility)
- {
- transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) ));
- eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 - effective_scattering);
- }
-else
- {
- transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) ));
- eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 - effective_scattering);
- }
-
- transmission = fog_func(transmission_arg, alt);
-
-// there's always residual intensity, we should never be driven to zero
-if (eqColorFactor < 0.2) eqColorFactor = 0.2;
-
-
-
-
- // now dim the light for haze
- eShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt);
-
-// Mie-like factor
-
- if (lightArg < 10.0)
- {
- intensity = length(hazeColor);
- float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt));
- hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) );
- }
-
-intensity = length(hazeColor);
-
-if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColor doesn't come out correctly
-{
-
-
- // high altitude desaturation of the haze color
- hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt)));
-
- // blue hue of haze
-
- hazeColor.x = hazeColor.x * 0.83;
- hazeColor.y = hazeColor.y * 0.9;
-
-
- // additional blue in indirect light
- float fade_out = max(0.65 - 0.3 *overcast, 0.45);
- intensity = length(hazeColor);
- hazeColor = intensity * normalize(mix(hazeColor, 1.5* shadedFogColor, 1.0 -smoothstep(0.25, fade_out,eShade) ));
-
-
- // change haze color to blue hue for strong fogging
- hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothstep(0.5,0.9,eqColorFactor))));
-
-
-
- // reduce haze intensity when looking at shaded surfaces, only in terminator region
- float shadow = mix( min(1.0 + dot(n,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission));
- hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator));
- }
-
-
- // don't let the light fade out too rapidly
- lightArg = (terminator + 200000.0)/100000.0;
- float minLightIntensity = min(0.2,0.16 * lightArg + 0.5);
- vec3 minLight = minLightIntensity * vec3 (0.2, 0.3, 0.4);
-
-hazeColor.rgb *= eqColorFactor * eShade;
-hazeColor.rgb = max(hazeColor.rgb, minLight.rgb);
-
-// finally, mix fog in
-
-// Testing phase controls
-if (reduce_haze_without_removing_calculation_overhead == 1)
-{
-transmission = 1.0 - (transmission/1000000.0);
-}
-
-
-fragColor.rgb = mix(hazeColor+secondary_light * fog_backscatter(mvisibility) , fragColor.rgb,transmission);
-
- }
-
- fragColor.rgb = filter_combined(fragColor.rgb);
-
- gl_FragColor = fragColor;
-
-
-
-// Testing phase controls:
-if (remove_haze_and_lighting == 1)
-{
- gl_FragColor = texel;
-}
-
}
diff --git a/Shaders/ws30-ALS-ultra.vert b/Shaders/ws30-ALS-ultra.vert
index 15b7bc6a0..b35374313 100644
--- a/Shaders/ws30-ALS-ultra.vert
+++ b/Shaders/ws30-ALS-ultra.vert
@@ -16,7 +16,6 @@
#define MODE_DIFFUSE 1
#define MODE_AMBIENT_AND_DIFFUSE 2
-//attribute vec2 orthophotoTexCoord;
// The constant term of the lighting equation that doesn't depend on
// the surface normal is passed in gl_{Front,Back}Color. The alpha
@@ -25,12 +24,25 @@
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
-varying vec3 rawPos;
+varying vec2 ground_tex_coord;
+varying vec2 rawPos;
varying vec3 worldPos;
varying vec3 ecViewdir;
varying vec2 grad_dir;
-//varying vec2 orthoTexCoord;
varying vec4 ecPosition;
+varying vec3 vertVec;
+
+// For water calculations
+varying float earthShade;
+varying vec3 lightdir;
+varying vec4 waterTex1;
+varying vec4 waterTex2;
+varying vec4 waterTex4;
+varying vec3 specular_light;
+
+uniform float osg_SimulationTime;
+uniform float WindN;
+uniform float WindE;
// Sent packed into alpha channels
//varying float yprime_alt;
@@ -60,7 +72,6 @@ uniform mat4 osg_ViewMatrixInverse;
uniform mat4 fg_zUpTransform;
uniform vec3 fg_modelOffset;
-float earthShade;
float yprime_alt;
vec3 moonlight_perception (in vec3 light);
@@ -76,227 +87,343 @@ const float terminator_width = 200000.0;
float light_func (in float x, in float a, in float b, in float c, in float d, in float e)
{
-//x = x - 0.5;
-
-// use the asymptotics to shorten computations
-if (x < -15.0) {return 0.0;}
-
-return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
+ //x = x - 0.5;
+ // use the asymptotics to shorten computations
+ if (x < -15.0) {return 0.0;}
+ return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
}
+void createRotationMatrix(in float angle, out mat4 rotmat)
+{
+ rotmat = mat4( cos( angle ), -sin( angle ), 0.0, 0.0,
+ sin( angle ), cos( angle ), 0.0, 0.0,
+ 0.0 , 0.0 , 1.0, 0.0,
+ 0.0 , 0.0 , 0.0, 1.0 );
+}
void main()
{
-
+
vec4 light_diffuse;
vec4 light_ambient;
vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
vec3 moonLightColor = vec3 (0.095, 0.095, 0.15) * moonlight + vec3 (0.005, 0.005, 0.005);
-
+
moonLightColor = moonlight_perception (moonLightColor);
-
-
+
+
//float yprime_alt;
float yprime;
float lightArg;
float intensity;
float vertex_alt;
float scattering;
+
+ // The ALS code assumes that units are in meters - e.g. model space vertices (gl_Vertex) are in meters
+
+ // WS30 model space, Nov 21, 2021:
+ // Coordinate axes are the same for geocentric, but not the origin.
+ // +z direction points from the Earth center to North pole.
+ // +x direction points from the Earth center to longitude = 0 on the equator.
+ // +y direction points from the Earth center to logntitude = East on the equator.
+ // Model space origin is at sea level. Units are in meters.
+ // Each tile, for each LoD level, its own model origin
+ // modelOffset is the model origin relative to the Earth center. It is in a geocentric
+ // space with the same axes, but with the Earth center as the origin. Units are in meters.
- rawPos = (fg_zUpTransform * gl_Vertex).xyz;
+
+ vec4 pos = gl_Vertex;
+ if (raise_vertex)
+ {
+ pos.z+=0.1;
+ gl_Position = gl_ModelViewProjectionMatrix * pos;
+ }
+ else gl_Position = ftransform();
+
+
+ // this code is copied from default.vert
+
+ ecPosition = gl_ModelViewMatrix * gl_Vertex;
+ //gl_Position = ftransform();
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ normal = gl_NormalMatrix * gl_Normal;
+
+ // Required for water calculations
+ lightdir = normalize(vec3(fg_zUpTransform * vec4(gl_ModelViewMatrixInverse * gl_LightSource[0].position)));
+ waterTex4 = vec4( ecPosition.xzy, 0.0 );
+
+ vec4 t1 = vec4(0.0, osg_SimulationTime * 0.005217, 0.0, 0.0);
+ vec4 t2 = vec4(0.0, osg_SimulationTime * -0.0012, 0.0, 0.0);
+
+ float Angle;
+
+ float windFactor = sqrt(WindE * WindE + WindN * WindN) * 0.05;
+ if (WindN == 0.0 && WindE == 0.0) {
+ Angle = 0.0;
+ } else {
+ Angle = atan(-WindN, WindE) - atan(1.0);
+ }
+
+ mat4 RotationMatrix;
+ createRotationMatrix(Angle, RotationMatrix);
+ waterTex1 = gl_MultiTexCoord0 * RotationMatrix - t1 * windFactor;
+ waterTex2 = gl_MultiTexCoord0 * RotationMatrix - t2 * windFactor;
+
+
+///////////////////////////////////////////
+// Test phase code:
+//
+ // Coords for ground textures
+ // Due to precision issues coordinates should restart (i.e. go to zero) every 5000m or so.
+ const float restart_dist_m = 5000.0;
+
+ // Model position
+ vec3 mp = gl_Vertex.xyz;
+
+ // Temporary approximation to get shaders to compile:
+ ground_tex_coord = gl_TexCoord[0].st;
+
+//
+// End test phase code
+///////////////////////////////////////////
+
+ // WS2:
+ // first current altitude of eye position in model space
+ // vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+ // and relative position to vector
+ //relPos = gl_Vertex.xyz - ep.xyz;
+
+
+ // Transform for frame of reference where:
+ // +z is in the up direction.
+ // The orientation of x and y axes are unknown currently.
+ // The origin is at the same position as the model space origin.
+ // The units are in meters.
+ mat4 viewSpaceToZUpSpace = fg_zUpTransform * gl_ModelViewMatrixInverse;
+
+ vec4 vertexZUp = fg_zUpTransform * gl_Vertex;
+
+ // WS2: rawPos = gl_Vertex.xy;
+ rawPos = vertexZUp.xy;
+
+ // WS2: worldPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz;
worldPos = fg_modelOffset + gl_Vertex.xyz;
-
-
- steepness = dot(normalize(vec3(fg_zUpTransform * vec4(gl_Normal,1.0))), vec3 (0.0, 0.0, 1.0));
- grad_dir = normalize(gl_Normal.xy);
+
- vec4 pos = gl_Vertex;
- if (raise_vertex)
- {
- pos.z+=0.1;
- gl_Position = gl_ModelViewProjectionMatrix * pos;
- }
- else gl_Position = ftransform();
+ steepness = dot(normalize(vec3(fg_zUpTransform * vec4(gl_Normal,1.0))), vec3 (0.0, 0.0, 1.0));
+ // Gradient direction used for small scale noise. In the same space as noise coords, rawpos.xy.
+ grad_dir = normalize(gl_Normal.xy);
+
+ // here start computations for the haze layer
+ // we need several geometrical quantities
+
+
+ // Eye position in z up space
+ vec4 epZUp = viewSpaceToZUpSpace * vec4(0.0,0.0,0.0,1.0);
+
+ // Position of vertex relative to the eye position in z up space
+ vec3 relPosZUp = (vertexZUp - epZUp).xyz;
+
+
+ // first current altitude of eye position in model space
+ vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+
+
+ // Eye position in model space
+ vec4 epMS = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+
+ /*
+ //old: and relative position to vector. This is also used for cloud shadow positioning.
+ relPosOld = (fg_zUpTransform * vec4(gl_Vertex - ep)).xyz;
+ if (any(notEqual(relPosOld, relPosZUp))) relPos = vec3(1000000.0);
+ */
+ relPos = relPosZUp;
+ vertVec = relPosZUp;
+
+ ecViewdir = (gl_ModelViewMatrix * (epMS - gl_Vertex)).xyz;
+ // unfortunately, we need the distance in the vertex shader, although the more accurate version
+ // is later computed in the fragment shader again
+ float dist = length(relPos);
+
+ // Altitude of the vertex above mean sea level in meters.
+ // This is equal to vertexZUp.z as the model space origin is at mean sea level.
+ // Somehow zero leads to artefacts, so ensure it is at least 100m.
+ //WS2: vertex_alt = max(gl_Vertex.z,100.0);
+ vertex_alt = max(vertexZUp.z,100.0);
+ scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
+
-// this code is copied from default.vert
-
- ecPosition = gl_ModelViewMatrix * gl_Vertex;
- //gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- //orthoTexCoord = orthophotoTexCoord;
- normal = gl_NormalMatrix * gl_Normal;
-
- // here start computations for the haze layer
- // we need several geometrical quantities
-
- // first current altitude of eye position in model space
- vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
-
- // and relative position to vector
- relPos = (fg_zUpTransform * vec4(gl_Vertex - ep)).xyz;
-
- ecViewdir = (gl_ModelViewMatrix * (ep - gl_Vertex)).xyz;
- // unfortunately, we need the distance in the vertex shader, although the more accurate version
- // is later computed in the fragment shader again
- float dist = length(relPos);
-
- // altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m
- vertex_alt = max(rawPos.z,100.0);
- scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
-
-
- // branch dependent on daytime
+ // branch dependent on daytime
if (terminator < 1000000.0) // the full, sunrise and sunset computation
{
-
-
// establish coordinates relative to sun position
-
+
vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz;
vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0));
-
-
// yprime is the distance of the vertex into sun direction
yprime = -dot(relPos, lightHorizon);
-
+
// this gets an altitude correction, higher terrain gets to see the sun earlier
yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt);
-
+
// two times terminator width governs how quickly light fades into shadow
// now the light-dimming factor
earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4;
-
- // parametrized version of the Flightgear ground lighting function
+
+ // parametrized version of the Flightgear ground lighting function
lightArg = (terminator-yprime_alt)/100000.0;
// directional scattering for low sun
if (lightArg < 10.0)
- {mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;}
+ {mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;}
else
- {mie_angle = 1.0;}
+ {mie_angle = 1.0;}
+
+
+ light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ light_diffuse.a = 1.0;
+ light_diffuse = light_diffuse * scattering;
+
+ //light_ambient.b = light_func(lightArg, 0.000506, 0.131, -3.315, 0.000457, 0.5);
+ //light_ambient.g = light_func(lightArg, 2.264e-05, 0.134, 0.967, 3.66e-05, 0.4);
+ light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
+ light_ambient.g = light_ambient.r * 0.4/0.33; //light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.4);
+ light_ambient.b = light_ambient.r * 0.5/0.33; //light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.5);
+ light_ambient.a = 1.0;
+
+ // Water specular calculations
+ specular_light.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ specular_light.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ specular_light.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ specular_light = max(specular_light * scattering, vec3 (0.05, 0.05, 0.05));
+ intensity = length(specular_light.rgb);
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.1, 0.6,ground_scattering) ));
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.5, 0.7,earthShade)));
+ // correct ambient light intensity and hue before sunrise
+ if (earthShade < 0.5)
+ {
+ intensity = length(light_ambient.rgb);
+ light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.8,earthShade) ));
+ light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade));
+
+ intensity = length(light_diffuse.rgb);
+ light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) ));
+ }
- light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
- light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
- light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
- light_diffuse.a = 1.0;
- light_diffuse = light_diffuse * scattering;
-
- //light_ambient.b = light_func(lightArg, 0.000506, 0.131, -3.315, 0.000457, 0.5);
- //light_ambient.g = light_func(lightArg, 2.264e-05, 0.134, 0.967, 3.66e-05, 0.4);
- light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
- light_ambient.g = light_ambient.r * 0.4/0.33; //light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.4);
- light_ambient.b = light_ambient.r * 0.5/0.33; //light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.5);
- light_ambient.a = 1.0;
+ // directional scattering for low sun
+ if (lightArg < 10.0) {
+ mie_angle = (0.5 * dot(normalize(relPos), lightdir) ) + 0.5;
+ } else {
+ mie_angle = 1.0;
+ }
+ // the haze gets the light at the altitude of the haze top if the vertex in view is below
+ // but the light at the vertex if the vertex is above
+
+ vertex_alt = max(vertex_alt,hazeLayerAltitude);
-
-// correct ambient light intensity and hue before sunrise
-if (earthShade < 0.5)
- {
- intensity = length(light_ambient.rgb);
- light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.8,earthShade) ));
- light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade));
-
- intensity = length(light_diffuse.rgb);
- light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) ));
- }
-
-
-// the haze gets the light at the altitude of the haze top if the vertex in view is below
-// but the light at the vertex if the vertex is above
-
-vertex_alt = max(vertex_alt,hazeLayerAltitude);
-
-if (vertex_alt > hazeLayerAltitude)
- {
- if (dist > 0.8 * avisibility)
- {
- vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
- yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
- }
- }
-else
- {
- vertex_alt = hazeLayerAltitude;
- yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
- }
-
-}
-else // the faster, full-day version without lightfields
-{
+ if (vertex_alt > hazeLayerAltitude)
+ {
+ if (dist > 0.8 * avisibility)
+ {
+ vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
+ yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
+ }
+ }
+ else
+ {
+ vertex_alt = hazeLayerAltitude;
+ yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
+ }
+
+ } // End if (terminator < 1000000.0)
+ else // the faster, full-day version without lightfields
+ {
//vertex_alt = max(gl_Vertex.z,100.0);
-
+
earthShade = 1.0;
mie_angle = 1.0;
if (terminator > 3000000.0)
- {light_diffuse = vec4 (1.0, 1.0, 1.0, 1.0);
- light_ambient = vec4 (0.33, 0.4, 0.5, 1.0); }
+ {
+ light_diffuse = vec4 (1.0, 1.0, 1.0, 1.0);
+ light_ambient = vec4 (0.33, 0.4, 0.5, 1.0);
+ specular_light = vec3 (1.0, 1.0, 1.0);
+ }
else
- {
-
- lightArg = (terminator/100000.0 - 10.0)/20.0;
- light_diffuse.b = 0.78 + lightArg * 0.21;
- light_diffuse.g = 0.907 + lightArg * 0.091;
- light_diffuse.r = 0.904 + lightArg * 0.092;
- light_diffuse.a = 1.0;
-
- //light_ambient.b = 0.41 + lightArg * 0.08;
- //light_ambient.g = 0.333 + lightArg * 0.06;
- light_ambient.r = 0.316 + lightArg * 0.016;
- light_ambient.g = light_ambient.r * 0.4/0.33;
- light_ambient.b = light_ambient.r * 0.5/0.33;
- light_ambient.a = 1.0;
- }
+ {
+ lightArg = (terminator/100000.0 - 10.0)/20.0;
+ light_diffuse.b = 0.78 + lightArg * 0.21;
+ light_diffuse.g = 0.907 + lightArg * 0.091;
+ light_diffuse.r = 0.904 + lightArg * 0.092;
+ light_diffuse.a = 1.0;
+ //light_ambient.b = 0.41 + lightArg * 0.08;
+ //light_ambient.g = 0.333 + lightArg * 0.06;
+ light_ambient.r = 0.316 + lightArg * 0.016;
+ light_ambient.g = light_ambient.r * 0.4/0.33;
+ light_ambient.b = light_ambient.r * 0.5/0.33;
+ light_ambient.a = 1.0;
+
+ specular_light.b = 0.78 + lightArg * 0.21;
+ specular_light.g = 0.907 + lightArg * 0.091;
+ specular_light.r = 0.904 + lightArg * 0.092;
+ }
+
light_diffuse = light_diffuse * scattering;
+ specular_light = specular_light * scattering;
+
yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);
-}
+
+ } //End the faster, full-day version without lightfields
-// a sky/earth irradiation map model - the sky creates much more diffuse radiation than the ground, so
-// steep faces end up shaded more
+ // a sky/earth irradiation map model - the sky creates much more diffuse radiation than the ground, so
+ // steep faces end up shaded more
+
+ light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 * 0.2);
-light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 * 0.2);
+ // deeper shadows when there is lots of direct light
-// deeper shadows when there is lots of direct light
-
-float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade);
-
- light_ambient.rgb = light_ambient.rgb * (1.0 - shade_depth);
- light_diffuse.rgb = light_diffuse.rgb * (1.0 + 1.2 * shade_depth);
-
-if (use_IR_vision)
- {
- light_ambient.rgb = max(light_ambient.rgb, vec3 (0.5, 0.5, 0.5));
- }
+ float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade);
+
+ light_ambient.rgb = light_ambient.rgb * (1.0 - shade_depth);
+ light_diffuse.rgb = light_diffuse.rgb * (1.0 + 1.2 * shade_depth);
+ specular_light.rgb *= (1.0 + 1.2 * shade_depth);
+
+ if (use_IR_vision)
+ {
+ light_ambient.rgb = max(light_ambient.rgb, vec3 (0.5, 0.5, 0.5));
+ }
-// default lighting based on texture and material using the light we have just computed
-
- light_diffuse_comp = light_diffuse;
- //Testing phase code: ambient colours are not sent to fragement shader yet.
- // They are all default except for water/ocean etc. currently
- // Emission is all set to the default of vec4(0.0, 0.0, 0.0, 1.0)
- //To do: Fix this once ambient colour becomes available in the fragment shaders.
- //const vec4 ambient_color = vec4(0.2, 0.2, 0.2, 1.0);
- const vec4 ambient_color = vec4(1.0);
- vec4 constant_term = ambient_color * (gl_LightModel.ambient + light_ambient);
-
- light_diffuse_comp.a = yprime_alt;
- gl_FrontColor.rgb = constant_term.rgb; // gl_FrontColor.a = 1.0;
- gl_BackColor.rgb = constant_term.rgb; // gl_BackColor.a = 0.0;
- gl_FrontColor.a = mie_angle;
- gl_BackColor.a = mie_angle;
-
- setupShadows(ecPosition);
+ // default lighting based on texture and material using the light we have just computed
+
+ light_diffuse_comp = light_diffuse;
+ //Testing phase code: ambient colours are not sent to fragement shader yet.
+ // They are all default except for water/ocean etc. currently
+ // Emission is all set to the default of vec4(0.0, 0.0, 0.0, 1.0)
+ //To do: Fix this once ambient colour becomes available in the fragment shaders.
+ //const vec4 ambient_color = vec4(0.2, 0.2, 0.2, 1.0);
+ const vec4 ambient_color = vec4(1.0);
+ vec4 constant_term = ambient_color * (gl_LightModel.ambient + light_ambient);
+
+ light_diffuse_comp.a = yprime_alt;
+ gl_FrontColor.rgb = constant_term.rgb; // gl_FrontColor.a = 1.0;
+ gl_BackColor.rgb = constant_term.rgb; // gl_BackColor.a = 0.0;
+ gl_FrontColor.a = mie_angle;
+ gl_BackColor.a = mie_angle;
+
+ setupShadows(ecPosition);
}
diff --git a/Shaders/ws30-ALS.frag b/Shaders/ws30-ALS.frag
index 4a516f4a4..91912166e 100644
--- a/Shaders/ws30-ALS.frag
+++ b/Shaders/ws30-ALS.frag
@@ -22,6 +22,9 @@
// Possible values: 0:Normal, 1:Just the texture.
const int remove_haze_and_lighting = 0;
+// Use built-in water shader. Use for testing impact of ws30-water.frag
+ const int water_shader = 1;
+
//
// End of test phase controls
//////////////////////////////////////////////////////////////////
@@ -43,6 +46,7 @@
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
+varying vec2 ground_tex_coord;
uniform sampler2D landclass;
uniform sampler2DArray textureArray;
@@ -72,6 +76,8 @@ uniform vec4 fg_diffuseArray[128];
uniform vec4 fg_specularArray[128];
uniform vec4 fg_textureLookup1[128];
uniform vec4 fg_textureLookup2[128];
+uniform vec4 fg_materialParams3[128];
+
#define MAX_TEXTURES 8
uniform mat4 fg_zUpTransform;
uniform vec3 fg_modelOffset;
@@ -106,6 +112,7 @@ vec3 filter_combined (in vec3 color) ;
float getShadowing();
vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
+vec4 generateWaterTexel();
// Not used
float luminance(vec3 color)
@@ -117,7 +124,6 @@ float luminance(vec3 color)
//////////////////////////
// Test-phase code:
-
// These should be sent as uniforms
// Tile dimensions in meters
@@ -130,47 +136,81 @@ float luminance(vec3 color)
// From noise.frag
float rand2D(in vec2 co);
-// These functions, and other function they depend on, are defined
-// in ws30-ALS-landclass-search.frag.
-
-
// Create random landclasses without a texture lookup to stress test.
// Each square of square_size in m is assigned a random landclass value.
int get_random_landclass(in vec2 co, in vec2 tile_size);
+// End Test-phase code
+////////////////////////
+
+// These functions, and other function they depend on, are defined
+// in ws30-ALS-landclass-search.frag.
// Lookup a ground texture at a point based on the landclass at that point, without visible
// seams at coordinate discontinuities or at landclass boundaries where texture are switched.
// The partial derivatives of the tile_coord at the fragment is needed to adjust for
// the stretching of different textures, so that the correct mip-map level is looked
// up and there are no seams.
+// Texture types: 0: base texture, 1: grain texture, 2: gradient texture, 3 dot texture,
+// 4: mix texture, 5: detail texture.
-vec4 lookup_ground_texture_array(in vec2 tile_coord, in int landclass_id, in vec2 dx, in vec2 dy);
+vec4 lookup_ground_texture_array(in int texture_type, in vec2 ground_texture_coord, in int landclass_id,
+ in vec4 dFdx_and_dFdy);
// Look up the landclass id [0 .. 255] for this particular fragment.
// Lookup id of any neighbouring landclass that is within the search distance.
// Searches are performed in upto 4 directions right now, but only one landclass is looked up
// Create a mix factor werighting the influences of nearby landclasses
-void get_landclass_id(in vec2 tile_coord,
- const in float landclass_texel_size_m, in vec2 dx, in vec2 dy,
+void get_landclass_id(in vec2 tile_coord, in vec4 dFdx_and_dFdy,
out int landclass_id, out ivec4 neighbor_landclass_ids,
out int num_unique_neighbors,out vec4 mix_factor
);
-// End Test-phase code
-////////////////////////
+// Look up the texel of the specified texture type (e.g. grain or detail textures) for this fragment
+// and any neighbor texels, then mix.
+vec4 get_mixed_texel(in int texture_type, in vec2 g_texture_coord,
+ in int landclass_id, in int num_unique_neighbors,
+ in ivec4 neighbor_texel_landclass_ids, in vec4 neighbor_mix_factors,
+ in vec4 dFdx_and_dFdy
+ );
+
+// Determine the texel and material parameters for a particular fragment,
+// Taking into account photoscenery etc.
+void get_material(in int landclass,
+ in vec2 ground_tex_coord,
+ in vec4 dxdy_gc,
+ out float mat_shininess,
+ out vec4 mat_ambient,
+ out vec4 mat_diffuse,
+ out vec4 mat_specular,
+ out vec4 dxdy,
+ out vec2 st
+ );
+
+// Apply the ALS haze model to a specific fragment
+vec4 applyHaze(inout vec4 fragColor,
+ inout vec3 hazeColor,
+ in vec3 secondary_light,
+ in float ct,
+ in float hazeLayerAltitude,
+ in float visibility,
+ in float avisibility,
+ in float dist,
+ in float lightArg,
+ in float mie_angle);
+
+// Procedurally generate a water texel for this fragment
+vec4 generateWaterTexel();
void main()
{
-
-
vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
// this is taken from default.frag
- vec3 n;
float NdotL, NdotHV, fogFactor;
+ vec3 n = normalize(normal);
vec3 lightDir = gl_LightSource[0].position.xyz;
vec3 halfVector = gl_LightSource[0].halfVector.xyz;
vec4 texel;
@@ -178,27 +218,18 @@ void main()
vec4 specular = vec4(0.0);
float intensity;
+ // Material/texel properties
+ float mat_shininess;
+ vec2 st;
+ vec4 mat_ambient, mat_diffuse, mat_specular, dxdy;
-
- // Oct 27 2021:
- // Geometry is in the form of roughly rectangular 'tiles'
- // with a mesh forming a grid with regular spacing.
- // Each vertex in the mesh is given an elevation
-
- // Tile dimensions in m
- // Testing: created from two float uniforms in global scope. Should be sent as a vec2
- // vec2 tile_size
-
+
// Tile texture coordinates range [0..1] over the tile 'rectangle'
vec2 tile_coord = gl_TexCoord[0].st;
- // Test phase: Constants and toggles for transitions between landlcasses are defined at
- // the top of this file.
-
// Look up the landclass id [0 .. 255] for this particular fragment
// and any neighbouring landclass that is close.
// Each tile has 1 texture containing landclass ids stetched over it.
-
// Landclass for current fragment, and up-to 4 neighboring landclasses - 2 used currently
int lc;
ivec4 lc_n;
@@ -208,277 +239,87 @@ void main()
// Mix factor of base textures for 2 neighbour landclass(es)
vec4 mfact;
-
- const float landclass_texel_size_m = 25.0;
-
// Partial derivatives of s and t for this fragment,
// with respect to window (screen space) x and y axes.
// Used to pick mipmap LoD levels, and turn off unneeded procedural detail
- vec2 dx = dFdx(tile_coord);
- vec2 dy = dFdy(tile_coord);
+ // dFdx and dFdy are packed in a vec4 so multiplying
+ // to scale takes 1 instruction slot.
+ vec4 dxdy_gc = vec4(dFdx(tile_coord) , dFdy(tile_coord));
- get_landclass_id(tile_coord, landclass_texel_size_m, dx, dy,
- lc, lc_n, num_unique_neighbors, mfact);
-
- // The landclass id is used to index into arrays containing
- // material parameters and textures for the landclass as
- // defined in the regional definitions
- float index = float(lc)/512.0;
- vec4 index_n = vec4(lc_n)/512.0;
-
- // Material properties.
- vec4 mat_diffuse, mat_ambient, mat_specular;
- float mat_shininess;
+ get_landclass_id(tile_coord, dxdy_gc, lc, lc_n, num_unique_neighbors, mfact);
+ get_material(lc, ground_tex_coord, dxdy_gc, mat_shininess, mat_ambient, mat_diffuse, mat_specular, dxdy, st);
if (fg_photoScenery) {
- mat_ambient = vec4(1.0,1.0,1.0,1.0);
- mat_diffuse = vec4(1.0,1.0,1.0,1.0);
- mat_specular = vec4(0.1, 0.1, 0.1, 1.0);
- mat_shininess = 1.2;
-
texel = texture(landclass, vec2(gl_TexCoord[0].s, 1.0 - gl_TexCoord[0].t));
} else {
- // Color Mode is always AMBIENT_AND_DIFFUSE, which means
- // using a base colour of white for ambient/diffuse,
- // rather than the material color from ambientArray/diffuseArray.
- mat_ambient = vec4(1.0,1.0,1.0,1.0);
- mat_diffuse = vec4(1.0,1.0,1.0,1.0);
- mat_specular = fg_specularArray[lc];
- mat_shininess = fg_dimensionsArray[lc].z;
-
- // Look up ground textures by indexing into the texture array.
- // Different textures are stretched along the ground to different
- // lengths along each axes as set by and
- // regional definitions parameters
-
- // Look up texture coordinates and scale of ground textures
- // Landclass for this fragment
- texel = lookup_ground_texture_array(tile_coord, lc, dx, dy);
-
- // Mix texels - to work consistently it needs a more preceptual interpolation than mix()
- if (num_unique_neighbors != 0)
- {
- // Closest neighbor landclass
- vec4 texel_closest = lookup_ground_texture_array(tile_coord, lc_n[0], dx, dy);
-
- // Neighbor contributions
- vec4 texel_nc=texel_closest;
-
- if (num_unique_neighbors > 1)
- {
- // 2nd Closest neighbor landclass
- vec4 texel_2nd_closest = lookup_ground_texture_array(tile_coord, lc_n[1],
- dx, dy);
-
- texel_nc = mix(texel_closest, texel_2nd_closest, mfact[1]);
- }
-
- texel = mix(texel, texel_nc, mfact[0]);
- }
+ // Lookup the base texture texel for this fragment. No mixing at this quality level.
+ texel = lookup_ground_texture_array(0, st, lc, dxdy);
}
- vec4 color = mat_ambient * (gl_LightModel.ambient + gl_LightSource[0].ambient);
+ if ((water_shader == 1) && (fg_photoScenery == false) && fg_materialParams3[lc].x > 0.5) {
+ // This is a water fragment, so calculate the fragment color procedurally
+ fragColor = generateWaterTexel();
+ fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, fragColor.rgb);
+
+ } else {
+ // Photoscenery or land fragment, so determine the shading and color normally
+ vec4 color = mat_ambient * (gl_LightModel.ambient + gl_LightSource[0].ambient);
- // Testing code:
- // Use rlc even when looking up textures to recreate the extra performance hit
- // so any performance difference between the two is due to the texture lookup
- // color = color+0.00001*float(get_random_landclass(tile_coord.st, tile_size));
+ // Testing code:
+ // Use rlc even when looking up textures to recreate the extra performance hit
+ // so any performance difference between the two is due to the texture lookup
+ // color = color+0.00001*float(get_random_landclass(tile_coord.st, tile_size));
- float effective_scattering = min(scattering, cloud_self_shading);
+ float effective_scattering = min(scattering, cloud_self_shading);
- vec4 light_specular = gl_LightSource[0].specular;
+ vec4 light_specular = gl_LightSource[0].specular;
- // If gl_Color.a == 0, this is a back-facing polygon and the
- // normal should be reversed.
- //n = (2.0 * gl_Color.a - 1.0) * normal;
- n = normalize(normal);
-
-
- NdotL = dot(n, lightDir);
- vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
- if (NdotL > 0.0) {
- float shadowmap = getShadowing();
- vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
- color += diffuse_term * NdotL * shadowmap;
- NdotHV = max(dot(n, halfVector), 0.0);
- if (mat_shininess > 0.0)
- specular.rgb = (mat_specular.rgb
- * light_specular.rgb
- * pow(NdotHV, gl_FrontMaterial.shininess)
- * shadowmap);
- }
- color.a = diffuse_term.a;
- // This shouldn't be necessary, but our lighting becomes very
- // saturated. Clamping the color before modulating by the texture
- // is closer to what the OpenGL fixed function pipeline does.
- color = clamp(color, 0.0, 1.0);
-
-
- // Testing code: mix with green to show values of variables at each point
- //vec4 green = vec4(0.0, 0.5, 0.0, 0.0);
- //texel = mix(texel, green, (mfact[2]));
-
-
- fragColor = color * texel + specular;
- fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, texel.rgb);
-
- // here comes the terrain haze model
- float delta_z = hazeLayerAltitude - eye_alt;
- float dist = length(relPos);
-
- float mvisibility = min(visibility,avisibility);
-
- if (dist > 0.04 * mvisibility)
- {
-
- alt = eye_alt;
-
- float transmission;
- float vAltitude;
- float delta_zv;
- float H;
- float distance_in_layer;
- float transmission_arg;
-
- // angle with horizon
- float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
-
-
- // we solve the geometry what part of the light path is attenuated normally and what is through the haze layer
- if (delta_z > 0.0) // we're inside the layer
- {
- if (ct < 0.0) // we look down
- {
- distance_in_layer = dist;
- vAltitude = min(distance_in_layer,mvisibility) * ct;
- delta_zv = delta_z - vAltitude;
- }
- else // we may look through upper layer edge
- {
- H = dist * ct;
- if (H > delta_z) {distance_in_layer = dist/H * delta_z;}
- else {distance_in_layer = dist;}
- vAltitude = min(distance_in_layer,visibility) * ct;
- delta_zv = delta_z - vAltitude;
- }
- }
- else // we see the layer from above, delta_z < 0.0
- {
- H = dist * -ct;
- if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading
- {
- distance_in_layer = 0.0;
- delta_zv = 0.0;
- }
- else
- {
- vAltitude = H + delta_z;
- distance_in_layer = vAltitude/H * dist;
- vAltitude = min(distance_in_layer,visibility) * (-ct);
- delta_zv = vAltitude;
- }
- }
+ // If gl_Color.a == 0, this is a back-facing polygon and the
+ // normal should be reversed.
+ //n = (2.0 * gl_Color.a - 1.0) * normal;
- // ground haze cannot be thinner than aloft visibility in the model,
- // so we need to use aloft visibility otherwise
- transmission_arg = (dist-distance_in_layer)/avisibility;
- float eqColorFactor;
+ NdotL = dot(n, lightDir);
+ vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
+ if (NdotL > 0.0) {
+ float shadowmap = getShadowing();
+ vec4 diffuse_term = light_diffuse_comp * mat_diffuse;
+ color += diffuse_term * NdotL * shadowmap;
+ NdotHV = max(dot(n, halfVector), 0.0);
+ if (mat_shininess > 0.0)
+ specular.rgb = (mat_specular.rgb
+ * light_specular.rgb
+ * pow(NdotHV, gl_FrontMaterial.shininess)
+ * shadowmap);
+ }
+ color.a = diffuse_term.a;
+ // This shouldn't be necessary, but our lighting becomes very
+ // saturated. Clamping the color before modulating by the texture
+ // is closer to what the OpenGL fixed function pipeline does.
+ color = clamp(color, 0.0, 1.0);
+ // Testing code: mix with green to show values of variables at each point
+ //vec4 green = vec4(0.0, 0.5, 0.0, 0.0);
+ //texel = mix(texel, green, (mfact[2]));
- if (visibility < avisibility)
- {
- transmission_arg = transmission_arg + (distance_in_layer/visibility);
- // this combines the Weber-Fechner intensity
- eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 -effective_scattering);
- }
- else
- {
- transmission_arg = transmission_arg + (distance_in_layer/avisibility);
- // this combines the Weber-Fechner intensity
- eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -effective_scattering);
+ fragColor = color * texel + specular;
+ fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, texel.rgb);
}
- transmission = fog_func(transmission_arg, alt);
-
- // there's always residual intensity, we should never be driven to zero
- if (eqColorFactor < 0.2) {eqColorFactor = 0.2;}
+ // angle with horizon
+ float dist = length(relPos);
+ float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
float lightArg = (terminator-yprime_alt)/100000.0;
vec3 hazeColor = get_hazeColor(lightArg);
+ gl_FragColor = applyHaze(fragColor, hazeColor, vec3(0.0), ct, hazeLayerAltitude, visibility, avisibility, dist, lightArg, mie_angle);
- // now dim the light for haze
- eShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt);
-
- // Mie-like factor
- if (lightArg < 10.0)
- {intensity = length(hazeColor);
- float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt));
- hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) );
- }
-
- // high altitude desaturation of the haze color
-
- intensity = length(hazeColor);
- hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt)));
-
- // blue hue of haze
-
- hazeColor.x = hazeColor.x * 0.83;
- hazeColor.y = hazeColor.y * 0.9;
-
-
- // additional blue in indirect light
- float fade_out = max(0.65 - 0.3 *overcast, 0.45);
- intensity = length(hazeColor);
- hazeColor = intensity * normalize(mix(hazeColor, 1.5* shadedFogColor, 1.0 -smoothstep(0.25, fade_out,eShade) ));
-
- // change haze color to blue hue for strong fogging
- //intensity = length(hazeColor);
- hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothstep(0.5,0.9,eqColorFactor))));
-
-
- // reduce haze intensity when looking at shaded surfaces, only in terminator region
-
- float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission));
- hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator));
-
- // don't let the light fade out too rapidly
- lightArg = (terminator + 200000.0)/100000.0;
- float minLightIntensity = min(0.2,0.16 * lightArg + 0.5);
- vec3 minLight = minLightIntensity * vec3 (0.2, 0.3, 0.4);
- hazeColor *= eqColorFactor * eShade;
- hazeColor.rgb = max(hazeColor.rgb, minLight.rgb);
-
- // determine the right mix of transmission and haze
-
-
-// Testing phase controls
-if (reduce_haze_without_removing_calculation_overhead == 1)
-{
-transmission = 1.0 - (transmission/1000000.0);
-}
-
-
-
- fragColor.rgb = mix(hazeColor, fragColor.rgb,transmission);
+ // Testing phase controls:
+ if (remove_haze_and_lighting == 1)
+ {
+ gl_FragColor = texel;
}
-
- fragColor.rgb = filter_combined(fragColor.rgb);
-
- gl_FragColor = fragColor;
-
-
-
-// Testing phase controls:
-if (remove_haze_and_lighting == 1)
-{
- gl_FragColor = texel;
-}
-
-
-
}
diff --git a/Shaders/ws30-ALS.vert b/Shaders/ws30-ALS.vert
index 0ef6387a9..2e534e8f8 100644
--- a/Shaders/ws30-ALS.vert
+++ b/Shaders/ws30-ALS.vert
@@ -27,11 +27,24 @@ uniform vec3 fg_modelOffset;
varying vec4 light_diffuse_comp;
varying vec3 normal;
varying vec3 relPos;
+varying vec2 ground_tex_coord;
varying vec4 ecPosition;
varying float yprime_alt;
varying float mie_angle;
+// For water calculations
+varying float earthShade;
+varying vec3 lightdir;
+varying vec4 waterTex1;
+varying vec4 waterTex2;
+varying vec4 waterTex4;
+varying vec3 specular_light;
+
+uniform float osg_SimulationTime;
+uniform float WindN;
+uniform float WindE;
+
uniform int colorMode;
uniform float hazeLayerAltitude;
uniform float terminator;
@@ -41,6 +54,7 @@ uniform float visibility;
uniform float overcast;
uniform float ground_scattering;
uniform float moonlight;
+uniform float eye_alt;
void setupShadows(vec4 eyeSpacePos);
@@ -48,19 +62,20 @@ void setupShadows(vec4 eyeSpacePos);
const float EarthRadius = 5800000.0;
const float terminator_width = 200000.0;
-
-float earthShade;
-
float light_func (in float x, in float a, in float b, in float c, in float d, in float e)
{
-//x = x - 0.5;
-
-// use the asymptotics to shorten computations
-if (x < -15.0) {return 0.0;}
-
-return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
+ // use the asymptotics to shorten computations
+ if (x < -15.0) {return 0.0;}
+ return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
}
+void rotationmatrix(in float angle, out mat4 rotmat)
+{
+ rotmat = mat4( cos( angle ), -sin( angle ), 0.0, 0.0,
+ sin( angle ), cos( angle ), 0.0, 0.0,
+ 0.0 , 0.0 , 1.0, 0.0,
+ 0.0 , 0.0 , 0.0, 1.0 );
+}
void main()
{
@@ -85,6 +100,31 @@ void main()
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
normal = gl_NormalMatrix * gl_Normal;
+ // Required for water calculations
+ lightdir = normalize(vec3(fg_zUpTransform * vec4(gl_ModelViewMatrixInverse * gl_LightSource[0].position)));
+ waterTex4 = vec4( ecPosition.xzy, 0.0 );
+
+ vec4 t1 = vec4(0.0, osg_SimulationTime * 0.005217, 0.0, 0.0);
+ vec4 t2 = vec4(0.0, osg_SimulationTime * -0.0012, 0.0, 0.0);
+
+ float Angle;
+
+ float windFactor = sqrt(WindE * WindE + WindN * WindN) * 0.05;
+ if (WindN == 0.0 && WindE == 0.0) {
+ Angle = 0.0;
+ } else {
+ Angle = atan(-WindN, WindE) - atan(1.0);
+ }
+
+ mat4 RotationMatrix;
+ rotationmatrix(Angle, RotationMatrix);
+ waterTex1 = gl_MultiTexCoord0 * RotationMatrix - t1 * windFactor;
+ rotationmatrix(Angle, RotationMatrix);
+ waterTex2 = gl_MultiTexCoord0 * RotationMatrix - t2 * windFactor;
+
+ // Temporary value:
+ ground_tex_coord = gl_TexCoord[0].st;
+
// here start computations for the haze layer
// we need several geometrical quantities
@@ -99,125 +139,131 @@ void main()
float dist = length(relPos);
// altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m
- vertex_alt = max(relPos.z,100.0);
+ vertex_alt = max(relPos.z + eye_alt, 100.0);
scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
-
// branch dependent on daytime
+ if (terminator < 1000000.0) // the full, sunrise and sunset computation
+ {
+ // establish coordinates relative to sun position
-if (terminator < 1000000.0) // the full, sunrise and sunset computation
-{
+ vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz;
+ vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0));
+
+ // yprime is the distance of the vertex into sun direction
+ yprime = -dot(relPos, lightHorizon);
+
+ // this gets an altitude correction, higher terrain gets to see the sun earlier
+ yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt);
+
+ // two times terminator width governs how quickly light fades into shadow
+ // now the light-dimming factor
+ earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4;
+ // parametrized version of the Flightgear ground lighting function
+ lightArg = (terminator-yprime_alt)/100000.0;
- // establish coordinates relative to sun position
+ // directional scattering for low sun
+ if (lightArg < 10.0) {
+ mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;
+ } else {
+ mie_angle = 1.0;
+ }
- vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz;
- vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0));
-
-
-
- // yprime is the distance of the vertex into sun direction
- yprime = -dot(relPos, lightHorizon);
-
- // this gets an altitude correction, higher terrain gets to see the sun earlier
- yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt);
-
- // two times terminator width governs how quickly light fades into shadow
- // now the light-dimming factor
- earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4;
-
- // parametrized version of the Flightgear ground lighting function
- lightArg = (terminator-yprime_alt)/100000.0;
-
- // directional scattering for low sun
- if (lightArg < 10.0)
- {mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;}
- else
- {mie_angle = 1.0;}
+ light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ light_diffuse.a = 1.0;
+ light_diffuse = light_diffuse * scattering;
+ light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
+ light_ambient.g = light_ambient.r * 0.4/0.33;
+ light_ambient.b = light_ambient.r * 0.5/0.33;
+ light_ambient.a = 1.0;
+ // Water specular calculations
+ specular_light.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ specular_light.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ specular_light.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ specular_light = max(specular_light * scattering, vec3 (0.05, 0.05, 0.05));
+ intensity = length(specular_light.rgb);
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.1, 0.6,ground_scattering) ));
+ specular_light.rgb = intensity * normalize(mix(specular_light.rgb, shadedFogColor, 1.0 -smoothstep(0.5, 0.7,earthShade)));
- light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
- light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
- light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
- light_diffuse.a = 1.0;
- light_diffuse = light_diffuse * scattering;
+ // correct ambient light intensity and hue before sunrise
+ if (earthShade < 0.5) {
+ //light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade));
+ intensity = length(light_ambient.xyz);
+ light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.8,earthShade) ));
+ light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade));
- light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
- light_ambient.g = light_ambient.r * 0.4/0.33;
- light_ambient.b = light_ambient.r * 0.5/0.33;
- light_ambient.a = 1.0;
+ intensity = length(light_diffuse.xyz);
+ light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) ));
+ }
+ // directional scattering for low sun
+ if (lightArg < 10.0) {
+ mie_angle = (0.5 * dot(normalize(relPos), lightdir) ) + 0.5;
+ } else {
+ mie_angle = 1.0;
+ }
+ // the haze gets the light at the altitude of the haze top if the vertex in view is below
+ // but the light at the vertex if the vertex is above
+ vertex_alt = max(vertex_alt,hazeLayerAltitude);
-// correct ambient light intensity and hue before sunrise
-if (earthShade < 0.5)
- {
- //light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade));
- intensity = length(light_ambient.xyz);
+ if (vertex_alt > hazeLayerAltitude)
+ {
+ if (dist > 0.8 * avisibility)
+ {
+ vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
+ yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
+ }
+ } else {
+ vertex_alt = hazeLayerAltitude;
+ yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
+ }
+ }
+ else // the faster, full-day version without lightfields
+ {
+ earthShade = 1.0;
+ mie_angle = 1.0;
- light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.8,earthShade) ));
- light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade));
+ if (terminator > 3000000.0) {
+ light_diffuse = vec4 (1.0, 1.0, 1.0, 0.0);
+ light_ambient = vec4 (0.33, 0.4, 0.5, 0.0);
+ specular_light = vec3 (1.0, 1.0, 1.0);
- intensity = length(light_diffuse.xyz);
- light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) ));
- }
+ } else {
+ lightArg = (terminator/100000.0 - 10.0)/20.0;
+ light_diffuse.b = 0.78 + lightArg * 0.21;
+ light_diffuse.g = 0.907 + lightArg * 0.091;
+ light_diffuse.r = 0.904 + lightArg * 0.092;
+ light_diffuse.a = 1.0;
+ light_ambient.r = 0.316 + lightArg * 0.016;
+ light_ambient.g = light_ambient.r * 0.4/0.33;
+ light_ambient.b = light_ambient.r * 0.5/0.33;
+ light_ambient.a = 1.0;
-// the haze gets the light at the altitude of the haze top if the vertex in view is below
-// but the light at the vertex if the vertex is above
+ specular_light.b = 0.78 + lightArg * 0.21;
+ specular_light.g = 0.907 + lightArg * 0.091;
+ specular_light.r = 0.904 + lightArg * 0.092;
+ }
+
+ light_diffuse = light_diffuse * scattering;
+ specular_light = specular_light * scattering;
+ float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade);
+ specular_light.rgb *= (1.0 + 1.2 * shade_depth);
-vertex_alt = max(vertex_alt,hazeLayerAltitude);
-
-if (vertex_alt > hazeLayerAltitude)
- {
- if (dist > 0.8 * avisibility)
- {
- vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
- yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
- }
- }
-else
- {
- vertex_alt = hazeLayerAltitude;
- yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
- }
-
-}
-else // the faster, full-day version without lightfields
-{
- //vertex_alt = max(gl_Vertex.z,100.0);
-
- earthShade = 1.0;
- mie_angle = 1.0;
-
- if (terminator > 3000000.0)
- {light_diffuse = vec4 (1.0, 1.0, 1.0, 0.0);
- light_ambient = vec4 (0.33, 0.4, 0.5, 0.0); }
- else
- {
-
- lightArg = (terminator/100000.0 - 10.0)/20.0;
- light_diffuse.b = 0.78 + lightArg * 0.21;
- light_diffuse.g = 0.907 + lightArg * 0.091;
- light_diffuse.r = 0.904 + lightArg * 0.092;
- light_diffuse.a = 1.0;
-
- light_ambient.r = 0.316 + lightArg * 0.016;
- light_ambient.g = light_ambient.r * 0.4/0.33;
- light_ambient.b = light_ambient.r * 0.5/0.33;
- light_ambient.a = 1.0;
- }
-
- light_diffuse = light_diffuse * scattering;
- yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);
-}
+ yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);
+ }
-// default lighting based on texture and material using the light we have just computed
+ // default lighting based on texture and material using the light we have just computed
light_diffuse_comp = light_diffuse;
//Testing phase code: ambient colours are not sent to fragement shader yet.
@@ -228,8 +274,10 @@ else // the faster, full-day version without lightfields
vec4 constant_term = gl_LightModel.ambient + light_ambient;
// Another hack for supporting two-sided lighting without using
// gl_FrontFacing in the fragment shader.
- gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0;
- gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0;
+ gl_FrontColor.rgb = constant_term.rgb;
+ gl_BackColor.rgb = constant_term.rgb;
+ gl_FrontColor.a = mie_angle;
+ gl_BackColor.a = mie_angle;
setupShadows(ecPosition);
}
diff --git a/Shaders/ws30-overlay-ALS.geom b/Shaders/ws30-overlay-ALS.geom
new file mode 100644
index 000000000..3393474af
--- /dev/null
+++ b/Shaders/ws30-overlay-ALS.geom
@@ -0,0 +1,75 @@
+// -*-C++-*-
+#version 120
+#extension GL_EXT_geometry_shader4 : enable
+
+// The following is copied from terrain-overlay.geom
+
+#define MAX_LAYERS 8
+#define MIN_LAYERS 2
+#define MAX_MINUS_MIN_LAYERS 6
+
+uniform float overlay_max_height;
+
+varying in vec3 v_normal[3];
+
+varying out vec2 g_rawpos;
+varying out float g_distance_to_eye;
+varying out vec3 g_normal;
+varying out float g_altitude;
+varying out float g_layer;
+
+uniform mat4 fg_LightMatrix_csm0;
+uniform mat4 fg_LightMatrix_csm1;
+uniform mat4 fg_LightMatrix_csm2;
+uniform mat4 fg_LightMatrix_csm3;
+varying out vec4 lightSpacePos[4];
+void setupShadows(vec4 eyeSpacePos)
+{
+ lightSpacePos[0] = fg_LightMatrix_csm0 * eyeSpacePos;
+ lightSpacePos[1] = fg_LightMatrix_csm1 * eyeSpacePos;
+ lightSpacePos[2] = fg_LightMatrix_csm2 * eyeSpacePos;
+ lightSpacePos[3] = fg_LightMatrix_csm3 * eyeSpacePos;
+}
+
+float min3(in float a, in float b, in float c)
+{
+ float m = a;
+ if (m > b) m = b;
+ if (m > c) m = c;
+ return m;
+}
+
+void main()
+{
+ float distances[3];
+ distances[0] = -(gl_ModelViewMatrix * gl_PositionIn[0]).z;
+ distances[1] = -(gl_ModelViewMatrix * gl_PositionIn[1]).z;
+ distances[2] = -(gl_ModelViewMatrix * gl_PositionIn[2]).z;
+ float minDistance = min3(distances[0], distances[1], distances[2]);
+ //float avgDistance = (distances[0]+distances[1]+distances[2])*0.33;
+
+ int numLayers = MIN_LAYERS + int((1.0 - smoothstep(250.0, 5000.0, minDistance)) * float(MAX_MINUS_MIN_LAYERS));
+
+ float deltaLayer = 1.0 / float(numLayers);
+ float currDeltaLayer = 1.5 * deltaLayer;// * 0.5;
+
+ for (int layer = 0; layer < numLayers; ++layer) {
+ for (int i = 0; i < 3; ++i) {
+ vec4 pos = gl_PositionIn[i] + vec4(v_normal[i] * currDeltaLayer * overlay_max_height, 0.0);
+ g_rawpos = gl_PositionIn[i].xy;
+ g_distance_to_eye = distances[i];
+ g_layer = currDeltaLayer;
+ g_normal = v_normal[i];
+ g_altitude = gl_PositionIn[i].z;
+
+ setupShadows(gl_ModelViewMatrix * pos);
+
+ gl_Position = gl_ModelViewProjectionMatrix * pos;
+ gl_TexCoord[0] = gl_TexCoordIn[i][0];
+ EmitVertex();
+ }
+ EndPrimitive();
+
+ currDeltaLayer += deltaLayer;
+ }
+}
diff --git a/Shaders/ws30-overlay-ALS.vert b/Shaders/ws30-overlay-ALS.vert
new file mode 100644
index 000000000..fa717a7f5
--- /dev/null
+++ b/Shaders/ws30-overlay-ALS.vert
@@ -0,0 +1,21 @@
+// -*-C++-*-
+#version 120
+
+//Copied from grass-ALS.vert
+
+// The UV scale controls the grass thickness. Lower numbers thicken the blades
+// while higher numbers make them thinner.
+#define UV_SCALE 10.0
+
+varying vec3 v_normal;
+
+void main()
+{
+
+ gl_Position = gl_Vertex;
+
+ // WS2: gl_TexCoord[0] = gl_MultiTexCoord0 * UV_SCALE;
+ gl_TexCoord[0] = gl_MultiTexCoord0 * UV_SCALE;
+
+ v_normal = gl_Normal;
+}
diff --git a/Shaders/ws30-q1.frag b/Shaders/ws30-q1.frag
index 987886d0e..550adb5de 100644
--- a/Shaders/ws30-q1.frag
+++ b/Shaders/ws30-q1.frag
@@ -58,7 +58,7 @@ void main()
} else {
// The Landclass for this particular fragment. This can be used to
// index into the atlas textures.
- int lc = int(texture2D(landclass, gl_TexCoord[0].st).r * 255.0 + 0.5);
+ int lc = int(texture2D(landclass, gl_TexCoord[0].st).g * 255.0 + 0.5);
uint tex1 = uint(fg_textureLookup1[lc].r * 255.0 + 0.5);
// Color Mode is always AMBIENT_AND_DIFFUSE, which means
diff --git a/Shaders/ws30-road-ALS-ultra.frag b/Shaders/ws30-road-ALS-ultra.frag
new file mode 100644
index 000000000..a6aa41224
--- /dev/null
+++ b/Shaders/ws30-road-ALS-ultra.frag
@@ -0,0 +1,735 @@
+// -*- mode: C; -*-
+// Licence: GPL v2
+// Authors: Frederic Bouvier and Gijs de Rooy
+// with major additions and revisions by
+// Emilian Huminiuc and Vivian Meazza 2011
+// ported to Atmospheric Light Scattering
+// by Thorsten Renk, 2013
+// changes for road and traffic rendering
+// by Thorsten Renk 2017 -2019
+#version 120
+
+varying vec3 VBinormal;
+varying vec3 VNormal;
+varying vec3 VTangent;
+varying vec3 rawpos;
+//varying vec3 reflVec;
+//varying vec3 vViewVec;
+varying vec3 vertVec;
+varying vec3 relPos;
+
+
+varying float alpha;
+
+uniform sampler2D BaseTex;
+//uniform sampler2D NormalTex;
+//uniform sampler2D ReflMapTex;
+uniform sampler2D CarTex;
+uniform sampler2D CarMetaTex;
+//uniform sampler2D ReflGradientsTex;
+//uniform samplerCube Environment;
+//uniform sampler2D GrainTex;
+
+//uniform int dirt_enabled;
+//uniform int dirt_multi;
+//uniform int nmap_dds;
+//uniform int nmap_enabled;
+//uniform int refl_enabled;
+//uniform int refl_type;
+//uniform int refl_map;
+//uniform int grain_texture_enabled;
+uniform int road_traffic_direction;
+//uniform int rain_enabled;
+uniform int road_traffic_enabled;
+uniform int cloud_shadow_flag;
+uniform int use_searchlight;
+uniform int use_landing_light;
+uniform int use_alt_landing_light;
+
+uniform float amb_correction;
+uniform float dirt_b_factor;
+uniform float dirt_g_factor;
+uniform float dirt_r_factor;
+//uniform float nmap_tile;
+//uniform float refl_correction;
+//uniform float refl_fresnel;
+//uniform float refl_fresnel_factor;
+//uniform float refl_noise;
+//uniform float refl_rainbow;
+//uniform float grain_magnification;
+//uniform float wetness;
+//uniform float rain_norm;
+uniform float road_traffic_density;
+uniform float streetlight_factor;
+uniform float road_traffic_variation;
+
+uniform float avisibility;
+uniform float cloud_self_shading;
+uniform float eye_alt;
+uniform float ground_scattering;
+uniform float hazeLayerAltitude;
+uniform float moonlight;
+uniform float overcast;
+uniform float scattering;
+uniform float terminator;
+uniform float terrain_alt;
+uniform float visibility;
+uniform float air_pollution;
+uniform float snowlevel;
+uniform float snow_thickness_factor;
+
+uniform float osg_SimulationTime;
+
+uniform float landing_light1_offset;
+uniform float landing_light2_offset;
+uniform float landing_light3_offset;
+
+uniform bool use_IR_vision;
+
+uniform mat4 fg_zUpTransform;
+uniform vec3 fg_modelOffset;
+
+// constants needed by the light and fog computations ###################################################
+
+const float EarthRadius = 5800000.0;
+const float terminator_width = 200000.0;
+
+
+//uniform vec3 dirt_r_color;
+//uniform vec3 dirt_g_color;
+//uniform vec3 dirt_b_color;
+
+uniform vec3 streetlight_color;
+
+float DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dot_density);
+float shadow_func (in float x, in float y, in float noise, in float dist);
+float fog_func (in float targ, in float altitude);
+float rayleigh_in_func(in float dist, in float air_pollution, in float avisibility, in float eye_alt, in float vertex_alt);
+float alt_factor(in float eye_alt, in float vertex_alt);
+float light_distance_fading(in float dist);
+float fog_backscatter(in float avisibility);
+float rand2D(in vec2 co);
+float Noise2D(in vec2 coord, in float wavelength);
+
+vec3 rayleigh_out_shift(in vec3 color, in float outscatter);
+vec3 get_hazeColor(in float lightArg);
+vec3 searchlight();
+vec3 landing_light(in float offset, in float offsetv);
+vec3 filter_combined (in vec3 color) ;
+vec3 addLights(in vec3 color1, in vec3 color2);
+
+float getShadowing();
+vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
+
+
+float light_func (in float x, in float a, in float b, in float c, in float d, in float e)
+ {
+ if (x > 30.0) {return e;}
+ if (x < -15.0) {return 0.0;}
+ return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
+ }
+
+
+void road_type_mapper (in vec2 coord, out float rtype_traffic_density, out float rtype_base_illumination, out float rtype_traffic_speed, out int rtype_dual_lane)
+ {
+ if (coord.s < 0.125) // railway
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0;
+ rtype_base_illumination = 0;
+ rtype_traffic_speed = 0.0;
+ }
+ else if (coord.s < 0.250) // residential
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0.3;
+ rtype_base_illumination = 0.65;
+ rtype_traffic_speed = 0.5;
+ }
+ else if (coord.s < 0.375) // single-lane major
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 1.0;
+ rtype_base_illumination = 0.65;
+ rtype_traffic_speed = 1.0;
+ }
+ else if (coord.s < 0.5)
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0.0;
+ rtype_base_illumination = 0.0;
+ rtype_traffic_speed = 0.0;
+ }
+ else if (coord.s < 0.625) // grass
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0.0;
+ rtype_base_illumination = 0.0;
+ rtype_traffic_speed = 0.0;
+ }
+ else if (coord.s < 0.750) // dual-lane highway
+ {
+ rtype_dual_lane = 1;
+ rtype_traffic_density = 1.0;
+ rtype_base_illumination = 0.0;
+ rtype_traffic_speed = 1.0;
+ }
+ else if (coord.s < 0.875) // dirt
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0.1;
+ rtype_base_illumination = 0.0;
+ rtype_traffic_speed = 0.3;
+ }
+ else // tramway
+ {
+ rtype_dual_lane = 0;
+ rtype_traffic_density = 0.0;
+ rtype_base_illumination = 0.0;
+ rtype_traffic_speed = 0.0;
+ }
+
+
+ }
+
+
+
+void main (void)
+ {
+ vec4 texel = texture2D(BaseTex, gl_TexCoord[0].st);
+ vec4 noisevec = vec4 (1.0, 1.0, 1.0, 1.0);
+
+ vec4 grainTexel;
+
+ vec3 mixedcolor;
+ vec3 N = vec3(0.0,0.0,1.0);
+
+ // noise
+
+ float noise_1m = Noise2D(rawpos.xy, 1.0);
+ float noise_5m = Noise2D(rawpos.xy, 5.0);
+
+ // road type characteristics
+
+ float rtype_traffic_density = 0.0;
+ float rtype_base_illumination = 0.0;
+ float rtype_traffic_speed = 0.0;
+ int rtype_dual_lane = 0;
+ road_type_mapper (gl_TexCoord[0].st, rtype_traffic_density, rtype_base_illumination, rtype_traffic_speed, rtype_dual_lane);
+
+ float pf = 0.0;
+ float pf1 = 0.0;
+ ///some generic light scattering parameters
+ vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
+ vec3 moonLightColor = vec3 (0.095, 0.095, 0.15) * moonlight;
+ float alt = eye_alt;
+ float effective_scattering = min(scattering, cloud_self_shading);
+
+
+ /// BEGIN geometry for light
+
+ vec3 up = (gl_ModelViewMatrix * vec4(0.0,0.0,1.0,0.0)).xyz;
+
+ vec3 nVertVec = normalize(vertVec);
+
+ float dist = length(relPos);
+ // angle of view vector with horizon
+ float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist;
+
+ float vertex_alt = (relPos.z + eye_alt);
+ float vertex_scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
+
+
+ vec3 lightHorizon = gl_LightSource[0].position.xyz - up * dot(up,gl_LightSource[0].position.xyz);
+ float yprime = -dot(vertVec, lightHorizon);
+ float yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt);
+ float lightArg = (terminator-yprime_alt)/100000.0;
+
+ float earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4;
+
+ float mie_angle = gl_Color.a;
+ float fog_vertex_alt = max(vertex_alt,hazeLayerAltitude);
+ float fog_yprime_alt = yprime_alt;
+ if (fog_vertex_alt > hazeLayerAltitude)
+ {
+ if (dist > 0.8 * avisibility)
+ {
+ fog_vertex_alt = mix(fog_vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
+ fog_yprime_alt = yprime -sqrt(2.0 * EarthRadius * fog_vertex_alt);
+ }
+ }
+ else
+ {
+ fog_vertex_alt = hazeLayerAltitude;
+ fog_yprime_alt = yprime -sqrt(2.0 * EarthRadius * fog_vertex_alt);
+ }
+
+ float fog_lightArg = (terminator-fog_yprime_alt)/100000.0;
+ float fog_earthShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, fog_yprime_alt) + 0.1;
+
+ /// END geometry for light
+
+
+ /// BEGIN light
+ vec4 light_diffuse;
+ vec4 light_ambient;
+ float intensity;
+
+ light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
+ light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
+ light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
+ light_diffuse.a = 1.0;
+ light_diffuse = light_diffuse * vertex_scattering;
+
+ light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
+ light_ambient.g = light_ambient.r * 0.4/0.33;
+ light_ambient.b = light_ambient.r * 0.5/0.33;
+ light_ambient.a = 1.0;
+
+ if (earthShade < 0.5)
+ {
+ intensity = length(light_ambient.rgb);
+ light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.1, 0.8,earthShade) ));
+ light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade));
+
+ intensity = length(light_diffuse.rgb);
+ light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.1, 0.7,earthShade) ));
+ }
+
+ vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+ vec3 ecViewDir = (gl_ModelViewMatrix * (ep - vec4(rawpos, 1.0))).xyz;
+ vec3 HV = normalize(normalize(gl_LightSource[0].position.xyz) + normalize(ecViewDir));
+
+ /// END light
+
+ /// BEGIN procedural textures - cars and snow
+
+ vec2 roadCoords = gl_TexCoord[0].st;
+ roadCoords.s *=8.0;
+ roadCoords.s = fract(roadCoords.s);
+
+
+
+ vec4 snow_texel = vec4 (0.95, 0.95, 0.95, 1.0);
+ float noise_term = 0.5 * (noise_5m - 0.5);
+ noise_term += 0.5 * (noise_1m - 0.5);
+ snow_texel.a = snow_texel.a * 0.2+0.8* smoothstep(0.2,0.8, 0.3 +noise_term + 0.5*snow_thickness_factor +0.0001*(relPos.z +eye_alt -snowlevel) );
+
+ float noise_2000m = 0.0;
+ float noise_10m = 0.0;
+
+ float snowLaneShape = smoothstep(0.20, 0.28, roadCoords.s) * (1.0-smoothstep(0.42, 0.5, roadCoords.s));
+ snowLaneShape += smoothstep(0.6, 0.68, roadCoords.s) * (1.0-smoothstep(0.82, 0.9, roadCoords.s));
+ snow_texel.a *= (1.0 - 0.3* snowLaneShape * rtype_traffic_density);
+
+ texel.rgb = mix(texel.rgb, snow_texel.rgb, snow_texel.a* smoothstep(snowlevel, snowlevel+200.0, 1.0 * (relPos.z + eye_alt)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0));
+
+ float cTag = 0.0;
+ float cPresent = 0.0;
+
+ float cSign = 1.0;
+ float total_traffic_density = 0.0;
+
+ vec4 carMetaTexel;
+
+ if (road_traffic_enabled == 1)
+ {
+ float cOffset = 0.0;
+ if (roadCoords.s > 0.5)
+ {
+ if (rtype_dual_lane == 0) {cSign = -1.0;}
+ else {cOffset = 5.0;}
+ }
+
+ if (rtype_dual_lane == 1) {cSign = -1.0;}
+
+ cSign *= road_traffic_direction;
+
+ total_traffic_density = road_traffic_density * rtype_traffic_density * road_traffic_variation;
+
+ float cCoord = roadCoords.t + cOffset;
+ cCoord += 0.3 * osg_SimulationTime * cSign * rtype_traffic_speed * (1.0 - (0.9 * smoothstep(1.0, 2.5, total_traffic_density)));
+ cCoord *= 5.0;
+
+ cTag = fract(cCoord);
+ float cDomain = cCoord - cTag;
+ float cRnd = rand2D(vec2 (cDomain, cSign));
+
+ cPresent = 0.0;
+ float cDisc = 0.2 * total_traffic_density;
+ if (cRnd > 1.0 - cDisc) {cPresent = 1.0;}
+
+ float cColorRnd = (cRnd - 1.0 + cDisc)/ max(cDisc, 0.05);
+ float cColorRnd2 = rand2D(vec2 (cDomain, 0.5));
+
+ float cColumn = (cColorRnd2 * 16.0) - fract(cColorRnd2 * 16.0);
+ float cRow = (rand2D(vec2 (cDomain, 1.5)) * 2.0);
+ cRow = cRow- fract(cRow);
+ //cRow = 0.0;
+
+
+ vec3 cColor = vec3 (0.8 * (1.0 - cColorRnd), 0.8 * 2.0 * (0.5 - abs(cColorRnd - 0.5)) , 0.8 * cColorRnd);
+ cColor *= cColorRnd2;
+
+ float cPos = cTag;
+ if (cSign > 0.0) {cPos = 1.0 - cPos;}
+ float cShape = smoothstep(0.0, 0.05, cPos) * (1.0-smoothstep(0.35, 0.4, cPos));
+
+ float ctPos;
+ if (roadCoords.s < 0.5)
+ {ctPos = clamp(5.0 * (roadCoords.s - 0.25), 0.0,1.0); }
+ else
+ {ctPos = clamp(5.0 * (roadCoords.s - 0.65), 0.0,1.0); }
+
+ float clPos = cPos;// + 0.45;
+
+ vec4 carTexel = texture2D(CarTex, vec2((ctPos + cColumn) / 16.0 , ((clPos + cRow) / 2.0) ));
+ carMetaTexel = texture2D(CarMetaTex, vec2((ctPos + cColumn) / 16.0 , ((clPos + cRow) / 2.0) ));
+
+
+ float laneShape = smoothstep(0.25, 0.28, roadCoords.s) * (1.0-smoothstep(0.42, 0.45, roadCoords.s));
+ laneShape += smoothstep(0.65, 0.68, roadCoords.s) * (1.0-smoothstep(0.82, 0.85, roadCoords.s));
+ cShape *= laneShape;
+
+ //texel.rgb = mix(texel.rgb, cColor, cPresent * cShape);
+ texel.rgb = mix(texel.rgb, carTexel.rgb, cPresent * carTexel.a * laneShape);
+ //texel.rgb = mix(texel.rgb, vec3 (1.0, 0.0, 0.0) * cColorRnd2, 0.3);
+ }
+
+
+
+ /// END procedural cars
+
+ //vec3 reflVecN;
+
+ //vec3 viewVec = normalize(vViewVec);
+ //float v = abs(dot(viewVec, normalize(VNormal)));// Map a rainbowish color
+
+ //float nDotVP = max(0.0, dot(N, normalize(gl_LightSource[0].position.xyz)));
+
+
+ float nDotVP = max(0.0, dot(N, normalize(gl_LightSource[0].position.xyz)));
+
+ //float nDotHV = max(0.0, dot(N, normalize(gl_LightSource[0].halfVector.xyz)));
+ float nDotHV = max(0.0, dot(N,HV));
+ //glare on the backside of tranparent objects
+ //if ((gl_FrontMaterial.diffuse.a < 1.0 || texel.a < 1.0)
+ // && dot(N, normalize(gl_LightSource[0].position.xyz)) < 0.0) {
+ // nDotVP = max(0.0, dot(-N, normalize(gl_LightSource[0].position.xyz)) * (1.0 -texel.a) );
+ // nDotHV = max(0.0, dot(-N, HV) * (1.0 -texel.a) );
+ // }
+
+ float nDotVP1 = 0.0;
+ float nDotHV1 = 0.0;
+
+
+ // try specular reflection of sky irradiance
+ nDotVP1 = max(0.0, dot(N, up));
+ nDotHV1 = max(0.0, dot(N, normalize(normalize(up) + normalize(-vertVec))));
+
+
+ if (nDotVP == 0.0)
+ {pf = 0.0;}
+ else
+ {pf = pow(nDotHV, gl_FrontMaterial.shininess);}
+
+ if (nDotVP1 == 0.0)
+ {pf1 = 0.0;}
+ else
+ {pf1 = pow(nDotHV1, 0.5*gl_FrontMaterial.shininess);}
+
+
+
+ if (cloud_shadow_flag == 1)
+ {
+ light_diffuse = light_diffuse * shadow_func(relPos.x, relPos.y, 1.0, dist);
+ }
+
+ vec3 secondary_light = vec3 (0.0,0.0,0.0);
+
+ if (use_searchlight == 1)
+ {
+ secondary_light += searchlight();
+ }
+ if (use_landing_light == 1)
+ {
+ secondary_light += landing_light(landing_light1_offset, landing_light3_offset);
+ }
+ if (use_alt_landing_light == 1)
+ {
+ secondary_light += landing_light(landing_light2_offset, landing_light3_offset);
+ }
+
+ float shadowmap = getShadowing();
+ vec4 Diffuse = light_diffuse * nDotVP * shadowmap;
+ Diffuse.rgb += secondary_light * light_distance_fading(dist);
+ if (use_IR_vision)
+ {
+ Diffuse.rgb = max(Diffuse.rgb, vec3 (0.5, 0.5, 0.5));
+ }
+ vec4 Specular = gl_FrontMaterial.specular * light_diffuse * pf + gl_FrontMaterial.specular * light_ambient * pf1 * shadowmap;
+ Specular+= gl_FrontMaterial.specular * pow(max(0.0,-dot(N,nVertVec)),gl_FrontMaterial.shininess) * vec4(secondary_light,1.0);
+
+
+ //vec4 color = gl_Color + Diffuse * gl_FrontMaterial.diffuse;
+ vec4 color = Diffuse;// * gl_FrontMaterial.diffuse;
+
+
+ color = clamp( color, 0.0, 1.0 );
+
+ // set ambient adjustment to remove bluiness with user input
+ float ambient_offset = clamp(amb_correction, -1.0, 1.0);
+ vec4 ambient = gl_LightModel.ambient + light_ambient;
+ vec4 ambient_Correction = vec4(ambient.rg, ambient.b * 0.6, 1.0)
+ * ambient_offset ;
+ ambient_Correction = clamp(ambient_Correction, -1.0, 1.0);
+
+ color += ambient;
+ color.a = texel.a * alpha;
+ vec4 fragColor = vec4(color.rgb * mixedcolor + ambient_Correction.rgb, color.a);
+
+ fragColor += Specular;
+
+ fragColor.rgb += getClusteredLightsContribution(vertVec, N, texel.rgb);
+
+ //////////////////////////////////////////////////////////////////////
+ // BEGIN procedural lightmap
+ //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+
+
+ vec3 pLMColor = streetlight_color;
+
+ float pLMIntensity = smoothstep(0.0, 0.4, roadCoords.s) * (1.0 - smoothstep(0.6, 1.0, roadCoords.s));
+ pLMIntensity = 0.25 * rtype_base_illumination * (1.0+ streetlight_factor) + 0.1 * max(0.0,sin(4.0 * roadCoords.t)) * streetlight_factor;
+ pLMIntensity = clamp(pLMIntensity, 0.0, 1.0);
+
+ if (gl_FrontMaterial.diffuse.r == 0.0) {pLMIntensity =0.0;}
+
+ pLMColor *= pLMIntensity;
+
+ if (road_traffic_enabled == 1)
+ {
+
+ float viewAngleFactor = smoothstep(-0.05, 0.0, cSign * dot(normalize(VBinormal), nVertVec));
+
+ vec3 pCLColor = vec3 (0.95, 1.0, 1.0);
+ vec3 pTLColor = vec3 (0.95, 0.0, 0.0);
+
+
+ // mean illumination by car headlights
+ pLMColor = pLMColor + 0.2 * min(1.0,total_traffic_density) * pCLColor;
+
+ //float pCLIntensity = smoothstep(0.4, 0.6, cTag) * (1.0-smoothstep(0.6, 0.8, cTag));
+ //float laneFact = smoothstep(0.25, 0.3, roadCoords.s) * (1.0-smoothstep(0.3, 0.35, roadCoords.s));
+ //laneFact += smoothstep(0.35, 0.4, roadCoords.s) * (1.0-smoothstep(0.4, 0.45, roadCoords.s));
+ //laneFact += smoothstep(0.65, 0.7, roadCoords.s) * (1.0-smoothstep(0.7, 0.75, roadCoords.s));
+ //laneFact += smoothstep(0.75, 0.8, roadCoords.s) * (1.0-smoothstep(0.8, 0.85, roadCoords.s));
+ //pCLIntensity = pCLIntensity * laneFact * cPresent;
+
+
+ float pCLIntensity, pTLIntensity;
+ if (cSign == -1.0)
+ {
+ pCLIntensity = carMetaTexel.r * cPresent * smoothstep(0.45, 0.55, cTag) * viewAngleFactor ;
+ pCLIntensity += 0.85 * carMetaTexel.b * cPresent * smoothstep(0.45, 0.55, cTag);
+ pTLIntensity = carMetaTexel.r * cPresent * (1.0 - smoothstep(0.45, 0.55, cTag)) * (1.0 - viewAngleFactor);
+ pTLIntensity += 0.85 * carMetaTexel.b * cPresent * (1.0 - smoothstep(0.45, 0.55, cTag));
+
+ }
+ else
+ {
+ pCLIntensity = carMetaTexel.r * cPresent * (1.0 - smoothstep(0.45, 0.55, cTag)) *viewAngleFactor ;
+ pCLIntensity += 0.85 * carMetaTexel.b * cPresent * (1.0 - smoothstep(0.45, 0.55, cTag));
+ pTLIntensity = carMetaTexel.r * cPresent * smoothstep(0.45, 0.55, cTag) * (1.0 - viewAngleFactor);
+ pTLIntensity += 0.85 * carMetaTexel.b * cPresent * smoothstep(0.45, 0.55, cTag);
+ }
+
+ //pCLColor *= pCLIntensity;
+
+
+
+ //if (cSign == 1.0)
+ // {
+ // pTLIntensity = smoothstep(0.9, 0.94, cTag) * (1.0-smoothstep(0.96, 1.0, cTag));
+ // }
+ //else
+ // {
+ // pTLIntensity = smoothstep(0.0, 0.04, cTag) * (1.0-smoothstep(0.06, 0.1, cTag));
+ // }
+
+
+
+ //pTLIntensity = pTLIntensity * laneFact * cPresent * (1.0 - viewAngleFactor);
+
+
+ pCLColor = pCLColor * pCLIntensity + pTLColor * pTLIntensity;
+
+
+ pLMColor = clamp(pLMColor, 0.0, 1.0);
+
+ pLMColor = max(pLMColor,pCLColor);
+ }
+
+ //fragColor.rgb = max(fragColor.rgb, pLMColor * gl_FrontMaterial.diffuse.rgb * smoothstep(0.0, 1.0, mixedcolor*.5 + pLMColor*.5));
+
+ fragColor.rgb = max(fragColor.rgb, pLMColor * smoothstep(0.0, 1.0, mixedcolor*.5 + pLMColor*.5));
+
+
+
+ //////////////////////////////////////////////////////////////////////
+ // END procedural lightmap
+ //////////////////////////////////////////////////////////////////////
+
+
+ /// BEGIN fog amount
+
+ float transmission;
+ float vAltitude;
+ float delta_zv;
+ float H;
+ float distance_in_layer;
+ float transmission_arg;
+ float eqColorFactor;
+
+ float delta_z = hazeLayerAltitude - eye_alt;
+ float mvisibility = min(visibility, avisibility);
+
+ if (dist > 0.04 * mvisibility)
+ {
+ if (delta_z > 0.0) // we're inside the layer
+ {
+ if (ct < 0.0) // we look down
+ {
+ distance_in_layer = dist;
+ vAltitude = min(distance_in_layer,mvisibility) * ct;
+ delta_zv = delta_z - vAltitude;
+ }
+ else // we may look through upper layer edge
+ {
+ H = dist * ct;
+ if (H > delta_z) {distance_in_layer = dist/H * delta_z;}
+ else {distance_in_layer = dist;}
+ vAltitude = min(distance_in_layer,visibility) * ct;
+ delta_zv = delta_z - vAltitude;
+ }
+ }
+ else // we see the layer from above, delta_z < 0.0
+ {
+ H = dist * -ct;
+ if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading
+ {
+ distance_in_layer = 0.0;
+ delta_zv = 0.0;
+ }
+ else
+ {
+ vAltitude = H + delta_z;
+ distance_in_layer = vAltitude/H * dist;
+ vAltitude = min(distance_in_layer,visibility) * (-ct);
+ delta_zv = vAltitude;
+ }
+ }
+
+ transmission_arg = (dist-distance_in_layer)/avisibility;
+
+
+ if (visibility < avisibility)
+ {
+ transmission_arg = transmission_arg + (distance_in_layer/visibility);
+ eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 -effective_scattering);
+ }
+ else
+ {
+ transmission_arg = transmission_arg + (distance_in_layer/avisibility);
+ eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -effective_scattering);
+ }
+ transmission = fog_func(transmission_arg, alt);
+ if (eqColorFactor < 0.2) eqColorFactor = 0.2;
+ }
+ else
+ {
+ eqColorFactor = 1.0;
+ transmission = 1.0;
+ }
+
+ /// END fog amount
+
+ /// BEGIN fog color
+
+ vec3 hazeColor = get_hazeColor(fog_lightArg);
+
+ float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0);
+ float lightIntensity = length(hazeColor * effective_scattering) * rShade;
+
+ if (transmission< 1.0)
+ {
+
+
+
+ if (fog_lightArg < 10.0)
+ {
+ intensity = length(hazeColor);
+ float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt));
+ hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) );
+ }
+
+ intensity = length(hazeColor);
+ hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt)));
+
+ hazeColor.r = hazeColor.r * 0.83;
+ hazeColor.g = hazeColor.g * 0.9;
+
+ float fade_out = max(0.65 - 0.3 *overcast, 0.45);
+ intensity = length(hazeColor);
+ hazeColor = intensity * normalize(mix(hazeColor, 1.5* shadedFogColor, 1.0 -smoothstep(0.25, fade_out,fog_earthShade) ));
+ hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothstep(0.5,0.9,eqColorFactor))));
+
+ float shadow = mix( min(1.0 + dot(VNormal,gl_LightSource[0].position.xyz),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission));
+ hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator));
+ }
+ else
+ {
+ hazeColor = vec3 (1.0, 1.0, 1.0);
+ }
+
+
+
+
+ /// END fog color
+ fragColor = clamp(fragColor, 0.0, 1.0);
+ hazeColor = clamp(hazeColor, 0.0, 1.0);
+
+ ///BEGIN Rayleigh fog ///
+
+ // Rayleigh color shift due to out-scattering
+ float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z);
+ float outscatter = 1.0-exp(-dist/rayleigh_length);
+ fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter);
+
+ vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity;
+ float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z);
+ fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength);
+
+ /// END Rayleigh fog
+
+ // don't let the light fade out too rapidly
+ lightArg = (terminator + 200000.0)/100000.0;
+ float minLightIntensity = min(0.2,0.16 * lightArg + 0.5);
+ vec3 minLight = minLightIntensity * vec3 (0.2, 0.3, 0.4);
+ hazeColor *= eqColorFactor * fog_earthShade;
+ hazeColor.rgb = max(hazeColor.rgb, minLight.rgb);
+
+
+ fragColor.rgb = mix(hazeColor +secondary_light * fog_backscatter(mvisibility), fragColor.rgb,transmission);
+
+ fragColor.rgb = filter_combined(fragColor.rgb);
+
+ gl_FragColor = fragColor;
+
+ }
diff --git a/Shaders/ws30-water.frag b/Shaders/ws30-water.frag
new file mode 100644
index 000000000..38d353634
--- /dev/null
+++ b/Shaders/ws30-water.frag
@@ -0,0 +1,360 @@
+// SPDX-FileCopyrightText: (C) 2022 Stuart Buchanan stuart13@gmail.com
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+// Helper functions for WS30 water implementation, heavily based on the
+// water-ALS-base.frag and waterr_ALS-high.frag
+
+#version 130
+#extension GL_EXT_texture_array : enable
+
+// Hardcoded indexes into the texture atlas
+const int ATLAS_INDEX_WATER = 0;
+const int ATLAS_INDEX_WATER_REFLECTION = 1;
+const int ATLAS_INDEX_WAVES_VERT10_NM = 2;
+const int ATLAS_INDEX_WATER_SINE_NMAP = 3;
+const int ATLAS_INDEX_WATER_REFLECTION_GREY = 4;
+const int ATLAS_INDEX_SEA_FOAM = 5;
+const int ATLAS_INDEX_PERLIN_NOISE_NM = 6;
+const int ATLAS_INDEX_OCEAN_DEPTH = 7;
+const int ATLAS_INDEX_GLOBAL_COLORS = 8;
+const int ATLAS_INDEX_PACKICE_OVERLAY = 9;
+
+// WS30 uniforms
+uniform sampler2DArray textureArray;
+uniform float ground_scattering;
+uniform float overcast;
+uniform float fg_tileWidth;
+uniform float fg_tileHeight;
+
+// Water.eff uniforms
+uniform float sea_r;
+uniform float sea_g;
+uniform float sea_b;
+uniform float osg_SimulationTime;
+uniform float WindN;
+uniform float WindE;
+uniform float WaveFreq;
+uniform float WaveAmp;
+uniform float WaveSharp;
+uniform float WaveAngle;
+uniform float WaveFactor;
+uniform float WaveDAngle;
+uniform float saturation;
+
+// WS30 varying
+varying vec3 relPos;
+
+// Water.eff varying
+varying float earthShade;
+varying vec3 lightdir;
+varying vec4 waterTex1;
+varying vec4 waterTex2;
+varying vec4 waterTex4;
+varying vec3 specular_light;
+
+/////// functions /////////
+
+float getShadowing();
+vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
+
+void rotationmatrix(in float angle, out mat4 rotmat)
+{
+ rotmat = mat4( cos( angle ), -sin( angle ), 0.0, 0.0,
+ sin( angle ), cos( angle ), 0.0, 0.0,
+ 0.0 , 0.0 , 1.0, 0.0,
+ 0.0 , 0.0 , 0.0, 1.0 );
+}
+
+// wave functions ///////////////////////
+struct Wave {
+ float freq; // 2*PI / wavelength
+ float amp; // amplitude
+ float phase; // speed * 2*PI / wavelength
+ vec2 dir;
+};
+
+Wave wave0 = Wave(1.0, 1.0, 0.5, vec2(0.97, 0.25));
+Wave wave1 = Wave(2.0, 0.5, 1.3, vec2(0.97, -0.25));
+Wave wave2 = Wave(1.0, 1.0, 0.6, vec2(0.95, -0.3));
+Wave wave3 = Wave(2.0, 0.5, 1.4, vec2(0.99, 0.1));
+
+float evaluateWave(in Wave w, in vec2 pos, in float t) {
+ return w.amp * sin( dot(w.dir, pos) * w.freq + t * w.phase);
+}
+
+// derivative of wave function
+float evaluateWaveDeriv(in Wave w, in vec2 pos, in float t) {
+ return w.freq * w.amp * cos( dot(w.dir, pos)*w.freq + t*w.phase);
+}
+
+// sharp wave functions
+float evaluateWaveSharp(in Wave w, in vec2 pos, in float t, in float k) {
+ return w.amp * pow(sin( dot(w.dir, pos)*w.freq + t*w.phase)* 0.5 + 0.5 , k);
+}
+
+float evaluateWaveDerivSharp(in Wave w, in vec2 pos, in float t, in float k) {
+ return k*w.freq*w.amp * pow(sin( dot(w.dir, pos)*w.freq + t*w.phase)* 0.5 + 0.5 , k - 1) * cos( dot(w.dir, pos)*w.freq + t*w.phase);
+}
+
+void sumWaves(in float angle, in float dangle, in float windScale, in float factor, out float ddx, float ddy) {
+ mat4 RotationMatrix;
+ float deriv;
+ vec4 P = waterTex1 * 1024;
+
+ rotationmatrix(radians(angle + dangle * windScale + 0.6 * sin(P.x * factor)), RotationMatrix);
+ P *= RotationMatrix;
+
+ P.y += evaluateWave(wave0, P.xz, osg_SimulationTime);
+ deriv = evaluateWaveDeriv(wave0, P.xz, osg_SimulationTime );
+ ddx = deriv * wave0.dir.x;
+ ddy = deriv * wave0.dir.y;
+
+ //P.y += evaluateWave(wave1, P.xz, osg_SimulationTime);
+ //deriv = evaluateWaveDeriv(wave1, P.xz, osg_SimulationTime);
+ //ddx += deriv * wave1.dir.x;
+ //ddy += deriv * wave1.dir.y;
+
+ P.y += evaluateWaveSharp(wave2, P.xz, osg_SimulationTime, WaveSharp);
+ deriv = evaluateWaveDerivSharp(wave2, P.xz, osg_SimulationTime, WaveSharp);
+ ddx += deriv * wave2.dir.x;
+ ddy += deriv * wave2.dir.y;
+
+ //P.y += evaluateWaveSharp(wave3, P.xz, osg_SimulationTime, WaveSharp);
+ //deriv = evaluateWaveDerivSharp(wave3, P.xz, osg_SimulationTime, WaveSharp);
+ //ddx += deriv * wave3.dir.x;
+ //ddy += deriv * wave3.dir.y;
+}
+
+vec4 generateWaterTexel()
+{
+ vec4 texel;
+ float dist = length(relPos);
+ float tileScale = 1 / (fg_tileHeight + fg_tileWidth) / 2.0;
+
+ vec4 sca = vec4(0.005, 0.005, 0.005, 0.005) * tileScale;
+ vec4 sca2 = vec4(0.02, 0.02, 0.02, 0.02) * tileScale;
+ vec4 tscale = vec4(0.25, 0.25, 0.25, 0.25) / 10000.0 * tileScale;
+
+ mat4 RotationMatrix;
+
+ // compute direction to viewer
+ vec3 E = normalize(-relPos);
+
+ // compute direction to light source
+ vec3 L = normalize(lightdir);
+
+ // half vector
+ vec3 Hv = normalize(L + E);
+
+ vec3 Normal = vec3 (0.0, 0.0, 1.0);
+
+ const float water_shininess = 240.0;
+
+ float windEffect = sqrt( WindE*WindE + WindN*WindN ) * 0.6; //wind speed in kt
+ float windScale = 15.0/(3.0 + windEffect); //wave scale
+ float windEffect_low = 0.3 + 0.7 * smoothstep(0.0, 5.0, windEffect); //low windspeed wave filter
+ float waveRoughness = 0.01 + smoothstep(0.0, 40.0, windEffect); //wave roughness filter
+
+ float mixFactor = 0.2 + 0.02 * smoothstep(0.0, 50.0, windEffect);
+ mixFactor = clamp(mixFactor, 0.3, 0.8);
+
+ // there's no need to do wave patterns or foam for pixels which are so far away that we can't actually see them
+ // we only need detail in the near zone or where the sun reflection is
+
+ int detail_flag;
+ if ((dist > 15000.0) && (dot(normalize(vec3 (lightdir.x, lightdir.y, 0.0) ), normalize(relPos)) < 0.7 )) {detail_flag = 0;}
+ else {detail_flag = 1;}
+
+ // sine waves
+ float ddx, ddx1, ddx2, ddx3, ddy, ddy1, ddy2, ddy3;
+ float angle;
+
+ ddx = 0.0, ddy = 0.0;
+ ddx1 = 0.0, ddy1 = 0.0;
+ ddx2 = 0.0, ddy2 = 0.0;
+ ddx3 = 0.0, ddy3 = 0.0;
+
+ if (detail_flag == 1)
+ {
+ angle = 0.0;
+
+ wave0.freq = WaveFreq ;
+ wave0.amp = WaveAmp;
+ wave0.dir = vec2 (0.0, 1.0); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle -= 45;
+ wave1.freq = WaveFreq * 2.0 ;
+ wave1.amp = WaveAmp * 1.25;
+ wave1.dir = vec2(0.70710, -0.7071); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle += 30;
+ wave2.freq = WaveFreq * 3.5;
+ wave2.amp = WaveAmp * 0.75;
+ wave2.dir = vec2(0.96592, -0.2588);// vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle -= 50;
+ wave3.freq = WaveFreq * 3.0 ;
+ wave3.amp = WaveAmp * 0.75;
+ wave3.dir = vec2(0.42261, -0.9063); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+ // sum waves
+ sumWaves(WaveAngle, -1.5, windScale, WaveFactor, ddx, ddy);
+ sumWaves(WaveAngle, 1.5, windScale, WaveFactor, ddx1, ddy1);
+
+ //reset the waves
+ angle = 0.0;
+ float waveamp = WaveAmp * 0.75;
+
+ wave0.freq = WaveFreq ;
+ wave0.amp = waveamp;
+ wave0.dir = vec2 (0.0, 1.0); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle -= 20;
+ wave1.freq = WaveFreq * 2.0 ;
+ wave1.amp = waveamp * 1.25;
+ wave1.dir = vec2(0.93969, -0.34202);// vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle += 35;
+ wave2.freq = WaveFreq * 3.5;
+ wave2.amp = waveamp * 0.75;
+ wave2.dir = vec2(0.965925, 0.25881); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+ angle -= 45;
+ wave3.freq = WaveFreq * 3.0 ;
+ wave3.amp = waveamp * 0.75;
+ wave3.dir = vec2(0.866025, -0.5); //vec2(cos(radians(angle)), sin(radians(angle)));
+
+
+ //sumWaves(WaveAngle + WaveDAngle, -1.5, windScale, WaveFactor, ddx2, ddy2);
+ //sumWaves(WaveAngle + WaveDAngle, 1.5, windScale, WaveFactor, ddx3, ddy3);
+
+ }
+ // end sine stuff
+
+ //cover = 5.0 * smoothstep(0.6, 1.0, scattering);
+ //cover = 5.0 * ground_scattering;
+
+ vec4 viewt = normalize(waterTex4);
+ vec2 st = vec2(waterTex2 * tscale * windScale);
+ vec4 disdis = texture(textureArray, vec3(st, ATLAS_INDEX_WATER_SINE_NMAP)) * 2.0 - 1.0;
+
+ vec4 vNorm;
+
+ //normalmaps
+ st = vec2(waterTex1 + disdis * sca2) * windScale;
+ vec4 nmap = texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM)) * 2.0 - 1.0;
+ vec4 nmap1 = texture(textureArray, vec3(st, ATLAS_INDEX_PERLIN_NOISE_NM)) * 2.0 - 1.0;
+
+ rotationmatrix(radians(3.0 * sin(osg_SimulationTime * 0.0075)), RotationMatrix);
+ st = vec2(waterTex2 * RotationMatrix * tscale) * windScale;
+ nmap += texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM)) * 2.0 - 1.0;
+
+ nmap *= windEffect_low;
+ nmap1 *= windEffect_low;
+
+ // mix water and noise, modulated by factor
+ vNorm = normalize(mix(nmap, nmap1, mixFactor) * waveRoughness);
+ vNorm.r += ddx + ddx1 + ddx2 + ddx3;
+
+ //if (normalmap_dds > 0) {vNorm = -vNorm;} //dds fix
+
+ //load reflection
+ vec4 refl ;
+ refl.r = sea_r;
+ refl.g = sea_g;
+ refl.b = sea_b;
+ refl.a = 1.0;
+
+ float intensity;
+ // de-saturate for reduced light
+ refl.rgb = mix(refl.rgb, vec3 (0.248, 0.248, 0.248), 1.0 - smoothstep(0.1, 0.8, ground_scattering));
+
+ // de-saturate light for overcast haze
+ intensity = length(refl.rgb);
+ refl.rgb = mix(refl.rgb, intensity * vec3 (1.0, 1.0, 1.0), 0.5 * smoothstep(0.1, 0.9, overcast));
+
+ vec3 N;
+ st = vec2(waterTex1 + disdis * sca2) * windScale;
+ vec3 N0 = vec3(texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM))) * 2.0 - 1.0;
+ st = vec2(waterTex1 + disdis * sca) * windScale;
+ vec3 N1 = vec3(texture(textureArray, vec3(st, ATLAS_INDEX_PERLIN_NOISE_NM))) * 2.0 - 1.0;
+
+ st = vec2(waterTex1 * tscale) * windScale;
+ N0 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM))) * 2.0 - 1.0;
+ N1 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_PERLIN_NOISE_NM))) * 2.0 - 1.0;
+
+ rotationmatrix(radians(2.0 * sin(osg_SimulationTime * 0.005)), RotationMatrix);
+ st = vec2(waterTex2 * RotationMatrix * (tscale + sca2)) * windScale;
+ N0 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM))) * 2.0 - 1.0;
+ N1 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_PERLIN_NOISE_NM))) * 2.0 - 1.0;
+
+ rotationmatrix(radians(-4.0 * sin(osg_SimulationTime * 0.003)), RotationMatrix);
+ st = vec2(waterTex1 * RotationMatrix + disdis * sca2) * windScale;
+ N0 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_WAVES_VERT10_NM))) * 2.0 - 1.0;
+ st = vec2(waterTex1 * RotationMatrix + disdis * sca) * windScale;
+ N1 += vec3(texture(textureArray, vec3(st, ATLAS_INDEX_PERLIN_NOISE_NM))) * 2.0 - 1.0;
+
+ N0 *= windEffect_low;
+ N1 *= windEffect_low;
+
+ N0.r += (ddx + ddx1 + ddx2 + ddx3);
+ N0.g += (ddy + ddy1 + ddy2 + ddy3);
+
+ N = normalize(mix(Normal + N0, Normal + N1, mixFactor) * waveRoughness);
+
+ vec3 specular_color = vec3(specular_light * earthShade) * pow(max(0.0, dot(N, Hv)), water_shininess) * 6.0;
+
+ // secondary reflection of sky irradiance
+ vec3 ER = E - 2.0 * N * dot(E,N);
+ float ctrefl = dot(vec3(0.0,0.0,1.0), -normalize(ER));
+ //float fresnel = -0.5 + 8.0 * (1.0-smoothstep(0.0,0.4, dot(E,N)));
+ float fresnel = 8.0 * (1.0-smoothstep(0.0,0.4, dot(E,N)));
+ //specular_color += (ctrefl*ctrefl) * fresnel* specular_light.rgb;
+
+ specular_color += ((0.15*(1.0-ctrefl* ctrefl) * fresnel) - 0.3) * specular_light.rgb * earthShade;
+ vec4 specular = vec4(specular_color, 0.5);
+
+ specular = specular * saturation * 0.3 * earthShade ;
+
+ //calculate fresnel
+ vec4 invfres = vec4( dot(vNorm, viewt) );
+ vec4 fres = vec4(1.0) + invfres;
+ refl *= fres;
+
+ vec4 ambient_light;
+ //intensity = length(specular_light.rgb);
+ ambient_light.rgb = max(specular_light.rgb * earthShade, vec3(0.05, 0.05, 0.05));
+ //ambient_light.rgb = max(intensity * normalize(vec3 (0.33, 0.4, 0.5)), vec3 (0.1,0.1,0.1));
+ ambient_light.a = 1.0;
+
+ // compute object shadow effect
+
+ float shadowValue = getShadowing();
+ specular = specular * shadowValue;
+ refl = refl * (0.7 + 0.3 *shadowValue);
+
+
+ texel = refl + specular * smoothstep(0.3, 0.6, ground_scattering);
+
+ // For the clustered lighting function we use the simple up direction (Normal) to get an
+ // approximate lighting contribution, as the procedural normal map is done afterwards.
+ //texel += vec4(getClusteredLightsContribution(ecPosition.xyz, Normal, vec3(1.0)), 0.0) * light_distance_fading(dist) * 2.0 * pow(max(0.0,dot(E,N)), water_shininess);
+
+ if (dist < 10000.0)
+ {
+ float foamSlope = 0.10 + 0.1 * windScale;
+ float waveSlope = N.g;
+
+ if ((windEffect >= 8.0) && (waveSlope >= foamSlope)) {
+ //add foam
+ st = vec2(waterTex2 * tscale) * 25.0;
+ vec4 foam_texel = texture(textureArray, vec3(st, ATLAS_INDEX_SEA_FOAM) );
+
+ texel = mix(texel, max(texel, texel + foam_texel), smoothstep(0.01, 0.50, N.g));
+ }
+ }
+
+ texel *= ambient_light;
+
+ return texel;
+}
diff --git a/Shaders/ws30.frag b/Shaders/ws30.frag
index 006b94383..782ed36bf 100644
--- a/Shaders/ws30.frag
+++ b/Shaders/ws30.frag
@@ -57,7 +57,7 @@ void main()
} else {
// The Landclass for this particular fragment. This can be used to
// index into the atlas textures.
- int lc = int(texture2D(landclass, gl_TexCoord[0].st).r * 255.0 + 0.5);
+ int lc = int(texture2D(landclass, gl_TexCoord[0].st).g * 255.0 + 0.5);
// Color Mode is always AMBIENT_AND_DIFFUSE, which means
// using a base colour of white for ambient/diffuse,
diff --git a/Textures/Sky/allsky_brightness_magten.png b/Textures/Sky/allsky_brightness_magten.png
new file mode 100644
index 000000000..27588327a
Binary files /dev/null and b/Textures/Sky/allsky_brightness_magten.png differ
diff --git a/Textures/Terrain/frozen_lake.png b/Textures/Terrain/frozen_lake.png
new file mode 100644
index 000000000..76a434c08
Binary files /dev/null and b/Textures/Terrain/frozen_lake.png differ
diff --git a/Textures/Water/sea_foam-ws30.png b/Textures/Water/sea_foam-ws30.png
new file mode 100644
index 000000000..d73399204
Binary files /dev/null and b/Textures/Water/sea_foam-ws30.png differ
diff --git a/Textures/Water/water-reflection-grey-ws30.png b/Textures/Water/water-reflection-grey-ws30.png
new file mode 100644
index 000000000..8d6862680
Binary files /dev/null and b/Textures/Water/water-reflection-grey-ws30.png differ
diff --git a/Textures/Water/water-reflection-ws30.png b/Textures/Water/water-reflection-ws30.png
new file mode 100644
index 000000000..e35250073
Binary files /dev/null and b/Textures/Water/water-reflection-ws30.png differ
diff --git a/Textures/Water/water_sine_nmap-ws30.png b/Textures/Water/water_sine_nmap-ws30.png
new file mode 100644
index 000000000..0abbb4023
Binary files /dev/null and b/Textures/Water/water_sine_nmap-ws30.png differ
diff --git a/Textures/Water/waves-ver10-nm-ws30.png b/Textures/Water/waves-ver10-nm-ws30.png
new file mode 100644
index 000000000..0d524ff36
Binary files /dev/null and b/Textures/Water/waves-ver10-nm-ws30.png differ
diff --git a/Translations/ca/FlightGear-Qt.xlf b/Translations/ca/FlightGear-Qt.xlf
index 7280aa21f..9f53008c9 100644
--- a/Translations/ca/FlightGear-Qt.xlf
+++ b/Translations/ca/FlightGear-Qt.xlf
@@ -97,181 +97,94 @@