Board index FlightGear Development Weather

A local weather system (v1.4 available)

Everything related to weather simulation, visuals should be discussed in the shader subforum.

Re: A local weather system (v1.4 available)

Postby fatty » Sun Aug 05, 2012 1:14 am

Hey Thorsten, or anyone else, just a quick question: in GIT now there is no precipitation while using the local weather system (it fades out once the local weather system is started, as if the weather is changing, so not a graphics/rendering issue). With the current weather dialogs, one can only control the precipitation from the "Basic Weather" dialog, which has no effect once local weather is running, so I'm not sure how to get the precipitation back. Does this happen for anyone else or is it a well-known issue? Thanks so much!
fatty
 
Posts: 176
Joined: Sat Jan 13, 2007 3:41 am
Location: Pennsylvania, U.S.

Re: A local weather system (v1.4 available)

Postby Thorsten » Sun Aug 05, 2012 6:13 pm

Does this happen for anyone else or is it a well-known issue?


Well-known issue. Every six month, I bitch on the devel list about it, so far without success.

It goes as follows: Advanced Weather sets the precipitation flag okay, but the flag is implemented in a 'smart' way, i.e. it produces rain only below the lowest cloud layer. Now, while Basic Weather manages cloud altitudes in layers, Advanced Weather manages cloud altitude per cloud and doesn't insist they are grouped into layers. However, both systems use the same internal infrastructure to create clouds (because it's the fastest way of getting the job done). As a consequence, to get Advanced Weather clouds placed at correct altitude, they are placed with their altitude as offset above a layer with altitude zero. That happens to be the only way to get it right (I've tried negative offsets from a high layer, but that doesn't work).

Now, having defined a lowest layer with altitude zero means of course that the 'smart' precipitation system never makes it rain. Or, if you watch very carefully, it does rain in Advanced Weather when the flag is set and you happen to be at sea level or below, but the rain fades out immediately above.

I keep asking for a dumb precipitation flag since Advanced Weather comes with its own system to set precipitation and doesn't have to rely on layer definition. So far, this hasn't gone anywhere. Maybe for 3.0... I keep my fingers crossed, apparently TorstenD was working on a solution at one point, but that seems to have disappeared.
Thorsten
 
Posts: 11322
Joined: Mon Nov 02, 2009 8:33 am

Re: A local weather system (v1.4 available)

Postby Hooray » Sun Aug 05, 2012 6:36 pm

I have no idea where this is implemented in the C++ code, but it sounds fairly simple to change like you say, using a flag.
Have you tried grep'ing the source tree for "precip*" ?

EDIT: Doing this now:

Code: Select all
  cd $HOME/flightgear/src/
  find . -type f -exec grep -qin "precip" {} \; -print


RESULT: http://gitorious.org/fg/flightgear/blob ... xx#line121

Basically, you could introduce a flag here: http://gitorious.org/fg/flightgear/blob ... xx#line216
Using something like this (untested):

Code: Select all
if ( fgGetBool("/environment/use-custom-precipitation", false) ) {
 altitudeCloudLayer =fgGetDouble("/environment/precipitation-max-altitude-m", 0);
 SG_LOG(SG_GENERAL, SG_ALERT, "Using custom precipitation altitude:" << altitudeCloudLayer);
 }
else
 altitudeCloudLayer = this->getPrecipitationAtAltitudeMax() * SG_METER_TO_FEET;


fgGet*/fgSet* are the C++ equivalents of getprop/setprop in Nasal.

and then start up FG with --prop:/environment/precipitation-max-altitude-m= (set from Nasal/LW) and --prop:/environment/use-custom-precipitation=1

I didn't test any of this, and I didn't look at all of the source code, but it should be pretty simple to fix this.
Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

Re: A local weather system (v1.4 available)

Postby fatty » Tue Aug 07, 2012 2:39 pm

Ah interesting, thanks for the explanation! Aside from that it works very well though and the clouds and colors are gorgeous :)
fatty
 
Posts: 176
Joined: Sat Jan 13, 2007 3:41 am
Location: Pennsylvania, U.S.

Re: A local weather system (v1.4 available)

Postby ot-666 » Mon Aug 13, 2012 11:14 pm

Is it possible to set the cloud distance to more then 250km?

Image

above Austria at 50000ft
Callsign: ot-666
Working on LOWI and other stuff - Custom Scenery Overlay Repo: http://gitorious.org/fgfs-custom-scenery/custom-scenery-overlay/
VMX22 - Osprey... sometimes in 2014
ot-666
 
