From 41d844342850f031e16417af93d95f45ac5fcc39 Mon Sep 17 00:00:00 2001 From: Alexis Bory Date: Sun, 10 Oct 2010 00:14:08 +0200 Subject: [PATCH 01/40] - local --- joysticks.xml | 1 + preferences.xml | 25 ++++++++++--------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/joysticks.xml b/joysticks.xml index 0062f800e..3f800d4d3 100644 --- a/joysticks.xml +++ b/joysticks.xml @@ -20,4 +20,5 @@ --> + diff --git a/preferences.xml b/preferences.xml index 1a06bef7e..5a01e6347 100644 --- a/preferences.xml +++ b/preferences.xml @@ -54,7 +54,7 @@ Started September 2000 by David Megginson, david@megginson.com true summer - + AutomaticSelection false 5 8 @@ -282,21 +282,14 @@ Started September 2000 by David Megginson, david@megginson.com Aircraft/Generic/generic-systems.xml - generic autopilot Aircraft/Generic/generic-autopilot.xml + - autopilot helpers Aircraft/Generic/generic-autopilot-helper.xml - - Environment Interpolation Rule - Environment/interpolator.xml - - - Environment METAR Interpolation Rule - Environment/metarinterpolator.xml - Aircraft/Generic/generic-instrumentation.xml @@ -593,16 +586,16 @@ Started September 2000 by David Megginson, david@megginson.com - true + false - true + false 1 - true + false true false @@ -612,11 +605,13 @@ Started September 2000 by David Megginson, david@megginson.com true - nimitz_demo + + + From 80eb4f44caf843503bf8f7f5488005af18da1c80 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sun, 10 Oct 2010 14:05:42 +0200 Subject: [PATCH 02/40] Fixed "Position aircraft in air" in dialog. Setting a parking position (e.g. by default via command-line) caused "Position aircraft in air" to not work as expected. The "parkpos" property must be reset, otherwise heading/glidepath/azimuth do not have any effect when repositioning. --- gui/dialogs/location-in-air.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/dialogs/location-in-air.xml b/gui/dialogs/location-in-air.xml index 63e104414..ce16f3fae 100644 --- a/gui/dialogs/location-in-air.xml +++ b/gui/dialogs/location-in-air.xml @@ -260,6 +260,8 @@ nasal - - + + 75 + 25 + -180 + 180 + /ai/models/wingman/controls/break-deg-rel + + dialog-apply + + + nasal + + + left - + - + @@ -156,15 +156,8 @@ - - - - - - - hbox @@ -182,6 +175,26 @@ + + hbox + + + left + + + + + + + true From 37e42d60b042ecbf693a333982dbbb2e97279cea Mon Sep 17 00:00:00 2001 From: Vivian Meazza Date: Tue, 12 Oct 2010 23:17:35 +0100 Subject: [PATCH 12/40] Add model cockpit view dialog. Signed-off-by: Vivian Meazza --- gui/dialogs/model-cockpit-view.xml | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 gui/dialogs/model-cockpit-view.xml diff --git a/gui/dialogs/model-cockpit-view.xml b/gui/dialogs/model-cockpit-view.xml new file mode 100644 index 000000000..be118d10b --- /dev/null +++ b/gui/dialogs/model-cockpit-view.xml @@ -0,0 +1,90 @@ + + + + model-cockpit-view + 5 + 3 + hbox + 0 + + + false + 0 + 0 + 0 + 0 + + + + + + + + 6 + + + + 0 + 1 + /sim/current-view/model-cockpit-view + + 1 + 1 + 1 + 1 + + + HELVETICA_14 + + + + + From 755a6a4d1abd48f80ac03bf0d12c1ec68f74cd7c Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Wed, 13 Oct 2010 08:14:20 +0200 Subject: [PATCH 13/40] Remove reference to inexistant texture --- Effects/water.eff | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/Effects/water.eff b/Effects/water.eff index 248950cb6..94a6cff6c 100644 --- a/Effects/water.eff +++ b/Effects/water.eff @@ -10,13 +10,6 @@ repeat normalized - - Textures/Water/water-refraction.png - linear-mipmap-linear - repeat - repeat - normalized - Textures/Water/water-normalmap.png linear-mipmap-linear @@ -84,16 +77,6 @@ texture[0]/internal-format - - 1 - texture[1]/image - texture[1]/filter - texture[1]/wrap-s - texture[1]/wrap-t - - texture[1]/internal-format - - 2 texture[2]/image @@ -124,11 +107,6 @@ 0 - water_refraction - sampler-2d - 1 - - water_normalmap sampler-2d 2 From e7e8ac84f257b6e728e259d88453ab4f6001abd8 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Wed, 13 Oct 2010 20:46:31 +0200 Subject: [PATCH 14/40] don't use printlog before nasal-dir-initialized Thanks, Anders. --- Nasal/contrail.nas | 2 +- Nasal/seaport.nas | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Nasal/contrail.nas b/Nasal/contrail.nas index 3ae2fcb41..c9e93572c 100644 --- a/Nasal/contrail.nas +++ b/Nasal/contrail.nas @@ -26,8 +26,8 @@ updateContrail = func{ ### Contrail -printlog ("debug", "init contrail"); _setlistener("/sim/signals/nasal-dir-initialized", func { + printlog ("debug", "init contrail"); props.globals.initNode("environment/pressure-inhg", 1, "DOUBLE"); props.globals.initNode("environment/temperature-degc", 1, "DOUBLE"); props.globals.initNode("environment/contrail", 1, "BOOL"); diff --git a/Nasal/seaport.nas b/Nasal/seaport.nas index f496b6ecb..81786fd55 100644 --- a/Nasal/seaport.nas +++ b/Nasal/seaport.nas @@ -1,11 +1,13 @@ -_setlistener("/sim/presets/latitude-deg", func { - printlog("info", "*** NEW LOCATION ***"); - settimer(func { - var typ = getprop("/sim/type"); - var lat = getprop("/position/latitude-deg"); - var lon = getprop("/position/longitude-deg"); - var g = geodinfo(lat, lon); - if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") ) - fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" })); - }, 8); -}, 1); +_setlistener("/sim/signals/nasal-dir-initialized", func { + _setlistener("/sim/presets/latitude-deg", func { + printlog("info", "*** NEW LOCATION ***"); + settimer(func { + var typ = getprop("/sim/type"); + var lat = getprop("/position/latitude-deg"); + var lon = getprop("/position/longitude-deg"); + var g = geodinfo(lat, lon); + if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") ) + fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" })); + }, 8); + }, 1); +}); From 0425ec0589773fdea43f764cfc6e82bf682929a9 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sat, 16 Oct 2010 17:31:19 +0100 Subject: [PATCH 15/40] Torsten Brehm: catch NaNs in pilot list gui, and report only once per call-sign. --- Nasal/multiplayer.nas | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Nasal/multiplayer.nas b/Nasal/multiplayer.nas index f2843b0c6..a47838225 100644 --- a/Nasal/multiplayer.nas +++ b/Nasal/multiplayer.nas @@ -178,6 +178,7 @@ var dialog = { { type: "checkbox", property: "controls/invisible", callback: "multiplayer.dialog.toggle_ignore", argprop: "callsign", label: "---------", halign: "right", font: font }, ]; + me.cs_warnings = {}; me.name = "who-is-online"; me.dialog = nil; me.loopid = 0; @@ -275,20 +276,29 @@ var dialog = { var ac = geo.Coord.new().set_xyz(x, y, z); var distance = nil; call(func distance = self.distance_to(ac), nil, var err = []); - if (size(err)) { - # debug.printerror(err); - # debug.dump(self, ac, mp); - # debug.tree(mp.node); + if ((size(err))or(distance==nil)) { + # Oops, have errors. Bogus position data (and distance==nil). + if (me.cs_warnings[mp.callsign]!=1) { + # report each callsign once only (avoid cluttering) + me.cs_warnings[mp.callsign] = 1; + print("Received invalid position data: " ~ debug._error(mp.callsign)); + } + # debug.printerror(err); + # debug.dump(self, ac, mp); + # debug.tree(mp.node); + } + else + { + # Node with valid position data (and "distance!=nil"). + n.setValues({ + "model-short": mp.available ? mp.model : "[" ~ mp.model ~ "]", + "bearing-to": self.course_to(ac), + "distance-to-km": distance / 1000.0, + "distance-to-nm": distance * M2NM, + "position/altitude-m": n.getNode("position/altitude-ft").getValue() * FT2M, + "controls/invisible": contains(ignore, mp.callsign), + }); } - - n.setValues({ - "model-short": mp.available ? mp.model : "[" ~ mp.model ~ "]", - "bearing-to": self.course_to(ac), - "distance-to-km": distance / 1000.0, - "distance-to-nm": distance * M2NM, - "position/altitude-m": n.getNode("position/altitude-ft").getValue() * FT2M, - "controls/invisible": contains(ignore, mp.callsign), - }); } if (PILOTSDLG_RUNNING) settimer(func me.update(id), 1, 1); From 81f756781ba4699a777bdbb6b30b2ca05cff9cd2 Mon Sep 17 00:00:00 2001 From: BARANGER Emmanuel Date: Sun, 17 Oct 2010 00:02:00 +0200 Subject: [PATCH 16/40] Merge branch 'master' of git://gitorious.org/fg/fgdata From e6b959b9c8673f8afc985fcf858fa414ff952dcb Mon Sep 17 00:00:00 2001 From: James Turner Date: Wed, 20 Oct 2010 11:20:05 +0100 Subject: [PATCH 17/40] Updated route-manager dialog, for revised C++ parts. --- gui/dialogs/route-manager.xml | 143 ++++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 5 deletions(-) diff --git a/gui/dialogs/route-manager.xml b/gui/dialogs/route-manager.xml index f5449f121..f0ad2d1ca 100644 --- a/gui/dialogs/route-manager.xml +++ b/gui/dialogs/route-manager.xml @@ -30,6 +30,8 @@ command interface /autopilot/route-manager/input: var list = cmdarg().getNode("list"); var cmd = routem.getNode("input", 1); var route = routem.getNode("route", 1); + var dep = routem.getNode("departure", 1); + var dest = routem.getNode("destination", 1); var sel_index = func { return int(selection.getValue()); @@ -59,8 +61,8 @@ command interface /autopilot/route-manager/input: cmd.setValue("@delete" ~ sel_index()); } - var auto_route = func { - cmd.setValue(); + var route = func { + cmd.setValue("@route" ~ sel_index()); } var jump_to = func { @@ -88,10 +90,15 @@ command interface /autopilot/route-manager/input: var departureRunways = dlg.getNode("departure-runways", 1); var destRunways = dlg.getNode("destination-runways", 1); - + var sids = dlg.getNode("sids", 1); + var stars = dlg.getNode("stars", 1); + var updateRunways = func { - var depIcao = routem.getNode("departure").getNode("airport").getValue(); + var depIcao = dep.getNode("airport").getValue(); departureRunways.removeChildren("value"); + + var currentRunway = dep.getNode("runway").getValue(); + var foundCurrent = 0; var apt = airportinfo(depIcao); if (apt != nil) { @@ -99,11 +106,20 @@ command interface /autopilot/route-manager/input: foreach (var rwy; keys(apt.runways)) { departureRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); i += 1; + if (rwy == currentRunway) { + foundCurrent = 1; + } } } - var destIcao = routem.getNode("destination").getNode("airport").getValue(); + if (!foundCurrent) { + dep.getNode("runway").clearValue(); + } + + var destIcao = dest.getNode("airport").getValue(); destRunways.removeChildren("value"); + currentRunway = dest.getNode("runway").getValue(); + foundCurrent = 0; var apt = airportinfo(destIcao); if (apt != nil) { @@ -111,11 +127,68 @@ command interface /autopilot/route-manager/input: foreach (var rwy; keys(apt.runways)) { destRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); i += 1; + if (rwy == currentRunway) { + foundCurrent = 1; + } } } + if (!foundCurrent) { + dest.getNode("runway").clearValue(); + } + + print("updated runways"); gui.dialog_update("route-manager"); } + + var updateSIDs = func { + sids.removeChildren("value"); + var depIcao = dep.getNode("airport").getValue(); + var rwy = dep.getNode("runway").getValue(); + var apt = airportinfo(depIcao); + if (apt == nil or apt.runways[rwy] == nil) { + dep.getNode("sid").clearValue(); + gui.dialog_update("route-manager", "sid"); + return; + } + + sids.getNode("value[0]", 1).setValue("(none)"); + var i=1; + foreach (var s; apt.runways[rwy].sids) { + sids.getNode("value[" ~ i ~ "]", 1).setValue(s); + i += 1; + } + + gui.dialog_update("route-manager", "sid"); + } + + var updateSTARs = func { + stars.removeChildren("value"); + var icao = dest.getNode("airport").getValue(); + var rwy = dest.getNode("runway").getValue(); + var apt = airportinfo(icao); + if (apt == nil or apt.runways[rwy] == nil) { + dest.getNode("star").clearValue(); + gui.dialog_update("route-manager", "star"); + return; + } + + var i=1; + stars.getNode("value[0]", 1).setValue("(none)"); + foreach (var s; apt.runways[rwy].stars) { + stars.getNode("value[" ~ i ~ "]", 1).setValue(s); + i += 1; + } + + gui.dialog_update("route-manager", "star"); + } + + # initialise departure values based on current position + cmd.setValue("@posinit"); + + updateRunways(); + updateSIDs(); + updateSTARs(); @@ -189,6 +262,31 @@ command interface /autopilot/route-manager/input: /autopilot/route-manager/departure/runway false /sim/gui/dialogs/route-manager/departure-runways + + + dialog-apply + departure-runway + + + nasal + + + + + + + + + sid + 100 + /autopilot/route-manager/departure/sid + false + /sim/gui/dialogs/route-manager/sids + + + dialog-apply + sid + @@ -229,6 +327,32 @@ command interface /autopilot/route-manager/input: /autopilot/route-manager/destination/runway false /sim/gui/dialogs/route-manager/destination-runways + + + dialog-apply + destination-runway + + + + nasal + + + + + + + + + star + 100 + /autopilot/route-manager/destination/star + false + /sim/gui/dialogs/route-manager/stars + + + dialog-apply + star + 7-mVaq*wd$C8(K_or;*MWbiv-s6D0=W zqoP)W4@vIqj3YuBQr?C-D%6#tOS-6}9DkTgeq!C4Q#b$RRVEXg&>dd2wdA}=~l^u<}o%n<60UOY|^#Cp*hF4mz?VLEKpQvyj#u^qNnH?=gS^HvIF z4G(^J7lF0s?8lkiWu8Ye-@Q9}$)G`6ZsIONl=j2*qRpo(A)H(+Fwp0tf+h*4WtyJC zc?Pjg)YX@~3!hnn*fl`67OEZhUTq9u;lK0WIkUl^A6c3YYTlSWx&nQB^SmWpY$;j} zi;XfscO_~*)RLa_jkgGdgEt^b-Scf#6M`%~mkAl^P>D;?(qp`MkT6fl362g5-p`|g z0gmW6y0_vJUbg#fyhbfcLa)RXti8atZ}+c2P}hjZHWZ^*pb6!t#>u5FN=8-OXqFW= zt}C^wQ8BGdx!nF#CYC$Hl|cEu0-f`(TmwUbo9t#=%hO7V((e;) ze$J%Or_*#%>S{gDxR?qDgZ&_Bd~C&z<}LGg?}<$|LCln}TgXwB{YFJ51J0GJH`+IN zZ9kDdag~VM^u(mNkIlik&bzCWmDKw)%$i7AS2FT=%A)+>xXPezy^p0R%d4HSo;(J# zX#i0K_&v*?`Jhtt8b4n6=m-)X@o~G#k0oMVdXUA4<8CMF7v>JWC+Gd*Dk`mbCiS)Dc=>kx@SM~fpA5_y^P+8xL3K0razLIc;w0CdsTyq2v2Ma zKk-NQ6;VGg55FA|)uKwEV?E1sv0ghhGvyA{D*NaIDUe7CglQaoOP;LT=SyDsyxvaz zNU$44#CCRDxySR30aM_j5r12z(Y7`_k&ppl;zI2eNHH-Yh71F|x-qvkuC`|j`LcVv zFe^rNX^7M7yT+xw>*9&>(dS5EeSuCi6=IjWCqIr7XO*Q(z6>XFheTw)Y$aITx1K(; zJ3d{x;OiX93@ReB90q@TAN7*o5s8ltnZEV>RORhFku`A)oAb*`gXx5$>1V+$T}qIb zZ{JohY8kJM4m>b6S4vo5#`__T$GYJ0tU)~){HU2g)5;yl)tVzBc_;dXJGq?wBG$mI zK8()j0dtyc;JTVf(`N8^#@wgwSBra|V|B4?q2^W*xukV;>KCahI@D&!NLQeb#aSN4 zBs@g3E}Z4FoEcm~n4y=ZZy#rzIG&7o)?Pe=N>qCDMZZuOz{chO(8+4afN14;1v2rc zk;xN1Ds-IQGSG7T@bLd1`JUN^(`3xbf;_%=@ZQKmHiPh(l zXRG2mkxEUmAR_xV%Z0672gW_yWyXD!aDE}iO_f(XDsmt2Nd;B{kWWZ=6|LJ;If8$F zKlLGk%{X4xo67mzA3SLrjD~$tFtAJi ztxkgZL9clK;yKuiNDgsJ9jVbW z+QF*cgJ7KL`O|ki;@#0UB9Wr?ukU#+#Zx$NPABzg+p;ex`dY1vFs5vZ_mQ_CrpBTt zzP=^Ruc4e}yXHE*Zl$zDX0PdWfr4&Fc|cC~dgcu^-&zzG*F^dZFDF3NNykpcd z)>)eMK2T^e9zy(L5w>a>!xz1;MY}VO7Z#{ld4FETdo(G5jk?)xHOpw=RU>h5&mGI6 zTT(6G^)9!{>y0{kB_WdD4u;#(=eRpEI1B8cUBBe9en=8JKKi4n*U3I^Mn$fM$NckM zkJS<;pWr+RLAdv};o{b+#Yv(4BCO6?uU~c7ov~!atD8y0RK6oDLoaSUdAR`NXKYKA z<(-e-7Q_gZ(FV(*uTE7lXWJRa&&K_wpSd9@cw2u7`|*VH{YE2USebacZYZzF3J>PT z5%$c+aWj3-{;&c=k#*X|$IC{E@z#A;peF1q5ZINXe)099nIIK9V{85$dy3^SGezYuwqISww26;heRq>E z+>HpkeT}2=%tNh{7bnK3?j1u_QljW=AbBnNc93#Q${m~AZr(0VnPs1}DUW^LCX=?) zYYol5yo2wnO5!CWJY}txKCexY(#xe%a{S>P)r0zEIy!4_MGnF_^RWi^UGxGq<0@~X zgm3-Pk3P!Pk@BKjXxe@vWb7^Jyc>zzZfY|X_$HWWy{R8zrVbY)LCRoKgt~={l(pKx zO6jBR$1auv-g4#h+I5?LnX|B$Mt)XjGn9OB5z*pZHVm}nyv*Og0yUW+>i!e{oL8rg zD5U=LvaPbT`5*z}ji;T-=qcNh<5!t$da+?OKx4LCYV+@ZdsLDa+k++S=d z%gi#FyzftJi1q0XCdo=Fc}@tBnI9GLs=)|x@GN--qrj~NgnIerDOR3YDs&0$FT!Y6 z)6Ae>8sv+UP{s*^9ST4Eq(V16neY-l3+S0l&{11{d)ND}@#oE&Aq9S*;KtDP ztas)Q<JwG}9Gjj9jd#>el2D7}V z(6yn5HcD2FT*)uEYyauaN z4dnHEBR<*)Hubw%qCH><$yTgZde^nbdGrWmA4wRbWg1_OtR-?7kgYu(?*h90DxD(; zb9%E}?p`i(aLE;DEu~ma;Sn9en+fV!inY9z*KyyPhFC4XnNYZ+KC7&K;2BNR@g#1B zO!Nx01SXhh*`PuOey?b;gdNn=v;D9n_eKjLm$xmbI#Kou!&T&Xw$EqUi5doc`^j8D zDdG<4(+5eBg`{Xj(&Q1EH#RHES4cm_(khp&≈IvW>KQuIZc`Fr3v1;0LSI%DnB@{EY~b~ zXcWJkRr(ib&Q7FJp5K!zd0;v*X#-6qD8Qu1|!ki=`W+Uc1?E-gb2#7Rwm4KC6O? zgG&p*GQE9XPgFe+9%3>;_clvyfZJExG`QoaShQ(V@8i66(_2md-tN?gy!+c4NsB8) z3cF+HLSoxEg{e#4wv`DQT6((e4JjQ}N;%+wSlb7h_4Kt&7oJ&eVGE(S&P~OLlI>zd zms>gvgcHZC;4JW9Cs$tXw)#bTT_JmhrChfB!RqS>VVAh=2{Ux9XKDcoS~fFknF52Y z($cpsOg#hCn+o#R62(LYmmW|jlskEc^-kc7xJiNCA)Y1{_wEzly(5zSemhB(G|Tyt zLsG#Xi$0R;;Y?Pv-fO3XhSr5b|7E3elVWoEpXV8T5=y(@IFKOxm!m1>yhY^;NQuLF z4gsj;PEJlaPw(h90-q|ZaV&EF0PVO8QFioA;NW6ra#a66xtMWdZseefH#l(Q^nNWYVd=q3g-KD zH!N=D04q7nANAxSPu=u8E@rKs+n87NJF(`8VCb8@ zSsXWZTjwTN(eu`A_8hI?y$(&M{Yn{6lM{CEv7rV2=aA`2dCfWt=kCxNJ;9`ol#}8w zhH{w^Rp8}I_BrLmSKlIVK5qq=cHymOIwHZ2H3CAVqBvZ?_@I3EBXX<_`y&3c=*p1UR zpz@5%lYpt`m4};B5UoK@RhXrS%-`B%>T$g^KnDcxT5Tr$~;Tpb?V;fGod zPO`thg^K^UUMUP50qq=)4xjTb-={vjg#smVP?{+#s`AZOE#Ql+rH{ne&?u%qKQ943 zISY99P!$wuvqw_RlG5s^q1s1bg`#dRJ9(%>YB|&(-qJuU;@6yY1w5QtGY7>R7uN&hx;xeFl z?$1ubN*7|sKH(J=TSy>O8FbRPB1uif5@WQSvR!)}K7%vMubzXIwHSc%D&upvp&epDU zAA-;Gm*OYTh7|~j_96PCiGA&7V;Z)`gbC$F$cL#zYF5Hp6ofisx-T(Y$_+@2{Zq!! z?TW+dGT$1#p55YE_f_O89&k|%=?TbxHv!A~Ae!>Y6zL;OH4R$J! z^rAl$jFRhcd1FZEclS1h&*^9ZWnDjOxfD*)MSt_W z)qLTtZlcX#d$_CJ1#L?YYpa3@*}RP8LFU#aWf{A%sokV&iZbICM#AI8?@wFxOc^A5 zsz6cYPTTJuYdx}LtmGo#SP~B;TL&FXoDuY-EU1$<^T_qV6u-I)+`6!?ca~;vgH*Rh z+`+Q!d89mqr)PF{1xlvb>u`5547x-1>9y?-{v_2>^@w%D9aPJztQXmqVraNP$FE1n zPJj63;w}&NsUvJghK&%a`YBQcQo7t2jU|Rh^pNxWePP8{5B(YFLp@K!mX&(RQ6z0( z+~Ju-m*qUM4?nTI0KPdG6{T<-m_S~o^mHU#<}gdoT|QbxCRRn=G)j;T5;)>LJ1DkE z6n;o%Z-;-BZ?N!kbHMO3Lc^IdRnN$2vFM@giP4T0Zc78&{MMH{gldP}5Aw8PSuDj#9S2O*jxdf!$h=xR<){$YCC66@3v`gx2rDJTQ{d; zrFTJS8r>X=qRagl$Q^`{@K7zsGAkc04p{U1RiXd*?CfM;D^`tT3 zHqMeW@h+tk=@lqwMMw6$-{It>7&c%`0C`y|Ms�@A1AY#J{t{Y%E8a(J9Hjk&Okr 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 literal 0 HcmV?d00001 diff --git a/Docs/detailed_clouds05.jpg b/Docs/detailed_clouds05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a06faed0107ae98d8c516153688d2958d532a77c GIT binary patch literal 94824 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%0Ab&!UrO&atYj+S4%H3>hXetiD%ZxW+Km}J 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≦r7;lE|Ezb1y)CL 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