Posts: 746
Joined: Sun Nov 08, 2009 5:14 pm
Location: Germany, Konstanz
Callsign: ot-666
IRC name: ot666
Version: GIT
OS: win7 64bit

Re: A local weather system (v1.4 available)

Postby Hooray » Tue Aug 14, 2012 9:48 am

you are getting >= 60 fps with these visibility settings? Is this possibly even with frame rate throttling enabled?
What hardware configuration do you have? What is your frame spacing (worst frame spacing) like?
This info may help people who also want to enjoy the latest weather features in FlightGear, i.e. so that they see what hardware they need to get.
Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

Re: A local weather system (v1.4 available)

Postby chris_blues » Tue Aug 14, 2012 10:03 am

With loose clouds like that I also get good framerates. I get in trouble when there's overcast skies... Then my GPU dies... :)
But I second that, weather tiles should be spread more widely... I remember some "hack" somewhere in some config file, where to increase the number, compile FG, and get wider weather areas... Why not include it into the GUI with bigger numbers?

[OT]
With these mountainous terrains it's not so obvious, but on flat landscapes I find most annoying, how the terrain tiles don't get loaded in distance. When cruising at 30000ft it's veery ugly...
[/OT]
Don't hesitate to let me know if I'm incorrect or just annoying! As long as you do it gently! :)
Debian testing 64bit - Athlon II 2x2.6GHz - 8GB RAM - GeForce GTS 450
Citation II
User avatar
chris_blues
 
Posts: 1541
Joined: Mon May 03, 2010 1:30 pm
Location: claws of real life
Callsign: chris_blues
Version: GIT
OS: Debian 8 64

Re: A local weather system (v1.4 available)

Postby Hooray » Tue Aug 14, 2012 10:23 am

on flat landscapes I find most annoying, how the terrain tiles don't get loaded in distance. When cruising at 30000ft it's veery ugly...

I think we previously talked about this, it's related to the terrain cache/tile manager loading tiles based on visibility - which is also a limitation for Nasal scripts, because they can only get info for tiles (and navaids etc) that are visible:

http://www.mail-archive.com/flightgear- ... 33348.html
http://www.mail-archive.com/flightgear- ... 34123.html
Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

Re: A local weather system (v1.4 available)

Postby chris_blues » Tue Aug 14, 2012 10:49 am

You're right. We have. But I thought I'll bring it up every now and then, and maybe someday there's a solution... :roll:

Cheers


Edit:
Some time ago, there was that orbital view discussion, since 30000 ft is some kind of orbit, even a very low one, it maybe makes sense, to try to make that work for FG git. I have no idea if it actually makes sense, but in my humble view of things, I could imagine that...
...back to topic :)
Don't hesitate to let me know if I'm incorrect or just annoying! As long as you do it gently! :)
Debian testing 64bit - Athlon II 2x2.6GHz - 8GB RAM - GeForce GTS 450
Citation II
User avatar
chris_blues
 
Posts: 1541
Joined: Mon May 03, 2010 1:30 pm
Location: claws of real life
Callsign: chris_blues
Version: GIT
OS: Debian 8 64

Re: A local weather system (v1.4 available)

Postby Hooray » Tue Aug 14, 2012 1:14 pm

chris_blues wrote in Tue Aug 14, 2012 10:49 am:You're right. We have. But I thought I'll bring it up every now and then, and maybe someday there's a solution... :roll:


To be honest, I don't think that discussion channels like the forum (or the mailing list!) are too suitable for tracking bug reports or feature requests.

Anybody really serious about such things should probably file a report using the issue tracker - that's by the far the most reliable method to ensure that it won't be totally forgotten too soon. Otherwise, it's just the sheer volume of messages that will quickly bury even important issues.

While such bug reports and especially feature requests are not really dealt with any sort of priority, the issue tracker is at least the right place to ensure that the people who can change such things, actually can find them easily - without spending hours searching the forum or devel list archives.

In other words: http://flightgear-bugs.googlecode.com/
I'd just suggest to make sure that you post links to related discussions (forum/devel list) - because this thread may be hard to find in 2-3 years ;-)


ot-666 wrote in Mon Aug 13, 2012 11:14 pm:Is it possible to set the cloud distance to more then 250km?


Thorsten can probably comment on the specifics, but you may also be hitting limitations of the LW grid scheme, which works such that you are always at the center of a 3x3 grid ( 0..8 ):

0 | 1 | 2
-----------
3 | 4 | 5
-----------
6 | 7 | 8

i.e. you are located in tile #4 - and the tile setup changes dynamically once you enter another tile, so that new tiles are created on demand - based on some hard-coded defaults. IIRC, it's 40x40km for each tile - a while ago I played around with the LW code and tried to replace all constants using a single variable, so that the tile dimensions could be changed in a single location, possibly by editing a property.

I think I still have the code somewhere. But that was until Thorsten told me that it's all manually tuned and while it would be possible to change things, they would probably stop working properly then ... Suffice to say that I ended up with a non-working version of LW that showed hard-to-debug errors, which I never fully understood. Maybe I was trying to do too many things at once, I think I also tried to generalize the tile manager back then - that said, I am still convinced that making the tile dimensions configurable should not be such a complicated change ... the most problematic aspect of it was finding all the hard-coded assumptions, i.e. not just "40" and "40000" but also all formulas and algorithms that factored in defaults based on the 40km default.

I do believe that with a little help from Thorsten, that I could look into this again and just make the tile dimensions configurable, so that we can adjust it during startup (and possibly at run time) - which would also be interesting for those people with PCs where 40km is too much, because we could then reduce it to 20km instead - which should probably be the test case anyhow ;-)

Here's what Thorsten said the last time we talked about the idea: http://www.flightgear.org/forums/viewto ... 95#p147156
Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

Re: A local weather system (v1.4 available)

Postby chris_blues » Tue Aug 14, 2012 2:25 pm

Hooray wrote in Tue Aug 14, 2012 1:14 pm:... file a report using the issue tracker...

Done...
Don't hesitate to let me know if I'm incorrect or just annoying! As long as you do it gently! :)
Debian testing 64bit - Athlon II 2x2.6GHz - 8GB RAM - GeForce GTS 450
Citation II
User avatar
chris_blues
 
Posts: 1541
Joined: Mon May 03, 2010 1:30 pm
Location: claws of real life
Callsign: chris_blues
Version: GIT
OS: Debian 8 64

Re: A local weather system (v1.4 available)

Postby ot-666 » Tue Aug 14, 2012 6:21 pm

Hooray wrote in Tue Aug 14, 2012 9:48 am:you are getting >= 60 fps with these visibility settings? Is this possibly even with frame rate throttling enabled?
What hardware configuration do you have? What is your frame spacing (worst frame spacing) like?
This info may help people who also want to enjoy the latest weather features in FlightGear, i.e. so that they see what hardware they need to get.


Hardware: i7 4core @ 4.2 GHz / 16GB / ati 5870 running win7 64bit / fgfs GIT 64bit.
(but after trying out a nvidea gtx680 recently, that blew my mind, i like to get one of them if they would not cost a fortune)

Frame spacing 20ms with spikes to 40ms (really rare spikes to 70ms) with those weather conditions... it was metar, but it resembled fair weather.
With a more dense cloud cover (stormy monday) i get around 30fps to 40fps. (bottleneck seems to be the cpu using mostly 1 and a half cores, since the gpu is never busy)

But my fps with the "normal" weather somtimes get droped to 12fps if the cloud cover is like that.
Overall the advanced weather runs a lot smother for me and looks just fantastic.

Shader settings up to maximum (besides urban), random tree densety 2.3, random buildings, Bare LOD to 220000, using DDS textures
Flightgear used 13.5GB memory during that flight :shock:

Having the tile dimensions configurable for the local weather sound nice.
Oliver
Callsign: ot-666
Working on LOWI and other stuff - Custom Scenery Overlay Repo: http://gitorious.org/fgfs-custom-scenery/custom-scenery-overlay/
VMX22 - Osprey... sometimes in 2014
ot-666
 
Posts: 746
Joined: Sun Nov 08, 2009 5:14 pm
Location: Germany, Konstanz
Callsign: ot-666
IRC name: ot666
Version: GIT
OS: win7 64bit

Re: A local weather system (v1.4 available)

Postby Hooray » Tue Aug 14, 2012 6:55 pm

ot-666 wrote in Tue Aug 14, 2012 6:21 pm:Having the tile dimensions configurable for the local weather sound nice.


We need to wait for Thorsten to respond so that we can figure out how to approach this best. Just replacing constants like "40000" is obviously simple and can be quickly done within seconds using a script - but like I mentioned earlier, there are probably a number of places where the 40x40 tile dimension is not directly written in the form of "40000" but in some encoded form (formula/algorithm), so that'd be hard to find and it would be possible to introduce subtle errors here.

Once we know all the places where this assumption is used, replacing the static number with a variable would be really simple, and we could then even look into making it runtime-configurable, to see if the system could be adjusted such that it supports down/up scaling of tile dimensions.