S4lbBt_M%~+L4=!S;DU2 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 RnkcEq1fC7cmQ$qJ|JeoR5>fyF literal 0 HcmV?d00001 diff --git a/Docs/high_pressure_border.jpg b/Docs/high_pressure_border.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9b77f63574c99fd13e6a36695a74bc7d024fae1 GIT binary patch literal 57042 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 JgeE3W|JnEZX1V|X literal 0 HcmV?d00001 diff --git a/Docs/low_pressure.jpg b/Docs/low_pressure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5670c41232444fc450e41e3b8ddaaab0020016e9 GIT binary patch literal 32858 zcmb5Uby$;M_%Mzl2BFd|(u~wm(uy*2ARCMZiP0h5V1beX+vtJBXaZ!M#hwW2kRq)$?(?qX{NQm#;xkF5H^CBT3xqFZN{=J*>h>Yw3IprfND#}Ncl+<)A z^wcy=w3L(#>#Scr&-Z*K74CH}v1>ozgbof|0c-;An0Cc1s=HVN_V z8|X>yk`NP<5Zw$@-l1ZDu1)gFoZ9s+$H!P2V8%T~NZBAQr$zHVm#EvPxJ78@ub~4v z?$=`Ch&Q_KpK&)^G5zl;|MwiC|F*h0=w^(Y@_!+?efu`?Eh6Io0J%kZn~Ip7`uQvE zJ2d7ToUx1lrijRI25(amQxYiUdO0E z?<4(;9cP~AObnWmg5=3BqkOqsesI1E3IHBJ?;itTU=T8&7{&U0erg0VR&|` zcPS1dRx#@4(aFvFk)o+1ErBIET=QfE&VVV9<|eEDfy+KElVgZiIhmmdB+bLriKY6y z8T~C2a`{nlwyVpSbYl4aLfVEN$%GfCGtN>`T5tBjndi!;hEJtiUu?(1Qn9&PZv&Ma zd4bUnD|Jg~Im_Fxe8ok@mRTYn@`RVCEWh$oHa7j4NwpByT0vs*c@p`UbEaElzbSdv1O`!!5CQ@g0N1Zn4P$w6_G< zjg17(YZ#Tm8e^&FLN$UOHQ1@}Aws2S__`}`m>oMeUD!v#DD&c#hplY`s*fl=UcK(j zea*W9CQk;r>S#zR@-Rmb=TN?V`>={sF(+no<5dyR@b(3H;vjC8j1LQH{9!wiA%-t@ zO)f2-#y9F`6)XU-Cp>HM#h+dz>s7mFuZ?-ryDfwmD}FAIxQybDE%#PgEA&gA*gQD+ zTRyJrX{|ekfo#r$M!t?fxHr)jn|DG*0MJLF+Z;XkllimIYgM zt7K8~iBud#QAPdnp7|+DTyyr(ww<#mg};DrR9@ z*u(q^Kg4u0l5qGL(}b$rx0EJVR#9>t=Bcpy8cz8f!4s}zFU?IS9ZQla8`uGQ-Tp>T z5g1?FnrbB-{E{y{f+9(HL!}H|_kmZ=$!hS&@u0rmi@CmCe-cUmW?K?b`CC%KRClcR z&R@xNsqVazst&s2@To5)uR=#x$TGfuxaPRct=H~LKsj8OR8cw(FJ?vFd+pB#d z{ALx5b!NaT*>N9B`=Zd09Y7f4yhr0_-j%jR8)dE6);rA)1ft_yEG1Kzjs{)g!cW93 zVpX!O4{ench}#9N5=frLrVC_i55E<6UPZoKn49{}gP*qU!wWzns_$_d0!MiU^V>0- z2H^Xv^fRj-aQeWmK}_*Z!oc>6*mPK~NoS>P)km_O+3$*IZf++AcnHLh%RV6Ks2}ax zCLH{>>p@A6xTDyQ)Zz?oMlZpQmV)57(gLOCp1)_Z&4idvp&SZdwHz{RLi4H+rWfc~ zBy1NLit{@ zPdIMQh96vL%rCF8M_II0vaKodbD*_uYqGzs@u z&yo*wSjhOdWOMQ?o&9+D?{cg{9xmL-*4{0?L3(tHZ(G1WmG=3-WN+X@SyK+=ba%4e zp=;%=Ng%man2Ym_iJ`9J2*z_^Jz^!D|eBOOqYgE#f0abb3Xp8*9H9zF$GCz8E?UM`_lYi zx1@5RXxk|fNOT2kT=K>IkZBZOp+g2KE<8dV_P|0f@cw8%9XdW&^ha}fEid7-fGu113Wm#I946HPs~w)8&@#Q<(M|%aUMdGhni*b+wphp0J;Q}h2~qm zVW`{oi)?YMT#;i%*|=KZ2WsPOhk8* z|GIVEbX!$_`3s&8L!Twx9}SXYU9#ssoJCwYd0e)U;~EkJ#b&3?EdB;7PnvQxfD2Xq z!!yF13Hg(nlsK((Ru5Zf{EnY&eSQ#c1y*U%Rov4>^HElANS4z-BFMn6#kp}aXu#D( z@8aPeiHUfrE`MpTm{x(0A;9S(wlE}1C^OP5#W2;f`O6Lr2$9)Z$OxpWE-ksIYKy+X z^R-Ix&fwdc>Yt7Q?NnWu#55h%9wBwnz>t3DRbxFT71;N9&-E~a2DXty7j17FW;ZRc zBBmIFpWY81SLpZ@2_0%NZH}Zp83|~7=$%vgQI!HI0dlf`r8e90j@!IsrOlpHL!zcy z6k)_r2A7Fy564l0cS7~71?`~*Ozor0P&#qGzr;s(JKzg_?7ZJLh-b4E?V)4kQ+LA7$Vux6{P9WlK3!k4f;kjmD(5y<6qWC+PIjH3=?jZa3PD(2FWglWOR(h5Lr~(4`iIO zYA={pd~Quwd|FY>ZpUscQp|Ca=ed1c`PdZ8G5r4S(|Qf2p`G=-k@OWCQwK3be!ise z<4QB9hA5gd8O^Np>uxY)5$V{TwZUIzR*o|A=-B5kr0dh%8e^{CNyh z5QJ#2BG3E-0als<1A)#eH)w)&(g21fSHLLxyLRKsmM-pUDkgQOLTX(~%25T|WKfxh z$M(T_XDR{QmXIaE%xVgxPpOf5ne^zqVr(u5n#f)x4pxa=HWl<3X zhG7io*2?HVR0hStXRJrjA6aCLE8`^jxmmuebHsj$8)SW)r7F_x1(SkY75QIBx-0dG z=w=LR<~YSF-LE`dbr#l6(2#S?E zdWYszBbxAqYh2^91xn5xx~W#D()J4@O#;F0=tU<1Yj0`S)s*}$S+ZEP02!=nh)#ze zJ1!{?3cyoSOuopS@kr{LheK+N^-| z0xR?;Dcm#>`_i@%PC_3UB~HuuYpI!p9`}sLW@+#DENz|cGsi*?S^6%M+D2U##wnkz zf$WnnzCKIP=#16rq2=%<=@3ek3gdD7Y4jWmR*`%f&?CwFeuk8Xrd6vMOCl_5(#c~r z`L5Pn?QaK>I6VUYYD$Xt6NBJ49tfa1$A6C+)SgtcEN6Tl*k>k+b&U6aOD7aI5 z$(i21Wb)DS)d^ASS;pO4B?S!m1<1Y)AOHCEgj( zIu2F~UzeSJ=NUKDF{Nd+VPK_Ui)ok={p7MX$|xYj%nNa{b?~H!e|}Y_$0^Q5nETY{ ziN6BKxIu&q&U_Cj{sy1i8w`(!-HURBuhOfG-qh0;@vL( zH#Q|UOHHDoU0c;wjN=j+N!c~F!Yy+O6JnH0LcU;qjn;6`9~(C3rs)PTZG?7&c37rx zoZQY0#Cr1ikVe%pqn9NU_`e`#e12Wxc7-1U?fip6j`P3uzj5zMogU?^9uD4Qgp8Z5 z7z{?UX$DZ-7cW%VixN3DUk1yuXb0vd+>SFUR!nL78@&#aizBxcR(Kt>GHKUp zxnwQ)qUWTMAN-}i#@BVq#fY67pmeRC_BAuzQvDHKB`Ej(;o+>&-d)b9*&#WA`Qjus zih&z582IM*y*DB26S@i?GD@A3AoKl*WU`F(Ebks(=eJ2V2#T}`(SA;{WHhd$hm_hO&R(v2*V4@AmU;KeK<-)JtUOVAOU+NILW&Jek=HS=Q-V>=^d&&}H8$q!s=-#F1Z#?(v% z7PF{TEqIQk#b3sDqzu1eWwyuUv3f&HLXbvASt)Bqu@EbI(6_8on{S+`ow`$9Zx;3$12N`>dxkm)M1 zKS5ktD6=eQ87HKc+*D>mJ7anrfVbrKmxyT2og{%q5#nmP(CERGp$>SiITCeZ9&#B4 zcSjdnf`Y}v0iY8Chjzmbu-m_!zXEE>#bt$m0@V08WHO)w-MKT+nJM6B9tjamK=2s6 zbrVS80w*y`29j04A2MvoEA`Yo3?i$LHDAd5w1BjMyDmev75`=ykbRNNPI@tNsI9jB z>2L0!F_r(VSI=jPXY_j|uFX#ZiL;)Npcstw%VvtpYp|AfvEAQ(wHtAU``FyWT(9Q? zHnG|KVwap|ak+`hQDQcl0(gVhCXaE$K8V@e#FSjxa_dprNa$n+TGHvkrYi-TD_1fh zLfYl;Q)#EVhS0==zbZEw1%760C*Ah zT|r>yAJJf=!2y2Ju&6W~(N-aWhq^9IcKVLu1rU{F(b2Q)W5>-jGcQQ$qLhQ@yI93Hc z2*sH<#mLEqPcJ0aI*tL6SPsoo07ER8uC6Qv?9B7cYIqe-_#d^wQ&Ud@U);S0 zAJB}O7ftkt;a3K*yIZkJ51zj0lnY%9QJn`#r^avI;+^R=t7Ce15$`wE9GO+CqW;te zuRX|!?G60AmAx~_WOu^M;a8cbtFttRp@vQ3RE0_3B;5Dp!(>|Ec^*489X^H4TL}`z z9Z|6Vu5KvHk2Z1-jZ|p1^8E zux>-r4wsK_!GsKZ16#ZP5q;}psp^a<6cBPUM_xS+kMq{X>o>?daF`bWkdauW7iSWl zQ)YQ>qkpn&Ouk7>5k8EJ@7ZdwGNLXSd-c~1MvDEh$_Dkfbe|*ZQ~wdo@#1VBjW$LQ zer~!miBlP-&d(K3JprPsgrg(J#(LmJn!jbOcdcoz=yZOo<$KUw#zZ@JSj`8oiM6pR zJ5ln&R5!9Az|V%=Z(BH{~OHpI>dj}OVv?k?+vOkxw$Y9q?MMD08FJgE$Ex;$yWfrX6Tmb~;c$(h*E zsZxnq_SHke6lIOvG+sM3>!;8Iryp@@7xr-apA=m2&8|_A*xnbL{uITbgJ7u=_U zbMOLAhyZS2yVoM;u)4T$NiB-LVkM*icd8PHXk0fC54Vreb`WrU@B=S#C+cZN3>C2YSnddtDcf{2Q>$ zmH&u362vD(?)`A9E5)Zg8J{t(@>4||wB7hmJ`M-mpEi;Slj@X1uzfkfQOw6t7F=#X z#5sD*!rL1Pi%SZ{pffsqxt)X7%J*%0qMYPC2{wFD#b*_{wPeq3 zmywPy61!tV8ONAo@|>rlw1A1w{o;%`VlhF3Usd3qIwS8-w@kY){+pKULl5=$%~V4m z06GC}BTn{=`I@)ioSbR~rYIOP?JBxJV41Q~$EaP(8*ZqtGd-ClC5agf9|TrkPBRIe zKh)e1k?-U_X0Xi{KD{Kz{IcK{Z%9(=`ov^V$tvrf2&*P^#Q(HqC}69%y6BnjJg+IruR`SU-!Yzl#Uu3zbs`-ozs0VNnBAlxJEoT9;q>7Z5H zKFp>`-aX;^)3^+Ue0K}CcCexqepw%)T*H`iV&3b-_D7-+#1*&rBZ9|zl9nfN@>hP+ zzC#%ef~>Ooz5`ZKv-6aZs}7e}$0?Ns$2Yv#(aPq^PV0GqE5k5H#d7RWgF`x}9ca3L z;tcIW!`7S#vR0j4ohNrp8)B74<|)22Zel+vjt#$-ds5U@6lb|pEj6^o*~ZzcDCr^nRbg*Dot`*kA1ub1jAfCJo;J^lOWior;<#JK7|E z`1+I)&MmH{LSE@!A*yQbKL+DUYGs7Meu!%v&PHrIUoKX*x1ra!OnhMRUaf?R$em?E z7f5#J#VA(pu`8z=3oS7!L(jpF0iAmB8hAukeu!G!y%w+Lp? zHiW8rS$i6n|N3QE5yf(23b95%APn7AIkfkNKGs>Rj8)P8ZXK>D_Q$YAHsUbqS^C%7 zK|~teltf>c1ZrtVb=^h3%D~=$(#Mt?n^~hsx&>fmWSUph-OQ~oa)vp&kJ#;$5ZquH z-;gB?JoWU&myYU`or9NYW%`i2Fa9zyj`UVQsES=+W(h|W(#}TA>Bq5= zfTq4=zZvG}$lSRiS(oQmNm4 zs@*r|GOGgol0dlrG%MVG)zKH%Zuo3%L>}x5hO;9>96~Ad+|!rG8uGWeY;-9RR_o|u z)~G+%viU)VoBb6M;cz z+&%e(0HGq-lpHMeqlR*Y+i2>y+(CMVrB!=bW$R63MY|)IsYS5-DLeDLTUdF5F=$QeS5V^&8hTeGWa8r=5h5=?GSs1jkz)sC z%V$0rM}=O3gKAwA@*Oo-a0AJEl|t8mB+x4LcsXtUJl>nxi(3G@L_xn$#3qQA z*t6)U`s@+<1${Kp;nA6~G`%C9nExY3$tH^`Cx1&OMmQ<&+f}Cl=pT_bYPWFwL*rXq zz)bC@UFQeAX6Apms=1}({hk)1;?QPV!E5%Y_^EFzbH%&_vurzEO>VW3V=CuAJm-~CvW?x0?d01lGju?5%v+S!Y=kTM2++myH7bKyreNenOi!~z zp^Hp$7!Tej%O>2NU0VjETNVF^o)4#qr;JJS4EYHVOBoVCLr8Wd>ZC?<))`#C}ltWcRTnc zKgD)JFgH6O_`Zp1?j*;w>X#^P`g1iIF|Um}wRW;+ya{)DOo~h}eg&Usq(zX$ z?z2=I2j1MRoPMYlafmg*3#x8&c%pUy$+TrMS)0(UHFo>#vfo%6!MaO49|W zAMx_lG-{b*Z@bn(U{d^xTP7Irbjp+HAXVc%+7>V7j_v4&#n_b}S3kNU)IB+K{^)lt z*_CtWa`s91iJ#JnySssG;l{VxC;}btvE5w;)NI!n;>NX+CRfDjQ>_r&fwAE?YzfH5 z40qfxG@)}QJ?Cs)iJKtiE_6hzxb)=4Z{m6rΝ2YooAYJ4s`nAS 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 P$cLrwD2+j)e@p)Z%!siE literal 0 HcmV?d00001 diff --git a/Docs/menu2.jpg b/Docs/menu2.jpg index 226d0a4b9e4aaa047a8d5dc67c946202ecb2336f..97714ac0c01293e30a32b003dff8b01b224f613d 100644 GIT binary patch literal 26427 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 literal 25166 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%0D(!BWTd5ZgOzkFsZp)NaX>){-du#t$p6sP#+0u z=v71me489Ah*pim=3#H z!_CGDt6Z|$#_YQz=E?$g`4>Df7{m0Z25{8DtJ>_Ilb_8A@&(>yBAuCQsD+k#o*Fd> zk;~6KE-b?2GIN-=CWgnYL69Vwz+GwU8z;lX%>af znVHS_TCP_}mPJc*$LehRrPKSY?1{yy@|{%0psR{%CG$_{g+)?Gp~401)T*3^P~FFv zNR;3vjrpV`C%TVKWxb*Wc{Cw@A^pocSK5hko@-q&+_j}fBcKhHs+BMAqgG%V8)69D z%SSoW$|$sU!aeOr@5NgCWtLM(gsS%^UsN)62Cs zGszZ&YSr-(Xei-$_=;KUoUTEP{@cR_zP!T~)b^23UR3h{cF_2}q1(`k(3p77Sr22` z;V4W~r)JwBdKN$T?4lxCs1I>e;)Z*pTz*?a-?G7osAfd-pnV8*V5y1uhJN;o^yUDC z`G_k+p>|i=#`R^=_ywF$CI{zlI}aC* zm0uQA3@hh8N{W8Ym(r%0@DYooghlHt=&*v9PqwMyg?KW5xMmcY=QrNpol}W7DAWlA zBWuJ+z>xj<4L;<4{a7`;W0%*nvY{t9i@!wsT{ebnUripDv?VfL!+!BQUYaY6IK2`a zkwyuebTR{!Ds()q6>3@EjS~no#oQYPO}4h*`V`mJbK-bMLa03SPt{zwB{w)l}jce zjm4RV=fgXiy806P7bLn$el|X3?hSAFTMca)IU*h{Z8Zr-G(=$u9pe&}7+uZa>x|V( zr@A9|Z9i^cl$ML5YGR$#?4_2oLVHG0Yrv!veOgX8rMpKT39aIqO*(0V;yKRamI#LbKut(EThKIY_s;q)#ptmD{wj)4>I zC-ui^r{o+=v$TD)p&xt0Qc#%@Fil@`=WdUt{H0vD{aFP^Ih(!P`kB1Lr|kFhiLoJ+;W92aZNYXo?37c{uBrjKyq zPu-j5Hko;5f5cWC;uO~hjH$S)^_`Ith|QFTV2J`p`@F2-Ge>n&ZA)bBwjxAbtu{p? z0ZbKQ)TPsIcTolR!c=Wd<2&coKfFMnJLX&K~MO; z>RG4gvfR2w>fBk*2r+H!n)4%121ir%&h73{hw3gzDoiObt%ncMVwaUt&uwH;${sIA;GZz$htO0vmu z2JxDDk$@Sh3f};lvX>SL3H=zz5Ht{F5eKy=)QI8L9 ze!}Q8^hditgtFG#5V99Mld@n0&82@THH_PLtNaj80nxc#bZwmju@Cj48I@d;_bWyb z>j@Dr1erd?(NQul$szL#T9uVmL?hQg5p$T*Q)pDRRAr${a3+7i{} z0?>7ldBliN%$~3d06zs^G!jqAkOymx7fVZ>*4bM^7?A+v_XrOl4JBEelc% zBbtF)u$Y?R$3iR4pR#T;U#?Fkn_?G~dhYV$Ec(xnis|{mHzylzA(ATiPL}L)J|3Pk zy_~6ug!cG8R(mmPi5_-t48#p9m|RfdM9|iH2hL4vGpWE0UDN?NQ(ZGT4Bzlm6zVMa zib7INrB3+dh7c$a2Ik&&kd6uDWxQlF86;R+a4U>MG-f9?ZNw6%%Ah0QwgjvzaFX$% z;vmPB%{q4}w`n^6{4_Hu|oT;r1uFu(Qu!(YR52g=W4m^?_^Q^yVxnEuU)xxzd0`$W+zg* z)>4nvoi~Ra`jnGuQtc89GNQb=Px2tIPX_zTh%>$$*QiKWR`XFeVDx5;wIlLbJT^4^ zW7h<3Ib5#ep4w;_D);*gI!BQ#8^dPa<@-ER!h<%se6(SE{t=zJle=!xiMjIz-x{jP zEO|pS>Fk4dd1;)rYPD4s5&*ks8*teTtD~>aJtaTG+=AVPebS`p(M~oKO!T$vR4qiQ zaJ0{fq^Xs7Y;+`HawrzXN2h?_o%_m_xheuH^8K*_o0NJBN6j9Q%+40EuH-%$MI)sH zEAy6nM6~mdI;I%z-Szw=CU1NGGXSOneckWd*47kqqC&|@bF`v+^m^i!V8T$38}sr=Qy;)LR#eZ9jmQO5!Nr>106)5<=0( z$W0-Y)NBJ7hT9mnBR&nev^syjZ5ZYQ4U~QC7T(`*WfdrJmzD!TFStqrFT$88M%Q3@kE*P z>$x3J1AE2^(~8dUKL3h9Z|$ z3v#7x#+HNLKM5{SIO&i|e&+FDGe5iRI0)HMr3rP)6^Ju)Ui2`_azl0{>V#K9wbO4N z*c^9_DKXDp{YHgVYyiWa%zq=$I7cda_-S!lKjCM4XVf>e{sno#w7&&5l#l`&Ibyfu zHd3Fk-U`928;{J!uf*oYL^kfgFoB3!HQnX!VD$7u{zE95cqXcDy$m~npK=cmTr4$G zHZ%MsiLy6DWV3A1u&Nt6=N|wTSuQ<{)-EDphU+@3QgH-3J$8}G_1TmR)Aj;7iSl>h z)b>BbXlh;o|K360y9hx`SvP+Y(7x?z^Y{Xxvmu$FV%+@cEF@9uO z*FhFig2 zIHQIJ+B7ZDFxXU)`UtJyln{0ss1%5QtKm=pB@$pZEt^DYOHYx$lkOvHw8Upw<&R0I zV_PaTs0aqi$-)PxQNwg9%`RUc6nm&@hH`JeNXsWfbL42lfSHy#MNz&KvM7I|+Y0<~MA|ppyY~w8)WC>6nd}W3 zV`zgm@A5u4|a8I;zJbWqzT4zFa| zv9br*KS~|}bFz8{4V85e~1`Dl=(&F5iIKq8IY~!|Qz)vcNA=k&F9GyK}X$RH^%7C~AnXV0}&Ddhx zrrpEmeJG&$o3^2_YQ3l}Q5R;GR}EJ`4PBr<^<1cQ12xP+q8>!H#kM7foX``CNFcYE zdbWv-nDsyDdoY-Px>40^%2sS#SwscgXrN_U<|oi;8?&!gE_a)NP(DbBn6W2Y(9jim z;p**9hd>ns_s)0C6C2`Gs(7_J`z^^yGL8C5k%^QjxyYKXQ0@t(Q?coMI}aVyZ-Bu1 zKO*pdjG&(m7?a2L&ldeTo{Jp}9#3Xh?yL}UpkNu9n!Q*)A(0j(BBJ4ziq!T#Hu?yTKE30Zl=NPbwUEpC$VCVQe6R&I| z_FEcizJIFmJIbBm^fcWYq!1OIqqiT1L;rue`0B7IyRP3M1q4C5Q5eZVrIijDM5Lul zB!{6Jhf+F*?ii#Sq=p8O?vxzhp}VCK&fxQ&_xsNIWA1BT*X&q3SN+ynDcbr*uh2oI zroZ|eUYb|tgSxOBIZ&Z{wzz2R&enTLsnkoA(o)$w5Z8gMV+Kv6! z-1x$@eDDtN*Ygy{?Uhi7zJ9ORT_;m)_u00GoMx)U{vn2Z=WYf7nPYh zAQdG@Hid6Fc2J5AJavV}nKWRUDOaz)!9|ni(hBIjR}gc+GmYx`79`D6Fw&vsj7V|8 ze0gdA3-fI6x=Ed1KCdEiHMTPo{0{?E!VT@b=_J#hl^dw5Yqrc%ltk@bVH9o(M=$Dr zN8>}6tzLC;3C`xEk0a--v}(?FTS^O)H8Qi|b5o7E6j{NgK-9~8Dhn|LcyeEU_O!m@ ztp`}doh5FQAV_oP$*Av?tXKyR+@#&jO>@g($yG&qlJyb+A@C2@cYM?=jQmGww2?Q(@x@4^l5w`C-vX+e|O?`OWt?A!5Bv)wQ)8f?@1+ za_&8Z+1WVi#S~m+0WNIT5QoR56OY@Iy7Xn9@7Yqyy@|B^Rm)Y>DwRpgF^_6YdMv4l z@kV3oM~P-V{%XBK@N#$QTF&IEe-d5Nk{E*w06)r7Qn;)coHE&F0-D}Qot`0>V;SgVPX57P|Y@qNsf8kx5m{2ZINvBZHZR%=HfXa1?pUNvKC@i)Va*fRd z;qbANbi2_znjURILG%{~G-+?Pn({JTPw*FVooC9Woo9tqDEOgLHtnM&uUm;)135sT z?1tL8rjn%vv2c+Gm1LZFwu6jWEr$0pN~v$ zy&N>TY72#pJ5ia&D0BZ1Q;8jynqli5EA;$$Mz6D?r}UxR#%t-Z?RL1PV!HvciZeqO z;yQY{b-fF^O8Q4PuT=XzX1iitYt<-uN&MNIUd>*Wg<{!Ey6)B6nNrx5PJY#(UiEaU zs74(1g|)3kokdFnFQ||i4AiOCK;@d4afS+U;SlH*gL^iZV-8;YbNCwBSQXlZ>XB}c zC2Q}uz*5mJA$XKRq#Zq;t4bh%jyzK~>GTZiHD5KHJK-+IPdOmR6 zK~dzV%kHU=sLpU*jFWNATEZ=aKQ%LEfBut~h!}-7C05}`09)QlQvS0*ZF=CSsI`VZ zS0Q#WpzrgwKZ(@26glo!an1yqPl$*7I++;^qGqVd{c8U%0RWK~|BNag`Gx^ekyfQ_t!j5+7!Z2;uemPCRkp-sj(9d~)Yt1Jtk1aVJ&tO%saROjD^u4|?TS5V#@B_5>9Zyrg(f0-{a4L{e?XM^ef$ z;TYM-<^Jh%hjTrnWZNpI9C<-`{#Xw9Iw5W`8wf1qvd4N-X#Q)sA^&JG=zDJuPOV?b zn5j-ViS2wn8&?*xq1+5GtqmyzIYrBWLRh-V8af(RIdl9Cq_;i&)NotWM5`@A^*mO; zx+6GDK1D?2qB$bolXDWUKJwO<<+tUw$8J=VZoC4wV%#){UA{ngHcyXszU3AvE`tz5 z2gL+HnY^!FVKs!*47!>=Z-kr@0-N+IQR$7y%*=#R}0@80ly`C8T}ih7lKdF zSxmw{LO1ujx~i@hMXyHJ@5w38Y-F3+^%3OZ{YSlDR!V4)CEWW`CrRA&`ZGXIp1Np6JQ@CL!%24_U`)a}>tD z;kyisSw&u~J!g4HN<>ZF<=-HnUGkWksd}N6nDBT)Cx5+R`x{WCVMB zUMDKukY^zVU>Ppha|JH9m~>V1hV%`W|3L`DC2ei2qw7rQSXMwyxbGEFiEf^`y!i3^ z9&{NkVg{-o;Eh8?3SX+}e<8#fN!Dc{eA3pXDGSDtA7Owe zv!8mvxPR5ek#gcx`L@xhxNw?!2;T_zc&76gOyFK!L2ykXb{(eY*fYP*YL8KaMv+;D zV48-na$r|B16)5vOx8I(hq~N8v+C}q3c2)#&|^AlXFg8dV%8r+yDbC_G?LNI`)r0k z#s?&`6|fZk>A4|VdI%wu7BA)ND0vo}n*Zse8>sOueIT7Hm;8cM5#6eDOFFRTP)>)M zpZ4V%!{@wk1?T;3`K`&MvI5n6c>@FE9opmngncYml9L&2am9Iy7Dv8OaBBPl6sl$6 z0DS+R!2f+T(FTl`-i%aqe8_cNA&k}A4(%jWLtAC@mWh9!+yn0LC`2SK4DY2C=^|53 zW@Pe?KC9q$Fk8(}8Q`nk7?b7NI)tVg^^ihLNok#9{0Hba!^6SZ{N*JWaf7ujCznoH zbX~%BmyJ$Xuiaz6R@)TI(x)K60UL@I&sZ{Bk5G_};kod_YaV46;52j~3{?_A_<~7{ zOhrVr*+j`7t2xLrqRlDT_a47VQp0ej;p5Vueg|0pCKsq!veEy7tJl*{En4ldb`*#7K%8C zPX`rch(Je`6Y-*?F+qo55d9CAM2%;$Qlm9kLj_-S^+YxNlPr0=h|Wez${XzCN-IV3P^zQ@~c|F5#@~s?58dbN*D48MkSQZG|TWt?=uI&CYE+ zw5u*&L$2$ZEGpf2<=^0KbyQz)ttltGmh<#{F>vb8Q|DS<9)dWcG+IF30bc2OhZm*_Ecx;0NVFzP z@1s~>@9{WiS4v!(V9iZ=)*`H_>oqaqnvEBO`0Wb*`RnwP&z{J|J@yFtVOY|yOPkhN z&C8EisIm^3Ufqo6l^OGgt;d2_SVYZ7qIZCOXt3zCxQ^Xfypbq3emKvAWI`t*3E5G7 zAH#5g3+P0L5sn8!c}@onvD>`^tgVzQ^ct#}@Ro5p7ti(yO_Y{x*;#1BSK81&d)1e| zKSLQs9su>H91Qs0RF71MHuHnT(9nDpq4(>aot3e~_W#XNz_|YHdOVZ&L$R_`a1~ZIgr7IpeisR=lsk3gWfuA&2cvihVJ*$_ehvEgO+(nITGy68utM%Dq+$dXkj_7p7+LienqDYv30`xC};da<3@X$6y{p3S4|Gf7D&X@PfwE$ zp;srss<(#ZTHz058jJt@jxln7rj_qqGdW3J&r^5pWP*NK8afROdYuMsG_r(n1j`!1 zP2cDYTxc!Hx8KrymQ*9RL_b{yD%7o}i)an0^iSUhuUH?U+uCyubolYO#U0?G;*oc7 zf#iqX^Cd_N8n1_^!ON;^R*6g;Tbx}zu-RXqN)=VF>}AbYum3W!4bC@mt*`7c1*wkp zU2V^pn!0J5nG*K6Jr!omRaWt8pI0sTB5An7*KZOCd-YGl21T-#Le)R3y>#F)ejtM> z-fpHJ`(}e*=DeEieyaCQawPAwkkhEMXxBZNHPs4dhIY$i0#gEhtjSt8&9p_F`jkh` zU=9yQiiMzNJ*87&mj}5Llv-R=0msK$g-Z<=hBMPnr&9)hV7mLZe_+E2nP@0)hD%(6 zHB6UbEkEO@9czsAfoQh9Ch#1<&_b#c!d6KMKnvG%Cdb-#6f1sf))bRn^E!$@F-x9G zO6`n%vwMK3G~)Cz@a)qM=n(oNdvq)&>UhH( zGa$$n-$wjz{YL#3Ja6}I&s;H=u%k1lVI8J;2{hc(Li9BHQvGU&(O7Gbs=KE@O?8{j zIJwPZg8>aW9gjYeBR0WrP2_-b{w(pZe^<_uj)(DqF(>v9quK-AcK7So8)=b!8B+?~ zGsB{*-XCro(8(=UuFBO5N)No>cxEc<@#`yhxrb*E&YN(T9;iX2Z6J@O;SAb4*<>i< zdcC&PAD26H_uy8t?)v}qU??`^vB83#*W?u{p!gL#7y_J|U6^xoqg_gjv8h8XgfBc8 zb{~#sD{G(`cz`&%$Etn=yZx7v`c^b0YPSu`SIwof<&n`VhJTEK0q-$HT=Fgw%LuDJ76CrY2jVeM@6D|)7c=8*&%FR3ac*2UgIe9#i zt~mQXTs>*{`K@W=(8dCujk3oCDRH8@elMsJ2mwayknV=_kv?`|lUk*X@ySV9jv~iS zDnH2X?v0E%TLZ1x9P5>ou()nblr@lzc(;KSuD3ue-Mui!GY7$oy;)73Y?o~+1B`7S zNWp~V1G9#P)bzpn6eZ8J8MoJ>-8-{(9D73QQ`Md|BMtRbJgBf_|0Cg{LnICU$%ympW?-l6Sf;m>sb3JPh(dIAe z)+BVHH*@` zF-@-dqb1S8I?xUmZYP+~DuEM8rC`+kh#<(HA!}#)BN1rAQuRm#1 zo-z)0HiWUm0&_rzuH5A5dJIVhdA7Vb4r`F{36gIOGtpOeL*JtBK~eF+E0}<>JE;8o z^q^jp%gln;tEssUEW5tVRAlm8CbrkwE`2Y(Zp0l#Ho2T;)`eKGRorhefNQ zIo(j6T3A590Q+|26ZIOMFP!-M*a0>V8Z(bo9%mwG^3d4^u)i*tJmkGr`$2>j=v>B) z{CX$Tix701j%eOhpn$fFl@>_9tx>h3A6w9stb~47cs}MVOe_7+?l1LJWO=)WFaFu^ zdaAO20TVEZ@OuUe>e16i*{q@lt+&Wi1J`CdEL{N6`R@h7%KHz+-Qudko zY_-0OXS278(7WcLw>0R9iUH6fe66g|fM}bACF7`{5e3IMA{t4g-w^-2)f|B}D#v85 z$G#Uhx&yTL{#L}`9W$%130=a%j>kg7B=Dw6MN|%bzJPpwkN$bAZYe{tn{nBA+FFmc z_xP+IOx~_>hKEmBNDvI78F$$+M9o#qb8*4))D+Q;b zI7V7!GS7vXW<>pNL=$qsDwp6SEKZeqTh1E&jv3A8}*YJ3GS&m#>N92&J zVY-*|Q-e+w1!zZ7F)SEClMVHc5khC2CC9`QlX`&4w|f40e`rS}=un}6ZEkqJFG?__ zVBA2WEH@Mr%y$T{{d z!-57|r)3^no}WLer{ks7d=fHMu6{U@R~1-6)1;)_=6F`?`gVGtBx+9oYdC&I z6kqUM0Z|rw)^ZLHdrw%;qN1+Oohg|pd=I00R;+r3hS0ur94~y<&~E+xZ1O~B=B%4D zCb!m5;?wYxfQ&pN16STxt*>UTTuw)V%G=tJ<*-1#5^Kk#DkM+dfV33!S+)o$@HG}? zgMWpuli5yozJaOmKlTWWm=zGDw+&(wnR14W;1?~(4stA{-6_C;O{aGk0%H_a2oqim zX?mx7xlH#iH?5g%O-)JK?S34POL-s^Slfk4Gknjk2ds`B|FJgi{FdAXJDtfAr9d=T zE4#xH34dj^6(Njw1PQB7__?cFbYe%{Hl!+^nq%Csq1{i?s4Vr}<_95y>+j~cO!s~A z-1s}d=YSzB21di%m8WJ9yWoc9V%e|Kn$HB4rht_sQrbGMn=7&+pUJAX1}4uDIPDed zFYRUBr_QfSO==_9Ui8-DtuLyicAEw}8`@6LGMcZS@Wgdoj&-j++$rnQdc2{)6vtNP zyE79w*H(I5vG?WeYJzsw8qOz`sL|~=w)i3=43BHsH*ww+=vzc}4Yvz9NJUjAfM;q* z%|5}PD2&3NzO~gbJoom%ecoa^lVzw@1F2l|duc@@jgfsim#xgnx}J|0MMHF`1n|Nw z`*WZE`M!-rkNS3^N;0I^02VyA=3$c+d9+b_^LP2Z?1Zx!pn`Tg*Sl|M$O+ujpJ}H+ zA*zdbNYFdk%lSct-r;HSf^otQ9eo~XFC0=u5~bT~HPrt!Lb9_g6ZDaO=JV!O;iOC{ zB_o|^8g-g~Qa|3lu6`WlVLJeCkfOxShHWG?? z4IGw(+MaFlzM4O3g3#f6(yk=Ew;ZU5xsC)eb~QTFTE0|3ulCUWYUfjN1)t4I#n8^~@+b-fuURE<<{sJf z8VWkoa9mswU4m>SPDy?)bEVhR3$N^cVP%NNU9I89maxOABIk-64c+r_?&cyV_0CoJ?eQni&yOGr~y%%!;>c`Pt9)I7J zMjDV&n)M&yt4*T$h3D-wp$NU;Qrh#!rWgH5^}2pupfQ+jde-;qOnt^kYvK5rmi&N{ z(n`%_kbYBezGcGpf}2bcbqFu!4^o!Z>Y*P*@*(^ao26;@y_TSR-KqGW4T^;Z!1@bI zt@ju~4Xek3o0BWI<+ce`#}wd{r=&C*aaKZ-0iSWqBa;G$^a$ZGE7ryeqL0Lng+c+9 z{QKM#=^1kjnp!w61j3kpUvViy+P{+t|?FKl3w| zcGSShV29{CQ%9ZP#&F_oOfkR(j=fiqz0c4i*2_;`>Co{vGbzLTN3IeJf-NClADRpz z&*9}+MjD@u4n_QK?Hz>r$#%DVu%;z89*}ufh!3S$hEIBQ2x{8*07J*{P;R_k7)(>j zzq%=4Ow*ro=j_skUyd8K7!=+C979Xm?Y(Mt36IyEB>nQuH@$RI+{3&0d&&YB?lFTb zDzb9-<5IQ+cxgZ!+B7S!^(URK_Je*EINIlM%_k3f=6LBsmi4>jj%@#}_Q6vx;yj={ z(@2ALsi51{gy%TpuuMIOB>mCfVqt#pXjM7oO7jwQQ|s3o6NiPvn%`X8WqLs*ZsvSU z9B8qvyuPDajY1#!Au@2|h67!{a=5eZz+Lx>;#7?q<<`XQMQ~LVU2z;aG@~5Hq`_~) z#+2^p!_Gh6VL6j|WGgawh6q5fl1{{lS3a5y^)f*jYCAeJ0f~!@!@QKPk4s=Zj$^;= zJOm54|A5lOa}k23L~VNxjbXCp6O@LPoRhFHIf~R^q4Q7+6h%%$ar+CG#W^mmywXjJ z-z0~hn0IT7R5in^_!#7QIDnV1LiZ}V^=oD6mZINnyF6cS9gdXy)$ezN`o#tl`Az+Q zb|fQ=r^T)sJ=yH#CcD%P=87%FQ!W@PuZpTP*T`*7~w(n5feECZKY5yyl?h0R$F`UX#$iBLVsS>k(05*Tz6#1 zH#q72#Yig|8$2Au$ixcJSX*mtI& z3%@nLZS)vPJ&c^4m&oCf7e$ew4&F9ZzaMVrm(>YV$59MhME;(SEY`gtt`KLv128ZQ zpyWFVc7^?0R3y&dagNf2_jQHPf*gvn*fBJ~z8L!iy96^R*rO$rfOPl7&>F1y7Uilu zo|X>xu%w5*9cgNhTEjdu)XGv=1Q24o+5gIp%?Ufx5`krB7n)8XY;$D`W+|=lag~{_ld7WWb{Fh)gP%%%(Fy915S*s`ZM^YPX*# z$;%Ck$KC|jF5s|LwSmd|~xlJ6EY*#mv zDL=Y=3G>V+l?GwV4D~DLIXKg1m1S~9CU4|CtzMOs(tRSY-p`aPPLY2S8n{~C4~ z7;oYbdk;I_w>W5H5Q86E_7@puWfqe!doGswV`nLaKbyW*T61U>n@_tQwwmE+*0EpP zrc|3>?iRCe`<9v7VecBle;enrJ6&<&%a1#+5*%~#9L=9wUozcVbsXETdk2yobaW=& zzniB%eqDGUt(cgatGAG-BM-+HqgZRZK zo>dG!HKBuLC?p>MDe}f4VM`XNU5Fr>_T&jdLV2W=AZfW)m2?q_C1hL% zQXg4fQUGL_93g21n_XSGfQ)LY7G)iV#inGLbBZ^nF~0OEm!5kz2A$Rxe2Z& zna2GehNy%i(L2)MZHh8_!~RoKM>WG2=D>U7AX`a#J=8TRuJsFLSH|18pO=fp+ z{>(b%MaMy#<)RNnI^UuU6wsd>o8$E0SLw|)v!G|~Icl*lZaV4C=eBd)1+{AZj6HloSRXj*3b{5u)};A+QNX2xJ{n zqH3Hd3?8bgh*ESF{uFU!oGRkRhx#z0V6-?YFdk8iC$y7T$cPm*`bmwF;v$*M!^R7_ zQ9g4#qI>E{ACSed8hhMIACZH{T!rP2eq57H0vWJDN~?s=GUVmng-9JeYfn_xgi#R5HLrfy0kd{4rCCGQ93|%QPWnhOf0CVR*`Y;Mzw z|FYm0RtZV+iSr54l-gp-(@qoBl9*lG35A$O&YVT3Oz|AoJn4xofHqQV=G1xkcGRE_{FCKqSUV-clshfmDKSE-Jv69P0uT&eMv*jB{~^nHi2CNjgnBAa8P%jb zOzIGp$_$?_5?@-)W;r!jQdWwtpjqu$SA)>gE>Z8S&^Z@b%X+#SrjMsXW9x%*XxCLx zB(EfLYq}IDSCoD$V|?viR%_)Br)ok|)skxr8~9eP_OY<-;3`_Sp;%Tiwq;@Mo#eP> zRm$-3ca&}2S|znvR$)|>6^SfP_E_55nFX_%ji}*(3QO2#X|{90ZJTae+hF-Cwz4cs zaJBvcTvd53pp+u+Q&sERHL}sU1U%z$`NJO9zI0yHrPm;@i`{WWH$x2T?g+*^N%LX{ zy6WA6cH^{F{lNviixn?@$En#@(6+s>x^F_~#$R2EE5LA58G$W!PXH&;l>Zf3VbD89 z!HLGcY+WrzW2UeJ8`!`aW@oHAyi#6Qc!jFkrad_z}P%VZwr7fdlklk9~HN6A(Z3T1Y%%O43SSD(np-U(vBSwugzH^S1>;7jN zRB_F-0E(DjIu#@Hh^{YeqDQexAvX(+(L5&aiyvLCC=WBxg1!NvkK5;C={PEqrZiqW zt!UUuFeoHZHsw?xg9hgp{@$pUVRjZFW-pL6;>Q$|H^u{-WIu4<7ey z$oakF!3M$1vc32cy_@s%;k3~9u3^YTK5~nf+>u4+%@%hyGO4nbs%tplM(Y#vzJAXI zqREl04jh_`mT0OrwS(84{&NY=yyj>%Iwv6%sg-ZN?bl5D`F;rWpjW+7%VQIPSK}$b zs`IgIe!I^B&lji*TAB92 z7Wu%Be(Y9~J?w5BVXUXzd7KBi>!o=Zt$z9th5gd*giP_{eka3QI^DL{ zee=6Wdv$%WxSTEwid2Bl zD*Rox|NYJ1eNiHR8wO|o2PLUud;G^?c~*CV=Nb8Tb6GNgqGf;)eG*wR|*aau}f^SlL^V42eBPM{dd=B`5+V>{-2Y)R> zf4dbx6G(#!C=)XnfGie-y%HWq=ms#TC_1BpA~=G~6+lPQfLSDkG?;-)*k;7yghl9r zIOqGVXoqG;M}e3^z0!ul zcO7pifchtQ9(YcNc!yu8h^IDqerR%r6=IPXU&GXgD9HX>#@97t7JusmfZmaHfOv*D z2y}VKETM893Sx>%h)Qu-fZX>Tu4slp7>hqOh8;MHq*#i}bBeH+i7>*4lQ=u__K9aG zjKg9sVaSM@cSpdejB>+_Ayef zq*nvtj8n%^$Al6Lc~Tb{LaiYrGi5#2c!~cAPK~G>&qx%T;CGYLbR$%P`?GjVLVo@z zlJ1j6@2HK)$aW2MJ1zNmxFV6#$b?U}j$%iP<^C8>OviD(hdvy4evl`VGr2{(SdljA zUIuwLFPW2nhm3yrgH9QB*fNq+M3wzTK6~R>SxInkhe@{=l5+Gu_vM6NNpmFWYeObq zE2)%wg_U(QkHP4bQ7IQDNsRNBl6li}pVwP^M}}lKjekjAQaP2_2$Ht8FJ+mL9E6y0 z0ViSCjRND4D;SgVA(;9&cP3F*TIYj zgzhMr(CA_J29T2}mkZX8kJ+2E`J0TPYD<<)PY0B`Ihd!{ivn4c`sJLyM4S(qB%bJ( zJm{Or=^xOUn^qW`J2-#z=AF5?D`Q!U{sGB`%A{TofRx?n#R9c~$axp6D}f zQZsBsNjukhj0^abLf9f6xk0sIp9DI2)k&J~fsPv}U7nODnA4!oGec7Tf`EE}VEHief(Wtc;{ zEhU2s*dd8(n1s$jaRPYRx~cWw)GRAu_BONXbld8??}mgd={*@$LdKrwdapH^uOvFJj~baRIDHJ2rL{<&$r_Xgt7WF@i;CK&)Y+(B zim&H-tY(y;;p&APn`rTRseOrg6RN55I&lFzvhgsK{MxU`NwTUcuA+&uE{irUD6%yB zk-QnLSU9uU_Dl#0pf3Jmd0WD*)mpUmhp`0tv!un7&*`lb>#+D4wJ)oj(7Lk()jYe@ zUr)=V6pO81Td_!+usOR;S*uNp#ZC0 zkeN*zMYqVglO%(M3%af(LKp|QrYp6A>r9_(h%2+Iyeued+k1eIXt?VuZeQDL{5U%h=&$|TzV3^^ z6r;ZuN|W6CztKyf2|U2o%fI)Fx^PP+0vy5WYq{fhwUNfV%WJp7cDfEMVag@DYFoOg z3z^mX!M(d_EzH8~O2D35zEmqOCyc@>9KK<>!S8!)VFbhS%fkn=zn{XvhY>X)h@JK; zzD9h+r6+yE!o(uH!=3WPRD;1aHpT4QyqfWR>03YwH@bMoWoR0g`dY&_d_4!;ve-$+ zSZ2m69HAAg##9%?LhNAlyTDt###ijZWkF`*!Vzi6ku1rbn8x**!Bm`YlCjCH7{&2eV~QNZckGK`^?j#YaenNGHkUcB z{K`ID$3(`;tz5{pY|DfD$?*%q(n7>bd`6||y()Ul!7R+4Dl%h%YzDNl$63j3e00c* z$$J@4u{uXS3GS8T3&a}+T z=`7FcEFiP?Z!9&S#GKFJEY2_~#Rc8E-{#KEJj@Kp&#GL!u$;>CG`jHY(ED6#MV!s# zoIzs@&hfm_AdS&>H#i4=-PcU3i`E>wI89J36$?0oJV16yi2c_}A~Kirm_E+O?8giMCvwvJ;Yr)j?I(&0S2xWz={j+`|nX(Ino!8b|)zT}|1I z&ihKMhUj-68p{+-nKj!iC=1sipS4-+PVP z#^qPWU9R7&%XTTb4esC%9*<^4-3fTz=$+7Cwt-3mXqZ^uN&QtV=ulyVhj`VkVJd$S zzOnza;+FwXFn)?oYwNY$dj=gk2 zS_>k>4>2i%1M=2>RC=irj_cL-Y_Odgkp7pZY=6n z!CSQ+=j34^y-u*v4T9rYbG&XHC9bQxuB^@h?9Wx~hkc0qiCAZh?5%km)gIEV{+_?l z>=%UM-43DsQhC&_=TNTF6GeiA4(LnHOzEEJP%-A2G=}f)eMk)MbS&%&drKJ`oI;k> zExzvj&OW|p-uIrgq%H9H6zia#u5_31&-9~?PG+<9@QY5ao^D+gf75(1?5nNuAFo|*@;A)#FW>S;4f8XfT`W!WH!oft^o{d7U-G}q^FNPjbPe=F zFVk&C^hX~o`Hu8UpVvCf^qdpOhfdW_|MWN(_4M9DHHh`6T4Bc?bLC$3f*kJ5K3-rS z_H=$TIHZtO8a)RIs!aF54rTUdFEMasl^dyYBs8N?OlRs&_eHOGX&5`ilSP-ZAq2H(X?D&{(>xD1+Fpmq2 zKdPml`mcYJNf)}UKlre3`+*LlqH3gGC-JxM`)CE;OeOmeC!&x4`%I7e$FKZAJNL`) a{Nye9&oBLCnf%jl{nwBE*?+4A0028g3qjfd literal 0 HcmV?d00001 diff --git a/Docs/thermal_lift_time.gif b/Docs/thermal_lift_time.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1b273f54b07b7a0173e49ed2f67374016be293e GIT binary patch literal 6042 zcmV;L7iH*2Nk%v~Vb20d0g(Uz00000{{a600RR90EC2ui0M7zR0RRI2oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoKZ!0Y}`>H&EGpz*j7-iXMiQzB$Or__V= zcdcrX*;;oC)?Jn1GVYrro7XdRyU32q#%j4eRTt;){L%gm*C!YhIN&yjm~puDm*_~b z7!&zO>CiPO6+*%JEsc-cs*IVyRITB*A7+RBHz-pFk|kF=db6_64`VPePDE?(4$ICrdi6=L#U)t z6;PE5wdzZ!XR>NlM9%A13s*mg9SiBK3bkli$}3wHZcVmrEzxCmx9$Q}a*y`q@b_n6 zo_Y0dx;I#6Vz68dYgjx1^2u0|MHWtY*>Gl}o9kxmjJ7h)#*Rmm_5pfqFVPWM6Fyx! za%vH-5w4ycwRT$Au_xjVp_?DF;PZ$>`90M54&;J+DhK!6H}Brdr=z3Z6f1VK%q?!m zYF*Fwx#0~&m)6~4`R(bmkAJ-0Pkb(4hk@7IY$GTfE2s zjWDigMU2qt2pEqD*ytjO>-hLu6+kv{WEuOUcngjaO_AgSQ9k43bxur)q>yZ|#UwUW z8c~~;8DROOhbM}O0hu##NhC2{T6JcIAfQR*mtEQE0i7D?S*LpMxrJvufpQ?{2!#eU zs11-E8Umw;;+5!5Z>ng7qm5cxrk6ip`T?Jrmh`7xk)kFbr*oQ0>Zo4ahiaa!rs`0r z)uEEutF8vHQYrP>+JUFxBswXKtqjKNtxmKF{-3H46x%Da7{LO7viL=NAhkC*+bpi# zSnCS6Ghj<7xb}=1t+f1k8w|QKh#Ri9f~KM_i|)4ID@wk|T422J+Q4qM@1{#bzwK_T zY`OU6Xs(qp)T@HPoF(j&yz?$R@lyrs`<=nNXiV|76-Nv*@v7!>94gAyid-@b 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 Uh7~)OY+18s(WX_qmS6z@J1yW;WdHyG literal 0 HcmV?d00001 diff --git a/Nasal/compat_layer.nas b/Nasal/compat_layer.nas index a91a0ccd7..dd90543f9 100644 --- a/Nasal/compat_layer.nas +++ b/Nasal/compat_layer.nas @@ -7,21 +7,19 @@ # function purpose # # setVisibility to set the visibility to a given value +# setLift to set lift to given value # setRain to set rain to a given value # setSnow to set snow to a given value # setTurbulence to set turbulence to a given value # setTemperature to set temperature to a given value # setPressure to set pressure to a given value # setDewpoint to set the dewpoint to a given value +# setLight to set light saturation to given value # setWind to set wind # setWindSmoothly to set the wind gradually across a second -# smooth_wind_loop helper function for setWindSmoothly +# smooth_wind_loop (helper function for setWindSmoothly) # create_cloud to place a single cloud into the scenery # create_cloud_array to place clouds from storage arrays into the scenery -# move_cloud to move the cloud position -# remove_clouds to remove clouds by tile index -# waiting_loop to ensure tile removal calls do not overlap -# remove_tile_loop to remove a fixed number of clouds per frame # get_elevation to get the terrain elevation at given coordinates # get_elevation_vector to get terrain elevation at given coordinate vector @@ -68,72 +66,35 @@ # The compatibility layer is currently work in progress and will be extended as new Nasal # APIs are being added to FlightGear. -########################################### -# header checking availability of functions -########################################### - - -var has_symbol = func(s) contains(globals,s); -var is_function = func(s) typeof(globals[s])=='func'; -var has_function = func(f) has_symbol(f) and is_function(f); - -# try to call a function with given parameters -# save exceptions to err vector -# returns 0 for no exceptions (exceptions vector is empty) -# returns >=1 for exception occurred (i.e. unsupported API call) - - -var try_call = func(f, params) { -var err=[]; -call(globals[f], params, nil,nil,err); # see http://plausible.org/nasal/lib.html -return size(err); -}; - - -var query = func(api,params) { - if ( has_function(api) ) { - return try_call(api, params ); - } - return 1; # fail -} - -var patches = { geodinfo: "http://flightgear.org/forums/viewtopic.php?f=5&t=7358&st=0&sk=t&sd=a&start=90#p82805", }; - -# query fgfs binary for required APIs and set values in this hash -var features = {}; - - -#fixme: compare results from new and old API -var check_geodinfo_vec = func { - var err=[]; - - if ( query('geodinfo',[ [37.618,-122.374],1000])==0 ) { - printf("geodinfo found"); # now try to use it - var ksfo=[37.618, -122.374]; - var alt=10000; - # see if it returns a vector or not - call( func { print (alt); (typeof(geodinfo(ksfo,alt))=='vector')?return:die(); }, [], caller()[0],nil,err); - print('-','geodinfo:', (size(err) >=1) ? "Vector support unavailable" : "Vector support available"); - if(size(err) and contains(patches,'geodinfo')) print('---> A patch is available at ', patches['geodinfo']); - - return size(err)?0:1; - } - return 0; -} _setlistener("/sim/signals/nasal-dir-initialized", func { - print ("Compatibility layer: Checking available Nasal APIs:"); - print ("(this may cause harmless error messages when hard-coded support is lacking)"); - print ("##########################################"); - features.geodinfo_supports_vectors= check_geodinfo_vec (); - print("features.geodinfo_supports_vectors=", features.geodinfo_supports_vectors); - print ("##########################################"); - print("Compatibility checks done."); + +var result = "yes"; + +print("Compatibility layer: testing for hard coded support"); + +if (props.globals.getNode("/rendering/scene/saturation", 0) == nil) + {result = "no"; features.can_set_light = 0;} +else + {result = "yes"; features.can_set_light = 1;} +print("* can set light saturation: "~result); + + +if (props.globals.getNode("/environment/terrain", 0) == nil) + {result = "no"; features.terrain_presampling = 0;} +else + {result = "yes"; features.terrain_presampling = 1;} +print("* hard coded terrain presampling: "~result); + +if (props.globals.getNode("/environment/config/enabled", 0) == nil) + {result = "no"; features.can_disable_environment = 0;} +else + {result = "yes"; features.can_disable_environment = 1;} +print("* can disable global weather: "~result); + +print("Compatibility layer: tests done."); }); -# this is now where we can simply refer to features.geodinfo_supports_vectors -# for checking if vector support is available or not - to use the most appropriate -# APIs @@ -143,20 +104,38 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { var setVisibility = func (vis) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update all entries in config and reinit environment +if (features.can_disable_environment == 1) + { + setprop("/environment/visibility-m",vis); + } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update all entries in config and reinit environment -var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); -foreach (var e; entries_aloft) { - e.getNode("visibility-m",1).setValue(vis); - } + var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); + foreach (var e; entries_aloft) { + e.getNode("visibility-m",1).setValue(vis); + } -var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); -foreach (var e; entries_boundary) { - e.getNode("visibility-m",1).setValue(vis); - } -fgcommand("reinit", props.Node.new({subsystem:"environment"})); + var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); + foreach (var e; entries_boundary) { + e.getNode("visibility-m",1).setValue(vis); + } + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } +} +#################################### +# set thermal lift to given value +#################################### + +var setLift = func (lift) { + +if (features.can_disable_environment == 1) + { + setprop("/environment/wind-from-down-fps",lift); + } } #################################### @@ -193,24 +172,36 @@ setprop("environment/metar/snow-norm",snow); var setTurbulence = func (turbulence) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update all entries in config and reinit environment +if (features.can_disable_environment == 1) + { + setprop("/environment/turbulence/magnitude-norm",turbulence); + setprop("/environment/turbulence/rate-hz",3.0); + } -var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); -foreach (var e; entries_aloft) { - e.getNode("turbulence/magnitude-norm",1).setValue(turbulence); - } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update all entries in config and reinit environment -# turbulence is slightly reduced in boundary layers + var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); + foreach (var e; entries_aloft) { + e.getNode("turbulence/magnitude-norm",1).setValue(turbulence); + e.getNode("turbulence/rate-hz",1).setValue(3.0); + e.getNode("turbulence/factor",1).setValue(1.0); + } -var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); -var i = 1; -foreach (var e; entries_boundary) { - e.getNode("turbulence/magnitude-norm",1).setValue(turbulence * 0.25*i); - i = i + 1; - } -fgcommand("reinit", props.Node.new({subsystem:"environment"})); + # turbulence is slightly reduced in boundary layers + var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); + var i = 1; + foreach (var e; entries_boundary) { + e.getNode("turbulence/magnitude-norm",1).setValue(turbulence * 0.25*i); + e.getNode("turbulence/rate-hz",1).setValue(5.0); + e.getNode("turbulence/factor",1).setValue(1.0); + i = i + 1; + } + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } } @@ -220,11 +211,18 @@ fgcommand("reinit", props.Node.new({subsystem:"environment"})); var setTemperature = func (T) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update the entry in config and reinit environment - -setprop(ec~"boundary/entry[0]/temperature-degc",T); -fgcommand("reinit", props.Node.new({subsystem:"environment"})); +if (features.can_disable_environment == 1) + { + setprop("/environment/temperature-sea-level-degc",T); + } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update the entry in config and reinit environment + + setprop(ec~"boundary/entry[0]/temperature-degc",T); + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } } #################################### @@ -233,12 +231,19 @@ fgcommand("reinit", props.Node.new({subsystem:"environment"})); var setPressure = func (p) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update the entry in config and reinit environment +if (features.can_disable_environment == 1) + { + setprop("/environment/pressure-sea-level-inhg",p); + } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update the entry in config and reinit environment -setprop(ec~"boundary/entry[0]/pressure-sea-level-inhg",p); -setprop(ec~"aloft/entry[0]/pressure-sea-level-inhg",p); -fgcommand("reinit", props.Node.new({subsystem:"environment"})); + setprop(ec~"boundary/entry[0]/pressure-sea-level-inhg",p); + setprop(ec~"aloft/entry[0]/pressure-sea-level-inhg",p); + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } } #################################### @@ -247,11 +252,30 @@ fgcommand("reinit", props.Node.new({subsystem:"environment"})); var setDewpoint = func (D) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update the entry in config and reinit environment +if (features.can_disable_environment == 1) + { + setprop("/environment/dewpoint-sea-level-degc",D); + } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update the entry in config and reinit environment -setprop(ec~"boundary/entry[0]/dewpoint-degc",D); -fgcommand("reinit", props.Node.new({subsystem:"environment"})); + setprop(ec~"boundary/entry[0]/dewpoint-degc",D); + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } +} + +#################################### +# set light saturation to given value +#################################### + +var setLight = func (s) { + +if (features.can_set_light == 1) + { + setprop("/rendering/scene/saturation",s); + } } ########################################################### @@ -261,23 +285,30 @@ fgcommand("reinit", props.Node.new({subsystem:"environment"})); var setWind = func (dir, speed) { -# this is a rather dirty workaround till a better solution becomes available -# essentially we update all entries in config and reinit environment +if (features.can_disable_environment == 1) + { + setprop("/environment/wind-from-heading-deg",dir); + setprop("/environment/wind-speed-kt",speed); + } +else + { + # this is a workaround for systems which lack hard-coded support + # essentially we update all entries in config and reinit environment + + var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); + foreach (var e; entries_aloft) { + e.getNode("wind-from-heading-deg",1).setValue(dir); + e.getNode("wind-speed-kt",1).setValue(speed); + } -var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); -foreach (var e; entries_aloft) { - e.getNode("wind-from-heading-deg",1).setValue(dir); - e.getNode("wind-speed-kt",1).setValue(speed); - } - -var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); -foreach (var e; entries_boundary) { - e.getNode("wind-from-heading-deg",1).setValue(dir); - e.getNode("wind-speed-kt",1).setValue(speed); - } - -fgcommand("reinit", props.Node.new({subsystem:"environment"})); + var entries_boundary = props.globals.getNode("environment/config/boundary", 1).getChildren("entry"); + foreach (var e; entries_boundary) { + e.getNode("wind-from-heading-deg",1).setValue(dir); + e.getNode("wind-speed-kt",1).setValue(speed); + } + fgcommand("reinit", props.Node.new({subsystem:"environment"})); + } } ########################################################### @@ -288,21 +319,29 @@ fgcommand("reinit", props.Node.new({subsystem:"environment"})); var setWindSmoothly = func (dir, speed) { -var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); +if (features.can_disable_environment == 1) + { + setWind(dir, speed); + } +else + { -var dir_old = entries_aloft[0].getNode("wind-from-heading-deg",1).getValue(); -var speed_old = entries_aloft[0].getNode("wind-speed-kt",1).getValue(); + var entries_aloft = props.globals.getNode("environment/config/aloft", 1).getChildren("entry"); -var dir = dir * math.pi/180.0; -var dir_old = dir_old * math.pi/180.0; + var dir_old = entries_aloft[0].getNode("wind-from-heading-deg",1).getValue(); + var speed_old = entries_aloft[0].getNode("wind-speed-kt",1).getValue(); -var vx = speed * math.sin(dir); -var vx_old = speed_old * math.sin(dir_old); + var dir = dir * math.pi/180.0; + var dir_old = dir_old * math.pi/180.0; -var vy = speed * math.cos(dir); -var vy_old = speed_old * math.cos(dir_old); + var vx = speed * math.sin(dir); + var vx_old = speed_old * math.sin(dir_old); -smooth_wind_loop(vx,vy,vx_old, vy_old, 4, 4); + var vy = speed * math.cos(dir); + var vy_old = speed_old * math.cos(dir_old); + + smooth_wind_loop(vx,vy,vx_old, vy_old, 4, 4); + } } @@ -335,10 +374,35 @@ var create_cloud = func(path, lat, long, alt, heading) { var tile_counter = getprop(lw~"tiles/tile-counter"); var buffer_flag = getprop(lw~"config/buffer-flag"); -var dynamics_flag = getprop(lw~"config/dynamics-flag"); var d_max = weather_tile_management.cloud_view_distance + 1000.0; +# check if we deal with a convective cloud + +var convective_flag = 0; + +if (find("cumulus",path) != -1) + { + if ((find("alto",path) != -1) or (find("cirro", path) != -1) or (find("strato", path) != -1)) + {convective_flag = 0;} + else if ((find("small",path) != -1) or (find("whisp",path) != -1)) + {convective_flag = 1;} + else if (find("bottom",path) != -1) + {convective_flag = 4;} + else + {convective_flag = 2;} + + } +else if (find("congestus",path) != -1) + { + if (find("bottom",path) != -1) + {convective_flag = 5;} + else + {convective_flag = 3;} + } + +#print("path: ", path, " flag: ", convective_flag); + # first check if the cloud should be stored in the buffer # we keep it if it is in visual range or at high altitude (where visual range is different) @@ -352,8 +416,17 @@ if (buffer_flag == 1) if ((d > d_max) and (alt < 20000.0)) # we buffer the cloud { - var b = weather_tile_management.cloudBuffer.new(lat, long, alt, path, heading, tile_counter); - if (dynamics_flag ==1) {b.timestamp = weather_dynamics.time_lw;} + var b = weather_tile_management.cloudBuffer.new(lat, long, alt, path, heading, tile_counter, convective_flag); + if (local_weather.dynamics_flag ==1) + { + b.timestamp = weather_dynamics.time_lw; + if (convective_flag !=0) # Cumulus clouds get some extra info + { + b.evolution_timestamp = cloud_evolution_timestamp; + b.flt = cloud_flt; + b.rel_alt = alt - cloud_mean_altitude; + } + } append(weather_tile_management.cloudBufferArray,b); return; } @@ -364,10 +437,12 @@ if (buffer_flag == 1) if (getprop(lw~"tmp/buffer-status") == "placing") { - tile_counter = getprop(lw~"tmp/buffer-tile-index"); + #tile_counter = getprop(lw~"tmp/buffer-tile-index"); + tile_counter = buffered_tile_index; } + # if the cloud is not buffered, get property tree nodes and write it # into the scenery @@ -382,6 +457,7 @@ var cloud_number = n.getNode("placement-index").getValue(); cl = c.getChild("cloud", i, 1); n.getNode("placement-index").setValue(i); + var placement_index = i; var model_number = n.getNode("model-placement-index").getValue(); var m = props.globals.getNode("models", 1); @@ -397,8 +473,6 @@ var latN = cl.getNode("position/latitude-deg", 1); latN.setValue(lat); var lonN = cl.getNode("position/longitude-deg", 1); lonN.setValue(long); var altN = cl.getNode("position/altitude-ft", 1); altN.setValue(alt); var hdgN = cl.getNode("orientation/true-heading-deg", 1); hdgN.setValue(heading); -#var pitchN = cl.getNode("orientation/pitch-deg", 1); pitchN.setValue(0.0); -#var rollN = cl.getNode("orientation/roll-deg", 1);rollN.setValue(0.0); cl.getNode("tile-index",1).setValue(tile_counter); @@ -407,35 +481,57 @@ model.getNode("latitude-deg-prop", 1).setValue(latN.getPath()); model.getNode("longitude-deg-prop", 1).setValue(lonN.getPath()); model.getNode("elevation-ft-prop", 1).setValue(altN.getPath()); model.getNode("heading-deg-prop", 1).setValue(hdgN.getPath()); -#model.getNode("pitch-deg-prop", 1).setValue(pitchN.getPath()); -#model.getNode("roll-deg-prop", 1).setValue(rollN.getPath()); model.getNode("tile-index",1).setValue(tile_counter); model.getNode("load", 1).remove(); -n.getNode("cloud-number").setValue(n.getNode("cloud-number").getValue()+1); # sort the model node into a vector for easy deletion - # append(weather_tile_management.modelArrays[tile_counter-1],model); # sort the cloud into the cloud hash array -if ((buffer_flag == 1) and (getprop(lw~"tmp/tile-management") != "single tile")) +if (buffer_flag == 1) { - var cs = weather_tile_management.cloudScenery.new(tile_counter, cl, model); + var cs = weather_tile_management.cloudScenery.new(tile_counter, convective_flag, cl, model); append(weather_tile_management.cloudSceneryArray,cs); } -# if weather dynamics is on, also create a timestamp property and sort the cloud node into quadtree +# if weather dynamics is on, also create a timestamp property and sort the cloud hash into quadtree -#if (getprop(lw~"config/dynamics-flag") == 1) -if (dynamics_flag == 1) +if (local_weather.dynamics_flag == 1) { - cl.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); - var blat = getprop(lw~"tiles/tmp/latitude-deg"); - var blon = getprop(lw~"tiles/tmp/longitude-deg"); - var alpha = getprop(lw~"tmp/tile-orientation-deg"); - weather_dynamics.sort_into_quadtree(blat, blon, alpha, lat, long, weather_dynamics.cloudQuadtrees[tile_counter-1], cl); + cs.timestamp = weather_dynamics.time_lw; + cs.write_index = placement_index; + + if (convective_flag !=0) # Cumulus clouds get some extra info + { + cs.evolution_timestamp = cloud_evolution_timestamp; + cs.flt = cloud_flt; + cs.rel_alt = alt - cloud_mean_altitude; + cs.target_alt = alt; + } + + if (getprop(lw~"tmp/buffer-status") == "placing") + { + var blat = buffered_tile_latitude; + var blon = buffered_tile_longitude; + var alpha = buffered_tile_alpha; + #var blat1 = getprop(lw~"tiles/tmp/latitude-deg"); + #var blon1 = getprop(lw~"tiles/tmp/longitude-deg"); + #var alpha1 = getprop(lw~"tmp/tile-orientation-deg"); + + #print("Lat: ", blat1, " ", blat); + #print("Lon: ", blon1, " ", blon); + #print("Alp: ", alpha1, " ", alpha); + + } + else + { + var blat = getprop(lw~"tiles/tmp/latitude-deg"); + var blon = getprop(lw~"tiles/tmp/longitude-deg"); + var alpha = getprop(lw~"tmp/tile-orientation-deg"); + } + weather_dynamics.sort_into_quadtree(blat, blon, alpha, lat, long, weather_dynamics.cloudQuadtrees[tile_counter-1], cs); } } @@ -451,12 +547,13 @@ if (getprop(lw~"tmp/thread-status") != "placing") {return;} if (getprop(lw~"tmp/convective-status") != "idle") {return;} if ((i < 0) or (i==0)) { - print("Cloud placement from array finished!"); + if (local_weather.debug_output_flag == 1) + {print("Cloud placement from array finished!"); } setprop(lw~"tmp/thread-status", "idle"); # now set flag that tile has been completely processed var dir_index = props.globals.getNode(lw~"tiles/tmp/dir-index").getValue(); - # print("dir_index: ",dir_index); + props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2); return; @@ -470,6 +567,12 @@ if (s < k_max) {k_max = s;} for (var k = 0; k < k_max; k = k+1) { + if (getprop(lw~"config/dynamics-flag") ==1) + { + cloud_mean_altitude = local_weather.clouds_mean_alt[s-k-1]; + cloud_flt = local_weather.clouds_flt[s-k-1]; + cloud_evolution_timestamp = local_weather.clouds_evolution_timestamp[s-k-1]; + } create_cloud(clouds_path[s-k-1], clouds_lat[s-k-1], clouds_lon[s-k-1], clouds_alt[s-k-1], clouds_orientation[s-k-1]); } @@ -479,144 +582,19 @@ setsize(clouds_lon,s-k_max); setsize(clouds_alt,s-k_max); setsize(clouds_orientation,s-k_max); +if (getprop(lw~"config/dynamics-flag") ==1) + { + setsize(local_weather.clouds_mean_alt,s-k_max); + setsize(local_weather.clouds_flt,s-k_max); + setsize(local_weather.clouds_evolution_timestamp,s-k_max); + } + settimer( func {create_cloud_array(i - k, clouds_path, clouds_lat, clouds_lon, clouds_alt, clouds_orientation ) }, 0 ); }; -#################################################### -# move a cloud -#################################################### - -var move_cloud = func (c, tile_index) { - -# get the old spacetime position of the cloud - -var lat_old = c.getNode("position/latitude-deg").getValue(); -var lon_old = c.getNode("position/longitude-deg").getValue(); -var alt = c.getNode("position/altitude-ft").getValue(); -var timestamp = c.getNode("timestamp-sec").getValue(); - -# get windfield and time since last update - -var windfield = weather_dynamics.get_windfield(tile_index); -var dt = weather_dynamics.time_lw - timestamp; - -#print(dt * windfield[1]); - -# update the spacetime position of the cloud - -c.getNode("position/latitude-deg",1).setValue(lat_old + windfield[1] * dt * local_weather.m_to_lat); -c.getNode("position/longitude-deg",1).setValue(lon_old + windfield[0] * dt * local_weather.m_to_lon); -c.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); - -} -#################################################### -# remove clouds by tile index -#################################################### - -var remove_clouds = func (index) { - -var n = size(props.globals.getNode("local-weather/clouds").getChild("tile",index,1).getChildren("cloud")); -props.globals.getNode("local-weather/clouds", 1).removeChild("tile",index); -setprop(lw~"clouds/cloud-number",getprop(lw~"clouds/cloud-number")-n); - -if (getprop(lw~"tmp/thread-flag") == 1) - {settimer( func {waiting_loop(index); },0);} -else - { - var modelNode = props.globals.getNode("models", 1).getChildren("model"); - foreach (var m; modelNode) - { - if (m.getNode("tile-index",1).getValue() == index) {m.remove();} - } - } - - -} - - - -# this is to avoid two tile removal loops starting at the same time - -var waiting_loop = func (index) { - -var status = getprop(lw~"tmp/thread-status"); - -if (status == "idle") {remove_tile_loop(index);} - -else { - print("Removal of ",index, " waiting for idle thread..."); - settimer( func {waiting_loop(index); },1.0); - } -} - - -var remove_tile_loop = func (index) { - -var n = 100; - -var flag_mod = 0; - - -var status = getprop(lw~"tmp/thread-status"); - -if ((status == "computing") or (status == "placing")) # the array is blocked - { - settimer( func {remove_tile_loop(index); },0); # try again next frame - return; - } -else if (status == "idle") # we initialize the loop - { - mvec = weather_tile_management.modelArrays[index-1]; - msize = size(mvec); - if (msize == 0) - { - print("Tile deletion loop finished!"); - setprop(lw~"tmp/thread-status", "idle"); - setprop(lw~"clouds/placement-index",0); - setprop(lw~"clouds/model-placement-index",0); - setsize(weather_tile_management.modelArrays[index-1],0); - return; - } - setprop(lw~"tmp/last-reading-pos-mod", msize); - setprop(lw~"tmp/thread-status", "removing"); - } - -var lastpos = getprop(lw~"tmp/last-reading-pos-mod"); - - -if (lastpos < (msize-1)) {var istart = lastpos;} else {var istart = (msize-1);} - -if (istart<0) {istart=0;} - -var i_min = istart - n; -if (i_min < -1) {i_min =-1;} - -for (var i = istart; i > i_min; i = i- 1) - { - m = mvec[i]; - m.remove(); - } - -if (i<0) {flag_mod = 1;} - - -if (flag_mod == 0) {setprop(lw~"tmp/last-reading-pos-mod",i); } - -if (flag_mod == 0) # we still have work to do - {settimer( func {remove_tile_loop(index); },0);} -else - { - print("Tile deletion loop finished!"); - setprop(lw~"tmp/thread-status", "idle"); - setprop(lw~"clouds/placement-index",0); - setprop(lw~"clouds/model-placement-index",0); - setsize(weather_tile_management.modelArrays[index-1],0); - } - -} @@ -629,7 +607,8 @@ var get_elevation = func (lat, lon) { var info = geodinfo(lat, lon); if (info != nil) {var elevation = info[0] * local_weather.m_to_ft;} - else {var elevation = -1.0;} + else {var elevation = -1.0; } + return elevation; } @@ -643,17 +622,12 @@ var get_elevation_array = func (lat, lon) { var elevation = []; var n = size(lat); -if (features.geodinfo_supports_vectors == 0) + +for(var i = 0; i < n; i=i+1) { - for(var i = 0; i < n; i=i+1) - { - append(elevation, get_elevation(lat[i], lon[i])); - } - } -else - { - elevation = geodinfo(lat,10000); + append(elevation, get_elevation(lat[i], lon[i])); } + return elevation; } @@ -673,3 +647,20 @@ var ec = "/environment/config/"; var mvec = []; var msize = 0; + +# available hard-coded support + +var features = {}; + +# globals to transmit info if clouds are written from buffer + +var buffered_tile_latitude = 0.0; +var buffered_tile_longitude = 0.0; +var buffered_tile_alpha = 0.0; +var buffered_tile_index = 0; + +# globals to handle additional info for Cumulus cloud dynamics + +var cloud_mean_altitude = 0.0; +var cloud_flt = 0.0; +var cloud_evolution_timestamp = 0.0; diff --git a/Nasal/local_weather.nas b/Nasal/local_weather.nas index 21badfc29..0b0240b2c 100644 --- a/Nasal/local_weather.nas +++ b/Nasal/local_weather.nas @@ -1,7 +1,7 @@ ######################################################## # routines to set up, transform and manage local weather -# Thorsten Renk, July 2010 +# Thorsten Renk, October 2010 # thermal model by Patrice Poly, April 2010 ######################################################## @@ -10,19 +10,24 @@ # calc_geo to compute the latitude to meter conversion # calc_d_sq to compute a distance square in local Cartesian approximation # effect_volume_loop to check if the aircraft has entered an effect volume -# assemble_effect_array to create a Nasal internal array with pointers to all effect volumes +# assemble_effect_array to store the size of the effect volume array # add_vectors to add two vectors in polar coordinates # wind_altitude_interpolation to interpolate aloft winds in altitude # wind_interpolation to interpolate aloft winds in altitude and position # interpolation_loop to continuously interpolate weather parameters between stations -# thermal_lift _loop to manage the detailed thermal lift model # thermal_lift_start to start the detailed thermal model +# thermal_lift_loop to manage the detailed thermal lift model +# thermal_lift_stop to end the detailed thermal lift model +# wave_lift_start to start the detailed wave lift model +# wave_lift_loop to manage the detailed wave lift model +# wave_lift_stop to end the detailed wave lift model # effect_volume_start to manage parameters when an effect volume is entered # effect_volume_stop to manage parameters when an effect volume is left # ts_factor (helper function for thermal lift model) # tl_factor (helper function for thermal lift model) # calcLift_max to calculate the maximal available thermal lift for given altitude # calcLift to calculate the thermal lift at aircraft position +# calcWaveLift to calculate wave lift at aircraft position # select_cloud_model to select a path to the cloud model, given the cloud type and subtype # create_cloud_vec to place a single cloud into an array to be written later # clear_all to remove all clouds, effect volumes and weather stations and stop loops @@ -31,6 +36,7 @@ # create_cumosys wrapper to place a convective cloud system based on terrain coverage # cumulus_loop to place 25 Cumulus clouds each frame # create_cumulus to place a convective cloud system based on terrain coverage +# recreate_cumulus to respawn convective clouds as part of the convective dynamics algorithm # cumulus_exclusion_layer to create a layer with 'holes' left for thunderstorm placement # create_rise_clouds to create a barrier cloud system # create_streak to create a cloud streak @@ -41,22 +47,33 @@ # terrain_presampling_loop to sample 25 terrain points per frame # terrain_presampling to sample terrain elevation at a random point within specified area # terrain_presampling_analysis to analyze terrain presampling results +# wave_detection_loop to detect if and where wave lift should be placed (currently unfinished) # get_convective_altitude to determine the altitude at which a Cumulus cloud is placed # manage presampling to take proper action when a presampling call has been finished # set_wind_model_flag to convert the wind model string into an integer flag +# set_texture_mix to determine the texture mix between smooth and rough cloud appearance # create_effect_volume to create an effect volume # set_weather_station to specify a weather station for interpolation # set_wind_ipoint to set an aloft wind interpolation point # showDialog to pop up a dialog window +# readFlags to read configuration flags from the property tree into Nasal variables at startup # streak_wrapper wrapper to execute streak from menu # convection wrapper wrapper to execute convective clouds from menu # barrier wrapper wrapper to execute barrier clouds from menu # single_cloud_wrapper wrapper to create single cloud from menu # layer wrapper wrapper to create layer from menu # box wrapper wrapper to create a cloudbox (experimental) -# set aloft wrapper wrapper to create aloft winds from menu +# set_aloft wrapper wrapper to create aloft winds from menu # set_tile to call a weather tile creation from menu # startup to prepare the package at startup +# test to serve as a testbed for new functions + +# object purpose + +# weatherStation to store info about weather conditions +# effectVolume to store effect volume info and provide methods to move and time-evolve effect volumes +# thermalLift to store thermal info and provide methods to move and time-evolve a thermal +# waveLift to store wave info ################################### # geospatial helper functions @@ -89,8 +106,7 @@ return (x*x + y*y); var effect_volume_loop = func (index, n_active) { var n = 25; -#var evNode = props.globals.getNode("local-weather/effect-volumes", 1).getChildren("effect-volume"); -#var esize = size(evNode); + var esize = n_effectVolumeArray; @@ -102,21 +118,22 @@ if (i_max > esize) {i_max = esize;} for (var i = index; i < i_max; i = i+1) { - #e = evNode[i]; - e = effectVolumeArray[i]; + var e = effectVolumeArray[i]; - var flag = 0; #default assumption is that we're not in the volume - var ealt_min = e.getNode("position/min-altitude-ft").getValue() * ft_to_m; - var ealt_max = e.getNode("position/max-altitude-ft").getValue() * ft_to_m; + var flag = 0; # default assumption is that we're not in the volume + + var ealt_min = e.alt_low * ft_to_m; + var ealt_max = e.alt_high * ft_to_m; + if ((viewpos.alt() > ealt_min) and (viewpos.alt() < ealt_max)) # we are in the correct alt range { # so we load geometry next - var geometry = e.getNode("geometry").getValue(); - var elat = e.getNode("position/latitude-deg").getValue(); - var elon = e.getNode("position/longitude-deg").getValue(); - var rx = e.getNode("volume/size-x").getValue(); - + + var geometry = e.geometry; + var elat = e.lat; + var elon = e.lon; + var rx = e.r1; if (geometry == 1) # we have a cylinder { @@ -126,23 +143,31 @@ for (var i = index; i < i_max; i = i+1) else if (geometry == 2) # we have an elliptic shape { # get orientation - var ry = e.getNode("volume/size-y").getValue(); - var phi = e.getNode("volume/orientation-deg").getValue(); + + var ry = e.r2; + var phi = e.phi; + phi = phi * math.pi/180.0; + + # first get unrotated coordinates var xx = (viewpos.lon() - elon) * lon_to_m; var yy = (viewpos.lat() - elat) * lat_to_m; + # then rotate to align with the shape var x = xx * math.cos(phi) - yy * math.sin(phi); var y = yy * math.cos(phi) + xx * math.sin(phi); + # then check elliptic condition if ((x*x)/(rx*rx) + (y*y)/(ry*ry) <1) {flag = 1;} } else if (geometry == 3) # we have a rectangular shape { # get orientation - var ry = e.getNode("volume/size-y").getValue(); - var phi = e.getNode("volume/orientation-deg").getValue(); + + var ry = e.r2; + var phi = e.phi; + phi = phi * math.pi/180.0; # first get unrotated coordinates var xx = (viewpos.lon() - elon) * lon_to_m; @@ -159,20 +184,20 @@ for (var i = index; i < i_max; i = i+1) # if flag ==1 at this point, we are inside the effect volume # but we only need to take action on entering and leaving, so we check also active_flag - #if (flag==1) {print("Inside volume");} + # if (flag==1) {print("Inside volume");} - var active_flag = e.getNode("active-flag").getValue(); # see if the node was active previously + var active_flag = e.active_flag; if ((flag==1) and (active_flag ==0)) # we just entered the node { - #print("Entered volume"); - e.getNode("active-flag").setValue(1); + #print("Entered volume"); + e.active_flag = 1; effect_volume_start(e); } else if ((flag==0) and (active_flag ==1)) # we left an active node { #print("Left volume!"); - e.getNode("active-flag").setValue(0); + e.active_flag = 0; effect_volume_stop(e); } if (flag==1) {active_counter = active_counter + 1;} # we still count the active volumes @@ -184,7 +209,6 @@ for (var i = index; i < i_max; i = i+1) # therefore we zero them for redundancy here so that the interpolation loop can take over # and set the properties correctly for outside -#print(i); if (i == esize) # we check the number of actives and reset all counters { @@ -196,6 +220,7 @@ if (i == esize) # we check the number of actives and reset all counters vNode.getChild("number-active-rain").setValue(0); vNode.getChild("number-active-lift").setValue(0); vNode.getChild("number-active-turb").setValue(0); + vNode.getChild("number-active-sat").setValue(0); } #print("n_active: ", active_counter); active_counter = 0; i = 0; @@ -215,10 +240,7 @@ if (getprop(lw~"effect-loop-flag") ==1) {settimer( func {effect_volume_loop(i, a var assemble_effect_array = func { -setsize(effectVolumeArray,0); -effectVolumeArray = props.globals.getNode("local-weather/effect-volumes", 1).getChildren("effect-volume"); n_effectVolumeArray = size(effectVolumeArray); -#print("Effect vector size: ",n_effectVolumeArray); } @@ -326,7 +348,6 @@ var interpolation_loop = func { var iNode = props.globals.getNode(lw~"interpolation", 1); var cNode = props.globals.getNode(lw~"current", 1); -var stNode = iNode.getChildren("station"); var viewpos = geo.aircraft_position(); var sum_vis = 0.0; @@ -338,33 +359,53 @@ var sum_norm = 0.0; # get an inverse distance weighted average from all defined weather stations -foreach (var s; stNode) { + +var n_stations = size(weatherStationArray); + +for (var i = 0; i < n_stations; i=i+1) { - var slat = s.getNode("latitude-deg").getValue(); - var slon = s.getNode("longitude-deg").getValue(); + s = weatherStationArray[i]; var stpos = geo.Coord.new(); - stpos.set_latlon(slat,slon,1000.0); + stpos.set_latlon(s.lat,s.lon,0.0); var d = viewpos.distance_to(stpos); if (d <100.0) {d = 100.0;} # to prevent singularity at zero - sum_norm = sum_norm + 1./d; - sum_vis = sum_vis + (s.getNode("visibility-m").getValue()/d); - sum_T = sum_T + (s.getNode("temperature-degc").getValue()/d); - sum_D = sum_D + (s.getNode("dewpoint-degc").getValue()/d); - sum_p = sum_p + (s.getNode("pressure-sea-level-inhg").getValue()/d); + sum_norm = sum_norm + 1./d * s.weight; + + + sum_vis = sum_vis + (s.vis/d) * s.weight; + sum_T = sum_T + (s.T/d) * s.weight; + sum_D = sum_D + (s.D/d) * s.weight; + sum_p = sum_p + (s.p/d) * s.weight; + + # gradually fade in the interpolation weight of newly added stations to + # avoid sudden jumps + + if (s.weight < 1.0) {s.weight = s.weight + 0.1;} # automatically delete stations out of range # take care not to unload if weird values appear for a moment - if ((d > 80000.0) and (d<100000.0)) {s.remove();} + if ((d > 80000.0) and (d<100000.0)) + { + if (debug_output_flag == 1) + {print("Distance to weather station ", d, " m, unloading ...", i);} + weatherStationArray = weather_tile_management.delete_from_vector(weatherStationArray,i); + i = i-1; n_stations = n_stations -1; + } } +setprop(lwi~"station-number", i); + + + var vis = sum_vis/sum_norm; var p = sum_p/sum_norm; var D = sum_D/sum_norm; var T = sum_T/sum_norm; + # a simple altitude model for visibility - increase it with increasing altitude var altitude = getprop("position/altitude-ft"); @@ -446,7 +487,7 @@ else if (wind_model_flag == 5) # aloft waypoint interpolated var altitude_agl = getprop("/position/altitude-agl-ft"); -if (getprop(lw~"tmp/presampling-flag") == 0) +if (presampling_flag == 0) { var boundary_alt = 600.0; var windspeed_ground = windspeed/3.0; @@ -502,64 +543,40 @@ if (getprop(lw~"interpolation-loop-flag") ==1) {settimer(interpolation_loop, 1.0 } -################################### -# thermal lift loop -################################### - -var thermal_lift_loop = func { - -var cNode = props.globals.getNode(lw~"current", 1); -var lNode = props.globals.getNode(lw~"lift",1); - -var apos = geo.aircraft_position(); - -var tlat = lNode.getNode("latitude-deg").getValue(); -var tlon = lNode.getNode("longitude-deg").getValue(); -var tpos = geo.Coord.new(); -tpos.set_latlon(tlat,tlon,0.0); - -var d = apos.distance_to(tpos); -var alt = getprop("position/altitude-ft"); - - -var R = lNode.getNode("radius").getValue(); -var height = lNode.getNode("height").getValue(); -var cn = lNode.getNode("cn").getValue(); -var sh = lNode.getNode("sh").getValue(); -var max_lift = lNode.getNode("max_lift").getValue(); -var f_lift_radius = lNode.getNode("f_lift_radius").getValue(); - -# print(d," ", alt, " ", R, " ", height, " ", cn, " ", sh," ", max_lift," ", f_lift_radius, " ",0.0); - -var lift = calcLift(d, alt, R, height, cn, sh, max_lift, f_lift_radius, 0.0); -# print(lift); - -cNode.getChild("thermal-lift").setValue(lift); - -if (getprop(lw~"lift-loop-flag") ==1) {settimer(thermal_lift_loop, 0);} -} - ################################### # thermal lift loop startup ################################### var thermal_lift_start = func (ev) { -# copy the properties from effect volume to the lift folder +# copy the properties from effect volume to the lift object -var lNode = props.globals.getNode(lw~"lift",1); -lNode.getNode("radius",1).setValue(ev.getNode("effects/radius").getValue()); -lNode.getNode("height",1).setValue(ev.getNode("effects/height").getValue()); -lNode.getNode("cn",1).setValue(ev.getNode("effects/cn").getValue()); -lNode.getNode("sh",1).setValue(ev.getNode("effects/sh").getValue()); -lNode.getNode("max_lift",1).setValue(ev.getNode("effects/max_lift").getValue()); -lNode.getNode("f_lift_radius",1).setValue(ev.getNode("effects/f_lift_radius").getValue()); +l = thermalLift.new(ev.lat, ev.lon, ev.radius, ev.height, ev.cn, ev.sh, ev.max_lift, ev.f_lift_radius); -#lNode.getNode("latitude-deg",1).setValue(ev.getNode("position/latitude-deg").getValue()); -#lNode.getNode("longitude-deg",1).setValue(ev.getNode("position/longitude-deg").getValue()); +l.index = ev.index; -lNode.getNode("latitude-deg",1).alias(ev.getNode("position/latitude-deg")); -lNode.getNode("longitude-deg",1).alias(ev.getNode("position/longitude-deg")); +if (dynamics_flag == 1) + { + l.timestamp = weather_dynamics.time_lw; + if (dynamical_convection_flag == 1) + { + l.flt = ev.flt; + l.evolution_timestamp = ev.evolution_timestamp; + } + } + + + +thermal = l; + +if (debug_output_flag == 1) + { + print("Entering thermal lift..."); + print("strength: ", thermal.max_lift, " radius: ", thermal.radius); + if (dynamical_convection_flag ==1) + {print("fractional lifetime: ", thermal.flt);} + + } # and start the lift loop, unless another one is already running # so we block overlapping calls @@ -569,23 +586,157 @@ if (getprop(lw~"lift-loop-flag") == 0) } +################################### +# thermal lift loop +################################### + +var thermal_lift_loop = func { + +var apos = geo.aircraft_position(); + +var tlat = thermal.lat; +var tlon = thermal.lon; + +var tpos = geo.Coord.new(); +tpos.set_latlon(tlat,tlon,0.0); + +var d = apos.distance_to(tpos); +var alt = getprop("position/altitude-ft"); + +if (dynamical_convection_flag == 1) + {var flt = thermal.flt;} +else + {var flt = 0.5;} + +var lift = calcLift(d, alt, thermal.radius, thermal.height, thermal.cn, thermal.sh, thermal.max_lift, thermal.f_lift_radius, flt); + +if (getprop(lw~"wave-loop-flag") ==1) + { + lift = lift + getprop(lw~"current/wave-lift"); + } + + +setprop(lw~"current/thermal-lift",lift); +compat_layer.setLift(lift); + +# if dynamics is on, move the thermal and occasionally compute altitude and age + +if (dynamics_flag == 1) + { + thermal.move(); + + if ((rand() < 0.01) and (presampling_flag == 1)) # check every 100 frames + { + if (dynamical_convection_flag == 1) + { + thermal.correct_altitude_and_age(); + if (thermal.flt > 1.1) + {thermal_lift_stop();} + } + else + { + thermal.correct_altitude(); + } + } + } + + +if (getprop(lw~"lift-loop-flag") ==1) {settimer(thermal_lift_loop, 0);} +} + + + + + ################################### # thermal lift loop stop ################################### var thermal_lift_stop = func { -# unalias later to avoid an error being generated - -settimer( func { -var lNode = props.globals.getNode(lw~"lift",1); -lNode.getNode("latitude-deg",1).unalias(); -lNode.getNode("longitude-deg",1).unalias(); },0.1); - setprop(lw~"lift-loop-flag",0); setprop(lw~"current/thermal-lift",0.0); +compat_layer.setLift(0.0); + +if (debug_output_flag == 1) + { + print("Leaving thermal lift..."); + } + } + +################################### +# wave lift loop startup +################################### + +var wave_lift_start = func (ev) { + +# copy the properties from effect volume to the wave object + + +w = waveLift.new (ev.lat, ev.lon, ev.r1, ev.r2, ev.phi, ev.height, ev.max_lift); +w.index = ev.index; +wave = w; + +# and start the lift loop, unless another one is already running +# so we block overlapping calls + +if (getprop(lw~"wave-loop-flag") == 0) +{setprop(lw~"wave-loop-flag",1); settimer(wave_lift_loop,0);} + +} + +################################### +# wave lift loop +################################### + +var wave_lift_loop = func { + +var lat = getprop("position/latitude-deg"); +var lon = getprop("position/longitude-deg"); +var alt = getprop("position/altitude-ft"); + + +var phi = wave.phi * math.pi/180.0; + +var xx = (lon - wave.lon) * lon_to_m; +var yy = (lat - wave.lat) * lat_to_m; + +var x = xx * math.cos(phi) - yy * math.sin(phi); +var y = yy * math.cos(phi) + xx * math.sin(phi); + +var lift = calcWaveLift(x,y,alt); + +# check if we are in a thermal, if so set wave lift and let the thermal lift loop add that + +if (getprop(lw~"lift-loop-flag") ==1) + { + setprop(lw~"current/wave-lift",lift); + } +else + { + setprop(lw~"current/thermal-lift",lift); + } + +if (getprop(lw~"wave-loop-flag") ==1) {settimer(wave_lift_loop, 0);} +} + + + + +################################### +# wave lift loop stop +################################### + +var wave_lift_stop = func { + +setprop(lw~"wave-loop-flag",0); +setprop(lw~"current/thermal-lift",0.0); +} + + + #################################### # action taken when in effect volume #################################### @@ -594,70 +745,86 @@ var effect_volume_start = func (ev) { var cNode = props.globals.getNode(lw~"current"); -if (ev.getNode("effects/visibility-flag", 1).getValue()==1) + +if (ev.vis_flag ==1) { # first store the current setting in case we need to restore on leaving - var vis = ev.getNode("effects/visibility-m").getValue(); - ev.getNode("restore/visibility-m",1).setValue(cNode.getNode("visibility-m").getValue()); + var vis = ev.vis; + ev.vis_r = cNode.getNode("visibility-m").getValue(); + # then set the new value in current and execute change cNode.getNode("visibility-m").setValue(vis); compat_layer.setVisibility(vis); # then count the number of active volumes on entry (we need that to determine # what to do on exit) - ev.getNode("restore/number-entry-vis",1).setValue(getprop(lw~"effect-volumes/number-active-vis")); - + ev.n_entry_vis = getprop(lw~"effect-volumes/number-active-vis"); + # and add to the counter setprop(lw~"effect-volumes/number-active-vis",getprop(lw~"effect-volumes/number-active-vis")+1); } -if (ev.getNode("effects/rain-flag", 1).getValue()==1) +#if (ev.getNode("effects/rain-flag", 1).getValue()==1) +if (ev.rain_flag == 1) { - var rain = ev.getNode("effects/rain-norm").getValue(); - ev.getNode("restore/rain-norm",1).setValue(cNode.getNode("rain-norm").getValue()); + var rain = ev.rain; + ev.rain_r = cNode.getNode("rain-norm").getValue(); cNode.getNode("rain-norm").setValue(rain); compat_layer.setRain(rain); - ev.getNode("restore/number-entry-rain",1).setValue(getprop(lw~"effect-volumes/number-active-rain")); + ev.n_entry_rain = getprop(lw~"effect-volumes/number-active-rain"); setprop(lw~"effect-volumes/number-active-rain",getprop(lw~"effect-volumes/number-active-rain")+1); } - -if (ev.getNode("effects/snow-flag", 1).getValue()==1) +if (ev.snow_flag == 1) { - var snow = ev.getNode("effects/snow-norm").getValue(); - ev.getNode("restore/snow-norm",1).setValue(cNode.getNode("snow-norm").getValue()); + var snow = ev.snow; + ev.snow_r = cNode.getNode("snow-norm").getValue(); cNode.getNode("snow-norm").setValue(snow); compat_layer.setSnow(snow); - ev.getNode("restore/number-entry-snow",1).setValue(getprop(lw~"effect-volumes/number-active-snow")); + ev.n_entry_snow = getprop(lw~"effect-volumes/number-active-snow"); setprop(lw~"effect-volumes/number-active-snow",getprop(lw~"effect-volumes/number-active-snow")+1); } - -if (ev.getNode("effects/turbulence-flag", 1).getValue()==1) +if (ev.turb_flag == 1) { - var turbulence = ev.getNode("effects/turbulence").getValue(); - ev.getNode("restore/turbulence",1).setValue(cNode.getNode("turbulence").getValue()); + var turbulence = ev.turb; + ev.turb_r = cNode.getNode("turbulence").getValue(); cNode.getNode("turbulence").setValue(turbulence); compat_layer.setTurbulence(turbulence); - ev.getNode("restore/number-entry-turb",1).setValue(getprop(lw~"effect-volumes/number-active-turb")); + ev.n_entry_turb = getprop(lw~"effect-volumes/number-active-turb"); setprop(lw~"effect-volumes/number-active-turb",getprop(lw~"effect-volumes/number-active-turb")+1); } - -if (ev.getNode("effects/thermal-lift-flag", 1).getValue()==1) +if (ev.sat_flag == 1) { - var lift = ev.getNode("effects/thermal-lift").getValue(); - ev.getNode("restore/thermal-lift",1).setValue(cNode.getNode("thermal-lift").getValue()); + var saturation = ev.sat; + ev.sat_r = getprop("/rendering/scene/saturation"); + compat_layer.setLight(saturation); + ev.n_entry_sat = getprop(lw~"effect-volumes/number-active-sat"); + setprop(lw~"effect-volumes/number-active-sat",getprop(lw~"effect-volumes/number-active-sat")+1); + } + +if (ev.lift_flag == 1) + { + var lift = ev.lift; + ev.lift_r = cNode.getNode("thermal-lift").getValue(); cNode.getNode("thermal-lift").setValue(lift); - #setLift(ev.getNode("position/latitude-deg").getValue(),ev.getNode("position/longitude-deg").getValue(),1); - ev.getNode("restore/number-entry-lift",1).setValue(getprop(lw~"effect-volumes/number-active-lift")); + compat_layer.setLift(lift); + ev.n_entry_lift = getprop(lw~"effect-volumes/number-active-lift"); setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")+1); } -else if (ev.getNode("effects/thermal-lift-flag", 1).getValue()==2) # thermal by function +else if (ev.lift_flag == 2) { - ev.getNode("restore/thermal-lift",1).setValue(cNode.getNode("thermal-lift").getValue()); - ev.getNode("restore/number-entry-lift",1).setValue(getprop(lw~"effect-volumes/number-active-lift")); + ev.lift_r = cNode.getNode("thermal-lift").getValue(); + ev.n_entry_lift = getprop(lw~"effect-volumes/number-active-lift"); setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")+1); thermal_lift_start(ev); } +else if (ev.lift_flag == 3) + { + ev.lift_r = cNode.getNode("thermal-lift").getValue(); + ev.n_entry_lift = getprop(lw~"effect-volumes/number-active-lift"); + setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")+1); + wave_lift_start(ev); + } } @@ -668,12 +835,14 @@ var effect_volume_stop = func (ev) { var cNode = props.globals.getNode(lw~"current"); -if (ev.getNode("effects/visibility-flag", 1).getValue()==1) +if (ev.vis_flag == 1) { var n_active = getprop(lw~"effect-volumes/number-active-vis"); - var n_entry = ev.getNode("restore/number-entry-vis").getValue(); + + var n_entry = ev.n_entry_vis; + # if no other nodes affecting property are active, restore to outside # else restore settings as they have been when entering the volume when the number # of active volumes is the same as on entry (i.e. volumes are nested), otherwise @@ -681,7 +850,8 @@ if (ev.getNode("effects/visibility-flag", 1).getValue()==1) # be cancelled if (n_active ==1){var vis = props.globals.getNode(lw~"interpolation/visibility-m").getValue();} - else if ((n_active -1) == n_entry) {var vis = ev.getNode("restore/visibility-m").getValue();} + else if ((n_active -1) == n_entry) #{var vis = ev.getNode("restore/visibility-m").getValue();} + {var vis = ev.vis_r;} else {var vis = cNode.getNode("visibility-m").getValue();} cNode.getNode("visibility-m").setValue(vis); compat_layer.setVisibility(vis); @@ -689,142 +859,145 @@ if (ev.getNode("effects/visibility-flag", 1).getValue()==1) # and subtract from the counter setprop(lw~"effect-volumes/number-active-vis",getprop(lw~"effect-volumes/number-active-vis")-1); } - -if (ev.getNode("effects/rain-flag", 1).getValue()==1) +if (ev.rain_flag == 1) { var n_active = getprop(lw~"effect-volumes/number-active-rain"); - var n_entry = ev.getNode("restore/number-entry-rain").getValue(); + var n_entry = ev.n_entry_rain; + if (n_active ==1){var rain = props.globals.getNode(lw~"interpolation/rain-norm").getValue();} - else if ((n_active -1) == n_entry) {var rain = ev.getNode("restore/rain-norm").getValue();} + else if ((n_active -1) == n_entry)# {var rain = ev.getNode("restore/rain-norm").getValue();} + {var rain = ev.rain_r;} else {var rain = cNode.getNode("rain-norm").getValue();} cNode.getNode("rain-norm").setValue(rain); compat_layer.setRain(rain); setprop(lw~"effect-volumes/number-active-rain",getprop(lw~"effect-volumes/number-active-rain")-1); } -if (ev.getNode("effects/snow-flag", 1).getValue()==1) +if (ev.snow_flag == 1) { var n_active = getprop(lw~"effect-volumes/number-active-snow"); - var n_entry = ev.getNode("restore/number-entry-snow").getValue(); + var n_entry = ev.n_entry_snow; + if (n_active ==1){var snow = props.globals.getNode(lw~"interpolation/snow-norm").getValue();} - else if ((n_active -1) == n_entry) {var snow = ev.getNode("restore/snow-norm").getValue();} + else if ((n_active -1) == n_entry) + {var snow = ev.snow_r;} else {var snow = cNode.getNode("snow-norm").getValue();} cNode.getNode("snow-norm").setValue(snow); compat_layer.setSnow(snow); setprop(lw~"effect-volumes/number-active-snow",getprop(lw~"effect-volumes/number-active-snow")-1); } -if (ev.getNode("effects/turbulence-flag", 1).getValue()==1) +if (ev.turb_flag == 1) { var n_active = getprop(lw~"effect-volumes/number-active-turb"); - var n_entry = ev.getNode("restore/number-entry-turb").getValue(); + var n_entry = ev.n_entry_turb; if (n_active ==1){var turbulence = props.globals.getNode(lw~"interpolation/turbulence").getValue();} - else if ((n_active -1) == n_entry) {var turbulence = ev.getNode("restore/turbulence").getValue();} + else if ((n_active -1) == n_entry) + {var turbulence = ev.turb_r;} else {var turbulence = cNode.getNode("turbulence").getValue();} cNode.getNode("turbulence").setValue(turbulence); compat_layer.setTurbulence(turbulence); setprop(lw~"effect-volumes/number-active-turb",getprop(lw~"effect-volumes/number-active-turb")-1); } -if (ev.getNode("effects/thermal-lift-flag", 1).getValue()==1) +if (ev.sat_flag == 1) + { + var n_active = getprop(lw~"effect-volumes/number-active-sat"); + var n_entry = ev.n_entry_sat; + if (n_active ==1){var saturation = 1.0;} + else if ((n_active -1) == n_entry) + {var saturation = ev.sat_r;} + else {var saturation = getprop("/rendering/scene/saturation");} + compat_layer.setLight(saturation); + setprop(lw~"effect-volumes/number-active-sat",getprop(lw~"effect-volumes/number-active-sat")-1); + } + +if (ev.lift_flag == 1) { var n_active = getprop(lw~"effect-volumes/number-active-lift"); - var n_entry = ev.getNode("restore/number-entry-lift").getValue(); + var n_entry = ev.n_entry_lift; if (n_active ==1){var lift = props.globals.getNode(lw~"interpolation/thermal-lift").getValue();} - else if ((n_active -1) == n_entry) {var lift = ev.getNode("restore/thermal-lift").getValue();} + else if ((n_active -1) == n_entry) + {var lift = ev.lift_r;} else {var lift = cNode.getNode("thermal-lift").getValue();} cNode.getNode("thermal-lift").setValue(lift); - # some cheat code - # setLift(ev.getNode("position/latitude-deg").getValue(),ev.getNode("position/longitude-deg").getValue(),0); - + compat_layer.setLift(lift); setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")-1); } -else if (ev.getNode("effects/thermal-lift-flag", 1).getValue()==2) # thermal by function +else if (ev.lift_flag == 2) { thermal_lift_stop(); setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")-1); } - -} - - - - - - - -#################################### -# set thermal lift to given value -#################################### - -var setLift = func (lat, lon, flag) { - -# this is a cheat - if you have an AI thermal present, this sets its coordinates to the -# current position - -if (flag==1) - { - setprop("ai/models/thermal/position/latitude-deg",lat); - setprop("ai/models/thermal/position/longitude-deg",lon); - } -else +else if (ev.lift_flag == 3) { - setprop("ai/models/thermal/position/latitude-deg",0.1); - setprop("ai/models/thermal/position/longitude-deg",0.1); - + wave_lift_stop(); + setprop(lw~"effect-volumes/number-active-lift",getprop(lw~"effect-volumes/number-active-lift")-1); } -#setprop("environment/thermal-lift",L); } + + ######################################### # compute thermal lift in detailed model ######################################### var ts_factor = func (t, alt, height) { +var t1 = 0.1; # fractional time at which lift is fully developed +var t2 = 0.9; # fractional time at which lift starts to decay +var t3 = 1.0; # fractional time at which lift is gone + # no time dependence modelled yet -return 1.0; +# return 1.0; -var t_a = t - (alt/height) * t1 -t1; + +var t_a = t - (alt/height) * t1 - t1; if (t_a<0) {return 0.0;} else if (t_a= t1) and (t < t2)) {return 1.0;} -else if (t_a >= t2) {return 0.5 - 0.5 * math.cos((1.0-(t2-t_a)/(t3-t2))*math.pi);} +else if (t_a < t2) {return 1.0;} +else {return 0.5 - 0.5 * math.cos((1.0-(t2-t_a)/(t3-t2))*math.pi);} } var tl_factor = func (t, alt, height) { +var t1 = 0.1; # fractional time at which lift is fully developed +var t2 = 0.9; # fractional time at which lift starts to decay +var t3 = 1.0; # fractional time at which lift is gone + # no time dependence modelled yet -return 1.0; +# return 1.0; var t_a = t - (alt/height) * t1; if (t_a<0) {return 0.0;} else if (t_a= t1) and (t < t2)) {return 1.0;} -else if (t_a >= t2) {return 0.5 - 0.5 * math.cos((1.0-(t2-t_a)/(t3-t2))*math.pi);} +else if (t_a < t2) {return 1.0;} +else {return 0.5 - 0.5 * math.cos((1.0-(t2-t_a)/(t3-t2))*math.pi);} } var calcLift_max = func (alt, max_lift, height) { +alt_agl = getprop("/position/altitude-agl-ft"); + # no lift below ground -if (alt < 0.0) {return 0.0;} +if (alt_agl < 0.0) {return 0.0;} # lift ramps up to full within 200 m -else if (alt < 200.0*m_to_ft) - {return max_lift * 0.5 * (1.0 + math.cos((1.0-alt/(200.0*m_to_ft))*math.pi));} +else if (alt_agl < 200.0*m_to_ft) + {return max_lift * 0.5 * (1.0 + math.cos((1.0-alt_agl/(200.0*m_to_ft))*math.pi));} # constant max. lift in main body -else if ((alt > 200.0*m_to_ft) and (alt < height)) +else if ((alt_agl > 200.0*m_to_ft) and (alt < height)) {return max_lift;} # decreasing lift from cloudbase to 10% above base else if ((alt > height ) and (alt < height*1.1)) - {return max_lift * 0.5 * (1.0 - math.cos((1.0-10.0*alt/height)*math.pi));} + {return max_lift * 0.5 * (1.0 - math.cos((1.0-10.0*(alt-height)/height)*math.pi));} # no lift available above else {return 0.0;} @@ -865,7 +1038,33 @@ else } } +######################################### +# compute wave lift in detailed model +######################################### +var calcWaveLift = func (x,y, alt) { + +var lift = wave.max_lift * math.cos((y/wave.y) * 1.5 * math.pi); + +if (abs(x)/wave.x > 0.9) + { + lift = lift * (abs(x) - 0.9 * wave.x)/(0.1 * wave.x); + } + + + +lift = lift * 2.71828 * math.exp(-alt/wave.height) * alt/wave.height; + +var alt_agl = getprop("/position/altitude-agl-ft"); + +if (alt_agl < 1000.0) + { + lift = lift * (alt_agl/1000.0) * (alt_agl/1000.0); + } + +return lift; +} + ########################################################### # select a cloud model @@ -939,6 +1138,40 @@ else if (type == "Congestus"){ else {path = "Models/Weather/congestus_sl5.xml";} } + } +else if (type == "Stratocumulus"){ + if (subtype == "small") { + if (rn > 0.8) {path = "Models/Weather/stratocumulus_small1.xml";} + else if (rn > 0.6) {path = "Models/Weather/stratocumulus_small2.xml";} + else if (rn > 0.4) {path = "Models/Weather/stratocumulus_small3.xml";} + else if (rn > 0.2) {path = "Models/Weather/stratocumulus_small4.xml";} + else {path = "Models/Weather/stratocumulus_small5.xml";} + } + else if (subtype == "large") { + if (rn > 0.8) {path = "Models/Weather/stratocumulus_sl1.xml";} + else if (rn > 0.6) {path = "Models/Weather/stratocumulus_sl2.xml";} + else if (rn > 0.4) {path = "Models/Weather/stratocumulus_sl3.xml";} + else if (rn > 0.2) {path = "Models/Weather/stratocumulus_sl4.xml";} + else {path = "Models/Weather/stratocumulus_sl5.xml";} + } + + } +else if (type == "Cumulus (whisp)"){ + if (subtype == "small") { + if (rn > 0.8) {path = "Models/Weather/cumulus_whisp1.xml";} + else if (rn > 0.6) {path = "Models/Weather/cumulus_whisp2.xml";} + else if (rn > 0.4) {path = "Models/Weather/cumulus_whisp3.xml";} + else if (rn > 0.2) {path = "Models/Weather/cumulus_whisp4.xml";} + else {path = "Models/Weather/cumulus_whisp5.xml";} + } + else if (subtype == "large") { + if (rn > 0.8) {path = "Models/Weather/cumulus_whisp1.xml";} + else if (rn > 0.6) {path = "Models/Weather/cumulus_whisp2.xml";} + else if (rn > 0.4) {path = "Models/Weather/cumulus_whisp3.xml";} + else if (rn > 0.2) {path = "Models/Weather/cumulus_whisp4.xml";} + else {path = "Models/Weather/cumulus_whisp5.xml";} + } + } else if (type == "Cumulus bottom"){ if (subtype == "small") { @@ -958,7 +1191,15 @@ else if (type == "Congestus bottom"){ } } - +else if (type == "Stratocumulus bottom"){ + if (subtype == "small") { + if (rn > 0.0) {path = "Models/Weather/stratocumulus_bottom1.xml";} + } + else if (subtype == "large") { + if (rn > 0.0) {path = "Models/Weather/stratocumulus_bottom1.xml";} + } + + } else if (type == "Cumulonimbus (cloudlet)"){ if (subtype == "small") { if (rn > 0.8) {path = "Models/Weather/cumulonimbus_sl1.xml";} @@ -1010,6 +1251,22 @@ else if (type == "Stratus (structured)"){ else {path = "Models/Weather/altocumulus_layer5.xml";} } } +else if (type == "Altocumulus perlucidus"){ + if (subtype == "small") { + if (rn > 0.8) {path = "Models/Weather/altocumulus_thinlayer6.xml";} + else if (rn > 0.6) {path = "Models/Weather/altocumulus_thinlayer7.xml";} + else if (rn > 0.4) {path = "Models/Weather/altocumulus_thinlayer8.xml";} + else if (rn > 0.2) {path = "Models/Weather/altocumulus_thinlayer9.xml";} + else {path = "Models/Weather/altocumulus_thinlayer10.xml";} + } + else if (subtype == "large") { + if (rn > 0.8) {path = "Models/Weather/altocumulus_thinlayer1.xml";} + else if (rn > 0.6) {path = "Models/Weather/altocumulus_thinlayer2.xml";} + else if (rn > 0.4) {path = "Models/Weather/altocumulus_thinlayer3.xml";} + else if (rn > 0.2) {path = "Models/Weather/altocumulus_thinlayer4.xml";} + else {path = "Models/Weather/altocumulus_thinlayer5.xml";} + } + } else if ((type == "Cumulonimbus") or (type == "Cumulonimbus (rain)")) { if (subtype == "small") { if (rn > 0.5) {path = "Models/Weather/cumulonimbus_small1.xml";} @@ -1162,26 +1419,26 @@ else if (type == "Fog (thick)") { else {path = "Models/Weather/stratus_thick5.xml";} } } -else if (type == "Test") {path="Models/Weather/test.xml";} +else if (type == "Test") {path="Models/Weather/single_cloud.xml";} else if (type == "Box_test") { if (subtype == "standard") { - if (rn > 0.8) {path = "Models/Weather/test1.xml";} - else if (rn > 0.6) {path = "Models/Weather/test2.xml";} - else if (rn > 0.4) {path = "Models/Weather/test3.xml";} - else if (rn > 0.2) {path = "Models/Weather/test4.xml";} - else {path = "Models/Weather/test5.xml";} + if (rn > 0.8) {path = "Models/Weather/cloudbox1.xml";} + else if (rn > 0.6) {path = "Models/Weather/cloudbox2.xml";} + else if (rn > 0.4) {path = "Models/Weather/cloudbox3.xml";} + else if (rn > 0.2) {path = "Models/Weather/cloudbox4.xml";} + else {path = "Models/Weather/cloudbox5.xml";} } else if (subtype == "core") { - if (rn > 0.8) {path = "Models/Weather/test_core1.xml";} - else if (rn > 0.6) {path = "Models/Weather/test_core2.xml";} - else if (rn > 0.4) {path = "Models/Weather/test_core3.xml";} - else if (rn > 0.2) {path = "Models/Weather/test_core4.xml";} - else {path = "Models/Weather/test_core5.xml";} + if (rn > 0.8) {path = "Models/Weather/cloudbox_core1.xml";} + else if (rn > 0.6) {path = "Models/Weather/cloudbox_core2.xml";} + else if (rn > 0.4) {path = "Models/Weather/cloudbox_core3.xml";} + else if (rn > 0.2) {path = "Models/Weather/cloudbox_core4.xml";} + else {path = "Models/Weather/cloudbox_core5.xml";} } else if (subtype == "bottom") { - if (rn > 0.66) {path = "Models/Weather/test_bottom1.xml";} - else if (rn > 0.33) {path = "Models/Weather/test_bottom2.xml";} - else if (rn > 0.0) {path = "Models/Weather/test_bottom3.xml";} + if (rn > 0.66) {path = "Models/Weather/cloudbox_bottom1.xml";} + else if (rn > 0.33) {path = "Models/Weather/cloudbox_bottom2.xml";} + else if (rn > 0.0) {path = "Models/Weather/cloudbox_bottom3.xml";} } } @@ -1207,6 +1464,15 @@ append(clouds_lon,long); append(clouds_alt,alt); append(clouds_orientation,heading); +# globals (needed for Cumulus clouds) should be set if needed by the main cloud generating call + +if (dynamics_flag ==1) + { + append(clouds_mean_alt, cloud_mean_altitude); + append(clouds_flt, cloud_fractional_lifetime); + append(clouds_evolution_timestamp,cloud_evolution_timestamp); + } + } ########################################################### # clear all clouds and effects @@ -1230,36 +1496,32 @@ foreach (var m; modelNode) } } -cloudNode.getNode("cloud-number",1).setValue(0); + # clear effect volumes -props.globals.getNode("local-weather/effect-volumes", 1).removeChildren("effect-volume"); +#props.globals.getNode("local-weather/effect-volumes", 1).removeChildren("effect-volume"); -# clear weather stations -props.globals.getNode("local-weather/interpolation", 1).removeChildren("station"); - -# clear winds - -props.globals.getNode("local-weather/interpolation", 1).removeChildren("wind"); -setprop(lwi~"ipoint-number",0); # reset pressure continuity weather_tiles.last_pressure = 0.0; -# stop all loops make sure thermal generation is off +# stop all loops setprop(lw~"effect-loop-flag",0); setprop(lw~"interpolation-loop-flag",0); setprop(lw~"tile-loop-flag",0); setprop(lw~"lift-loop-flag",0); +setprop(lw~"wave-loop-flag",0); setprop(lw~"dynamics-loop-flag",0); setprop(lw~"timing-loop-flag",0); setprop(lw~"buffer-loop-flag",0); setprop(lw~"housekeeping-loop-flag",0); -setprop(lw~"tmp/generate-thermal-lift-flag",0); +setprop(lw~"convective-loop-flag",0); + +weather_dynamics.convective_loop_kill_flag = 1; # long-running loop needs a different scheme to end # also remove rain and snow effects @@ -1281,31 +1543,40 @@ settimer ( func { setsize(weather_dynamics.cloudQuadtrees,0);},0.1); # to avoid setsize(effectVolumeArray,0); n_effectVolumeArray = 0; + settimer ( func { setsize(weather_tile_management.modelArrays,0); setsize(weather_dynamics.tile_wind_direction,0); setsize(weather_dynamics.tile_wind_speed,0); setsize(weather_tile_management.cloudBufferArray,0); setsize(weather_tile_management.cloudSceneryArray,0); + setsize(alt_20_array,0); + setsize(alt_50_array,0); + setsize(weather_dynamics.tile_convective_altitude,0); + setsize(weather_dynamics.tile_convective_strength,0); + setsize(weatherStationArray,0); setprop(lw~"clouds/buffer-count",0); setprop(lw~"clouds/cloud-scenery-count",0); + weather_tile_management.n_cloudSceneryArray = 0; + props.globals.getNode("local-weather/interpolation", 1).removeChildren("wind"); + setprop(lwi~"ipoint-number",0); },1.1); +setprop(lw~"tmp/presampling-status", "idle"); + } + ########################################################### # detailed Cumulus clouds created from multiple cloudlets ########################################################### var create_detailed_cumulus_cloud = func (lat, lon, alt, size) { -#print(size); var edge_bias = convective_texture_mix; -#print("edge_bias: ",edge_bias); - var size_bias = 0.0; if (size > 2.0) @@ -1343,7 +1614,7 @@ else if (size>0.8) var y = 200.0; var edge = 0.3; } -else +else if (size>0.4) { var type = "Cumulus (cloudlet)"; var btype = "Cumulus bottom"; @@ -1353,6 +1624,16 @@ else var y = 200.0; var edge = 1.0; } +else + { + var type = "Cumulus (whisp)"; + var btype = "Cumulus bottom"; + var height = 100; + var n = 1; + var x = 100.0; + var y = 100.0; + var edge = 1.0; + } var alpha = rand() * 180.0; @@ -1390,16 +1671,18 @@ create_streak("Cumulonimbus",lat,lon, alt+ 0.5* height, height,8,0.0,0.0,1600.0, var create_cumosys = func (blat, blon, balt, nc, size) { # realistic Cumulus has somewhat larger models, so compensate to get the same coverage -if (getprop(lw~"config/detailed-clouds-flag") == 1) +if (detailed_clouds_flag == 1) {nc = int(0.7 * nc);} -if (getprop(lw~"tmp/thread-flag") == 1) +if (thread_flag == 1) {setprop(lw~"tmp/convective-status", "computing"); cumulus_loop(blat, blon, balt, nc, size);} else {create_cumulus(blat, blon, balt, nc, size); - print("Convective system done!");} + if (debug_output_flag == 1) + {print("Convective system done!");} + } } @@ -1410,7 +1693,8 @@ var n = 25; if (nc < 0) { - print("Convective system done!"); + if (debug_output_flag == 1) + {print("Convective system done!");} setprop(lw~"tmp/convective-status", "idle"); assemble_effect_array(); return; @@ -1436,7 +1720,7 @@ var p = 0.0; var rn = 0.0; var place_lift_flag = 0; var strength = 0.0; -var detail_flag = getprop(lw~"config/detailed-clouds-flag"); +var detail_flag = detailed_clouds_flag; var alpha = getprop(lw~"tmp/tile-orientation-deg") * math.pi/180.0; # the tile orientation @@ -1459,7 +1743,6 @@ var t_factor1 = 0.5 * (1.0-math.cos((t * sec_to_rad))); # daily variation in strength of thermals, peaks around 15:30 var t_factor2 = 0.5 * (1.0-math.cos((t * sec_to_rad)-0.9)); -#print("t-factor1 is now: ",t_factor1, " ",t_factor2); # number of possible thermals equals overall strength times daily variation times geographic variation # this is a proxy for solar thermal energy @@ -1492,6 +1775,7 @@ while (i < nc) { if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];} else {print(p, " ", info[1].names[0]);} }} + else {continue;} # then decide if the thermal energy at the spot generates an updraft and a cloud @@ -1508,16 +1792,19 @@ while (i < nc) { # check if we have a terrain elevation analysis available and can use a # detailed placement altitude correction - if (getprop(lw~"tmp/presampling-flag") == 1) + if (presampling_flag == 1) { - var place_alt = get_convective_altitude(balt, elevation); + var place_alt = get_convective_altitude(balt, elevation, getprop(lw~"tiles/tile-counter")); } else {var place_alt = balt;} + + cloud_mean_altitude = place_alt; + cloud_fractional_lifetime = rand(); + cloud_evolution_timestamp = weather_dynamics.time_lw; - - if (getprop(lw~"tmp/generate-thermal-lift-flag") != 3) # no clouds if we produce blue thermals + if (generate_thermal_lift_flag != 3) # no clouds if we produce blue thermals { - if (getprop(lw~"tmp/thread-flag") == 1) + if (thread_flag == 1) { if (detail_flag == 0){create_cloud_vec(path,lat,lon, place_alt, 0.0);} else {create_detailed_cumulus_cloud(lat, lon, place_alt, strength);} @@ -1530,7 +1817,7 @@ while (i < nc) { } # now see if we need to create a thermal - first check the flag - if (getprop(lw~"tmp/generate-thermal-lift-flag") == 1) # thermal by constant + if (generate_thermal_lift_flag == 1) # thermal by constant { # now check if convection is strong if (place_lift_flag == 1) @@ -1538,21 +1825,18 @@ while (i < nc) { var lift = 3.0 + 10.0 * (strength -1.0); var radius = 500 + 500 * rand(); #print("Lift: ", lift * ft_to_m - 1.0); - create_effect_volume(1, lat, lon, radius, radius, 0.0, 0.0, place_alt+500.0, -1, -1, -1, -1, lift, 1); + create_effect_volume(1, lat, lon, radius, radius, 0.0, 0.0, place_alt+500.0, -1, -1, -1, -1, lift, 1,-1); } # end if place_lift_flag } # end if generate-thermal-lift-flag - else if ((getprop(lw~"tmp/generate-thermal-lift-flag") == 2) or (getprop(lw~"tmp/generate-thermal-lift-flag") == 3)) # thermal by function + else if ((generate_thermal_lift_flag == 2) or (generate_thermal_lift_flag == 3)) # thermal by function { if (place_lift_flag == 1) { - #var lift = 3.0 + 20.0 * p * rand(); - #var radius = 500 + 500 * rand(); var lift = (3.0 + 10.0 * (strength -1.0))/thermal_conditions; var radius = (500 + 500 * rand())*thermal_conditions; - #print("Lift: ", lift * ft_to_m - 1.0, " strength: ",strength); - create_effect_volume(1, lat, lon, 1.1*radius, 1.1*radius, 0.0, 0.0, place_alt+500.0, -1, -1, -1, lift*0.02, lift, -2); + create_effect_volume(1, lat, lon, 1.1*radius, 1.1*radius, 0.0, 0.0, place_alt*1.15, -1, -1, -1, lift*0.04, lift, -2,-1); } # end if place_lift_flag } # end if generate-thermal-lift-flag @@ -1564,6 +1848,165 @@ while (i < nc) { } + + + + +################################################################# +# respawn convective clouds to compensate for decay +# the difference being that new clouds get zero fractional +# lifetime and are placed based on terrain with a different weight +################################################################## + +var recreate_cumulus = func (blat, blon, balt, alpha, nc, size, tile_index) { + +var path = "Models/Weather/blank.ac"; +var i = 0; +var p = 0.0; +var rn = 0.0; +var place_lift_flag = 0; +var strength = 0.0; +var detail_flag = detailed_clouds_flag; + +alpha = alpha * math.pi/180.0; # the tile orientation + +var sec_to_rad = 2.0 * math.pi/86400; # conversion factor for sinusoidal dependence on daytime + +# current aircraft position + +var alat = getprop("position/latitude-deg"); +var alon = getprop("position/longitude-deg"); + +# get the local time of the day in seconds + +var t = getprop("sim/time/utc/day-seconds"); +t = t + getprop("sim/time/local-offset"); + + +# and make a simple sinusoidal model of thermal strength + +# daily variation in number of thermals, peaks at noon +var t_factor1 = 0.5 * (1.0-math.cos((t * sec_to_rad))); + +# daily variation in strength of thermals, peaks around 15:30 +var t_factor2 = 0.5 * (1.0-math.cos((t * sec_to_rad)-0.9)); + + +# number of possible thermals equals overall strength times daily variation times geographic variation +# this is a proxy for solar thermal energy + +nc = t_factor1 * nc * math.cos(blat/180.0*math.pi); + +var thermal_conditions = getprop(lw~"config/thermal-properties"); + + +while (i < nc) { + + p = 0.0; + place_lift_flag = 0; + strength = 0.0; + + # pick a trial position inside the tile and rotate by tile orientation angle + var x = (2.0 * rand() - 1.0) * size; + var y = (2.0 * rand() - 1.0) * size; + + var lat = blat + (y * math.cos(alpha) - x * math.sin(alpha)) * m_to_lat; + var lon = blon + (x * math.cos(alpha) + y * math.sin(alpha)) * m_to_lon; + + # check if the cloud would be spawned in visual range, if not don't bother + var d_sq = calc_d_sq(alat, alon, lat, lon); + + if (math.sqrt(d_sq) > weather_tile_management.cloud_view_distance) + {i = i+1; continue;} + + # now check ground cover type on chosen spot + var info = geodinfo(lat, lon); + + if (info != nil) { + var elevation = info[0] * m_to_ft; + if (info[1] != nil){ + var landcover = info[1].names[0]; + if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];} + else {print(p, " ", info[1].names[0]);} + }} + else {continue;} + + # check if to place a cloud with weight sqrt(p), the lifetime gets another sqrt(p) factor + + if (rand() > math.sqrt(p)) + {i=i+1; continue;} + + + # then calculate the strength of the updraft + + strength = (1.5 * rand() + (2.0 * p)) * t_factor2; # the strength of thermal activity at the spot + if (strength > 1.0) + { + path = select_cloud_model("Cumulus","large"); place_lift_flag = 1; + } + else {path = select_cloud_model("Cumulus","small");} + + if (presampling_flag == 1) + { + var place_alt = get_convective_altitude(balt, elevation, tile_index); + } + else {var place_alt = balt;} + + cloud_mean_altitude = place_alt; + cloud_fractional_lifetime = 0.0; + cloud_evolution_timestamp = weather_dynamics.time_lw; + + compat_layer.cloud_mean_altitude = place_alt; + compat_layer.cloud_flt = cloud_fractional_lifetime; + compat_layer.cloud_evolution_timestamp = cloud_evolution_timestamp; + + if (generate_thermal_lift_flag != 3) # no clouds if we produce blue thermals + { + if (thread_flag == 1) + { + thread_flag = 0; # create clouds immediately + if (detail_flag == 0){compat_layer.create_cloud(path,lat,lon, place_alt, 0.0);} + else {create_detailed_cumulus_cloud(lat, lon, place_alt, strength);} + thread_flag = 1; # and restore threading + } + else + { + if (detail_flag == 0){compat_layer.create_cloud(path, lat, lon, place_alt, 0.0);} + else {create_detailed_cumulus_cloud(lat, lon, place_alt, strength);} + } + } + + if (generate_thermal_lift_flag == 1) # thermal by constant + { + if (place_lift_flag == 1) + { + var lift = 3.0 + 10.0 * (strength -1.0); + var radius = 500 + 500 * rand(); + create_effect_volume(1, lat, lon, radius, radius, 0.0, 0.0, place_alt+500.0, -1, -1, -1, -1, lift, 1,-1); + } # end if place_lift_flag + } # end if generate-thermal-lift-flag + else if ((generate_thermal_lift_flag == 2) or (generate_thermal_lift_flag == 3)) # thermal by function + { + if (place_lift_flag == 1) + { + var lift = (3.0 + 10.0 * (strength -1.0))/thermal_conditions; + var radius = (500 + 500 * rand())*thermal_conditions; + + create_effect_volume(1, lat, lon, 1.1*radius, 1.1*radius, 0.0, 0.0, place_alt*1.15, -1, -1, -1, lift*0.04, lift, -2,-1); + } # end if place_lift_flag + + } # end if generate-thermal-lift-flag + + + i = i + 1; + } # end while + +} + + + + + ########################################################### # place a Cumulus layer with excluded regions # to avoid placing cumulus underneath a thunderstorm @@ -1576,7 +2019,7 @@ var strength = 0; var flag = 1; var phi = alpha * math.pi/180.0; -var detail_flag = getprop(lw~"config/detailed-clouds-flag"); +var detail_flag = detailed_clouds_flag; if (detail_flag == 1) {var i_max = int(0.25*n);} else {var i_max = int(1.0*n);} @@ -1604,7 +2047,7 @@ for (var i =0; i< i_max; i=i+1) if (strength > 1.0) {var path = select_cloud_model("Cumulus","large"); } else {var path = select_cloud_model("Cumulus","small");} - if (getprop(lw~"tmp/thread-flag") == 1) + if (thread_flag == 1) { if (detail_flag == 0){create_cloud_vec(path,lat,lon, balt, 0.0);} else {create_detailed_cumulus_cloud(lat, lon, balt, strength);} @@ -1634,7 +2077,6 @@ var p = 0.0; var rn = 0.0; var nsample = 10; var counter = 0; -var elevation = 0.0; var dir = (winddir + 180.0) * math.pi/180.0; var step = dist/nsample; @@ -1644,7 +2086,6 @@ while (i < nc) { counter = counter + 1; p = 0.0; - elevation=0.0; var x = (2.0 * rand() - 1.0) * size; var y = (2.0 * rand() - 1.0) * size; @@ -1652,12 +2093,11 @@ while (i < nc) { var lat = blat + y * m_to_lat; var lon = blon + x * m_to_lon; - var info = geodinfo(lat, lon); - if (info != nil) {elevation = info[0] * m_to_ft;} + var elevation = compat_layer.get_elevation(lat, lon); + #print("elevation: ", elevation, "balt: ", balt); - - if ((elevation < balt) and (elevation != 0.0)) + if ((elevation < balt) and (elevation != -1.0)) { for (var j = 0; j balt) + + #print("x: ", x, "y: ", y); + + var elevation1 = compat_layer.get_elevation(tlat,tlon); + #print("elevation1: ", elevation1, "balt: ", balt); + + if (elevation1 > balt) { p = 1.0 - j * (1.0/nsample); + #p = 1.0; break; } @@ -1680,14 +2123,13 @@ while (i < nc) { } if (counter > 500) {print("Cannot place clouds - exiting..."); i = nc;} if (rand() < p) - { - path = select_cloud_model("Altocumulus","large"); - #print("Cloud ",i, " after ",counter, " tries"); + { + path = select_cloud_model("Stratus (structured)","large"); compat_layer.create_cloud(path, lat, lon, balt, 0.0); - counter = 0; - i = i+1; - } - + counter = 0; + i = i+1; + } + } # end while } @@ -1742,7 +2184,7 @@ for (var i=0; i 0.05) # we have below 5 fps if (nc <= 0) # we're done and may analyze the result { terrain_presampling_analysis(); - print("Presampling done!"); + if (debug_output_flag == 1) + {print("Presampling done!");} setprop(lw~"tmp/presampling-status", "finished"); return; } @@ -2092,29 +2532,13 @@ for (var i=0; i 1.0) {shift_strength = 1.0;} # no enhancement for very low layers -if (shift_strength < 0.0) {shift_strength = 0.0;} # this shouldn't happen, but just in case... +if (shift_strength < 0.0) {shift_strength = 1.0;} # this shouldn't happen, but just in case... + +if (alt_diff > alt_variation) {alt_diff = alt_variation;} # maximal shift is given by alt_variation return balt + shift_strength * alt_diff * fraction; @@ -2309,84 +2766,57 @@ if (convective_texture_mix > 0.2) {convective_texture_mix = 0.2;} # create an effect volume ########################################################### -var create_effect_volume = func (geometry, lat, lon, r1, r2, phi, alt_low, alt_high, vis, rain, snow, turb, lift, lift_flag) { - -var flag = 0; - -var index = getprop(lw~"effect-volumes/effect-placement-index"); - -var n = props.globals.getNode("local-weather/effect-volumes", 1); - for (var i = index; 1; i += 1) - if (n.getChild("effect-volume", i, 0) == nil) - break; - - setprop(lw~"effect-volumes/effect-placement-index",i); +var create_effect_volume = func (geometry, lat, lon, r1, r2, phi, alt_low, alt_high, vis, rain, snow, turb, lift, lift_flag, sat) { -ev = n.getChild("effect-volume", i, 1); +var ev = effectVolume.new (geometry, lat, lon, r1, r2, phi, alt_low, alt_high, vis, rain, snow, turb, lift, lift_flag, sat); +ev.index = getprop(lw~"tiles/tile-counter"); +ev.active_flag = 0; -ev.getNode("geometry", 1).setValue(geometry); -ev.getNode("active-flag", 1).setValue(0); -ev.getNode("position/latitude-deg", 1).setValue(lat); -ev.getNode("position/longitude-deg", 1).setValue(lon); -ev.getNode("position/min-altitude-ft", 1).setValue(alt_low); -ev.getNode("position/max-altitude-ft", 1).setValue(alt_high); -ev.getNode("volume/size-x", 1).setValue(r1); -ev.getNode("volume/size-y", 1).setValue(r2); -ev.getNode("volume/orientation-deg", 1).setValue(phi); -ev.getNode("tile-index",1).setValue(getprop(lw~"tiles/tile-counter")); -var flag = 1; -if (vis < 0.0) {flag = 0;} -ev.getNode("effects/visibility-flag", 1).setValue(flag); -ev.getNode("effects/visibility-m", 1).setValue(vis); +if (vis < 0.0) {ev.vis_flag = 0;} else {ev.vis_flag = 1;} +if (rain < 0.0) {ev.rain_flag = 0;} else {ev.rain_flag = 1;} +if (snow < 0.0) {ev.snow_flag = 0;} else {ev.snow_flag = 1;} +if (turb < 0.0) {ev.turb_flag = 0;} else {ev.turb_flag = 1;} +if (lift_flag == 0.0) {ev.lift_flag = 0;} else {ev.lift_flag = 1;} +if (sat < 0.0) {ev.sat_flag = 0;} else {ev.sat_flag = 1;} +if (sat > 1.0) {sat = 1.0;} -flag = 1; -if (rain < 0.0) {flag = 0;} -ev.getNode("effects/rain-flag", 1).setValue(flag); -ev.getNode("effects/rain-norm", 1).setValue(rain); - -flag = 1; -if (snow < 0.0) {flag = 0;} -ev.getNode("effects/snow-flag", 1).setValue(flag); -ev.getNode("effects/snow-norm", 1).setValue(snow); - -flag = 1; -if (snow < 0.0) {flag = 0;} -ev.getNode("effects/snow-flag", 1).setValue(flag); -ev.getNode("effects/snow-norm", 1).setValue(snow); - -flag = 1; -if (turb < 0.0) {flag = 0;} -ev.getNode("effects/turbulence-flag", 1).setValue(flag); -ev.getNode("effects/turbulence", 1).setValue(turb); - -flag = 1; -if (lift_flag == 0) {flag = 0;} -ev.getNode("effects/thermal-lift-flag", 1).setValue(flag); -ev.getNode("effects/thermal-lift", 1).setValue(lift); - -flag = 1; if (lift_flag == -2) # we create a thermal by function { - ev.getNode("effects/thermal-lift-flag", 1).setValue(2); - ev.getNode("effects/radius",1 ).setValue(0.8*r1); - ev.getNode("effects/height",1).setValue(alt_high); - ev.getNode("effects/cn",1).setValue(0.8); - ev.getNode("effects/sh",1).setValue(0.8); - ev.getNode("effects/max_lift",1).setValue(lift); - ev.getNode("effects/f_lift_radius",1).setValue(0.8); + ev.lift_flag = 2; + ev.radius = 0.8 * r1; + ev.height = alt_high * 0.87; + ev.cn = 0.7 + rand() * 0.2; + ev.sh = 0.7 + rand() * 0.2; + ev.max_lift = lift; + ev.f_lift_radius = 0.7 + rand() * 0.2; + if (dynamics_flag == 1) # globals set by the convective system + { + ev.flt = cloud_fractional_lifetime; + ev.evolution_timestamp = cloud_evolution_timestamp; + } + } + +if (lift_flag == -3) # we create a wave lift + { + ev.lift_flag = 3; + ev.height = 10000.0; # scale height in ft + ev.max_lift = lift; + ev.index = 0; # static objects are assigned tile id zero } # set a timestamp if needed -if (getprop(lw~"config/dynamics-flag") == 1) +if (dynamics_flag == 1) { - ev.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); + ev.timestamp = weather_dynamics.time_lw; } # and add to the counter setprop(lw~"effect-volumes/number",getprop(lw~"effect-volumes/number")+1); + +append(effectVolumeArray,ev); } @@ -2399,27 +2829,17 @@ setprop(lw~"effect-volumes/number",getprop(lw~"effect-volumes/number")+1); var set_weather_station = func (lat, lon, vis, T, D, p) { -var n = props.globals.getNode(lwi, 1); - for (var i = 0; 1; i += 1) - if (n.getChild("station", i, 0) == nil) - break; - -s = n.getChild("station", i, 1); - -s.getNode("latitude-deg",1).setValue(lat); -s.getNode("longitude-deg",1).setValue(lon); -s.getNode("visibility-m",1).setValue(vis); -s.getNode("temperature-degc",1).setValue(T); -s.getNode("dewpoint-degc",1).setValue(D); -s.getNode("pressure-sea-level-inhg",1).setValue(p); -s.getNode("tile-index",1).setValue(getprop(lw~"tiles/tile-counter")); +var s = weatherStation.new (lat, lon, vis, T, D, p); +s.index = getprop(lw~"tiles/tile-counter"); +s.weight = 0.1; # set a timestamp if needed -if (getprop(lw~"config/dynamics-flag") == 1) +if (dynamics_flag == 1) { - s.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); + s.timestamp = weather_dynamics.time_lw; } +append(weatherStationArray,s); } @@ -2477,6 +2897,29 @@ var showDialog = func (name) { fgcommand("dialog-show", props.Node.new({"dialog-name":name})); +} + + +########################################################### +# helper to transfer configuration flags in menu to Nasal +########################################################### + +var readFlags = func { + +# thermal lift must be 1 for constant thermals (obsolete), 2 for thermals by model (menu default) +# and 3 for blue thermals (set internally inside the tile only) + +if (getprop(lw~"config/generate-thermal-lift-flag") ==1) {generate_thermal_lift_flag = 2;} + else {generate_thermal_lift_flag = 0}; + +thread_flag = getprop(lw~"config/thread-flag"); +dynamics_flag = getprop(lw~"config/dynamics-flag"); +presampling_flag = getprop(lw~"tmp/presampling-flag"); +detailed_clouds_flag = getprop(lw~"config/detailed-clouds-flag"); +dynamical_convection_flag = getprop(lw~"config/dynamical-convection-flag"); +debug_output_flag = getprop(lw~"config/debug-output-flag"); + + } ########################################################### @@ -2485,8 +2928,9 @@ fgcommand("dialog-show", props.Node.new({"dialog-name":name})); var streak_wrapper = func { -setprop(lw~"tmp/thread-flag", 0); -setprop(lw~"config/dynamics-flag",0); +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; var array = []; append(weather_tile_management.modelArrays,array); @@ -2514,8 +2958,10 @@ create_streak(type,lat,lon,alt,rnd_alt,nx,xoffset,xedge,rnd_pos_x,ny,yoffset,yed var convection_wrapper = func { -setprop(lw~"tmp/thread-flag", 0); -setprop(lw~"config/dynamics-flag",0); +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; + var array = []; append(weather_tile_management.modelArrays,array); @@ -2534,8 +2980,11 @@ create_cumosys(lat,lon,alt,n, size*1000.0); var barrier_wrapper = func { -setprop(lw~"tmp/thread-flag", 0); -setprop(lw~"config/dynamics-flag",0); + +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; + var array = []; append(weather_tile_management.modelArrays,array); @@ -2555,7 +3004,11 @@ create_rise_clouds(lat, lon, alt, n, size, dir, dist); var single_cloud_wrapper = func { -setprop(lw~"config/dynamics-flag",0); +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; + + var array = []; append(weather_tile_management.modelArrays,array); @@ -2576,8 +3029,10 @@ compat_layer.create_cloud(path, lat, lon, alt, heading); var layer_wrapper = func { -setprop(lw~"config/dynamics-flag",0); -setprop(lw~"tmp/thread-flag", 0); +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; + var array = []; append(weather_tile_management.modelArrays,array); @@ -2602,8 +3057,10 @@ create_layer(type, lat, lon, alt, thick, rx, ry, phi, density, edge, rain_flag, var box_wrapper = func { -setprop(lw~"tmp/thread-flag", 0); -setprop(lw~"config/dynamics-flag",0); +thread_flag = 0; +dynamics_flag = 0; +presampling_flag = 0; + setprop(lw~"tiles/tile-counter",getprop(lw~"tiles/tile-counter")+1); @@ -2679,6 +3136,7 @@ if (wind_model_flag == 5) var set_tile = func { + var type = getprop("/local-weather/tmp/tile-type"); # set tile center coordinates to current position @@ -2690,9 +3148,39 @@ setprop(lw~"tiles/tmp/latitude-deg",lat); setprop(lw~"tiles/tmp/longitude-deg",lon); setprop(lw~"tiles/tmp/dir-index",4); +readFlags(); + +# check consistency of flags + +if (dynamical_convection_flag == 1) + { + if (dynamics_flag == 0) + { + print("Dynamical convection needs weather dynamics to run! Aborting..."); + setprop("/sim/messages/pilot", "Local weather: dynamical convection needs weather dynamics to run! Aborting..."); + return; + } + if (presampling_flag == 0) + { + print("Dynamical convection needs terrain presampling to run! Aborting..."); + setprop("/sim/messages/pilot", "Local weather: dynamical convection needs terrain presampling to run! Aborting..."); + return; + } + } + + +# if we can do so, we switch global weather off at this point + +if (compat_layer.features.can_disable_environment ==1) + { + props.globals.getNode("/environment/config/enabled").setBoolValue(0); + } + + + # now see if we need to presample the terrain -if ((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) +if ((presampling_flag == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) { terrain_presampling_start(lat, lon, 1000, 40000, getprop(lw~"tmp/tile-orientation-deg")); return; @@ -2759,7 +3247,7 @@ setprop(lw~"tiles/tile-counter",getprop(lw~"tiles/tile-counter")+1); # see if we need to generate a quadtree structure for clouds -if (getprop(lw~"config/dynamics-flag") ==1) +if (dynamics_flag ==1) { var quadtree = []; weather_dynamics.generate_quadtree_structure(0, quadtree); @@ -2825,6 +3313,10 @@ else {print("Tile not implemented.");setprop(lw~"tiles/tile-counter",getprop(lw~"tiles/tile-counter")-1);return();} +# mark tile as active + +append(weather_tile_management.active_tile_list,1); + # start tile management loop if needed if (getprop(lw~"tmp/tile-management") != "single tile") { @@ -2848,7 +3340,7 @@ if (getprop(lw~"effect-loop-flag") == 0) # start weather dynamics loops if needed -if (getprop(lw~"config/dynamics-flag") ==1) +if (dynamics_flag ==1) { if (getprop(lw~"timing-loop-flag") == 0) {setprop(lw~"timing-loop-flag",1); weather_dynamics.timing_loop();} @@ -2857,11 +3349,18 @@ if (getprop(lw~"config/dynamics-flag") ==1) { setprop(lw~"dynamics-loop-flag",1); weather_dynamics.quadtree_loop(); - weather_dynamics.weather_dynamics_loop(0); + weather_dynamics.weather_dynamics_loop(0,0); + } + if ((getprop(lw~"convective-loop-flag") == 0) and (getprop(lw~"config/dynamical-convection-flag") ==1)) + { + setprop(lw~"convective-loop-flag",1); + weather_dynamics.convective_loop(); } - } + + + # and start the buffer loop and housekeeping loop if needed if (getprop(lw~"config/buffer-flag") ==1) @@ -2873,7 +3372,7 @@ if (getprop(lw~"config/buffer-flag") ==1) } } -#weather_tile_management.watchdog_loop(); +# weather_tile_management.watchdog_loop(); } @@ -2969,67 +3468,186 @@ var test = func { var lat = getprop("position/latitude-deg"); var lon = getprop("position/longitude-deg"); +var pos = geo.aircraft_position(); + +props.globals.getNode("/environment/terrain/area/enabled",1).setBoolValue(1); + +setprop("/environment/terrain/area/input/analyse-every",200); +setprop("/environment/terrain/area/input/elevation-histogram-count",20); +setprop("/environment/terrain/area/input/elevation-histogram-max-ft",10000); +setprop("/environment/terrain/area/input/elevation-histogram-step-ft",500); +setprop("/environment/terrain/area/input/heading-deg",0.0); +setprop("/environment/terrain/area/input/speed-kt",-.0); +setprop("/environment/terrain/area/input/latitude-deg",lat); +setprop("/environment/terrain/area/input/longitude-deg",lon); +setprop("/environment/terrain/area/input/max-samples",1000); +setprop("/environment/terrain/area/input/max-samples-per-frame",20); +setprop("/environment/terrain/area/input/orientation-deg",0); +setprop("/environment/terrain/area/input/radius-m",40000); + +props.globals.getNode("/environment/terrain/area/input/use-aircraft-position",1).setBoolValue(0); -var v = [1,2,3,4,5,6,7]; - -print(v[2]); -v = weather_tile_management.delete_from_vector(v, 2); -v = weather_tile_management.delete_from_vector(v, 2); - -for (var i = 0; i < size(v); i = i + 1) - { - print(v[i]); - } - -#weather_dynamics.cos_beta = 1; -#weather_dynamics.sin_beta = 0; -#weather_dynamics.tan_vangle = 0.3; - -#weather_dynamics.plane_x = 0.0; -#weather_dynamics.plane_y = 0.0; - - - -#for (var i=0; i<16; i=i+1) -# { -# var pix = []; -# for (var j=0; j<16; j=j+1) -# { -# var x = -18750.0 + j * 2500.0; -# var y = 18750.0 - i * 2500.0; -# append(pix,weather_dynamics.check_visibility(x,y,2500.0)); -# } -# print(pix[0],pix[1],pix[2],pix[3],pix[4],pix[5],pix[6],pix[7],pix[8],pix[9],pix[10],pix[11],pix[12],pix[13],pix[14],pix[15]); -# } - -#print(weather_dynamics.check_visibility(0,0,0,8000.0,10000)); -#print(weather_dynamics.check_visibility(0,0,0,15000.0,2500)); -#print(weather_dynamics.check_visibility(0,0,0,-15000.0,2500)); -#print(weather_dynamics.check_visibility(0,0,7000,5000.0,2500)); - - - - -#terrain_presampling_start(lat, lon, 10000, 20000, 0.0); - -#test: 8 identical position tuples for KSFO -#var p=[ 37.6189722, -122.3748889, 37.6189722, -122.3748889, -# 37.6289722, -122.3748889, 37.6189722, -122.3648889, -# 37.6389722, -122.3748889, 37.6189722, -122.3548889, -# 37.6489722, -122.3748889, 37.6189722, -122.3448889 ]; -# -#var x=geodinfo(p, 10000); # passing in vector with position tuples - -#foreach(var e;x) { -# print("Elevation:",e); # showing results -#} - - - - +fgcommand("reinit", props.Node.new({subsystem:"environment"})); } + + + + +################################################################# +# object classes +################################################################# + +var weatherStation = { + new: func (lat, lon, vis, T, D, p) { + var s = { parents: [weatherStation] }; + s.lat = lat; + s.lon = lon; + s.vis = vis; + s.T = T; + s.D = D; + s.p = p; + return s; + }, + move: func { + var windfield = weather_dynamics.get_windfield(me.index); + var dt = weather_dynamics.time_lw - me.timestamp; + me.lat = me.lat + windfield[1] * dt * local_weather.m_to_lat; + me.lon = me.lon + windfield[0] * dt * local_weather.m_to_lon; + me.timestamp = weather_dynamics.time_lw; + }, +}; + +var effectVolume = { + new: func (geometry, lat, lon, r1, r2, phi, alt_low, alt_high, vis, rain, snow, turb, lift, lift_flag, sat) { + var e = { parents: [effectVolume] }; + e.geometry = geometry; + e.lat = lat; + e.lon = lon; + e.r1 = r1; + e.r2 = r2; + e.phi = phi; + e.alt_low = alt_low; + e.alt_high = alt_high; + e.vis = vis; + e.rain = rain; + e.snow = snow; + e.turb = turb; + e.lift = lift; + e.lift_flag = lift_flag; + e.sat = sat; + return e; + }, + move: func { + var windfield = weather_dynamics.get_windfield(me.index); + var dt = weather_dynamics.time_lw - me.timestamp; + me.lat = me.lat + windfield[1] * dt * local_weather.m_to_lat; + me.lon = me.lon + windfield[0] * dt * local_weather.m_to_lon; + me.timestamp = weather_dynamics.time_lw; + }, + correct_altitude: func { + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + alt_20_array[me.index-1]; + var elevation = compat_layer.get_elevation(me.lat, me.lon); + me.alt_high = local_weather.get_convective_altitude(convective_alt, elevation, me.index) *1.15; + me.height = me.alt_high * 0.87; + }, + correct_altitude_and_age: func { + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + local_weather.alt_20_array[me.index-1]; + var elevation = -1.0; var p_cover = 0.2; + var info = geodinfo(me.lat, me.lon); + if (info != nil) + { + elevation = info[0] * local_weather.m_to_ft; + if (info[1] != nil) + { + var landcover = info[1].names[0]; + if (contains(landcover_map,landcover)) {p_cover = landcover_map[landcover];} + else {p_cover = 0.2;} + } + } + me.alt_high = get_convective_altitude(convective_alt, elevation, me.index) * 1.15; + me.height = me.alt_high * 0.87; + var current_lifetime = math.sqrt(p_cover)/math.sqrt(0.35) * weather_dynamics.cloud_convective_lifetime_s; + var fractional_increase = (weather_dynamics.time_lw - me.evolution_timestamp)/current_lifetime; + me.flt = me.flt + fractional_increase; + me.evolution_timestamp = weather_dynamics.time_lw; + }, + get_distance: func { + var lat = getprop("position/latitude-deg"); + var lon = getprop("position/longitude-deg"); + return math.sqrt(calc_d_sq(lat, lon, me.lat, me.lon)); + }, +}; + + +var thermalLift = { + new: func (lat, lon, radius, height, cn, sh, max_lift, f_lift_radius) { + var l = { parents: [thermalLift] }; + l.lat = lat; + l.lon = lon; + l.radius = radius; + l.height = height; + l.cn = cn; + l.sh = sh; + l.max_lift = max_lift; + l.f_lift_radius = f_lift_radius; + return l; + }, + move: func { + var windfield = weather_dynamics.get_windfield(me.index); + var dt = weather_dynamics.time_lw - me.timestamp; + me.lat = me.lat + windfield[1] * dt * local_weather.m_to_lat; + me.lon = me.lon + windfield[0] * dt * local_weather.m_to_lon; + me.timestamp = weather_dynamics.time_lw; + }, + correct_altitude: func { + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + alt_20_array[me.index-1]; + var elevation = compat_layer.get_elevation(me.lat, me.lon); + me.height = local_weather.get_convective_altitude(convective_alt, elevation, me.index); + }, + correct_altitude_and_age: func { + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + local_weather.alt_20_array[me.index-1]; + var elevation = -1.0; var p_cover = 0.2; + var info = geodinfo(me.lat, me.lon); + if (info != nil) + { + elevation = info[0] * local_weather.m_to_ft; + if (info[1] != nil) + { + var landcover = info[1].names[0]; + if (contains(landcover_map,landcover)) {p_cover = landcover_map[landcover];} + else {p_cover = 0.2;} + } + } + me.height = get_convective_altitude(convective_alt, elevation, me.index); + var current_lifetime = math.sqrt(p_cover)/math.sqrt(0.35) * weather_dynamics.cloud_convective_lifetime_s; + var fractional_increase = (weather_dynamics.time_lw - me.evolution_timestamp)/current_lifetime; + me.flt = me.flt + fractional_increase; + me.evolution_timestamp = weather_dynamics.time_lw; + }, + +}; + + +var waveLift = { + new: func (lat, lon, x, y, phi, height, max_lift) { + var w = { parents: [waveLift] }; + w.lat = lat; + w.lon = lon; + w.x = x; + w.y = y; + w.phi = phi; + w.height = height; + w.max_lift = max_lift; + w.phi = getprop(lw~"tmp/tile-orientation-deg"); + return w; + }, + +}; + + + ################################################################# # global variable, property creation and the startup listener ################################################################# @@ -3051,7 +3669,7 @@ var ec = "/environment/config/"; # a hash map of the strength for convection associated with terrain types -var landcover_map = {BuiltUpCover: 0.35, Town: 0.35, Freeway:0.35, BarrenCover:0.3, HerbTundraCover: 0.25, GrassCover: 0.2, CropGrassCover: 0.2, Sand: 0.25, Grass: 0.2, Ocean: 0.01, Marsh: 0.05, Lake: 0.01, ShrubCover: 0.15, Landmass: 0.2, CropWoodCover: 0.15, MixedForestCover: 0.1, DryCropPastureCover: 0.25, MixedCropPastureCover: 0.2, IrrCropPastureCover: 0.15, DeciduousBroadCover: 0.1, pa_taxiway : 0.35, pa_tiedown: 0.35, pc_taxiway: 0.35, pc_tiedown: 0.35, Glacier: 0.01, DryLake: 0.3, IntermittentStream: 0.2}; +var landcover_map = {BuiltUpCover: 0.35, Town: 0.35, Freeway:0.35, BarrenCover:0.3, HerbTundraCover: 0.25, GrassCover: 0.2, CropGrassCover: 0.2, EvergreenBroadCover: 0.2, Sand: 0.25, Grass: 0.2, Ocean: 0.01, Marsh: 0.05, Lake: 0.01, ShrubCover: 0.15, Landmass: 0.2, CropWoodCover: 0.15, MixedForestCover: 0.1, DryCropPastureCover: 0.25, MixedCropPastureCover: 0.2, IrrCropPastureCover: 0.15, DeciduousBroadCover: 0.1, pa_taxiway : 0.35, pa_tiedown: 0.35, pc_taxiway: 0.35, pc_tiedown: 0.35, Glacier: 0.01, DryLake: 0.3, IntermittentStream: 0.2}; # a hash map of average vertical cloud model sizes @@ -3069,8 +3687,15 @@ var clouds_lon = []; var clouds_alt = []; var clouds_orientation = []; +# additional info needed for dynamical clouds: the base altitude around which cloudlets are distributed +# and the fractional lifetime -# storage arrays for terrain presampling and results +var clouds_mean_alt = []; +var clouds_flt = []; +var clouds_evolution_timestamp = []; + + +# storage arrays for terrain presampling and results by tile var terrain_n = []; var alt_50_array = []; @@ -3081,6 +3706,16 @@ var alt_20_array = []; var effectVolumeArray = []; var n_effectVolumeArray = 0; +# the thermal and the wave hash + +var thermal = {}; +var wave = {}; + + +# array of currently existing weather stations + +var weatherStationArray = []; + # a flag for the wind model (so we don't have to do string comparisons all the time) # 1: constant 2: constant in tile 3: aloft interpolated 4: airmass interpolated @@ -3090,6 +3725,25 @@ var wind_model_flag = 1; var convective_texture_mix = 0.0; +# a global keeping track of the mean cloud altitude when building a Cumulus from individual cloudlets + +var cloud_mean_altitude = 0.0; + +# globals keeping track of the lifetime when building a Cumulus from individual cloudlets + +var cloud_fractional_lifetime = 0.0; +var cloud_evolution_timestamp = 0.0; + +# global flags mirroring property tree menu settings + +var generate_thermal_lift_flag = 0; +var thread_flag = 1; +var dynamics_flag = 1; +var presampling_flag = 1; +var detailed_clouds_flag = 1; +var dynamical_convection_flag = 1; +var debug_output_flag = 1; + # set all sorts of default properties for the menu @@ -3142,16 +3796,14 @@ setprop(lw~"tmp/box-bottom-fraction",0.9); setprop(lw~"tmp/box-bottom-thickness",0.5); setprop(lw~"tmp/box-bottom-n",12); setprop(lw~"tmp/tile-type", "High-pressure"); -setprop(lw~"tmp/tile-orientation-deg", 0.0); +setprop(lw~"tmp/tile-orientation-deg", 260.0); setprop(lw~"tmp/windspeed-kt", 8.0); setprop(lw~"tmp/tile-alt-offset-ft", 0.0); setprop(lw~"tmp/tile-alt-median-ft",0.0); setprop(lw~"tmp/tile-alt-min-ft",0.0); setprop(lw~"tmp/tile-management", "single tile"); -setprop(lw~"tmp/generate-thermal-lift-flag", 0); setprop(lw~"tmp/presampling-flag", 1); setprop(lw~"tmp/asymmetric-tile-loading-flag", 0); -setprop(lw~"tmp/thread-flag", 1); setprop(lw~"tmp/last-reading-pos-del",0); setprop(lw~"tmp/last-reading-pos-mod",0); setprop(lw~"tmp/thread-status", "idle"); @@ -3159,23 +3811,23 @@ setprop(lw~"tmp/convective-status", "idle"); setprop(lw~"tmp/presampling-status", "idle"); setprop(lw~"tmp/buffer-status", "idle"); setprop(lw~"tmp/buffer-tile-index", 0); -setprop(lw~"tmp/FL0-wind-from-heading-deg",0.0); +setprop(lw~"tmp/FL0-wind-from-heading-deg",260.0); setprop(lw~"tmp/FL0-windspeed-kt",8.0); -setprop(lw~"tmp/FL50-wind-from-heading-deg",2.0); +setprop(lw~"tmp/FL50-wind-from-heading-deg",262.0); setprop(lw~"tmp/FL50-windspeed-kt",11.0); -setprop(lw~"tmp/FL100-wind-from-heading-deg",4.0); +setprop(lw~"tmp/FL100-wind-from-heading-deg",264.0); setprop(lw~"tmp/FL100-windspeed-kt",16.0); -setprop(lw~"tmp/FL180-wind-from-heading-deg",5.0); +setprop(lw~"tmp/FL180-wind-from-heading-deg",265.0); setprop(lw~"tmp/FL180-windspeed-kt",24.0); -setprop(lw~"tmp/FL240-wind-from-heading-deg",9.0); +setprop(lw~"tmp/FL240-wind-from-heading-deg",269.0); setprop(lw~"tmp/FL240-windspeed-kt",35.0); -setprop(lw~"tmp/FL300-wind-from-heading-deg",13.0); +setprop(lw~"tmp/FL300-wind-from-heading-deg",273.0); setprop(lw~"tmp/FL300-windspeed-kt",45.0); -setprop(lw~"tmp/FL340-wind-from-heading-deg",14.0); +setprop(lw~"tmp/FL340-wind-from-heading-deg",274.0); setprop(lw~"tmp/FL340-windspeed-kt",50.0); -setprop(lw~"tmp/FL390-wind-from-heading-deg",13.0); +setprop(lw~"tmp/FL390-wind-from-heading-deg",273.0); setprop(lw~"tmp/FL390-windspeed-kt",56.0); -setprop(lw~"tmp/FL450-wind-from-heading-deg",12.0); +setprop(lw~"tmp/FL450-wind-from-heading-deg",272.0); setprop(lw~"tmp/FL450-windspeed-kt",65.0); setprop(lw~"tmp/ipoint-latitude-deg",getprop("position/latitude-deg")); setprop(lw~"tmp/ipoint-longitude-deg",getprop("position/longitude-deg")); @@ -3183,8 +3835,6 @@ setprop(lw~"tmp/ipoint-longitude-deg",getprop("position/longitude-deg")); # set config values -#setprop(lw~"config/distance-to-load-tile-m",35000.0); -#setprop(lw~"config/distance-to-remove-tile-m",37000.0); setprop(lw~"config/distance-to-load-tile-m",39000.0); setprop(lw~"config/distance-to-remove-tile-m",39500.0); setprop(lw~"config/detailed-clouds-flag",1); @@ -3198,6 +3848,10 @@ setprop(lw~"config/asymmetric-buffering-flag",0); setprop(lw~"config/asymmetric-buffering-reduction",0.3); setprop(lw~"config/asymmetric-buffering-angle-deg",90.0); setprop(lw~"config/clouds-in-dynamics-loop",250); +setprop(lw~"config/debug-output-flag",1); +setprop(lw~"config/generate-thermal-lift-flag", 0); +setprop(lw~"config/dynamical-convection-flag", 1); +setprop(lw~"config/thread-flag", 1); # set the default loop flags to loops inactive @@ -3206,12 +3860,14 @@ setprop(lw~"effect-loop-flag",0); setprop(lw~"interpolation-loop-flag",0); setprop(lw~"tile-loop-flag",0); setprop(lw~"lift-loop-flag",0); +setprop(lw~"wave-loop-flag",0); setprop(lw~"buffer-loop-flag",0); setprop(lw~"housekeeping-loop-flag",0); +setprop(lw~"convective-loop-flag",0); # create other management properties -setprop(lw~"clouds/cloud-number",0); +#setprop(lw~"clouds/cloud-number",0); setprop(lw~"clouds/placement-index",0); setprop(lw~"clouds/model-placement-index",0); setprop(lw~"effect-volumes/effect-placement-index",0); @@ -3224,7 +3880,7 @@ setprop(lw~"effect-volumes/number-active-rain",0); setprop(lw~"effect-volumes/number-active-snow",0); setprop(lw~"effect-volumes/number-active-turb",0); setprop(lw~"effect-volumes/number-active-lift",0); - +setprop(lw~"effect-volumes/number-active-sat",0); # create properties for tile management diff --git a/Nasal/weather_dynamics.nas b/Nasal/weather_dynamics.nas index c92e12095..b89e3448d 100644 --- a/Nasal/weather_dynamics.nas +++ b/Nasal/weather_dynamics.nas @@ -1,6 +1,6 @@ ######################################################## # routines to simulate cloud wind drift and evolution -# Thorsten Renk, July 2010 +# Thorsten Renk, October 2010 ######################################################## # function purpose @@ -9,18 +9,18 @@ # timing_loop to provide accurate timing information for wind drift calculations # quadtree_loop to manage drift of clouds in the field of view # weather_dynamics_loop to manage drift of weather effects, tile centers and interpolation points +# convective_loop to regularly recreate convective clouds # generate_quadtree_structure to generate a quadtree data structure used for managing the visual field # sort_into_quadtree to sort objects into a quadtree structure +# sorting_recursion to recursively sort into a quadree (helper) # quadtree_recursion to search the quadtree for objects in the visual field # check_visibility to check if a quadrant is currently visible # move_tile to move tile coordinates in the wind -# move_effect_volume to move an effect volume in the wind -# move_weather_station to move a weather station in the wind # get_cartesian to get local Cartesian coordinates out of coordinates #################################################### -# get the windfield for a given locatio and altitude +# get the windfield for a given location and altitude # (currently constant, but supposed to be local later) #################################################### @@ -63,7 +63,8 @@ return windfield; var timing_loop = func { -time_lw = time_lw + getprop("/sim/time/delta-sec"); +dt_lw = getprop("/sim/time/delta-sec"); +time_lw = time_lw + dt_lw; if (getprop(lw~"timing-loop-flag") ==1) {settimer(timing_loop, 0);} @@ -116,6 +117,8 @@ foreach (t; tiles) cos_beta = math.cos(beta * math.pi/180.0); sin_beta = math.sin(beta * math.pi/180.0); plane_x = xy_vec[0]; plane_y = xy_vec[1]; + + windfield = get_windfield(index); quadtree_recursion(cloudQuadtrees[index-1],0,1,0.0,0.0); } @@ -156,34 +159,172 @@ if (getprop(lw~"dynamics-loop-flag") ==1) {settimer(quadtree_loop, 0);} -var weather_dynamics_loop = func (index) { +var weather_dynamics_loop = func (index, cindex) { var n = 20; +var nc = 1; +var csize = weather_tile_management.n_cloudSceneryArray; var i_max = index + n; if (i_max > local_weather.n_effectVolumeArray) {i_max = local_weather.n_effectVolumeArray;} +var ecount = 0; + for (var i = index; i < i_max; i = i+1) { - move_effect_volume(local_weather.effectVolumeArray[i]); + var ev = local_weather.effectVolumeArray[i]; + if (ev.index !=0) + {ev.move();} + if ((ev.lift_flag == 2) and (rand() < 0.05) and (local_weather.presampling_flag == 1)) + { + if (local_weather.dynamical_convection_flag ==1) + { + ev.correct_altitude_and_age(); + + if (ev.flt > 1.2) # beyond 1.0, sink is still active + { + local_weather.effectVolumeArray = weather_tile_management.delete_from_vector(local_weather.effectVolumeArray,i); + local_weather.n_effectVolumeArray = local_weather.n_effectVolumeArray - 1; + i = i-1; i_max = i_max -1; ecount = ecount + 1; + } + + } + else + {ev.correct_altitude();} + } } +setprop(lw~"effect-volumes/number",getprop(lw~"effect-volumes/number")- ecount); index = index + n; if (i >= local_weather.n_effectVolumeArray) {index = 0;} -var stations = props.globals.getNode(lw~"interpolation").getChildren("station"); -foreach (s; stations) +var ccount = 0; + +if (csize > 0) { - move_weather_station(s); + + var j_max = cindex + nc; + if (j_max > csize -1) {j_max = csize-1;} + + + for (var j = cindex; j < j_max; j = j+1) + { + var cs = weather_tile_management.cloudSceneryArray[j]; + #cs.move(); + if (cs.type !=0) + { + if ((rand() < 0.1) and (local_weather.presampling_flag == 1)) + { + if (local_weather.dynamical_convection_flag ==1) + { + cs.correct_altitude_and_age(); + if (cs.flt > 1.0) # the cloud has reached its maximum age and decays + { + cs.removeNodes(); + weather_tile_management.cloudSceneryArray = weather_tile_management.delete_from_vector(weather_tile_management.cloudSceneryArray,j); + ccount = ccount + 1; + } + } + else + { + cs.correct_altitude(); + } + } + } + } + +cindex = cindex + nc; +if (j >= csize) {cindex = 0;} } -if (getprop(lw~"dynamics-loop-flag") ==1) {settimer( func {weather_dynamics_loop(index); },0);} + + +foreach (s; local_weather.weatherStationArray) + { + s.move(); + } + +if (getprop(lw~"dynamics-loop-flag") ==1) {settimer( func {weather_dynamics_loop(index, cindex); },0);} } +########################################################### +# convective evolution loop +########################################################### + +var convective_loop = func { + +# a 30 second loop needs a different strategy to end, otherwise there is trouble if it is restarted while still running + +if (convective_loop_kill_flag == 1) + {convective_loop_kill_flag = 0; return;} + +var cloud_respawning_interval_s = 30.0; + + +if (getprop(lw~"tmp/thread-status") == "placing") + {if (getprop(lw~"convective-loop-flag") ==1) {settimer( func {convective_loop()}, 5.0);} return;} + +# open the system for write status +setprop(lw~"tmp/buffer-status","placing"); + +if (local_weather.debug_output_flag == 1) + {print("Respawning convective clouds...");} + +for(var i = 0; i < 9; i = i + 1) + { + var index = getprop(lw~"tiles/tile["~i~"]/tile-index"); + if ((index == -1) or (index == 0)) {continue;} + if (getprop(lw~"tiles/tile["~i~"]/generated-flag") != 2) + {continue;} + + var strength = tile_convective_strength[index-1]; + var alt = tile_convective_altitude[index-1]; + var n = weather_tiles.get_n(strength); + if (local_weather.detailed_clouds_flag == 1) + {n = int(0.7 * n);} + + n = n/cloud_convective_lifetime_s * cloud_respawning_interval_s * math.sqrt(0.35); + + n_res = n - int(n); + n = int(n); + if (rand() < n_res) {n=n+1;} + + if (local_weather.debug_output_flag == 1) + {print("Tile: ", index, " n: ", n);} + + var lat = getprop(lw~"tiles/tile["~i~"]/latitude-deg"); + var lon = getprop(lw~"tiles/tile["~i~"]/longitude-deg"); + var alpha = getprop(lw~"tiles/tile["~i~"]/orientation-deg"); + + compat_layer.buffered_tile_latitude = lat; + compat_layer.buffered_tile_longitude = lon; + compat_layer.buffered_tile_alpha = alpha; + compat_layer.buffered_tile_index = index; + + setprop(lw~"tmp/buffer-tile-index", index); + + if (local_weather.presampling_flag == 1) + {var alt_offset = local_weather.alt_20_array[index -1];} + else + {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} + + local_weather.recreate_cumulus(lat,lon, alt + alt_offset, alpha, n, 20000.0, index); + + } + +# close the write process +setprop(lw~"tmp/buffer-status","idle"); + + + +if (getprop(lw~"convective-loop-flag") ==1) {settimer(convective_loop, cloud_respawning_interval_s);} + +} + ########################################################### # generate quadtree structure ########################################################### @@ -266,7 +407,8 @@ if (depth == quadtree_depth +1) { foreach (var c; tree) { - compat_layer.move_cloud(c, current_tile_index_wd); + c.move(); + c.to_target_alt(); cloud_counter = cloud_counter + 1; } return; @@ -396,59 +538,6 @@ t.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); } -#################################################### -# move an effect volume -#################################################### - -var move_effect_volume = func (e) { - -# get the old spacetime position of the effect - -var lat_old = e.getNode("position/latitude-deg").getValue(); -var lon_old = e.getNode("position/longitude-deg").getValue(); -var tile_index = e.getNode("tile-index").getValue(); -var timestamp = e.getNode("timestamp-sec").getValue(); - -# get windfield and time since last update - -var windfield = weather_dynamics.get_windfield(tile_index); -var dt = weather_dynamics.time_lw - timestamp; - - -# update the spacetime position of the effect - -e.getNode("position/latitude-deg",1).setValue(lat_old + windfield[1] * dt * local_weather.m_to_lat); -e.getNode("position/longitude-deg",1).setValue(lon_old + windfield[0] * dt * local_weather.m_to_lon); -e.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); -} - - -#################################################### -# move a weather station -#################################################### - -var move_weather_station = func (s) { - -# get the old spacetime position of the station - -var lat_old = s.getNode("latitude-deg").getValue(); -var lon_old = s.getNode("longitude-deg").getValue(); -var tile_index = s.getNode("tile-index").getValue(); -var timestamp = s.getNode("timestamp-sec").getValue(); - -# get windfield and time since last update - -var windfield = weather_dynamics.get_windfield(tile_index); -var dt = weather_dynamics.time_lw - timestamp; - - -# update the spacetime position of the effect - -s.getNode("latitude-deg",1).setValue(lat_old + windfield[1] * dt * local_weather.m_to_lat); -s.getNode("longitude-deg",1).setValue(lon_old + windfield[0] * dt * local_weather.m_to_lon); -s.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); -} - ########################################################### # get local Cartesian coordinates @@ -504,7 +593,12 @@ var lw = "/local-weather/"; # globals var time_lw = 0.0; +var dt_lw = 0.0; var max_clouds_in_loop = 250; +var cloud_max_vertical_speed_fts = 30.0; +var cloud_convective_lifetime_s = 1800.0; # max. lifetime of convective clouds + +var convective_loop_kill_flag = 0; # the quadtree structure @@ -516,6 +610,8 @@ var quadtree_depth = 3; var tile_wind_direction = []; var tile_wind_speed = []; +var tile_convective_altitude = []; +var tile_convective_strength = []; # define these as global, as we need to evaluate them only once per frame # but use them over and over @@ -525,6 +621,7 @@ var cos_beta = 0; var sin_beta = 0; var plane_x = 0; var plane_y = 0; +var windfield = []; var current_tile_index_wd = 0; diff --git a/Nasal/weather_tile_management.nas b/Nasal/weather_tile_management.nas index b6090f3f9..32fc366e5 100644 --- a/Nasal/weather_tile_management.nas +++ b/Nasal/weather_tile_management.nas @@ -1,6 +1,6 @@ ######################################################## # routines to set up, transform and manage weather tiles -# Thorsten Renk, July 2010 +# Thorsten Renk, October 2010 ######################################################## # function purpose @@ -13,9 +13,17 @@ # create_neighbour to set up information for a new neighbouring tile # create_neighbours to initialize the 8 neighbours of the initial tile # buffer_loop to manage the buffering of faraway clouds in an array +# housekeeping_loop to shift clouds from the scenery into the buffer +# wathcdog loop (debug helping structure) # calc_geo to get local Cartesian geometry for latitude conversion # get_lat to get latitude from Cartesian coordinates # get_lon to get longitude from Cartesian coordinates +# delete_from_vector to delete an element 'n' from a vector + +# object purpose +# +# cloudBuffer to store a cloud in a Nasal buffer, to provide methods to move it +# cloudScenery to store info for clouds in scenery, to provide methods to move and evolve them ################################### @@ -38,11 +46,12 @@ var loading_flag = getprop(lw~"tmp/asymmetric-tile-loading-flag"); var this_frame_action_flag = 0; # use this flag to avoid overlapping tile operations setsize(active_tile_list,0); +#append(active_tile_list,0); # tile zero formally containing static objects is always active if (distance_to_load > 3.0 * current_visibility) {distance_to_load = 3.0 * current_visibility;} -if (distance_to_load < 25000.0) - {distance_to_load = 25000.0;} +if (distance_to_load < 29000.0) + {distance_to_load = 29000.0;} foreach (var t; tNode) { @@ -77,10 +86,11 @@ foreach (var t; tNode) { { this_frame_action_flag = 1; setprop(lw~"tiles/tile-counter",getprop(lw~"tiles/tile-counter")+1); - print("Building tile unique index ",getprop(lw~"tiles/tile-counter"), " in direction ",i); + if (local_weather.debug_output_flag == 1) + {print("Building tile unique index ",getprop(lw~"tiles/tile-counter"), " in direction ",i);} append(active_tile_list,getprop(lw~"tiles/tile-counter")); - if (getprop(lw~"config/dynamics-flag") == 1) + if (local_weather.dynamics_flag == 1) { var quadtree = []; weather_dynamics.generate_quadtree_structure(0, quadtree); @@ -97,7 +107,8 @@ foreach (var t; tNode) { if ((d > d_remove) and (flag == 2) and (this_frame_action_flag == 0)) # the tile needs to be deleted if it exists { - print("Removing tile, unique index ", t.getNode("tile-index").getValue()," direction ",i); + if (local_weather.debug_output_flag == 1) + {print("Removing tile, unique index ", t.getNode("tile-index").getValue()," direction ",i);} remove_tile(t.getNode("tile-index").getValue()); t.getNode("generated-flag").setValue(0); this_frame_action_flag = 1; @@ -132,7 +143,8 @@ foreach (var t; tNode) { print("Flag: ",gen_flag); } - print("Changing active tile to direction ", i_min); + if (local_weather.debug_output_flag == 1) + {print("Changing active tile to direction ", i_min);} change_active_tile(i_min); } @@ -169,28 +181,30 @@ setprop(lw~"tiles/tmp/dir-index",dir_index); # do windspeed and orientation before presampling check, but test not to do it again -if (((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) or (getprop(lw~"tmp/presampling-flag") == 0)) +if (((local_weather.presampling_flag == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) or (local_weather.presampling_flag == 0)) { var alpha = getprop(lw~"tmp/tile-orientation-deg"); + if ((local_weather.wind_model_flag == 2) or (local_weather.wind_model_flag ==4)) { alpha = alpha + 2.0 * (rand()-0.5) * 10.0; + # account for the systematic spin of weather systems around a low pressure # core dependent on hemisphere if (lat >0.0) {alpha = alpha -3.0;} else {alpha = alpha +3.0;} setprop(lw~"tmp/tile-orientation-deg",alpha); - + # compute the new windspeed var windspeed = getprop(lw~"tmp/windspeed-kt"); windspeed = windspeed + 2.0 * (rand()-0.5) * 2.0; if (windspeed < 0) {windspeed = rand();} - setprop(lw~"tmp/windspeed-kt", windspeed); + setprop(lw~"tmp/windspeed-kt",windspeed); # store the tile orientation and wind strength in an array for fast processing @@ -204,7 +218,6 @@ if (((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling- alpha = res[0]; setprop(lw~"tmp/tile-orientation-deg",alpha); - var windspeed = res[1]; setprop(lw~"tmp/windspeed-kt",windspeed); @@ -219,16 +232,17 @@ if (((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling- - # now see if we need to presample the terrain -if ((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) +if ((local_weather.presampling_flag == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) { local_weather.terrain_presampling_start(lat, lon, 1000, 40000, getprop(lw~"tmp/tile-orientation-deg")); return; } -print("Current tile type: ", code); + +if (local_weather.debug_output_flag == 1) + {print("Current tile type: ", code);} if (getprop(lw~"tmp/tile-management") == "repeat tile") { @@ -248,7 +262,11 @@ if (getprop(lw~"tmp/tile-management") == "repeat tile") else if (code == "cold_sector") {weather_tiles.set_cold_sector_tile();} else if (code == "warm_sector") {weather_tiles.set_warm_sector_tile();} else if (code == "tropical_weather") {weather_tiles.set_tropical_weather_tile();} - else {print("Repeat tile not implemented with this tile type!");} + else + { + print("Repeat tile not implemented with this tile type!"); + setprop("/sim/messages/pilot", "Local weather: Repeat tile not implemented with this tile type!"); + } } else if (getprop(lw~"tmp/tile-management") == "realistic weather") { @@ -370,6 +388,7 @@ else if (getprop(lw~"tmp/tile-management") == "realistic weather") else { print("Realistic weather not implemented with this tile type!"); + setprop("/sim/messages/pilot", "Local weather: Realistic weather not implemented with this tile type!"); } } # end if mode == realistic weather @@ -397,21 +416,34 @@ for (var j = 0; j < s; j=j+1) settimer( func { props.globals.getNode("local-weather/clouds", 1).removeChild("tile",index) },100); -#compat_layer.remove_clouds(index); var effectNode = props.globals.getNode("local-weather/effect-volumes").getChildren("effect-volume"); var ecount = 0; -foreach (var e; effectNode) +for (var i = 0; i < local_weather.n_effectVolumeArray; i = i + 1) { - if (e.getNode("tile-index").getValue() == index) - { - e.remove(); + ev = local_weather.effectVolumeArray[i]; + if (ev.index == index) + { + local_weather.effectVolumeArray = delete_from_vector(local_weather.effectVolumeArray,i); + local_weather.n_effectVolumeArray = local_weather.n_effectVolumeArray - 1; + i = i - 1; ecount = ecount + 1; } + else if (ev.index == 0) # use the opportunity to check if static effects should also be removed + { + if (ev.get_distance() > 80000.0) + { + local_weather.effectVolumeArray = delete_from_vector(local_weather.effectVolumeArray,i); + local_weather.n_effectVolumeArray = local_weather.n_effectVolumeArray - 1; + i = i - 1; + ecount = ecount + 1; + } + } } + setprop(lw~"effect-volumes/number",getprop(lw~"effect-volumes/number")- ecount); # set placement indices to zero to reinitiate search for free positions @@ -422,7 +454,7 @@ setprop(lw~"effect-volumes/effect-placement-index",0); # remove quadtree structures -if (getprop(lw~"config/dynamics-flag") ==1) +if (local_weather.dynamics_flag ==1) { settimer( func {setsize(weather_dynamics.cloudQuadtrees[index-1],0);},1.0); } @@ -568,11 +600,6 @@ t.getNode("timestamp-sec").setValue(f.getNode("timestamp-sec").getValue()); t.getNode("orientation-deg").setValue(f.getNode("orientation-deg").getValue()); t.getNode("code").setValue(f.getNode("code").getValue()); -#if (f.getNode("code").getValue() == "") -# {print("Empty tile code copying from ", from_index," to ", to_index, "!");} - -#if (f.getNode("code").getValue() != "") # we don't copy an empty code, that can trigger errors -# {t.getNode("code").setValue(f.getNode("code").getValue());} } @@ -630,7 +657,7 @@ setprop(lw~"tiles/tile[0]/generated-flag",0); setprop(lw~"tiles/tile[0]/tile-index",-1); setprop(lw~"tiles/tile[0]/code",""); setprop(lw~"tiles/tile[0]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[0]/orientation-deg",0.0); +setprop(lw~"tiles/tile[0]/orientation-deg",alpha); x = 0.0; y = 40000.0; setprop(lw~"tiles/tile[1]/latitude-deg",blat + get_lat(x,y,phi)); @@ -639,7 +666,7 @@ setprop(lw~"tiles/tile[1]/generated-flag",0); setprop(lw~"tiles/tile[1]/tile-index",-1); setprop(lw~"tiles/tile[1]/code",""); setprop(lw~"tiles/tile[1]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[1]/orientation-deg",0.0); +setprop(lw~"tiles/tile[1]/orientation-deg",alpha); x = 40000.0; y = 40000.0; setprop(lw~"tiles/tile[2]/latitude-deg",blat + get_lat(x,y,phi)); @@ -648,7 +675,7 @@ setprop(lw~"tiles/tile[2]/generated-flag",0); setprop(lw~"tiles/tile[2]/tile-index",-1); setprop(lw~"tiles/tile[2]/code",""); setprop(lw~"tiles/tile[2]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[2]/orientation-deg",0.0); +setprop(lw~"tiles/tile[2]/orientation-deg",alpha); x = -40000.0; y = 0.0; setprop(lw~"tiles/tile[3]/latitude-deg",blat + get_lat(x,y,phi)); @@ -657,7 +684,7 @@ setprop(lw~"tiles/tile[3]/generated-flag",0); setprop(lw~"tiles/tile[3]/tile-index",-1); setprop(lw~"tiles/tile[3]/code",""); setprop(lw~"tiles/tile[3]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[3]/orientation-deg",0.0); +setprop(lw~"tiles/tile[3]/orientation-deg",alpha); # this is the current tile x = 0.0; y = 0.0; @@ -677,7 +704,7 @@ setprop(lw~"tiles/tile[5]/generated-flag",0); setprop(lw~"tiles/tile[5]/tile-index",-1); setprop(lw~"tiles/tile[5]/code",""); setprop(lw~"tiles/tile[5]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[5]/orientation-deg",0.0); +setprop(lw~"tiles/tile[5]/orientation-deg",alpha); x = -40000.0; y = -40000.0; setprop(lw~"tiles/tile[6]/latitude-deg",blat + get_lat(x,y,phi)); @@ -686,7 +713,7 @@ setprop(lw~"tiles/tile[6]/generated-flag",0); setprop(lw~"tiles/tile[6]/tile-index",-1); setprop(lw~"tiles/tile[6]/code",""); setprop(lw~"tiles/tile[6]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[6]/orientation-deg",0.0); +setprop(lw~"tiles/tile[6]/orientation-deg",alpha); x = 0.0; y = -40000.0; setprop(lw~"tiles/tile[7]/latitude-deg",blat + get_lat(x,y,phi)); @@ -695,7 +722,7 @@ setprop(lw~"tiles/tile[7]/generated-flag",0); setprop(lw~"tiles/tile[7]/tile-index",-1); setprop(lw~"tiles/tile[7]/code",""); setprop(lw~"tiles/tile[7]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[7]/orientation-deg",0.0); +setprop(lw~"tiles/tile[7]/orientation-deg",alpha); x = 40000.0; y = -40000.0; setprop(lw~"tiles/tile[8]/latitude-deg",blat + get_lat(x,y,phi)); @@ -704,7 +731,7 @@ setprop(lw~"tiles/tile[8]/generated-flag",0); setprop(lw~"tiles/tile[8]/tile-index",-1); setprop(lw~"tiles/tile[8]/code",""); setprop(lw~"tiles/tile[8]/timestamp-sec",weather_dynamics.time_lw); -setprop(lw~"tiles/tile[8]/orientation-deg",0.0); +setprop(lw~"tiles/tile[8]/orientation-deg",alpha); } @@ -772,7 +799,7 @@ for (var i = index; i < i_max; i = i+1) # if wind drift is on, move the cloud - if (getprop(lw~"config/dynamics-flag") == 1) + if (local_weather.dynamics_flag == 1) { c.move(); } @@ -797,8 +824,30 @@ for (var i = index; i < i_max; i = i+1) if (d < d_comp) # insert the cloud into scenery and delete from buffer { - setprop(lw~"tmp/buffer-tile-index",c.index); + compat_layer.buffered_tile_index = c.index; + + if (local_weather.dynamics_flag == 1) # assemble the current tile coordinates for insertion into quadtree + { + for (var j = 0; j < 9; j=j+1) + { + if (getprop(lw~"tiles/tile["~j~"]/tile-index") == c.index) + { + compat_layer.buffered_tile_latitude = getprop(lw~"tiles/tile["~j~"]/latitude-deg"); + compat_layer.buffered_tile_longitude = getprop(lw~"tiles/tile["~j~"]/longitude-deg"); + compat_layer.buffered_tile_alpha=getprop(lw~"tiles/tile["~j~"]/orientation-deg"); + break; + } + } + } + + if ((c.type !=0) and (local_weather.dynamics_flag == 1)) # set additional info for Cumulus clouds + { + compat_layer.cloud_mean_altitude = c.alt - c.rel_alt; + compat_layer.cloud_flt = c.flt; + compat_layer.cloud_evolution_timestamp = c.evolution_timestamp; + } compat_layer.create_cloud(c.path, c.lat, c.lon, c.alt, c.orientation); + n_cloudSceneryArray = n_cloudSceneryArray +1; cloudBufferArray = delete_from_vector(cloudBufferArray,i); i = i -1; i_max = i_max - 1; n_max = n_max - 1; deleted_flag = 1; @@ -826,6 +875,7 @@ var housekeeping_loop = func (index) { var n = 5; var n_max = size(cloudSceneryArray); +n_cloudSceneryArray = n_max; var s = size(active_tile_list); setprop(lw~"clouds/cloud-scenery-count",n_max); @@ -869,6 +919,7 @@ for (var i = index; i < i_max; i = i+1) c.removeNodes(); cloudSceneryArray = delete_from_vector(cloudSceneryArray,i); i = i -1; i_max = i_max - 1; n_max = n_max - 1; + n_cloudSceneryArray = n_cloudSceneryArray -1; continue; } @@ -893,6 +944,7 @@ for (var i = index; i < i_max; i = i+1) append(cloudBufferArray,c.to_buffer()); cloudSceneryArray = delete_from_vector(cloudSceneryArray,i); i = i -1; i_max = i_max - 1; n_max = n_max - 1; + n_cloudSceneryArray = n_cloudSceneryArray -1; continue; } @@ -921,11 +973,13 @@ foreach(t; tNode) var code = t.getNode("code").getValue(); var index = t.getNode("tile-index").getValue(); var flag = t.getNode("generated-flag").getValue(); + var alpha = t.getNode("orientation-deg").getValue(); - print(i,": code: ", code, " unique id: ", index, " flag: ", flag); + print(i,": code: ", code, " unique id: ", index, " flag: ", flag, " alpha: ",alpha); i = i + 1; } +print("alpha: ",getprop(lw~"tmp/tile-orientation-deg")); print("===================="); @@ -963,8 +1017,9 @@ var active_tile_list = []; var cloudBufferArray = []; + var cloudBuffer = { - new: func(lat, lon, alt, path, orientation, index) { + new: func(lat, lon, alt, path, orientation, index, type) { var c = { parents: [cloudBuffer] }; c.lat = lat; c.lon = lon; @@ -972,6 +1027,7 @@ var cloudBuffer = { c.path = path; c.orientation = orientation; c.index = index; + c.type = type; return c; }, get_distance: func { @@ -1003,13 +1059,21 @@ var cloudBuffer = { var cloudSceneryArray = []; +var n_cloudSceneryArray = 0; var cloudScenery = { - new: func(index, cloudNode, modelNode) { + new: func(index, type, cloudNode, modelNode) { var c = { parents: [cloudScenery] }; c.index = index; + c.type = type; c.cloudNode = cloudNode; c.modelNode = modelNode; + c.calt = cloudNode.getNode("position/altitude-ft"); + c.clat = cloudNode.getNode("position/latitude-deg"); + c.clon = cloudNode.getNode("position/longitude-deg"); + c.alt = c.calt.getValue(); + c.lat = c.clat.getValue(); + c.lon = c.clon.getValue(); return c; }, removeNodes: func { @@ -1017,17 +1081,20 @@ var cloudScenery = { me.cloudNode.remove(); }, to_buffer: func { - var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); - var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); - var alt = me.cloudNode.getNode("position/altitude-ft").getValue(); var path = me.modelNode.getNode("path").getValue(); var orientation = me.cloudNode.getNode("orientation/true-heading-deg").getValue(); - var b = cloudBuffer.new(lat, lon, alt, path, orientation, me.index); + var b = cloudBuffer.new(me.lat, me.lon, me.alt, path, orientation, me.index, me.type); - if (getprop(lw~"config/dynamics-flag") == 1) + if (local_weather.dynamics_flag == 1) { - var timestamp = me.cloudNode.getNode("timestamp-sec").getValue(); - b.timestamp = timestamp; + b.timestamp = me.timestamp; + + if (me.type !=0) # Cumulus clouds get some extra info + { + b.flt = me.flt; + b.rel_alt = me.rel_alt; + b.evolution_timestamp = me.evolution_timestamp; + } } me.removeNodes(); @@ -1036,21 +1103,106 @@ var cloudScenery = { get_distance: func { var pos = geo.aircraft_position(); var cpos = geo.Coord.new(); - var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); - var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); + var lat = me.clat.getValue(); + var lon = me.clon.getValue(); cpos.set_latlon(lat,lon,0.0); return pos.distance_to(cpos); }, get_course: func { var pos = geo.aircraft_position(); var cpos = geo.Coord.new(); - var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); - var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); + var lat = me.clat.getValue(); + var lon = me.clon.getValue(); cpos.set_latlon(lat,lon,0.0); return pos.course_to(cpos); }, get_altitude: func { - return me.cloudNode.getNode("position/altitude-ft").getValue(); + return me.calt.getValue(); + }, + correct_altitude: func { + var lat = me.clat.getValue(); + var lon = me.clon.getValue(); + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + local_weather.alt_20_array[me.index-1]; + var elevation = compat_layer.get_elevation(lat, lon); + var alt_new = local_weather.get_convective_altitude(convective_alt, elevation, me.index); + me.target_alt = alt_new + me.rel_alt; + }, + correct_altitude_and_age: func { + var lat = me.lat; + var lon = me.lon; + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + local_weather.alt_20_array[me.index-1]; + + # get terrain elevation and landcover + + var elevation = -1.0; var p_cover = 0.2;# defaults if there is no info + var info = geodinfo(lat, lon); + if (info != nil) + { + elevation = info[0] * local_weather.m_to_ft; + if (info[1] != nil) + { + var landcover = info[1].names[0]; + if (contains(local_weather.landcover_map,landcover)) {p_cover = local_weather.landcover_map[landcover];} + else {p_cover = 0.2;} + } + } + + + # correct the altitude + var alt_new = local_weather.get_convective_altitude(convective_alt, elevation, me.index); + me.target_alt = alt_new + me.rel_alt; + + # correct fractional lifetime based on terrain below + var current_lifetime = math.sqrt(p_cover)/math.sqrt(0.35) * weather_dynamics.cloud_convective_lifetime_s; + var fractional_increase = (weather_dynamics.time_lw - me.evolution_timestamp)/current_lifetime; + me.flt = me.flt + fractional_increase; + me.evolution_timestamp = weather_dynamics.time_lw; + }, + to_target_alt: func { + if (me.type ==0) {return;} + var alt_diff = me.target_alt - me.alt; + if (alt_diff == 0.0) {return;} + var max_vertical_movement_ft = weather_dynamics.dt_lw * weather_dynamics.cloud_max_vertical_speed_fts; + if (abs(alt_diff) < max_vertical_movement_ft) + { + me.alt = me.target_alt; + } + else if (alt_diff < 0) + { + me.alt = me.alt -max_vertical_movement_ft; + } + else + { + me.alt = me.alt + max_vertical_movement_ft; + } + setprop(lw~"clouds/tile["~me.index~"]/cloud["~me.write_index~"]/position/altitude-ft", me.alt); + }, + move: func { + + + var windfield = weather_dynamics.windfield; + var dt = weather_dynamics.time_lw - me.timestamp; + + me.lat = me.lat + windfield[1] * dt * local_weather.m_to_lat; + me.lon = me.lon + windfield[0] * dt * local_weather.m_to_lon; + + setprop(lw~"clouds/tile["~me.index~"]/cloud["~me.write_index~"]/position/latitude-deg", me.lat); + setprop(lw~"clouds/tile["~me.index~"]/cloud["~me.write_index~"]/position/longitude-deg", me.lon); + + me.timestamp = weather_dynamics.time_lw; + + }, + show: func { + var lat = me.clat.getValue(); + var lon = me.clon.getValue(); + var alt = me.calt.getValue(); + + var convective_alt = weather_dynamics.tile_convective_altitude[me.index-1] + local_weather.alt_20_array[me.index-1]; + var elevation = compat_layer.get_elevation(lat, lon); + print("lat :", lat, " lon: ", lon, " alt: ", alt); + print("path: ", me.modelNode.getNode("path").getValue()); + print("elevation: ", compat_layer.get_elevation(lat, lon), " cloudbase: ", convective_alt); + if (me.type !=0) {print("relative: ", me.rel_alt, "target: ", me.target_alt);} }, }; diff --git a/Nasal/weather_tiles.nas b/Nasal/weather_tiles.nas index a7b7bc33d..c306709c4 100644 --- a/Nasal/weather_tiles.nas +++ b/Nasal/weather_tiles.nas @@ -1,7 +1,7 @@ ######################################################## # routines to set up weather tiles -# Thorsten Renk, July 2010 +# Thorsten Renk, October 2010 ######################################################## # function purpose @@ -22,7 +22,7 @@ var tile_start = func { # set thread lock -if (getprop(lw~"tmp/thread-flag") == 1){setprop(lw~"tmp/thread-status","computing");} +if (local_weather.thread_flag == 1){setprop(lw~"tmp/thread-status","computing");} # set the tile code var current_code = getprop(lw~"tiles/code"); @@ -51,9 +51,10 @@ var dir_index = getprop(lw~"tiles/tmp/dir-index"); local_weather.assemble_effect_array(); -print("Finished setting up tile type ",current_code, " in direction ",dir_index); +if (local_weather.debug_output_flag == 1) + {print("Finished setting up tile type ",current_code, " in direction ",dir_index);} -if (getprop(lw~"tmp/thread-flag") == 1) +if (local_weather.thread_flag == 1) {setprop(lw~"tmp/thread-status","placing");} else # without worker threads, tile generation is complete at this point {props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2);} @@ -97,10 +98,17 @@ local_weather.set_weather_station(blat, blon, 20000.0, 14.0, 12.0, 29.78); #create_2_8_sstratus_streak(blat, blon,5000.0,0.0); -create_4_8_cirrocumulus_bank(blat, blon, 6000.0, 0.0); +#create_4_8_cirrocumulus_bank(blat, blon, 6000.0, 0.0); + +#create_4_8_cirrocumulus_streaks(blat, blon, 6000.0, 0.0); + +# create_2_8_cirrocumulus(blat, blon, 6000.0, 0.0); #create_detailed_stratocumulus_bank(blat, blon,5000.0+alt_offset,0.0); +create_4_8_altocumulus_perlucidus(blat, blon, 10000.0, 0.0); + +local_weather.create_effect_volume(3, blat, blon, 20000.0, 7000.0, alpha, 0.0, 80000.0, -1, -1, -1, -1, 15.0, -3,-1); tile_finished(); @@ -143,12 +151,43 @@ var p = 1025.0 + rand() * 6.0; p = adjust_p(p); # and set them at the tile center local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); -# weak cumulus development var alt = spread * 1000; -var strength = rand() * 0.05; +var strength = 0.0; -local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); +var rn = rand(); + + +if (rn > 0.5) + { + # cloud scenario 1: weak cumulus development and blue thermals + + strength = rand() * 0.05; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + # generate a few blue thermals + + if (local_weather.generate_thermal_lift_flag !=0) + { + local_weather.generate_thermal_lift_flag = 3; + strength = rand() * 0.4; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + local_weather.generate_thermal_lift_flag = 2; + } + + } +else if (rn > 0.0) + { + # cloud scenario 2: some Cirrocumulus patches + + create_2_8_cirrocumulus(blat, blon, alt + alt_offset + 5000.0, alpha); + } + + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -192,36 +231,35 @@ var p = 1019.0 + rand() * 6.0; p = adjust_p(p); # and set them at the tile center local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); -# moderate cumulus development var alt = spread * 1000; +var strength = 0.0; var rn = rand(); + if (rn > 0.66) { # cloud scenario 1: possible Cirrus over Cumulus - var strength = 0.2 + rand() * 0.4; + strength = 0.2 + rand() * 0.4; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); # one or two Cirrus clouds x = 2000.0 + rand() * 16000.0; y = 2.0 * (rand()-0.5) * 18000; - alt = 25000.0 + rand() * 5000.0; var path = local_weather.select_cloud_model("Cirrus", "small"); - compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset,alpha); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset + 25000.0 + rand() * 5000.0,alpha); if (rand() > 0.5) { x = -2000.0 - rand() * 16000.0; y = 2.0 * (rand()-0.5) * 18000; - alt = 25000.0 + rand() * 5000.0; var path = local_weather.select_cloud_model("Cirrus", "small"); - compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset,alpha); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +25000.0 + rand() * 5000.0,alpha); } } @@ -229,7 +267,7 @@ else if (rn > 0.33) { # cloud scenario 2: Cirrostratus over weak Cumulus - var strength = 0.2 + rand() * 0.2; + strength = 0.2 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); create_2_8_cirrostratus(blat, blon, alt+alt_offset+25000.0, alpha); @@ -239,7 +277,7 @@ else if (rn > 0.0) { # cloud scenario 3: Cirrocumulus sheet over Cumulus - var strength = 0.2 + rand() * 0.2; + strength = 0.2 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); x = 2.0 * (rand()-0.5) * 5000; @@ -251,6 +289,12 @@ else if (rn > 0.0) } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + + tile_finished(); } @@ -296,25 +340,26 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # now a random selection of different possible cloud configuration scenarios var alt = spread * 1000; +var strength = 0.0; var rn = rand(); -if (rn > 0.833) +if (rn > 0.875) { # cloud scenario 1: Altocumulus patch over weak Cumulus - var strength = 0.1 + rand() * 0.1; + strength = 0.1 + rand() * 0.1; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); x = 2.0 * (rand()-0.5) * 5000; y = 2.0 * (rand()-0.5) * 5000; - local_weather.create_streak("Altocumulus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 12000.0+alt+alt_offset,1500.0,30,1000.0,0.2,800.0,30,1000.0,0.2,800.0,alpha ,1.0); + local_weather.create_streak("Altocumulus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 12000.0+alt+alt_offset,1500.0,30,1000.0,0.2,1200.0,30,1000.0,0.2,1200.0,alpha ,1.0); } -else if (rn > 0.666) +else if (rn > 0.750) { # cloud scenario 2: Altocumulus streaks - var strength = 0.15 + rand() * 0.2; + strength = 0.15 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); x = 2.0 * (rand()-0.5) * 10000; @@ -322,14 +367,14 @@ else if (rn > 0.666) local_weather.create_streak("Altocumulus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 12000.0+alt+alt_offset,1500.0,25,700.0,0.2,800.0,10,700.0,0.2,800.0,alpha ,1.4); x = 2.0 * (rand()-0.5) * 10000; y = 2.0 * (rand()-0.5) * 10000; - local_weather.create_streak("Altocumulus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 12000.0+alt+alt_offset,1500.0,22,750.0,0.2,800.0,8,750.0,0.2,800.0,alpha ,1.1); + local_weather.create_streak("Altocumulus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 12000.0+alt+alt_offset,1500.0,22,750.0,0.2,1000.0,8,750.0,0.2,1000.0,alpha ,1.1); } -else if (rn > 0.5) +else if (rn > 0.625) { # cloud scenario 3: Cirrus - var strength = 0.1 + rand() * 0.1; + strength = 0.1 + rand() * 0.1; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); x = 2.0 * (rand()-0.5) * 3000; @@ -337,11 +382,11 @@ else if (rn > 0.5) local_weather.create_streak("Cirrus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 22000.0+alt+alt_offset,1500.0,3,9000.0,0.0, 800.0, 1,8000.0,0.0,800,0,alpha ,1.0); } -else if (rn > 0.333) +else if (rn > 0.5) { # cloud scenario 4: Cumulonimbus banks - var strength = 0.7 + rand() * 0.3; + strength = 0.7 + rand() * 0.3; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); for (var i = 0; i < 3; i = i + 1) @@ -352,11 +397,11 @@ else if (rn > 0.333) create_cloud_bank("Cumulonimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset, 1600.0, 800.0, 3000.0, 9, alpha); } } -else if (rn > 0.166) +else if (rn > 0.375) { # cloud scenario 5: scattered Stratus - var strength = 0.4 + rand() * 0.2; + strength = 0.4 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus_structured"]; @@ -364,11 +409,11 @@ else if (rn > 0.166) local_weather.create_streak("Stratus (structured)",blat, blon, alt+6000.0+alt_offset+size_offset,1000.0,18,0.0,0.3,20000.0,18,0.0,0.3,20000.0,0.0,1.0); } -else if (rn > 0.0) +else if (rn > 0.250) { # cloud scenario 6: Cirrocumulus sheets - var strength = 0.2 + rand() * 0.2; + strength = 0.2 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); @@ -383,10 +428,31 @@ else if (rn > 0.0) var path = local_weather.select_cloud_model("Cirrocumulus", "large"); compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +20000+ alt_variation,alpha+ beta); } + } +else if (rn > 0.125) + { + # cloud scenario 7: Thin Cirrocumulus sheets over weak Cumulus + + strength = 0.05 + rand() * 0.1; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + create_4_8_cirrocumulus_streaks(blat, blon, alt + 6000.0 + alt_offset, alpha); + + } +else if (rn > 0.0) + { + # cloud scenario 8: Altocumulus perlucidus + + create_4_8_altocumulus_perlucidus(blat, blon, alt + 10000.0 + alt_offset, alpha); } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + tile_finished(); @@ -435,6 +501,7 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; # now a random selection of different possible cloud configuration scenarios @@ -484,6 +551,11 @@ else if (rn > 0.0) create_4_8_cirrocumulus_bank(blat, blon, alt+alt_offset + 12000.0, alpha); } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + tile_finished(); } @@ -531,6 +603,7 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; var rn = rand(); @@ -547,16 +620,16 @@ if (rn > 0.75) var beta = rand() * 360.0; local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 1, 1.0); - local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 10000.0, 6000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0 ); - local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0 ); + local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 10000.0, 6000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0,-1 ); + local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 ); x = 2.0 * (rand()-0.5) * 11000.0; y = 2.0 * (rand()-0.5) * 11000.0; var beta = rand() * 360.0; local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset, 500.0, 10000.0, 6000.0, beta, 1.0, 0.2, 1, 1.0); - local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0 ); - local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 8000.0, 4000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0 ); + local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0 ,-1); + local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 8000.0, 4000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 ); create_4_8_sstratus_undulatus(blat, blon, alt+alt_offset +3000.0, alpha); create_2_8_tstratus(blat, blon, alt+alt_offset +6000.0, alpha); @@ -569,8 +642,8 @@ else if (rn >0.5) alt = alt + local_weather.cloud_vertical_size_map["Stratus"] * 0.5 * m_to_ft; create_8_8_stratus(blat, blon, alt+alt_offset,alpha); - local_weather.create_effect_volume(3, blat, blon, 18000.0, 18000.0, 0.0, 0.0, 1800.0, 8000.0, -1, -1, -1, -1, 0); - local_weather.create_effect_volume(3, blat, blon, 14000.0, 14000.0, 0.0, 0.0, 1500.0, 6000.0, 0.1, -1, -1, -1,0 ); + local_weather.create_effect_volume(3, blat, blon, 18000.0, 18000.0, 0.0, 0.0, 1800.0, 8000.0, -1, -1, -1, -1, 0,-1); + local_weather.create_effect_volume(3, blat, blon, 14000.0, 14000.0, 0.0, 0.0, 1500.0, 6000.0, 0.1, -1, -1, -1,0,-1 ); create_2_8_sstratus(blat, blon, alt+alt_offset+3000,alpha); } else if (rn >0.25) @@ -594,6 +667,11 @@ else if (rn >0.0) create_2_8_sstratus(blat, blon, alt+alt_offset+6000,alpha); } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + tile_finished(); } @@ -643,15 +721,15 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # set a closed Nimbostratus layer var alt = spread * 1000.0 + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft; +var strength = 0.0; -#print("alt: ",spread*1000); create_8_8_nimbus(blat, blon, alt+alt_offset, alpha); # and a precipitation layer below, more rain in the center of the tile -local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, alpha, 0.0, alt + alt_offset, 3000.0, 0.3, -1, -1, -1,0 ); -local_weather.create_effect_volume(3, blat , blon, 16000.0, 16000.0, alpha, 0.0, alt + alt_offset - 300.0, 1500.0, 0.5, -1, -1, -1,0 ); +local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, alpha, 0.0, alt + alt_offset, 3000.0, 0.3, -1, -1, -1,0 ,0.95); +local_weather.create_effect_volume(3, blat , blon, 16000.0, 16000.0, alpha, 0.0, alt + alt_offset - 300.0, 1500.0, 0.5, -1, -1, -1,0 ,0.8); # and some broken Stratus cover above @@ -661,6 +739,10 @@ var rn = rand(); if (rn > 0.5){create_4_8_stratus_patches(blat, blon, alt+alt_offset+3000.0, alpha);} else {create_4_8_stratus(blat, blon, alt+alt_offset+3000.0, alpha);} +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -705,6 +787,7 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; var rn = rand(); @@ -713,7 +796,7 @@ var rn = rand(); if (rn > 0.5) { # cloud scenario 1: strong Cumulus development - var strength = 0.8 + rand() * 0.2; + strength = 0.8 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); } @@ -721,7 +804,7 @@ else if (rn > 0.0) { # cloud scenario 2: Cirrocumulus sheets over Cumulus - var strength = 0.6 + rand() * 0.2; + strength = 0.6 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); for (var i = 0; i < 2; i = i + 1) @@ -738,6 +821,12 @@ else if (rn > 0.0) } +#local_weather.create_effect_volume(3, blat, blon, 20000.0, 7000.0, alpha, 0.0, 80000.0, -1, -1, -1, -1, 15.0, -3,-1); + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -782,6 +871,7 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; var rn = rand(); @@ -789,14 +879,14 @@ var rn = rand(); if (rn > 0.8) { # cloud scenario 1: weak Cumulus development, some Cirrostratus - var strength = 0.3 + rand() * 0.2; + strength = 0.3 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); create_4_8_cirrostratus_patches(blat, blon, alt+alt_offset+25000.0, alpha); } else if (rn > 0.6) { # cloud scenario 2: weak Cumulus development under Altostratus streaks - var strength = 0.1 + rand() * 0.1; + strength = 0.1 + rand() * 0.1; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus_structured"]; @@ -807,7 +897,7 @@ else if (rn > 0.6) else if (rn > 0.4) { # cloud scenario 3: Cirrocumulus bank - var strength = 0.05 + rand() * 0.05; + strength = 0.05 + rand() * 0.05; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Cirrocumulus"]; @@ -818,7 +908,7 @@ else if (rn > 0.4) else if (rn > 0.2) { # cloud scenario 4: Cirrocumulus undulatus - var strength = 0.05 + rand() * 0.05; + strength = 0.05 + rand() * 0.05; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Cirrocumulus"]; @@ -830,7 +920,7 @@ else if (rn > 0.0) { # cloud scenario 5: weak Cumulus development under scattered Altostratus - var strength = 0.15 + rand() * 0.15; + strength = 0.15 + rand() * 0.15; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus_structured"]; @@ -839,6 +929,10 @@ else if (rn > 0.0) } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -892,6 +986,7 @@ local_weather.set_weather_station(blat, blon, vis, T, D, p * hp_to_inhg); # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; # tropical weather has a strong daily variation, call thunderstorm only in the correct afternoon time window @@ -901,7 +996,7 @@ var rn = rand(); if (rn > (t_factor * t_factor * t_factor * t_factor)) # call a normal convective cloud system { -var strength = 1.0 + rand() * 0.2; +strength = 1.0 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); } @@ -954,10 +1049,15 @@ local_weather.cumulus_exclusion_layer(blat, blon, alt+alt_offset, n, 20000.0, 20 # some turbulence in the convection layer -local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, alpha, 0.0, alt+3000.0+alt_offset, -1, -1, -1, 0.4, -1,0 ); +local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, alpha, 0.0, alt+3000.0+alt_offset, -1, -1, -1, 0.4, -1,0 ,-1); } # end thundercloud placement +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + tile_finished(); } @@ -1019,6 +1119,7 @@ local_weather.set_weather_station(blat +get_lat(x,y,phi), blon + get_lon(x,y,phi # altitude for the lowest layer var alt = spread * 1000.0; +var strength = 0.0; # thunderstorms first @@ -1072,12 +1173,17 @@ local_weather.create_streak("Stratus (thin)",blat+get_lat(x,y,phi), blon+get_lon # some turbulence in the convection layer x=0.0; y = 5000.0; -local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 11000.0, alpha, 0.0, alt+3000.0+alt_offset, -1, -1, -1, 0.4, -1,0 ); +local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 11000.0, alpha, 0.0, alt+3000.0+alt_offset, -1, -1, -1, 0.4, -1,0 ,-1); # some rain and reduced visibility in its core x=0.0; y = 5000.0; -local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 8000.0, alpha, 0.0, alt+alt_offset, 10000.0, 0.1, -1, -1, -1,0 ); +local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 8000.0, alpha, 0.0, alt+alt_offset, 10000.0, 0.1, -1, -1, -1,0,-1 ); + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1145,6 +1251,12 @@ local_weather.set_weather_station(blat +get_lat(x,y,phi), blon + get_lon(x,y,phi # altitude for the lowest layer var alt = spread * 1000.0; +# some weak Cumulus development + +var strength = 0.1 + rand() * 0.1; +local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + # high Cirrus leading x = 2.0 * (rand()-0.5) * 1000; @@ -1165,6 +1277,11 @@ for (var i=0; i<6; i=i+1) } +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); + tile_finished(); } @@ -1230,7 +1347,7 @@ local_weather.set_weather_station(blat +get_lat(x,y,phi), blon + get_lon(x,y,phi # altitude for the lowest layer var alt = spread * 1000.0; - +var strength = 0.0; # followed by random patches of Cirrostratus @@ -1273,6 +1390,10 @@ var y = 8000.0; local_weather.create_streak("Stratus",blat +get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset +5000.0,1000.0,30,0.0,0.2,20000.0,10,0.0,0.2,12000.0,alpha,1.0); +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1339,7 +1460,7 @@ local_weather.set_weather_station(blat +get_lat(x,y,phi), blon + get_lon(x,y,phi # altitude for the lowest layer var alt = spread * 1000.0 + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft; - +var strength = 0.0; # closed Stratus layer @@ -1364,12 +1485,18 @@ local_weather.create_streak("Nimbus",blat +get_lat(x,y,phi), blon+get_lon(x,y,ph # some rain beneath the stratus x=0.0; y = -10000.0; -local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 10000.0, alpha, 0.0, alt+alt_offset+1000, vis * 0.7, 0.1, -1, -1, -1,0 ); +local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 10000.0, alpha, 0.0, alt+alt_offset+1000, vis * 0.7, 0.1, -1, -1, -1,0 ,-1); # heavier rain beneath the Nimbostratus x=0.0; y = 10000.0; -local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 10000.0, alpha, 0.0, alt+alt_offset, vis * 0.5, 0.3, -1, -1, -1,0 ); +local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 10000.0, alpha, 0.0, alt+alt_offset, vis * 0.5, 0.3, -1, -1, -1,0,-1 ); + + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1436,6 +1563,7 @@ local_weather.set_weather_station(blat +get_lat(x,y,phi), blon + get_lon(x,y,phi # altitude for the lowest layer var alt = spread * 1000.0 + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft; +var strength = 0.0; # low Nimbostratus layer @@ -1461,7 +1589,13 @@ local_weather.create_streak("Nimbus",blat +get_lat(x,y,phi), blon+get_lon(x,y,ph # rain beneath the Nimbostratus x=0.0; y = -5000.0; -local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 15000.0, alpha, 0.0, alt+alt_offset, vis * 0.5, 0.3, -1, -1, -1,0 ); +local_weather.create_effect_volume(3, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0, 15000.0, alpha, 0.0, alt+alt_offset, vis * 0.5, 0.3, -1, -1, -1,0 ,-1); + + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1481,7 +1615,7 @@ tile_finished(); var set_gliders_sky_tile = func { -setprop(lw~"tiles/code","glides_sky"); +setprop(lw~"tiles/code","gliders_sky"); tile_start(); @@ -1503,16 +1637,20 @@ calc_geo(blat); # first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) local_weather.set_weather_station(blat, blon, 35000.0, 20.0, 16.0, 1018 * hp_to_inhg); -# switch the placement of thermal effect volumes on: 1: constant lift 2: by function -setprop(lw~"tmp/generate-thermal-lift-flag",2); +var alt = 3000.0; + # add convective clouds var strength = 0.5; var n = int(4000 * strength); # calculate the number of placement tries from tile size 20x20km and strength -local_weather.create_cumosys(blat,blon, 3000.0+alt_offset,n, 20000.0); +local_weather.create_cumosys(blat,blon, alt+alt_offset,n, 20000.0); +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1547,16 +1685,28 @@ calc_geo(blat); # first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) local_weather.set_weather_station(blat, blon, 45000.0, 20.0, 15.0, 1018 * hp_to_inhg); -# switch the placement of thermal effect volumes on: 1: constant lift 2: by function 3: blue -setprop(lw~"tmp/generate-thermal-lift-flag",3); +local_weather.generate_thermal_lift_flag = 3; +var alt = 5000.0; # add convective clouds +# set flag to blue thermal generation +if (local_weather.generate_thermal_lift_flag !=0) + {local_weather.generate_thermal_lift_flag = 3;} + var strength = 0.9; var n = int(4000 * strength); # calculate the number of placement tries from tile size 20x20km and strength local_weather.create_cumosys(blat,blon, 5000.0+alt_offset,n, 20000.0); +# set flag back to normal thermal generation +if (local_weather.generate_thermal_lift_flag !=0) + {local_weather.generate_thermal_lift_flag = 0;} + +# store convective altitude and strength + +append(weather_dynamics.tile_convective_altitude,alt); +append(weather_dynamics.tile_convective_strength,strength); tile_finished(); @@ -1723,6 +1873,10 @@ for (var i = n; i 320 100 20 - 25000.0 + 29000.0 55000.0 /local-weather/config/distance-to-load-tile-m diff --git a/gui/dialogs/local_weather_tiles.xml b/gui/dialogs/local_weather_tiles.xml index 2d3b86397..770a45620 100644 --- a/gui/dialogs/local_weather_tiles.xml +++ b/gui/dialogs/local_weather_tiles.xml @@ -35,9 +35,6 @@ Coldfront Warmfront Tropical - --- - Glider's sky - Blue thermals dialog-apply @@ -104,7 +101,7 @@ constant in tile aloft interpolated aloft waypoints - + dialog-apply @@ -150,8 +147,8 @@ 150 15 15 - - /local-weather/tmp/thread-flag + + /local-weather/config/generate-thermal-lift-flag dialog-apply @@ -162,8 +159,8 @@ 125 15 15 - - /local-weather/tmp/asymmetric-tile-loading-flag + + /local-weather/config/debug-output-flag dialog-apply @@ -193,6 +190,18 @@ + + 150 + 100 + 15 + 15 + + /local-weather/config/dynamical-convection-flag + + dialog-apply + + + 10 75 @@ -250,7 +259,7 @@ - - - - - - - - - - - - - - - - - + + + + + + From 1ff1469fc11f70dd18bb02cd3dacfac9854d5942 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam Date: Sun, 31 Oct 2010 12:29:02 +0100 Subject: [PATCH 29/40] Updated WalkView: - Added a default key binding file. - Improved the documentation. --- Aircraft/Generic/WalkView/walk-view-keys.xml | 198 +++++++++++++++++++ Aircraft/Generic/WalkView/walkview.nas | 7 +- 2 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 Aircraft/Generic/WalkView/walk-view-keys.xml diff --git a/Aircraft/Generic/WalkView/walk-view-keys.xml b/Aircraft/Generic/WalkView/walk-view-keys.xml new file mode 100644 index 000000000..5471e9026 --- /dev/null +++ b/Aircraft/Generic/WalkView/walk-view-keys.xml @@ -0,0 +1,198 @@ + + + + + + + + + W + Walk view: Run forward. + + nasal + + + + + nasal + + + + + + + w + Walk view: Walk forward. + + nasal + + + + + nasal + + + + + + + d + Walk view: Side step right. + true + + nasal + + + + + nasal + + + + + + + D + Walk view: Fast side step right. + true + + nasal + + + + + nasal + + + + + + + a + Walk view: Side step left. + true + + nasal + + + + + nasal + + + + + + A + Walk view: Fast side step left. + true + + nasal + + + + + nasal + + + + + + + s + Walk view: Walk backwards. + + nasal + + + + + nasal + + + + + + + + diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index cecd081c6..105015900 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -100,7 +100,8 @@ var active_walker = func { # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -# +# See Aircraft/Nordstern, Aircraft/Short_Empire or Aircraft/ZLT-NT +# for working examples of walk views. var walker = { new : func (view_name, constraints = nil, managers = nil) { var obj = { parents : [walker] }; @@ -124,7 +125,7 @@ var walker = { view.manager.register(view_name, obj); walkers[obj.view.getPath()] = obj; - debug.dump(obj); + #debug.dump(obj); return obj; }, active : func { @@ -216,6 +217,8 @@ var walker = { ############################################################################### # Constraint classes. Determines where the view can walk. +# + # The union of two constraints. # c1, c2 - the constraints : constraint From e00d8d30ea3c36875c7fd70b36ca6e91beb106dc Mon Sep 17 00:00:00 2001 From: Detlef Faber Date: Sun, 31 Oct 2010 16:36:20 +0100 Subject: [PATCH 30/40] generic logos: add Logo of the day >:) --- Aircraft/Generic/Logos/pumpkin.png | Bin 0 -> 57809 bytes Aircraft/Generic/Logos/pumpkin.xml | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 Aircraft/Generic/Logos/pumpkin.png create mode 100644 Aircraft/Generic/Logos/pumpkin.xml diff --git a/Aircraft/Generic/Logos/pumpkin.png b/Aircraft/Generic/Logos/pumpkin.png new file mode 100644 index 0000000000000000000000000000000000000000..98edaa7b7ec2a54d7b01add92a9e9c8d51b90013 GIT binary patch literal 57809 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 + + + + + + Pumpkin + ../../Generic/Logos/pumpkin.png + + + + From 4692db87d6504664b724fce62792f78d9e1bc561 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam Date: Sun, 31 Oct 2010 22:06:44 +0100 Subject: [PATCH 31/40] Updated WalkView: Added a more general area constraint: linePlane. --- Aircraft/Generic/WalkView/walkview.nas | 94 +++++++++++++++++++++----- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 105015900..8ed1bb61f 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -97,11 +97,12 @@ var active_walker = func { # [19.5, 0.3, -8.85]); # var walker = walkview.walker.new("Passenger View", constraint); # +# See Aircraft/Nordstern, Aircraft/Short_Empire and Aircraft/ZLT-NT +# for working examples of walk views. +# # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -# See Aircraft/Nordstern, Aircraft/Short_Empire or Aircraft/ZLT-NT -# for working examples of walk views. var walker = { new : func (view_name, constraints = nil, managers = nil) { var obj = { parents : [walker] }; @@ -259,26 +260,55 @@ var makeUnionConstraint = func (cs) { return ret; } +# Rectangular plane defined by a straight line and a width. +# The line is extruded horizontally on each side by width/2 into a +# planar surface. +# p1, p2 - the line endpoints. +# width - total width of the plane. +var linePlane = { + new : func (p1, p2, width) { + var obj = { parents : [linePlane] }; + obj.p1 = p1; + obj.p2 = p2; + obj.halfwidth = width/2; + obj.length = vec2.length(vec2.sub(p2, p1)); + obj.e1 = vec2.normalize(vec2.sub(p2, p1)); + obj.e2 = [obj.e1[1], -obj.e1[0]]; + obj.k = (p2[2] - p1[2]) / obj.length; + + return obj; + }, + constrain : func (pos) { + var p = [pos[0], pos[1], pos[2]]; + var pXY = vec2.sub(pos, me.p1); + var along = vec2.dot(pXY, me.e1); + var across = vec2.dot(pXY, me.e2); + + var along2 = max(0, min(along, me.length)); + var across2 = max(-me.halfwidth, min(across, me.halfwidth)); + if (along2 != along or across2 != across) { + # Compute new XY position. + var t = vec2.add(vec2.mul(along2, me.e1), vec2.mul(across2, me.e2)); + p[0] = me.p1[0] + t[0]; + p[1] = me.p1[1] + t[1]; + } + + # Compute Z positition. + p[2] = me.p1[2] + me.k * along2; + return p; + } +}; + # Mostly aligned plane sloping along the X axis. +# NOTE: Obsolete. Use linePlane instead. # minp - the X,Y minimum point : position (meter) # maxp - the X,Y maximum point : position (meter) var slopingYAlignedPlane = { new : func (minp, maxp) { - var obj = { parents : [slopingYAlignedPlane] }; - obj.minp = minp; - obj.maxp = maxp; - obj.kxz = (maxp[2] - minp[2])/(maxp[0] - minp[0]); - return obj; - }, - constrain : func (pos) { - var p = [pos[0], pos[1], pos[2]]; - if (pos[0] < me.minp[0]) p[0] = me.minp[0]; - if (pos[0] > me.maxp[0]) p[0] = me.maxp[0]; - if (pos[1] < me.minp[1]) p[1] = me.minp[1]; - if (pos[1] > me.maxp[1]) p[1] = me.maxp[1]; - p[2] = me.minp[2] + me.kxz * (pos[0] - me.minp[0]); - return p; - }, + return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], + [maxp[0], (minp[1] + maxp[1])/2, maxp[2]], + (maxp[1] - minp[1])); + } }; # Action constraint @@ -369,3 +399,33 @@ var closerXY = func (pos, p1, p2) { var l2 = [p2[0] - pos[0], p2[1] - pos[1]]; return (l1[0]*l1[0] + l1[1]*l1[1]) - (l2[0]*l2[0] + l2[1]*l2[1]); } + +var max = func (a, b) { + return b > a ? b : a; +} +var min = func (a, b) { + return a > b ? b : a; +} + +# 2D vector math. +var vec2 = { + add : func (a, b) { + return [a[0] + b[0], a[1] + b[1]]; + }, + sub : func (a, b) { + return [a[0] - b[0], a[1] - b[1]]; + }, + mul : func (k, a) { + return [k * a[0], k * a[1]]; + }, + length : func (a) { + return math.sqrt(a[0]*a[0] + a[1]*a[1]); + }, + dot : func (a, b) { + return a[0]*b[0] + a[1]*b[1]; + }, + normalize : func (a) { + var s = 1/vec2.length(a); + return [s * a[0], s * a[1]]; + } +} From 5612cd36dde115425da9e4e35ceb7ed1ce7bbc7a Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Mon, 1 Nov 2010 17:47:08 +0100 Subject: [PATCH 32/40] Horse/cow (scenery) culling... Removed since this caused severe scenery (un)loading issues with osg. Scenery nodes with too many parents cause extreme delays when unloading tiles. => Need a better cow/horse-herd implementation! :) --- materials.xml | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/materials.xml b/materials.xml index e3f79bf99..828bc5cdf 100644 --- a/materials.xml +++ b/materials.xml @@ -1320,6 +1320,9 @@ Shared parameters for various materials. random + 1000000.0 20000.0 4000.0 @@ -1383,6 +1386,9 @@ Shared parameters for various materials. random + 500000.0 Textures/Trees/mixed-summer.png 8 @@ -1444,6 +1450,9 @@ Shared parameters for various materials. random + 500000.0 20000.0 5000.0 @@ -2140,6 +2149,9 @@ Shared parameters for various materials. random + 1000000.0 20000.0 4000.0 @@ -2202,6 +2214,9 @@ Shared parameters for various materials. random + 150000.0 10000.0 5000.0 @@ -2264,6 +2279,9 @@ Shared parameters for various materials. random + 150000.0 10000.0 5000.0 From 4c694b2bc2a830550a14b2082aad360d517573be Mon Sep 17 00:00:00 2001 From: Anders Gidenstam Date: Mon, 1 Nov 2010 21:12:39 +0100 Subject: [PATCH 33/40] Updated WalkView: Added a circular surface constraint. --- Aircraft/Generic/WalkView/walkview.nas | 38 ++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 8ed1bb61f..239ab575c 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -83,7 +83,8 @@ var active_walker = func { # speed ... speed in m/sec : double # # set_pos(pos) -# get_pos() : position +# pos ... position in meter : [double, double, double] +# get_pos() : position ([meter, meter, meter]) # # set_eye_height(h) # get_eye_height() : int (meter) @@ -263,8 +264,8 @@ var makeUnionConstraint = func (cs) { # Rectangular plane defined by a straight line and a width. # The line is extruded horizontally on each side by width/2 into a # planar surface. -# p1, p2 - the line endpoints. -# width - total width of the plane. +# p1, p2 - the line endpoints. : position ([meter, meter, meter]) +# width - total width of the plane. : length (meter) var linePlane = { new : func (p1, p2, width) { var obj = { parents : [linePlane] }; @@ -283,7 +284,7 @@ var linePlane = { var pXY = vec2.sub(pos, me.p1); var along = vec2.dot(pXY, me.e1); var across = vec2.dot(pXY, me.e2); - + var along2 = max(0, min(along, me.length)); var across2 = max(-me.halfwidth, min(across, me.halfwidth)); if (along2 != along or across2 != across) { @@ -299,10 +300,35 @@ var linePlane = { } }; +# Circular surface aligned with the XY plane +# center - the center point : position ([meter, meter, meter]) +# radius - radius in the XY plane : length (meter) +var CircularXYSurface = { + new : func (center, radius) { + var obj = { parents : [CircularXYSurface] }; + obj.center = center; + obj.radius = radius; + + return obj; + }, + constrain : func (pos) { + var p = [pos[0], pos[1], me.center[2]]; + var pXY = vec2.sub(pos, me.center); + var lXY = vec2.length(pXY); + + if (lXY > me.radius) { + var t = vec2.add(me.center, vec2.mul(me.radius/lXY, pXY)); + p[0] = t[0]; + p[1] = t[1]; + } + return p; + }, +}; + # Mostly aligned plane sloping along the X axis. # NOTE: Obsolete. Use linePlane instead. -# minp - the X,Y minimum point : position (meter) -# maxp - the X,Y maximum point : position (meter) +# minp - the X,Y minimum point : position ([meter, meter, meter]) +# maxp - the X,Y maximum point : position ([meter, meter, meter]) var slopingYAlignedPlane = { new : func (minp, maxp) { return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], From 7b08e91f7b62c4b39ad7cc472f5c0e49233f17a6 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam Date: Mon, 1 Nov 2010 21:31:15 +0100 Subject: [PATCH 34/40] Updated Walk View: Unified all "class"/"type" names to begin with a capital letter. --- Aircraft/Generic/WalkView/walkview.nas | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 239ab575c..c329f88dc 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -104,9 +104,9 @@ var active_walker = func { # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -var walker = { +var Walker = { new : func (view_name, constraints = nil, managers = nil) { - var obj = { parents : [walker] }; + var obj = { parents : [Walker] }; obj.view = view.views[view.indexof(view_name)]; obj.constraints = constraints; obj.managers = managers; @@ -225,9 +225,9 @@ var walker = { # The union of two constraints. # c1, c2 - the constraints : constraint # NOTE: Assumes that the constraints are convex. -var unionConstraint = { +var UnionConstraint = { new : func (c1, c2) { - var obj = { parents : [unionConstraint] }; + var obj = { parents : [UnionConstraint] }; obj.c1 = c1; obj.c2 = c2; return obj; @@ -256,7 +256,7 @@ var makeUnionConstraint = func (cs) { var ret = cs[0]; for (var i = 1; i < size(cs); i += 1) { - ret = unionConstraint.new(ret, cs[i]); + ret = UnionConstraint.new(ret, cs[i]); } return ret; } @@ -266,9 +266,9 @@ var makeUnionConstraint = func (cs) { # planar surface. # p1, p2 - the line endpoints. : position ([meter, meter, meter]) # width - total width of the plane. : length (meter) -var linePlane = { +var LinePlane = { new : func (p1, p2, width) { - var obj = { parents : [linePlane] }; + var obj = { parents : [LinePlane] }; obj.p1 = p1; obj.p2 = p2; obj.halfwidth = width/2; @@ -329,9 +329,9 @@ var CircularXYSurface = { # NOTE: Obsolete. Use linePlane instead. # minp - the X,Y minimum point : position ([meter, meter, meter]) # maxp - the X,Y maximum point : position ([meter, meter, meter]) -var slopingYAlignedPlane = { +var SlopingYAlignedPlane = { new : func (minp, maxp) { - return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], + return LinePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], [maxp[0], (minp[1] + maxp[1])/2, maxp[2]], (maxp[1] - minp[1])); } @@ -344,9 +344,9 @@ var slopingYAlignedPlane = { # on_exit(x, y) - function that is called when the walker leaves the area. # x and y are <0, 0 or >0 depending on in which direction(s) # the walker left the constraint. -var actionConstraint = { +var ActionConstraint = { new : func (constraint, on_enter = nil, on_exit = nil) { - var obj = { parents : [actionConstraint] }; + var obj = { parents : [ActionConstraint] }; obj.constraint = constraint; obj.on_enter = on_enter; obj.on_exit = on_exit; From 5ecdf0f8787b62b3f1b38d0c718fd3f52e2a19c0 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam Date: Mon, 1 Nov 2010 22:44:10 +0100 Subject: [PATCH 35/40] Updated WalkView: Added a makePolylinePath convenience function. --- Aircraft/Generic/WalkView/walkview.nas | 49 +++++++++++++++++++------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index c329f88dc..b7bad57c1 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -221,6 +221,43 @@ var Walker = { # Constraint classes. Determines where the view can walk. # +# Convenience functions. + +# Build a UnionConstraint hierarchy from a list of constraints. +# cs - list of constraints : [constraint] +var makeUnionConstraint = func (cs) { + if (size(cs) < 2) return cs[0]; + + var ret = cs[0]; + for (var i = 1; i < size(cs); i += 1) { + ret = UnionConstraint.new(ret, cs[i]); + } + return ret; +} + +# Build a UnionConstraint hierachy that represents a polyline path +# with a certain width. Each internal point gets a circular surface. +# points - list of points : [position] ([[meter, meter, meter]]) +# width - width of the path : length (meter) +# round_ends - put a circle also on the first and last points : bool +var makePolylinePath = func (points, width, round_ends = 0) { + if (size(points) < 2) return nil; + var ret = LinePlane.new(points[0], points[1], width); + if (round_ends) { + ret = UnionConstraint.new(line, + CircularXYSurface.new(points[0], width/2)); + } + for (var i = 2; i < size(points); i += 1) { + var line = LinePlane.new(points[i-1], points[i], width); + if (i + 1 < size(points) or round_ends) { + line = UnionConstraint.new + (line, + CircularXYSurface.new(points[i], width/2)); + } + ret = UnionConstraint.new(line, ret); + } + return ret; +} # The union of two constraints. # c1, c2 - the constraints : constraint @@ -249,18 +286,6 @@ var UnionConstraint = { } }; -# Build a unionConstraint hierarchy from a list of constraints. -# cs - list of constraints : [constraint] -var makeUnionConstraint = func (cs) { - if (size(cs) < 2) return cs[0]; - - var ret = cs[0]; - for (var i = 1; i < size(cs); i += 1) { - ret = UnionConstraint.new(ret, cs[i]); - } - return ret; -} - # Rectangular plane defined by a straight line and a width. # The line is extruded horizontally on each side by width/2 into a # planar surface. From 9a590d3e61f21c7cc98ef15bb722a1ef41baa365 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Tue, 2 Nov 2010 19:41:00 +0100 Subject: [PATCH 36/40] Added missing buttons to AI options dialog. Renamed "ATC/AI" to "AI" since ATC options are no longer available. --- gui/dialogs/ai.xml | 52 +++++++++++++++++++++++++++++++++++++++++++++- gui/menubar.xml | 4 ++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/gui/dialogs/ai.xml b/gui/dialogs/ai.xml index bba1c22eb..56898b8c9 100644 --- a/gui/dialogs/ai.xml +++ b/gui/dialogs/ai.xml @@ -71,4 +71,54 @@ true - \ No newline at end of file + + + hbox + 6 + + true + + + + + + + + + + + + true + + + + diff --git a/gui/menubar.xml b/gui/menubar.xml index 39045e82f..29295d576 100644 --- a/gui/menubar.xml +++ b/gui/menubar.xml @@ -457,9 +457,9 @@

- + - + dialog-show ai From 7e816deb446f78715c420edde902042af82e76fa Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Tue, 2 Nov 2010 21:31:00 +0100 Subject: [PATCH 37/40] Revert "Small fix to the urban shader" This reverts commit 41027306053caabfa9dc8bf999fad3740e91cdb2. --- Shaders/urban.frag | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Shaders/urban.frag b/Shaders/urban.frag index 69c20a061..f61faa35a 100644 --- a/Shaders/urban.frag +++ b/Shaders/urban.frag @@ -45,9 +45,9 @@ void QDM(inout vec3 p, inout vec3 v) float level = MAX_LEVEL; vec2 dirSign = (sign(v.xy) + 1.0) * 0.5; GlobalIterationCount = 0; - float d = 0.0; + float d = 0; - while (level >= 0.0 && GlobalIterationCount < gIterationCap) + while (level >= 0 && GlobalIterationCount < gIterationCap) { vec4 uv = vec4(p2.xyz, level); d = texture2DLod(QDMTex, uv.xy, uv.w).w; @@ -98,8 +98,8 @@ void QDM(inout vec3 p, inout vec3 v) float dA = p2.z * (rayLength - BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; float dB = p2.z * (rayLength + BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; - vec4 p2a = vec4(p + v * dA, 0.0); - vec4 p2b = vec4(p + v * dB, 0.0); + vec4 p2a = vec4(p + v * dA, 0); + vec4 p2b = vec4(p + v * dB, 0); dA = texture2DLod(NormalTex, p2a.xy, p2a.w).w; dB = texture2DLod(NormalTex, p2b.xy, p2b.w).w; From 7d82264b7979c5d6c24b0cf4041cab5acfd84097 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Tue, 2 Nov 2010 21:31:31 +0100 Subject: [PATCH 38/40] Revert "Urban shader using Quadtree Displacement Mapping" This reverts commit 3cd68ac922d5768e5403065e1654478c1fbe0c7f. --- Effects/urban.eff | 31 ++---------- Shaders/urban.frag | 116 ++++++++++++--------------------------------- 2 files changed, 33 insertions(+), 114 deletions(-) diff --git a/Effects/urban.eff b/Effects/urban.eff index d73d5b2ea..f8eecd141 100644 --- a/Effects/urban.eff +++ b/Effects/urban.eff @@ -7,7 +7,6 @@ 0.008 0.75 0.59 0.05 /sim/rendering/quality-level - 10 15 @@ -69,24 +68,12 @@ texture[2]/filter texture[2]/wrap-s texture[2]/wrap-t - texture[2]/internal-format + + texture[2]/internal-format + 2 - texture[2]/image - nearest-mipmap-nearest - texture[2]/wrap-s - texture[2]/wrap-t - texture[2]/internal-format - - average - average - average - min - - - - 3 noise @@ -115,15 +102,10 @@ sampler-2d 1 - - QDMTex - sampler-2d - 2 - NoiseTex sampler-3d - 3 + 2 depth_factor @@ -150,11 +132,6 @@ float snow-level - - max_lod_level - float - max-lod-level - diff --git a/Shaders/urban.frag b/Shaders/urban.frag index f61faa35a..7e207cf44 100644 --- a/Shaders/urban.frag +++ b/Shaders/urban.frag @@ -2,15 +2,9 @@ // Licence: GPL v2 // Author: Frederic Bouvier. // Adapted from the paper by F. Policarpo et al. : Real-time Relief Mapping on Arbitrary Polygonal Surfaces -// Adapted from the paper and sources by M. Drobot in GPU Pro : Quadtree Displacement Mapping with Height Blending #version 120 -#define TEXTURE_MIP_LEVELS 10 -#define TEXTURE_PIX_COUNT 1024 //pow(2,TEXTURE_MIP_LEVELS) -#define BINARY_SEARCH_COUNT 10 -#define BILINEAR_SMOOTH_FACTOR 2.0 - varying vec4 rawpos; varying vec4 ecPosition; varying vec3 VNormal; @@ -22,7 +16,6 @@ varying vec4 constantColor; uniform sampler3D NoiseTex; uniform sampler2D BaseTex; uniform sampler2D NormalTex; -uniform sampler2D QDMTex; uniform float depth_factor; uniform float tile_size; uniform float quality_level; // From /sim/rendering/quality-level @@ -30,103 +23,52 @@ uniform float snowlevel; // From /sim/rendering/snow-level-m uniform vec3 night_color; const float scale = 1.0; -int GlobalIterationCount = 0; -int gIterationCap = 64; +int linear_search_steps = 10; -void QDM(inout vec3 p, inout vec3 v) +float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds) { - const int MAX_LEVEL = TEXTURE_MIP_LEVELS; - const float NODE_COUNT = TEXTURE_PIX_COUNT; - const float TEXEL_SPAN_HALF = 1.0 / NODE_COUNT / 2.0; + float size = 1.0 / float(linear_search_steps); + float depth = 0.0; + float best_depth = 1.0; - float fDeltaNC = TEXEL_SPAN_HALF * depth_factor; - - vec3 p2 = p; - float level = MAX_LEVEL; - vec2 dirSign = (sign(v.xy) + 1.0) * 0.5; - GlobalIterationCount = 0; - float d = 0; - - while (level >= 0 && GlobalIterationCount < gIterationCap) + for(int i = 0; i < linear_search_steps - 1; ++i) { - vec4 uv = vec4(p2.xyz, level); - d = texture2DLod(QDMTex, uv.xy, uv.w).w; + depth += size; + float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a); + if(best_depth > 0.996) + if(depth >= t) + best_depth = depth; + } + depth = best_depth; - if (d > p2.z) + const int binary_search_steps = 5; + + for(int i = 0; i < binary_search_steps; ++i) + { + size *= 0.5; + float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a); + if(depth >= t) { - //predictive point of ray traversal - vec3 tmpP2 = p + v * d; - - //current node count - float nodeCount = pow(2.0, (MAX_LEVEL - level)); - //current and predictive node ID - vec4 nodeID = floor(vec4(p2.xy, tmpP2.xy)*nodeCount); - - //check if we are crossing the current cell - if (nodeID.x != nodeID.z || nodeID.y != nodeID.w) - { - //calculate distance to nearest bound - vec2 a = p2.xy - p.xy; - vec2 p3 = (nodeID.xy + dirSign) / nodeCount; - vec2 b = p3.xy - p.xy; - - vec2 dNC = (b.xy * p2.z) / a.xy; - //take the nearest cell - d = min(d,min(dNC.x, dNC.y))+fDeltaNC; - - level++; - - //use additional convergence speed-up - #ifdef USE_QDM_ASCEND_INTERVAL - if(frac(level*0.5) > EPSILON) - level++; - #elseif USE_QDM_ASCEND_CONST - level++; - #endif - } - p2 = p + v * d; + best_depth = depth; + depth -= 2.0 * size; } - level--; - GlobalIterationCount++; + depth += size; } - // - // Manual Bilinear filtering - // - float rayLength = length(p2.xy - p.xy) + fDeltaNC; - - float dA = p2.z * (rayLength - BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; - float dB = p2.z * (rayLength + BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; - - vec4 p2a = vec4(p + v * dA, 0); - vec4 p2b = vec4(p + v * dB, 0); - dA = texture2DLod(NormalTex, p2a.xy, p2a.w).w; - dB = texture2DLod(NormalTex, p2b.xy, p2b.w).w; - - dA = abs(p2a.z - dA); - dB = abs(p2b.z - dB); - - p2 = mix(p2a.xyz, p2b.xyz, dA / (dA + dB)); - - p = p2; -} - -float ray_intersect(vec2 dp, vec2 ds) -{ - vec3 p = vec3( dp, 0.0 ); - vec3 v = vec3( ds, 1.0 ); - QDM( p, v ); - return p.z; + return(best_depth); } void main (void) { + if ( quality_level >= 3.5 ) { + linear_search_steps = 20; + } vec3 ecPos3 = ecPosition.xyz / ecPosition.w; vec3 V = normalize(ecPos3); vec3 s = vec3(dot(V, VTangent), dot(V, VBinormal), dot(VNormal, -V)); vec2 ds = s.xy * depth_factor / s.z; vec2 dp = gl_TexCoord[0].st - ds; - float d = ray_intersect(dp, ds); + float d = ray_intersect(NormalTex, dp, ds); vec2 uv = dp + ds * d; vec3 N = texture2D(NormalTex, uv).xyz * 2.0 - 1.0; @@ -147,7 +89,7 @@ void main (void) vec3 sl = normalize( vec3( dot( l, VTangent ), dot( l, VBinormal ), dot( -l, VNormal ) ) ); ds = sl.xy * depth_factor / sl.z; dp -= ds * d; - float dl = ray_intersect(dp, ds); + float dl = ray_intersect(NormalTex, dp, ds); if ( dl < d - 0.05 ) shadow_factor = dot( constantColor.xyz, vec3( 1.0, 1.0, 1.0 ) ) * 0.25; } From 235395e57391d9f26264a76402c0d7d470373ba2 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Tue, 2 Nov 2010 21:33:55 +0100 Subject: [PATCH 39/40] Revert accidental change to joysticks.xml --- joysticks.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/joysticks.xml b/joysticks.xml index 3f800d4d3..0062f800e 100644 --- a/joysticks.xml +++ b/joysticks.xml @@ -20,5 +20,4 @@ --> - From 7c608c20032624c2f6ef43d8005ec176c63c79ca Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Tue, 2 Nov 2010 22:31:39 +0100 Subject: [PATCH 40/40] Restore QDM urban shader technique for quality level >= 4 --- Effects/urban.eff | 143 +++++++++++++++++++++++++++++++++++++++++++++ Shaders/urban.frag | 112 +++++++++++++++++++++++++++++++++-- 2 files changed, 250 insertions(+), 5 deletions(-) diff --git a/Effects/urban.eff b/Effects/urban.eff index f8eecd141..1f43cbb73 100644 --- a/Effects/urban.eff +++ b/Effects/urban.eff @@ -13,6 +13,149 @@ 6 7 + + + + /sim/rendering/urban-shader + /sim/rendering/shader-effects + + 4.0 + /sim/rendering/quality-level + + + + 2.0 + + + + GL_ARB_shader_objects + GL_ARB_shading_language_100 + GL_ARB_vertex_shader + GL_ARB_fragment_shader + + + + + + true + + material/ambient + material/diffuse + material/specular + ambient-and-diffuse + + transparent + transparent + smooth + back + + render-bin/bin-number + render-bin/bin-name + + + 0 + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + + texture[0]/internal-format + + + + 1 + texture[2]/image + texture[2]/filter + texture[2]/wrap-s + texture[2]/wrap-t + texture[2]/internal-format + + + 2 + texture[2]/image + nearest-mipmap-nearest + texture[2]/wrap-s + texture[2]/wrap-t + texture[2]/internal-format + + average + average + average + min + + + + 3 + noise + + + Shaders/urban.vert + Shaders/urban.frag + + tangent + 6 + + + binormal + 7 + + + normal + 15 + + + + BaseTex + sampler-2d + 0 + + + NormalTex + sampler-2d + 1 + + + QDMTex + sampler-2d + 2 + + + NoiseTex + sampler-3d + 3 + + + depth_factor + float + depth-factor + + + tile_size + float + xsize + + + night_color + float-vec3 + night-color + + + quality_level + float + quality-level + + + snowlevel + float + snow-level + + + max_lod_level + float + max-lod-level + + + diff --git a/Shaders/urban.frag b/Shaders/urban.frag index 7e207cf44..addceb67c 100644 --- a/Shaders/urban.frag +++ b/Shaders/urban.frag @@ -5,6 +5,11 @@ #version 120 +#define TEXTURE_MIP_LEVELS 10 +#define TEXTURE_PIX_COUNT 1024 //pow(2,TEXTURE_MIP_LEVELS) +#define BINARY_SEARCH_COUNT 10 +#define BILINEAR_SMOOTH_FACTOR 2.0 + varying vec4 rawpos; varying vec4 ecPosition; varying vec3 VNormal; @@ -16,6 +21,7 @@ varying vec4 constantColor; uniform sampler3D NoiseTex; uniform sampler2D BaseTex; uniform sampler2D NormalTex; +uniform sampler2D QDMTex; uniform float depth_factor; uniform float tile_size; uniform float quality_level; // From /sim/rendering/quality-level @@ -24,8 +30,96 @@ uniform vec3 night_color; const float scale = 1.0; int linear_search_steps = 10; +int GlobalIterationCount = 0; +int gIterationCap = 64; -float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds) +void QDM(inout vec3 p, inout vec3 v) +{ + const int MAX_LEVEL = TEXTURE_MIP_LEVELS; + const float NODE_COUNT = TEXTURE_PIX_COUNT; + const float TEXEL_SPAN_HALF = 1.0 / NODE_COUNT / 2.0; + + float fDeltaNC = TEXEL_SPAN_HALF * depth_factor; + + vec3 p2 = p; + float level = MAX_LEVEL; + vec2 dirSign = (sign(v.xy) + 1.0) * 0.5; + GlobalIterationCount = 0; + float d = 0.0; + + while (level >= 0.0 && GlobalIterationCount < gIterationCap) + { + vec4 uv = vec4(p2.xyz, level); + d = texture2DLod(QDMTex, uv.xy, uv.w).w; + + if (d > p2.z) + { + //predictive point of ray traversal + vec3 tmpP2 = p + v * d; + + //current node count + float nodeCount = pow(2.0, (MAX_LEVEL - level)); + //current and predictive node ID + vec4 nodeID = floor(vec4(p2.xy, tmpP2.xy)*nodeCount); + + //check if we are crossing the current cell + if (nodeID.x != nodeID.z || nodeID.y != nodeID.w) + { + //calculate distance to nearest bound + vec2 a = p2.xy - p.xy; + vec2 p3 = (nodeID.xy + dirSign) / nodeCount; + vec2 b = p3.xy - p.xy; + + vec2 dNC = (b.xy * p2.z) / a.xy; + //take the nearest cell + d = min(d,min(dNC.x, dNC.y))+fDeltaNC; + + level++; + + //use additional convergence speed-up + #ifdef USE_QDM_ASCEND_INTERVAL + if(frac(level*0.5) > EPSILON) + level++; + #elseif USE_QDM_ASCEND_CONST + level++; + #endif + } + p2 = p + v * d; + } + level--; + GlobalIterationCount++; + } + + // + // Manual Bilinear filtering + // + float rayLength = length(p2.xy - p.xy) + fDeltaNC; + + float dA = p2.z * (rayLength - BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; + float dB = p2.z * (rayLength + BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; + + vec4 p2a = vec4(p + v * dA, 0.0); + vec4 p2b = vec4(p + v * dB, 0.0); + dA = texture2DLod(NormalTex, p2a.xy, p2a.w).w; + dB = texture2DLod(NormalTex, p2b.xy, p2b.w).w; + + dA = abs(p2a.z - dA); + dB = abs(p2b.z - dB); + + p2 = mix(p2a.xyz, p2b.xyz, dA / (dA + dB)); + + p = p2; +} + +float ray_intersect_QDM(vec2 dp, vec2 ds) +{ + vec3 p = vec3( dp, 0.0 ); + vec3 v = vec3( ds, 1.0 ); + QDM( p, v ); + return p.z; +} + +float ray_intersect_relief(vec2 dp, vec2 ds) { float size = 1.0 / float(linear_search_steps); float depth = 0.0; @@ -34,7 +128,7 @@ float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds) for(int i = 0; i < linear_search_steps - 1; ++i) { depth += size; - float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a); + float t = step(0.95, texture2D(NormalTex, dp + ds * depth).a); if(best_depth > 0.996) if(depth >= t) best_depth = depth; @@ -46,7 +140,7 @@ float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds) for(int i = 0; i < binary_search_steps; ++i) { size *= 0.5; - float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a); + float t = step(0.95, texture2D(NormalTex, dp + ds * depth).a); if(depth >= t) { best_depth = depth; @@ -58,6 +152,14 @@ float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds) return(best_depth); } +float ray_intersect(vec2 dp, vec2 ds) +{ + if ( quality_level >= 4.0 ) + return ray_intersect_QDM( dp, ds ); + else + return ray_intersect_relief( dp, ds ); +} + void main (void) { if ( quality_level >= 3.5 ) { @@ -68,7 +170,7 @@ void main (void) vec3 s = vec3(dot(V, VTangent), dot(V, VBinormal), dot(VNormal, -V)); vec2 ds = s.xy * depth_factor / s.z; vec2 dp = gl_TexCoord[0].st - ds; - float d = ray_intersect(NormalTex, dp, ds); + float d = ray_intersect(dp, ds); vec2 uv = dp + ds * d; vec3 N = texture2D(NormalTex, uv).xyz * 2.0 - 1.0; @@ -89,7 +191,7 @@ void main (void) vec3 sl = normalize( vec3( dot( l, VTangent ), dot( l, VBinormal ), dot( -l, VNormal ) ) ); ds = sl.xy * depth_factor / sl.z; dp -= ds * d; - float dl = ray_intersect(NormalTex, dp, ds); + float dl = ray_intersect(dp, ds); if ( dl < d - 0.05 ) shadow_factor = dot( constantColor.xyz, vec3( 1.0, 1.0, 1.0 ) ) * 0.25; }