Like Thorsten mentioned earlier, coming up with more configurable tile-system (grid layout), would be much more complicated though

Flightgear used 13.5GB memory during that flight

...something's definitely wrong there ... you are lucky in that you have 16gb of RAM, but most people won't have that luxury.
Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

Re: A local weather system (v1.4 available)

Postby Thorsten » Tue Aug 14, 2012 9:13 pm

Just two short comments (I'm in the US attending a conference at the moment and have pretty much zero time for Flightgear):

You can't make tile dimensions configurable. The 'artwork' part of the code depends on this being a fixed number.

You can in principle change the tile manager to generate more tiles. If you're lucky, it will run stable... I would advise against doing this. 75 km cloud visibility (the maximum obtainable at present) is plenty, and severely taxing the vertex shader already. The system is not designed to look plausible from really high (20+ km) altitudes, and a 2d layer system would be superior in this case.
Thorsten
 
Posts: 11322
Joined: Mon Nov 02, 2009 8:33 am

Re: A local weather system (v1.4 available)

Postby Hooray » Tue Aug 14, 2012 9:19 pm

Thorsten wrote in Tue Aug 14, 2012 9:13 pm:You can't make tile dimensions configurable. The 'artwork' part of the code depends on this being a fixed number.


Yes, that's what I was trying to say when I referred to your algorithms also having these implicit assumptions - otherwise, it'd be a simple search/replace, i.e.:

Code: Select all
diff --git a/Nasal/local_weather/local_weather.nas b/Nasal/local_weather/local_weather.nas
index 1bcc4fe..4a252c7 100644
--- a/Nasal/local_weather/local_weather.nas
+++ b/Nasal/local_weather/local_weather.nas
@@ -4034,9 +4034,14 @@ setlistener(lw~"config/temperature-offset-degc", func {temperature_offset = getp
 setlistener("/environment/air-pollution-norm", func {air_pollution_norm = getprop("/environment/air-pollution-norm");});
 
 setlistener("/sim/rendering/shaders/skydome", func {scattering_shader_flag = getprop("/sim/rendering/shaders/skydome"); if (scattering_shader_flag ==1) {setprop("/sim/rendering/minimum-sky-visibility",0.0);} else  {setprop("/sim/rendering/minimum-sky-visibility",1000.0);} });
-}
 
 
+setlistener(lw~"config/tile-size-m", func {
+ print("Local Weather:Changing the tile-size at runtime is currently not yet supported!\ntile_size is:", tile_size_m );
+} );
+
+}
+
 #####################################################
 # Standard test call (for development and debug only)
 #####################################################
diff --git a/Nasal/local_weather/weather_tile_management.nas b/Nasal/local_weather/weather_tile_management.nas
index 61e0df1..2a1c535 100644
--- a/Nasal/local_weather/weather_tile_management.nas
+++ b/Nasal/local_weather/weather_tile_management.nas
@@ -981,17 +981,22 @@ t.getNode("code").setValue(f.getNode("code").getValue());
 
 var create_neighbour = func (blat, blon, index, alpha) {
 
+if (local_weather.debug_output_flag == 1) {
+  print("Setting up adjacent tiles with dimensions:", tile_size_m, 'x', tile_size_m, ' m');
+}
+
+
 var x = 0.0;
 var y = 0.0;
 var phi = alpha * math.pi/180.0;
 
 calc_geo(blat);
 
-if ((index == 0) or (index == 3) or (index == 6)) {x =-40000.0;}
-if ((index == 2) or (index == 5) or (index == 8)) {x = 40000.0;}
+if ((index == 0) or (index == 3) or (index == 6)) {x =-get_tile_size();}
+if ((index == 2) or (index == 5) or (index == 8)) {x = get_tile_size();}
 
-if ((index == 0) or (index == 1) or (index == 2)) {y = 40000.0;}
-if ((index == 6) or (index == 7) or (index == 8)) {y = -40000.0;}
+if ((index == 0) or (index == 1) or (index == 2)) {y = get_tile_size();}
+if ((index == 6) or (index == 7) or (index == 8)) {y = -get_tile_size();}
 
 var t = props.globals.getNode(lw~"tiles").getChild("tile",index,1);
 
@@ -1022,7 +1027,7 @@ var phi = alpha * math.pi/180.0;
 
 calc_geo(blat);
 
-x = -40000.0; y = 40000.0;
+x = -get_tile_size(); y = get_tile_size();
 setprop(lw~"tiles/tile[0]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[0]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[0]/generated-flag",0);
@@ -1031,7 +1036,7 @@ setprop(lw~"tiles/tile[0]/code","");
 setprop(lw~"tiles/tile[0]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[0]/orientation-deg",alpha);
 
-x = 0.0; y = 40000.0;
+x = 0.0; y = get_tile_size();
 setprop(lw~"tiles/tile[1]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[1]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[1]/generated-flag",0);
@@ -1040,7 +1045,7 @@ setprop(lw~"tiles/tile[1]/code","");
 setprop(lw~"tiles/tile[1]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[1]/orientation-deg",alpha);
 
-x = 40000.0; y = 40000.0;
+x = get_tile_size(); y = get_tile_size();
 setprop(lw~"tiles/tile[2]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[2]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[2]/generated-flag",0);
@@ -1049,7 +1054,7 @@ setprop(lw~"tiles/tile[2]/code","");
 setprop(lw~"tiles/tile[2]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[2]/orientation-deg",alpha);
 
-x = -40000.0; y = 0.0;
+x = -get_tile_size(); y = 0.0;
 setprop(lw~"tiles/tile[3]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[3]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[3]/generated-flag",0);
@@ -1069,7 +1074,7 @@ setprop(lw~"tiles/tile[4]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[4]/orientation-deg",getprop(lw~"tmp/tile-orientation-deg"));
 
 
-x = 40000.0; y = 0.0;
+x = get_tile_size(); y = 0.0;
 setprop(lw~"tiles/tile[5]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[5]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[5]/generated-flag",0);
@@ -1078,7 +1083,7 @@ setprop(lw~"tiles/tile[5]/code","");
 setprop(lw~"tiles/tile[5]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[5]/orientation-deg",alpha);
 
-x = -40000.0; y = -40000.0;
+x = -get_tile_size(); y = -get_tile_size();
 setprop(lw~"tiles/tile[6]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[6]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[6]/generated-flag",0);
@@ -1087,7 +1092,7 @@ setprop(lw~"tiles/tile[6]/code","");
 setprop(lw~"tiles/tile[6]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[6]/orientation-deg",alpha);
 
-x = 0.0; y = -40000.0;
+x = 0.0; y = -get_tile_size();
 setprop(lw~"tiles/tile[7]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[7]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[7]/generated-flag",0);
@@ -1096,7 +1101,7 @@ setprop(lw~"tiles/tile[7]/code","");
 setprop(lw~"tiles/tile[7]/timestamp-sec",weather_dynamics.time_lw);
 setprop(lw~"tiles/tile[7]/orientation-deg",alpha);
 
-x = 40000.0; y = -40000.0;
+x = get_tile_size(); y = -get_tile_size();
 setprop(lw~"tiles/tile[8]/latitude-deg",blat + get_lat(x,y,phi));
 setprop(lw~"tiles/tile[8]/longitude-deg",blon + get_lon(x,y,phi));
 setprop(lw~"tiles/tile[8]/generated-flag",0);
@@ -1325,6 +1330,8 @@ var cloud_view_distance = getprop(lw~"config/clouds-visible-range-m");
 var modelArrays = [];
 var active_tile_list = [];
 
+var tile_size_m = getprop( lw~"config/tile-size-m" ) or 40000.0 and print("Local Weather: Using default tile dimensions");
+var get_tile_size = func return tile_size_m or die("LW:tile_size_m is nil!");
 
 #####################################################
 # hashes to manage clouds in scenery or in the buffer
diff --git a/Nasal/local_weather/weather_tiles.nas b/Nasal/local_weather/weather_tiles.nas
index 30259ff..7f92c4d 100644
--- a/Nasal/local_weather/weather_tiles.nas
+++ b/Nasal/local_weather/weather_tiles.nas
@@ -1199,7 +1199,7 @@ calc_geo(blat);
 
 # get probabilistic values for the weather parameters
 
-var vis = 40000.0 + rand() * 15000.0;
+var vis = get_tile_size() + rand() * 15000.0;
 var T = 8.0 + rand() * 8.0;
 var spread = 7.0 + 3.0 * rand();
 var D = T - spread;

Please don't send support requests by PM, instead post your questions on the forum so that all users can contribute and benefit
Thanks & all the best,
Hooray
Help write next month's newsletter !
pui2canvas | MapStructure | Canvas Development | Programming resources
Hooray
 
Posts: 11437
Joined: Tue Mar 25, 2008 8:40 am

PreviousNext

Return to Weather

Who is online

Users browsing this forum: No registered users and 1 guest