c172p-team / c172p

A high detailed version of the Cessna 172P aircraft for FlightGear
GNU General Public License v2.0
79 stars 44 forks source link

Add ALS dirt effect #737

Closed wlbragg closed 6 years ago

wlbragg commented 8 years ago

I toyed with this on the j3cub and it is easy to create. My goal is to make it dynamic as to where eventually it gets dirty enough that our GUI asks if you would like to wash the aircraft. I haven't started that coding even on the cub, but I think it would be relatively easy also. Here is the cub with dirt on the wing, strut and tires.

fgfs-screen-001 22

onox commented 8 years ago

That would be cool. Are splashed bugs on the windshield and the leading edge of the wing also a possibility?

gilbertohasnofb commented 8 years ago

That's a cool effect indeed :smile:

wlbragg commented 8 years ago

Are splashed bugs on the windshield and the leading edge of the wing also a possibility?

If you made an object just for the leading edge and gave it its own definition and grain map you probably could make it look like bugs on the leading edge. This is the technique http://wiki.flightgear.org/ALS_technical_notes#The_grain_texture_and_the_rain_effect

For the windshield, I'm not sure it this technique will work on glass, it will work but I don't know about the total alpha of it and how it would look, we will just have to try and see what it looks like. But for sure you could use http://wiki.flightgear.org/ALS_technical_notes#Functional_masks I'm not sure though about our many effects already in use and what can be combined, I think we can figure out a combination the will combine well but don't know for sure.

gilbertohasnofb commented 7 years ago

For the windshield it could also be nice to have some scratches that could be more illuminated depending on the angle, similar to the frost effect. Maybe Thorsten could be interested on that :smile:

edit: what I mean is something like this, look at the glass scratches around the sun

onox commented 7 years ago

For scratches you need a certain color (red/blue/green) in the glass mask texture of the interior glass. You could take a look at the F-14/F-15/F-16, one of those has that feature.

gilbertohasnofb commented 7 years ago

I will take a look at this soon, thanks @onox

wlbragg commented 6 years ago

Effect is in place. All we need now is some nasal control and maybe another grain texture maps for the leading edge.

fgfs-screen-011

gilbertohasnofb commented 6 years ago

@wlbragg Looking good! But perhaps this bit here shouldn't be part of the wing edge, as this is inside the cockpit glass and thus wouldn't get dirty:

fg

gilbertohasnofb commented 6 years ago

same for the landing light.

wlbragg commented 6 years ago

@gilbertohasnofb Yes, I need to split anything that is not exposed to the elements to their own effect without the dirt. We can make this as simple or complex as we want, ie: have it get dirtier over time until "wash-me" or just a slider to set manually. We can make a better dirt texture for the leading edge or for the glass or maybe a bug splat for the glass? @onox, your input here would be helpful. Maybe you or @gilbertohasnofb would want to code this effect system. These are the current properties that can control the amount of dirt for each object. We can combine any of these if you all think it not necessary to have this many separate areas for the effect. I had no real reason to lay it out this way. It is just what I ended up with because of the way the bumpspec is laid out.

<dirt-edge type="float">0</dirt-edge>
<dirt-fuselage type="float">0</dirt-fuselage>
<dirt-wing type="float">0</dirt-wing>
<dirt-tail type="float">0</dirt-tail>

Any suggestions on how to proceed?

gilbertohasnofb commented 6 years ago

We can make a better dirt texture for the leading edge or for the glass or maybe a bug splat for the glass?

could you please point me to the texture files? I can see what I can come up with. Is there a working branch for this effect so I can tweak the textures and see the difference in the sim?

wlbragg commented 6 years ago

I'll set up a working branch as soon as we get the smoothing pushed and closed, too many changes for me to keep organized!

could you please point me to the texture files?

I am using the "rust" in fgdata, fgdata/Models/Geometry/Nimitz/rust_texture.png

There is the ice effect for another example, fgdata/Aircraft/Generic/Effects/window_frost.png

F16 uses this https://www.dropbox.com/s/kci98p4w2tvi9x2/canopy.png?dl=0 I think that glare is incorporated in this one. The frost pattern I think may be what they use for the glare. The color would be handled in the effect definition iI believe. I'll have to look into it.

In the Cub to control frost and fog I use https://www.dropbox.com/s/ih0kyuli7rkj1qu/windshield.png?dl=0

Use Gimp or other graphics program and separate the rgb channels to get a better idea to how it works.

The red channel in my_mask.png controls the strength of fogging, full red corresponds to maximal fogging, no red to zero fogging. This allows to selectively model the position of heaters in the cockpit. Use /environment/aircraft-effects/fog-level to adjust the actual amount of fog runtime.

The green channel of my_mask.png is the amount of reduction of rain in an area. This is intended for airplanes equipped with windshield wipers to partially clear the wiped area of the rain. Whether the windshield wiper is actually on or not is controlled runtime via /environent/aircraft-effects/use-wipers (1 sets wipers to on).

The blue channel of my_mask.png is reserved for an overlay pattern which will be drawn in an optionally specified vector (white in the example xml above) - the primary function is to render damage on the glass, but with a different color, also dirt or an alternative more finely controlled frost pattern can be used. The strength of the pattern can be adjusted runtime via /environment/aircraft-effects/overlay-alpha, allowing dynamical accumulation of dirt or sudden appearance of damage.

See: http://wiki.flightgear.org/ALS_technical_notes#Functional_masks There is a picture of a broken cockpit glass that can be achieved, I don't know who or where that mask is or came from.

gilbertohasnofb commented 6 years ago

@wlbragg would you like to try this dirt texture I just created? I don't know how it will look in the sim though as I didn't figure out how to test it.

dirt

As for the glass, I will need to take a proper look on what we need. Can we use the same texture as the F16 in order to first implement the effect and then I can try to tweak it? As for the frost, I think that one is looking quite good already but I can try something later on.

gilbertohasnofb commented 6 years ago

@wlbragg if the resolution of the image above is too much overkill, feel free to resize it to 512 x 512 which is the same res as that rust texture you are using.

gilbertohasnofb commented 6 years ago

@wlbragg did you test my texture above, was it any better than what you had been using?

And for anyone wishing to implement the logic in the future, the properties that control the dirt are:

environment/aircraft-effects/dirt-edge
environment/aircraft-effects/dirt-wing
environment/aircraft-effects/dirt-fuselage
environment/aircraft-effects/dirt-tail
gilbertohasnofb commented 6 years ago

Also, some of the UV-mapping of the dirt effect could be improved, particularly in the surfaces whose normals are in the same plane as the ground:

fg

wlbragg commented 6 years ago

@wlbragg did you test my texture above,

I haven't had a chance to test it yet.

Also, some of the UV-mapping of the dirt effect could be improved,

Unfortunately we don't have any control over the UV mapping of it, It's built into the shader. But setting the value of any of the "environment/aircraft-effects/xxxx-dirt" between .1 an 3+? does change the look of it. I doubt it will change the streaks, however it was designed to streak like that on the vertical mesh. Also, I don't know what one could do with different textures, how much improvement you'd achieve.

wlbragg commented 6 years ago

@gilbertohasnofb Your dirt texture looks great.

Dude, we really need to wash our aircraft a little more often!

fgfs-screen-001

FYI: Use

<grain-texture-enabled type="int">1</grain-texture-enabled>

instead of

<grain-texture-enabled type="int">2</grain-texture-enabled>

to map the grain texture to the objects UV coordinates VS the models XY coordinates. This eliminates the streaks.

wlbragg commented 6 years ago

@gilbertohasnofb

I changed the property names that control the dirt to match the effects files so it is now...

<dirt-edge type="float">0</dirt-edge>
<dirt-fuselage type="float">0</dirt-fuselage>
<dirt-wing type="float">0</dirt-wing>
<dirt-tail type="float">0</dirt-tail>

You may want to revise your post above just in case someone doesn't read past that post.

I pushed your texture as the dirt effect is now tied to it locally VS the rust texture in fgdata. I also resized it to 512x512.

gilbertohasnofb commented 6 years ago

@wlbragg done.

onox commented 6 years ago

We can do the programming in a new issue.

wlbragg commented 6 years ago

Another idea for the dirt. If we separate the underside of the fuselage I wonder if we could make a texture simulating this type of "oil" grim? Maybe even isolating the forward 3rd of it.

dirt

gilbertohasnofb commented 6 years ago

Will that affect the UV-map of the other liveries? If not, then I am totally up for that. Would you be able to create a png file for me with the shape of the bottom fuselage so that I can create that texture?

onox commented 6 years ago

Added ALS effect in PR #973

gilbertohasnofb commented 6 years ago

@onox shouldn't this be left opened since that PR only implemented the effect but not the logic behind it?

onox commented 6 years ago

Yes, but because @wlbragg already used branch issue-737 for the massive work on the mesh, a new issue and branch name would be better.

legoboyvdlp commented 6 years ago

With low levels of dirt (e.g. 1.0, you get huge lo-res patches), while at e.g. 3.0 you get many small hi-res patches. The "concentration" of dirt doesn't seem to change at all?

@wlbragg @gilbertohasnofb

image

image

Notice the slider in the menu.

I would expect the resoloution to stay the same but the concentration to reduce?

gilbertohasnofb commented 6 years ago

Hmm last time I checked I was able to change the intensity not the resolution, are you using the correct properties? @wlbragg might be able to spot the problem.

Also, do we really want another slider in that menu? Though making it dynamic like @wlbragg originally suggested might need much more work.

wlbragg commented 6 years ago

Off the top of my head try .1 - .9. I am away from my computer at the moment.

legoboyvdlp commented 6 years ago

I'm making it dynamic (that part is already done!) but giving the option to use the slider as well. I'll try .1 to .9, but as far as I know that still made quite low res dirt.

gilbertohasnofb commented 6 years ago

I'm making it dynamic (that part is already done!) but giving the option to use the slider as well.

My suggestion would be to use just a single toggle Enable dirt effect but no slider. Our dialog is already so cluttered. I also don't see much point to give the user some fine tuning tools for something like this, let's just implement the effect to the best of our abilities and let the user only enable/disable it. Else we will be getting into the territory of older X-Plane dialogs (which thankfully have been completely removed):

legoboyvdlp commented 6 years ago

OK - that's fine.

image

dirt level 0.1 - few big patches

image

0.4 - more smaller patches

image

0.7, same

image

1.0, even higher res, smaller patches, but more of them

even at the lowest setting, the aircraft is far too dirty, I wouldn't let an aircraft get into this state:

image

I'd advise much more white in the dirt texture, and how can I change intensity, not resoloution?

gilbertohasnofb commented 6 years ago

@legoboyvdlp I can't fire up FG right now but I think your mistake is that you are changing dirt-level as well as dirt-wing, dirt-fuselage, dirt-tail and dirt-edge. Could you try setting dirt-level to 1.0 and then changing dirt-wing, dirt-fuselage, dirt-tail and dirt-edge to several values from 0.0 to 1.0? That might do the trick.

gilbertohasnofb commented 6 years ago

If it is not clear: my suspicion is that dirt-level sets the resolution. The amount of dirt is then set individually for parts of the aircraft by dirt-wing, dirt-fuselage, dirt-tail and dirt-edge. It's just a hunch but give it a try.

gilbertohasnofb commented 6 years ago

@legoboyvdlp as for the dynamic system, I don't know if this is possible but this would be cool: dirt should accumulate proportionally to the airspeed, only on the ground and using a larger factor when it's a grass runway and even larger factor when it's a plain dirt runway or if the plane goes on the airport grass. I think on regular asphalted runways it should accumulate dirt extremely slowly.

Another idea for the dirt. If we separate the underside of the fuselage I wonder if we could make a texture simulating this type of "oil" grim? Maybe even isolating the forward 3rd of it.

@wlbragg you wrote that in the past. I am still happy to work on this texture if you can pull it off from the model and effects side.

legoboyvdlp commented 6 years ago

If it is not clear: my suspicion is that dirt-level sets the resolution. The amount of dirt is then set individually for parts of the aircraft by dirt-wing, dirt-fuselage, dirt-tail and dirt-edge. It's just a hunch but give it a try.

dirt-level is a property I made myself to control all 4 dirt properties using one nasal loop / slider.

@legoboyvdlp as for the dynamic system, I don't know if this is possible but this would be cool: dirt should accumulate proportionally to the airspeed

that's possible

, only on the ground and using a larger factor when it's a grass runway and even larger factor when it's a plain dirt runway or if the plane goes on the airport grass. I think on regular asphalted runways it should accumulate dirt extremely slowly.

that probably isn't, unfortunately.

gilbertohasnofb commented 6 years ago

Well, only on the ground is easy, you need to use the WOW properties to check if the wheels are touching the ground. The type of ground might be trickier (or impossible) indeed. I believe the WOW properties for each of the three gears are:

/fdm/jsbsim/gear/unit[1]/WOW /fdm/jsbsim/gear/unit[19]/WOW /fdm/jsbsim/gear/unit[23]/WOW

But do test that, please. Also, we don't want dirt accumulating on water. You can check if the plane is touching the water using the property /fdm/jsbsim/hydro/active-norm.

legoboyvdlp commented 6 years ago

Thanks :)

gilbertohasnofb commented 6 years ago

@legoboyvdlp My pleasure. I will test the dirt properties later and report back to you, let's see if I can reproduce this problem you are having with the resolution.

@wlbragg just one more idea, about the bottom of the fuselage. If it's too difficult to separate it as a different object maybe we could get away by having a copy of the few polygons that make up the bottom of the fuselage, make them transparent and move them infinitisely down in the z axis. Then the texture could be applied to it. Could something like this work?

legoboyvdlp commented 6 years ago

@gilbertohasnofb I've made it so that it will take 100 minutes to go from no dirt to max dirt at 50 knots. Is that fast enough? That would mean washing the aircraft about every 50 flights, assuming you are moving on the ground for 3-4 minutes each time if my maths is right!

Accounting for airborne dust and bugs etc, I've added a factor, meaning that dirt increases very, very, very, very slowly in the air - I'm talking about 0.000001 every ten seconds or so ;)

wkitty42 commented 6 years ago

On 08/09/2018 09:49 AM, Gilberto Agostinho wrote:

Well, only on the ground is easy, you need to use the WOW properties to check if the wheels are touching the ground. The type of ground might be trickier (or impossible) indeed.

don't we roll differently on different ground? pavement with the least resistance, rough dirt or grass with more resistance?

gilbertohasnofb commented 6 years ago

This sounds reasonable but perhaps do increase the 100 minutes. I like the 50 flights number, but I think 3-4 minutes on the ground is fairly optimistic. I think 10 minutes is the minimal amount it would take from the moment the engine is on until you take off, even if the airport is empty.

Also, would you be able to implement a slightly more complex logic for the airspeed?: we want the speed to influence the dirt accumulation, but I think that the aircraft would also get some dirt accumulated if the engine is on but it is not moving. So maybe dirt should depend on engine being true and then low value at 0.0 groundspeed and max value at 50.0 kts. Also I think using groundspeed makes more sense.

don't we roll differently on different ground? pavement with the least resistance, rough dirt or grass with more resistance?

@wkitty42 that's done via the scenery definitions in xml, they have a property that sets the resistance to movement. I don't think we have access to that via the property tree.

legoboyvdlp commented 6 years ago

That's fine, I can change that easily ;)

wkitty42 commented 6 years ago

On 08/09/2018 10:34 AM, Gilberto Agostinho wrote:

don't we roll differently on different ground? pavement with the least resistance, rough dirt or grass with more resistance?

@wkitty42 https://github.com/wkitty42 that's done via the scenery definitions in xml, they have a property that sets the resistance to movement. I don't think we have access to that via the property tree.

oh... that's sad...

the only other thing i was thinking of is that craft get dirty just sitting around... sure, they get more when moving but... i see this as a simple timer thing where the craft just gets dirty over a period of time... even the front and back windows... not so much the side windows... the pilot can wash the craft or not depending on their laziness... me? i'm lazy but i clean my front window occasionally when it gets too hard to see through... especially with a lot of sun-glare coming off/through it...

in other words, don't over-engineer the dirt aspect... KIS goes a long way ;)

wlbragg commented 6 years ago

FYI: not to complicate this but we have access to all of this

Don't we roll differently on different ground? pavement with the least resistance, rough dirt or grass with more resistance?

@wkitty42 that's done via the scenery definitions in xml, they have a property that sets the resistance to movement. I don't think we have access to that via the property tree.

These are two examples of how to get and use the ground cover information. I posted to save you the trouble of finding them.

The Aircrane uses

var landcover_map = {
        Asphalt:                0.1,
        Freeway:                0.1,
        Road:                   0.1,
        BuiltUpCover:           0.1,
        Town:                   0.1,
        SubUrban:               0.1,
        pa_centerline:          0.1,
        pa_aim:                 0.1,
        pa_rest:                0.1,
        pa_shoulder:            0.1,
        pa_shoulder_f:          0.1,
        pa_taxiway:             0.1,
        pa_tiedown:             0.1,
        pa_dspl_thresh:         0.1,
        pa_dspl_arrows:         0.1,
        pa_threshold:           0.1,
        pa_no_threshold:        0.1,
        pa_stopway:             0.1,
        pa_L:                   0.1,
        pa_R:                   0.1,
        pa_C:                   0.1,
        pa_0l:                  0.1,
        pa_0r:                  0.1,
        pa_1c:                  0.1,
        pa_1l:                  0.1,
        pa_1r:                  0.1,
        pa_11:                  0.1,
        pa_2c:                  0.1,
        pa_2l:                  0.1,
        pa_2r:                  0.1,
        pa_3c:                  0.1,
        pa_3l:                  0.1,
        pa_3r:                  0.1,
        pa_4c:                  0.1,
        pa_4r:                  0.1,
        pa_5c:                  0.1,
        pa_5r:                  0.1,
        pa_6c:                  0.1,
        pa_6r:                  0.1,
        pa_7c:                  0.1,
        pa_7r:                  0.1,
        pa_8c:                  0.1,
        pa_8r:                  0.1,
        pa_9c:                  0.1,
        pa_9r:                  0.1,
        pa_tz_three:            0.1,
        pa_aim:                 0.1,
        pa_aim_uk:              0.1,
        pa_tz_two_a:            0.1,
        pa_tz_two_b:            0.1,
        pa_tz_one_a:            0.1,
        pa_tz_one_b:            0.1,
        pa_centerline:          0.1,
        pa_rest:                0.1,
        pa_heli:                0.1,
        pc_taxiway:             0.1,
        pc_tiedown:             0.1,
        pc_dspl_thresh:         0.1,
        pc_dspl_arrows:         0.1,
        pc_shoulder:            0.1,
        pc_shoulder_f:          0.1,
        pc_threshold:           0.1,
        pc_no_threshold:        0.1,
        pc_stopway:             0.1,
        pc_L:                   0.1,
        pc_R:                   0.1,
        pc_C:                   0.1,
        pc_0l:                  0.1,
        pc_0r:                  0.1,
        pc_1c:                  0.1,
        pc_1l:                  0.1,
        pc_1r:                  0.1,
        pc_11:                  0.1,
        pc_2c:                  0.1,
        pc_2l:                  0.1,
        pc_2r:                  0.1,
        pc_3c:                  0.1,
        pc_3l:                  0.1,
        pc_3r:                  0.1,
        pc_4c:                  0.1,
        pc_4r:                  0.1,
        pc_5c:                  0.1,
        pc_5r:                  0.1,
        pc_6c:                  0.1,
        pc_6r:                  0.1,
        pc_7c:                  0.1,
        pc_7r:                  0.1,
        pc_8c:                  0.1,
        pc_8r:                  0.1,
        pc_9c:                  0.1,
        pc_9r:                  0.1,
        pc_tz_three:            0.1,
        pc_aim:                 0.1,
        pc_aim_uk:              0.1,
        pc_tz_two_a:            0.1,
        pc_tz_two_b:            0.1,
        pc_tz_one_a:            0.1,
        pc_tz_one_b:            0.1,
        pc_centerline:          0.1,
        pc_rest:                0.1,
        pc_heli:                0.1,
        BarrenCover:            0.1,
        YellowSign:             0.1,
        RedSign:                0.1,
        BlackSign:              0.1,
        FramedSign:             0.1,
        UnidirectionalTaper:    0.1,
        UnidirectionalTaperRed: 0.1,
        UnidirectionalTaperGreen:0.1,
        BidirectionalTaper:     0.1,
        EvergreenNeedleCover:   0.3,
        GolfCourse:             0.3,
        DeciduousNeedleCover:   0.3,
        MixedForestCover:       0.3,
        Urban:                  0.3,
        CropWoodCover:          0.4,
        DeciduousBroadCover:    0.4,
        EvergreenBroadCover:    0.4,
        MixedCrop:              0.5,
        ComplexCrop:            0.5,
        Construction:           0.5,
        Railroad:               0.5,
        SomeSort:               0.5,
        DryCropPastureCover:    0.6,
        MixedCropPastureCover:  0.6,
        IrrCropPastureCover:    0.6,
        DryCrop:                0.6,
        Rock:                   0.6,
        NaturalCrop:            0.6,
        HerbTundraCover:        0.6,
        Island:                 0.6,
        grass_rwy:              0.7,
        GrassCover:             0.7,
        CropGrassCover:         0.7,
        Grass:                  0.7,
        Grassland:              0.7,
        ShrubCover:             0.7,
        Shrub:                  0.7,
        Sand:                   1.0,
        BarrenCover:            1.0,
        Landmass:               1.0,
        Glacier:                1.0,
        SnowCover:              1.0,
        DryLake:                1.0,
        IntermittentStream:     1.0,
        Lava:                   1.0,
        PackIce:                1.0,
        dirt_rwytiedown:        1.0,
        dirt_rwytaxiway:        1.0,
        dirt_rwythreshold:      1.0,
        dirt_rwyL:              1.0,
        dirt_rwyR:              1.0,
        dirt_rwyC:              1.0,
        dirt_rwy0l:             1.0,
        dirt_rwy0r:             1.0,
        dirt_rwy1c:             1.0,
        dirt_rwy1l:             1.0,
        dirt_rwy1r:             1.0,
        dirt_rwy11:             1.0,
        dirt_rwy2c:             1.0,
        dirt_rwy2l:             1.0,
        dirt_rwy2r:             1.0,
        dirt_rwy3c:             1.0,
        dirt_rwy3l:             1.0,
        dirt_rwy3r:             1.0,
        dirt_rwy4c:             1.0,
        dirt_rwy4r:             1.0,
        dirt_rwy5c:             1.0,
        dirt_rwy5r:             1.0,
        dirt_rwy6c:             1.0,
        dirt_rwy6r:             1.0,
        dirt_rwy7c:             1.0,
        dirt_rwy7r:             1.0,
        dirt_rwy8c:             1.0,
        dirt_rwy8r:             1.0,
        dirt_rwy9c:             1.0,
        dirt_rwy9r:             1.0,
        dirt_rwytz_three:       1.0,
        dirt_rwyaim:            1.0,
        dirt_rwyaim_uk:         1.0,
        dirt_rwytz_two_a:       1.0,
        dirt_rwy:               1.0,
        Default:                1.0,
        lakebed_taxiway:        1.0
 };

var rotor_wash_loop = func {

    ##### water and grass shader effect
    var vpos = geo.viewer_position();
    var apos = geo.aircraft_position();

    var lat_to_m = 110952.0;
    var lon_to_m = math.cos(apos.lat()*math.pi/180.0) * lat_to_m;

    var alt = getprop("/position/altitude-agl-ft");

    var delta_x = (apos.lat() - vpos.lat()) * lat_to_m;
    var delta_y = -(apos.lon() - vpos.lon()) * lon_to_m;

    setprop("/environment/aircraft-effects/wash-x", delta_x);
    setprop("/environment/aircraft-effects/wash-y", delta_y);

    var rpm_factor = getprop("rotors/main/rpm")/400.0;

    var strength = 20.0/alt;
    if (strength > 1.0) {strength = 1.0;}
    strength = strength * rpm_factor;

    setprop("/environment/aircraft-effects/wash-strength", strength);

  #rotor wash particle strength
  var lat = getprop("/position/latitude-deg");
  var lon = getprop("/position/longitude-deg");
  var info = geodinfo(lat, lon);
  var dustcover = getprop("/environment/surface/dust-cover-factor");
  var wetness = getprop("/environment/surface/wetness");
  var dustfactor = getprop("/controls/engines/engine/throttle");

  if (info != nil) {
    if (info[1] != nil) {
      if (info[1].names !=nil) {
        setprop("/environment/terrain-names",info[1].names[0]);
        if (contains(landcover_map,info[1].names[0]))
          dustfactor = (1 - getprop("/controls/engines/engine/throttle")) * (landcover_map[info[1].names[0]]);
      }
    }
  }

  dustfactor = dustfactor - wetness;
    dustfactor = dustfactor + dustcover;
  setprop("/environment/terrain-dust-factor", dustfactor);

    #rotor wash particle effect colors
    var land = getprop("/gear/gear/ground-is-solid");
  var red_diffuse = getprop("/rendering/scene/diffuse/red");
  var snowlevel = getprop("/environment/snow-level-m");

    if (land)
    {
      if (alt > snowlevel)
        {
          setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedstart",   red_diffuse*.8);
            setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedstart", red_diffuse*.8);
            setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedstart",  red_diffuse*.8);
            setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedend",     red_diffuse*.9);
            setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedend",   red_diffuse*.9);
            setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedend",    red_diffuse*.9);
        }
      else
        {
          setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedstart",   red_diffuse*.89);
              setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedstart", red_diffuse*.76);
              setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedstart",  red_diffuse*.57);
              setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedend",     red_diffuse*.99);
              setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedend",   red_diffuse*.86);
              setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedend",    red_diffuse*.67);
        }
      }
  else
    {
          setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedstart",   red_diffuse*.90);
          setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedstart", red_diffuse*.95);
          setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedstart",  red_diffuse*.93);
          setprop("/sim/model/aircrane/effects/particles/rotorwash/redcombinedend",     red_diffuse*.92);
          setprop("/sim/model/aircrane/effects/particles/rotorwash/greencombinedend",   red_diffuse*.98);
          setprop("/sim/model/aircrane/effects/particles/rotorwash/bluecombinedend",    red_diffuse*.95);
      }
}

the Alouette uses a scaled down version of the same with a default to cover those not accounted for.

# ALS effect manager

# provides relative vectors from eye-point to aircraft lightspots on runway
# and rotor wash
# in east/north/up coordinates the renderer uses used for outside views

# in addition manages splash vector for rain

# Thorsten Renk, 2017

var landcover_map = {BuiltUpCover: 0.1, Town: 0.1, Freeway:0.1, BarrenCover:1.0, HerbTundraCover: 0.2, GrassCover: 0.2, CropGrassCover: 0.2, EvergreenBroadCover: 0.2, EvergreenNeedleCover: 0.2, Sand: 1.0, Grass: 0.2, Grassland: 0.2, Ocean: 2.0, Marsh: 1.5, Lake: 2.0, ShrubCover: 0.4, Shrub: 0.4, Landmass: 0.2, CropWoodCover: 0.1, MixedForestCover: 0.1, DryCropPastureCover: 0.4, MixedCropPastureCover: 0.2, MixedCrop: 0.2, ComplexCrop: 0.2, IrrCropPastureCover: 0.1, DeciduousBroadCover: 0.1, DeciduousNeedleCover: 0.1, Bog: 1.5, Littoral: 2.0, pa_taxiway : 0.1, pa_tiedown: 0.1, pc_taxiway: 0.1, pc_tiedown: 0.1, Glacier: 3.0, SnowCover: 3.0, DryLake: 1.0, IntermittentStream: 1.0, DryCrop: 0.6, Lava: 1.0, GolfCourse: 0.1, Rock: 0.3, Construction: 0.5, PackIce: 2.0, NaturalCrop: 0.2};

var effect_manager = {

    run: 0,

    lat_to_m: 110952.0,
    lon_to_m: 0.0,

    light1_xpos: 0.0,
    light1_ypos: 0.0,
    light1_zpos: 0.0,
    light1_r: 0.0,
    light1_g: 0.0,
    light1_b: 0.0,
    light1_size: 0.0,
    light1_stretch: 0.0,
    light1_is_on: 0,

    light2_xpos: 0.0,
    light2_ypos: 0.0,
    light2_zpos: 0.0,
    light2_r: 0.0,
    light2_g: 0.0,
    light2_b: 0.0,
    light2_size: 0.0,   
    light2_is_on: 0,

    light3_xpos: 0.0,
    light3_ypos: 0.0,
    light3_zpos: 0.0,
    light3_r: 0.0,
    light3_g: 0.0,
    light3_b: 0.0,
    light3_size: 0.0,
    light3_is_on : 0,

    light4_xpos: 0.0,
    light4_ypos: 0.0,
    light4_zpos: 0.0,
    light4_r: 0.0,
    light4_g: 0.0,
    light4_b: 0.0,
    light4_size: 0.0,
    light4_is_on: 0,

    splash_x: 0.01,
    splash_y: 0.0,
    splash_z: -1.0,
    frost: 0.0,

    dust: 0.0,
    is_water: 0,
    is_snow: 0,
    dust_color: [1.0, 1.0,1.0],
    dust_color_last: [0.0, 0.0, 0.0],

    # node reference pointers for faster property I/O

    nd_ref_light1_x:  props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m", 1),
    nd_ref_light1_y:  props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m", 1),
    nd_ref_light1_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m", 1),
    nd_ref_light1_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir", 1),

    nd_ref_light2_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[1]", 1),
    nd_ref_light2_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[1]", 1),
    nd_ref_light2_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[1]", 1),

    nd_ref_light3_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[2]", 1),
    nd_ref_light3_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[2]", 1),
    nd_ref_light3_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[2]", 1),

    nd_ref_light4_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[3]", 1),
    nd_ref_light4_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[3]", 1),
    nd_ref_light4_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[3]", 1),

    nd_ref_wash_x: props.globals.getNode("/environment/aircraft-effects/wash-x", 1),
    nd_ref_wash_y: props.globals.getNode("/environment/aircraft-effects/wash-y", 1),
    nd_ref_wash_strength: props.globals.getNode("/environment/aircraft-effects/wash-strength", 1),

    nd_ref_splash_x: props.globals.getNode("/environment/aircraft-effects/splash-vector-x", 1),
    nd_ref_splash_y: props.globals.getNode("/environment/aircraft-effects/splash-vector-y", 1),
    nd_ref_splash_z: props.globals.getNode("/environment/aircraft-effects/splash-vector-z", 1),

    nd_ref_frost_level: props.globals.getNode("/environment/aircraft-effects/frost-level", 1),

    nd_ref_dust_r: props.globals.getNode("/fdm/jsbsim/effects/dust-r", 1),
    nd_ref_dust_g: props.globals.getNode("/fdm/jsbsim/effects/dust-g", 1),
    nd_ref_dust_b: props.globals.getNode("/fdm/jsbsim/effects/dust-b", 1),

    nd_ref_heatblur: props.globals.getNode("/fdm/jsbsim/effects/heatblur", 1),

    init: func {
        # define your lights here

        # light 1 ########
        # offsets to aircraft center

        me.light1_xpos = 15.0;
        me.light1_ypos = 0.0;
        me.light1_zpos = 0.0;

        # color values

        me.light1_r = 0.3;
        me.light1_g = 0.3;
        me.light1_b = 0.3;

        # spot size

        me.light1_size = 6.0;
        me.light1_stretch = 1.5;

        # light 2 ########
        # offsets to aircraft center

        me.light2_xpos = 2.0;
        me.light2_ypos = -1.5;
        me.light2_zpos = 2.0;

        # color values

        me.light2_r = 0.0;
        me.light2_g = 0.2;
        me.light2_b = 0.0;

        # spot size

        me.light2_size = 2.0;

        # light 3 ########
        # offsets to aircraft center

        me.light3_xpos = 2.0;
        me.light3_ypos = 1.0;
        me.light3_zpos = 2.0;

        # color values

        me.light3_r = 0.2;
        me.light3_g = 0.0;
        me.light3_b = 0.0;

        # spot size

        me.light3_size = 2.0;

        # light 4 ########
        # offsets to aircraft center

        me.light4_xpos = -2.0;
        me.light4_ypos = 0.0;
        me.light4_zpos = 2.5;

        # color values

        me.light4_r = 0.1;
        me.light4_g = 0.0;
        me.light4_b = 0.0;

        # spot size

        me.light4_size = 3.0;

        me.start();
        },

    start: func {

        setprop("/sim/rendering/als-secondary-lights/num-lightspots", 4);

        setprop("/sim/rendering/als-secondary-lights/lightspot/size", me.light1_size);
        setprop("/sim/rendering/als-secondary-lights/lightspot/size[1]", me.light2_size);
        setprop("/sim/rendering/als-secondary-lights/lightspot/size[2]", me.light3_size);
        setprop("/sim/rendering/als-secondary-lights/lightspot/size[3]", me.light4_size);

        setprop("/sim/rendering/als-secondary-lights/lightspot/stretch", me.light1_stretch);

        me.run = 1;     
        me.update();

        },

    stop: func {
        me.run = 0;

        },

    update: func {

        if (me.run == 0) {return;}

        var alt_agl = getprop("/position/altitude-agl-ft");
        var rotor_rpm = getprop("/fdm/jsbsim/propulsion/engine/rotor-rpm");
        var als_on = getprop("/sim/rendering/shaders/skydome");

        setprop("/position/gear-agl-m", alt_agl * 0.3048 - 0.72);

        # lights and wash we only need to do close to the ground when ALS is on

        if ((als_on == 1) and (alt_agl < 100.0))
            {
            var apos = geo.aircraft_position();
            var vpos = geo.viewer_position();

            me.lon_to_m = math.cos(apos.lat()*math.pi/180.0) * me.lat_to_m;

            var heading = getprop("/orientation/heading-deg") * math.pi/180.0;

            var lat = apos.lat();
            var lon = apos.lon();
            var alt = apos.alt();

            var sh = math.sin(heading);
            var ch = math.cos(heading);

            var strobelights = getprop("/fdm/jsbsim/electrical/strobe-lights");
            var strobe1 = getprop("/fdm/jsbsim/systems/effets/lights/blinker-kinemat-in");

            if (strobelights == 1) 
                {
                if (strobe1 == 1)
                    {
                    me.light2_on();
                    me.light3_off();
                    }
                else
                    {
                    me.light2_off();
                    me.light3_on();
                    }

                }
            else
                {
                me.light2_off();
                me.light3_off();
                }           

            var beacon = getprop("/fdm/jsbsim/electrical/beacon");
            var strobe2 = getprop("/fdm/jsbsim/systems/effets/lights/beacon2-on");

            if (beacon == 1)
                {
                if (strobe2 == 0)
                    {
                    me.light4_on();
                    }
                else
                    {
                    me.light4_off();
                    }
                }
            else
                {
                me.light4_off();
                }

            var view = getprop("/sim/current-view/view-number");

            if ((getprop("/fdm/jsbsim/electrical/landing-light") == 1) and (view != 0) and (view != 9) and (view != 10))
                {
                me.light1_on();
                }
            else
                {
                me.light1_off();
                }

            # rotor particle dust

            me.terrain_probe(apos.lat(), apos.lon(), apos.alt());
            me.set_dust();

            # rotor wash

            var delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
            var delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;

            me.nd_ref_wash_x.setValue(delta_x);
            me.nd_ref_wash_y.setValue(delta_x);

            var rpm_factor = rotor_rpm /350.0;

            var strength = 20.0/alt_agl;
            if (strength > 1.0) {strength = 1.0;}
            strength = strength * rpm_factor;

            me.nd_ref_wash_strength.setValue(strength);

            # light 1 position

            #var alt_agl = getprop("/position/altitude-agl-ft");

            var proj_x = alt_agl;
            var proj_z = alt_agl/10.0;

            apos.set_lat(lat + ((me.light1_xpos + proj_x) * ch + me.light1_ypos * sh) / me.lat_to_m);
            apos.set_lon(lon + ((me.light1_xpos + proj_x)* sh - me.light1_ypos * ch) / me.lon_to_m);

            delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
            delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
            var delta_z = apos.alt()- proj_z - vpos.alt();

            me.nd_ref_light1_x.setValue(delta_x);
            me.nd_ref_light1_y.setValue(delta_y);
            me.nd_ref_light1_z.setValue(delta_z);
            me.nd_ref_light1_dir.setValue(heading);         

            # light 2 position

            apos.set_lat(lat + (me.light2_xpos * ch + me.light2_ypos * sh) / me.lat_to_m);
            apos.set_lon(lon + (me.light2_xpos * sh - me.light2_ypos * ch) / me.lon_to_m);

            delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
            delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
            delta_z = apos.alt() - vpos.alt();

            me.nd_ref_light2_x.setValue(delta_x);
            me.nd_ref_light2_y.setValue(delta_y);
            me.nd_ref_light2_z.setValue(delta_z);

            # light 3 position

            apos.set_lat(lat + (me.light3_xpos * ch + me.light3_ypos * sh) / me.lat_to_m);
            apos.set_lon(lon + (me.light3_xpos * sh - me.light3_ypos * ch) / me.lon_to_m);

            delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
            delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
            delta_z = apos.alt() - vpos.alt();

            me.nd_ref_light3_x.setValue(delta_x);
            me.nd_ref_light3_y.setValue(delta_y);
            me.nd_ref_light3_z.setValue(delta_z);

            # light 4 position

            apos.set_lat(lat + (me.light4_xpos * ch + me.light4_ypos * sh) / me.lat_to_m);
            apos.set_lon(lon + (me.light4_xpos * sh - me.light4_ypos * ch) / me.lon_to_m);

            delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
            delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
            delta_z = apos.alt() - vpos.alt();

            me.nd_ref_light4_x.setValue(delta_x);
            me.nd_ref_light4_y.setValue(delta_y);
            me.nd_ref_light4_z.setValue(delta_z);

            }

        # rain also needs to be done above 100 ft

        if (als_on == 1)
            {

            me.splash_z = -1.0 - rotor_rpm/100.0;
            if (me.splash_z < -2.0) {me.splash_z = -2.0;}

            var beta = getprop("/fdm/jsbsim/aero/beta-deg") * math.pi/180.0;
            var airspeed = getprop("/velocities/airspeed-kt");

            var splash_h = airspeed/80.0;
            if (splash_h > 1.0) {splash_h = 1.0;}

            me.splash_x = splash_h * math.cos(beta) -0.001;
            me.splash_y = splash_h * math.sin(beta);

            me.nd_ref_splash_x.setValue(me.splash_x);
            me.nd_ref_splash_y.setValue(me.splash_y);
            me.nd_ref_splash_z.setValue(me.splash_z);

            var temperature = getprop("/environment/temperature-degc");

            me.frost = - (temperature + 5.0);
            if (me.frost < 0.0) {me.frost = 0.0;}
            else if (me.frost > 0.5) {me.frost = 0.5;}

            me.nd_ref_frost_level.setValue(me.frost);

            var turbine_rpm = getprop("/fdm/jsbsim/propulsion/engine/engine-rpm");

            turbine_rpm = turbine_rpm / 5000.0;
            if (turbine_rpm > 1.0) {turbine_rpm = 1.0;}

            me.nd_ref_heatblur.setValue(turbine_rpm * 0.4);
            }

        settimer ( func me.update(), 0.0);
        },

    light1_on : func {
        if (me.light1_is_on == 1) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", me.light1_r);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", me.light1_g);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", me.light1_b);
        me.light1_is_on = 1;
        },

    light1_off : func {
        if (me.light1_is_on == 0) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", 0.0);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", 0.0);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", 0.0);
        me.light1_is_on = 0;
        },

    light2_on : func {
        if (me.light2_is_on == 1) {return;}
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", me.light2_r);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", me.light2_g);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", me.light2_b);
        me.light2_is_on = 1;
        },

    light2_off : func {
        if (me.light2_is_on == 0) {return;}
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", 0.0);
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", 0.0);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", 0.0);
        me.light2_is_on = 0;
        },

    light3_on : func {
        if (me.light3_is_on == 1) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", me.light3_r);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", me.light3_g);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", me.light3_b);
        me.light3_is_on = 1;
        },

    light3_off : func {
        if (me.light3_is_on == 0) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", 0.0);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", 0.0);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", 0.0);
        me.light3_is_on = 0;
        },

    light4_on : func {
        if (me.light4_is_on == 1) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", me.light3_r);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", me.light3_g);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", me.light3_b);
        me.light4_is_on = 1;
        },

    light4_off : func {
        if (me.light4_is_on == 0) {return;}
        setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", 0.0);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", 0.0);
        #setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", 0.0);
        me.light4_is_on = 0;
        },

    terrain_probe: func (lat, lon, alt) {

        var info = geodinfo(lat, lon);
        if ((info != nil) and (info[1] != nil))
            {
            if (contains(landcover_map,info[1].names[0])) 
                {me.dust = landcover_map[info[1].names[0]];}
            else 
                {me.dust = 0.2;}

            }
        else
            {
            me.dust = 0.2;  
            }

            if (me.dust > 2.99)
                {
                me.is_snow = 1;
                me.is_water = 0;
                me.dust = 2.0 * (me.dust - 2.0);
                }
            else if (me.dust > 1.99)
                {
                me.is_water = 1;
                me.is_snow = 0;
                me.dust = 3.0 * (me.dust - 1.0);
                }
            else
                {
                me.dust = 2.0 * me.dust;
                me.is_snow = 0;
                me.is_water = 0;
                }

                var snowlevel = getprop("/environment/snow-level-m");
            var dustcover = getprop("/environment/surface/dust-cover-factor");
            var wetness = getprop("/environment/surface/wetness");

            if ((alt  > snowlevel) and (me.is_water == 0))
                {
                me.is_snow = 1;
                }
            else if ((wetness > 0.3) and (me.is_snow == 0))
                {
                me.is_water = 1;
                }

            if (me.is_snow == 1)
                {
                me.dust = 2.0 * (me.dust + 1.0);
                }
            else if (me.is_water == 1)
                {
                me.dust = 3.5 * me.dust + 1.0 * wetness ;
                }
            else
                {
                me.dust = me.dust + 3.5 * dustcover;
                }
        },

        set_dust: func {

            var torque = getprop("/fdm/jsbsim/propulsion/engine/torque-lbsft");

            var size = 0.04 * math.sqrt(math.abs(torque)) + 0.8  + 0.00000004 * math.pow(torque, 2.0);
            size *= me.dust;
            setprop("/fdm/jsbsim/effects/dust", me.dust);
            setprop("/fdm/jsbsim/effects/particle-size", size);

            if ((me.is_snow) or (me.is_water))
                {
                me.dust_color = [1.0, 1.0, 1.0];
                }
            else 
                {
                me.dust_color = [0.75, 0.75, 0.6];
                }
            var scenelight = 1.2 * getprop("/rendering/scene/diffuse/red");
            if (me.light1_is_on == 1)
                {
                scenelight+= 0.5;
                }

            if (scenelight > 1.0) {scenelight = 1.0;}

            me.dust_color[0] *= scenelight;
            me.dust_color[1] *= scenelight;
            me.dust_color[2] *= scenelight;

            if (me.dust_color[0] != me.dust_color_last[0])
                {
                me.nd_ref_dust_r.setValue(me.dust_color[0]);
                me.dust_color_last[0] = me.dust_color[0];
                }
            if (me.dust_color[1] != me.dust_color_last[1])
                {
                me.nd_ref_dust_g.setValue(me.dust_color[1]);
                me.dust_color_last[1] = me.dust_color[1];
                }
            if (me.dust_color[2] != me.dust_color_last[2])
                {
                me.nd_ref_dust_b.setValue(me.dust_color[2]);
                me.dust_color_last[2] = me.dust_color[2];
                }

        },

};

effect_manager.init();

The main difference between the two is Thorsten's (Alouette) version uses a scaled down landcover list and accounts for all the ALS environemtal factors (ie: wetness).

My version (Aircrain) has a more detailed landcover list) but I don't use the ALS environment slider portion.

Also note this is applied to particles VS a shader map.

Surface roughness is also available but I don't know that this is a factor that would give this use case much of a bonus.

i see this as a simple timer thing where the craft just gets dirty over a period of time.

I kind of see @wkitty42 point. I originally thought that this would be a simple time thing, I never thought about using terrain as a factor (although using terrain is a good idea as a bush plane is going to get dirtier than a strictly asphalt plane).. Anyway terrain mapping is available if you want to go to that detail.

wlbragg commented 6 years ago

Another food for thought, I would take my time with this to do it justice. To do anything but a simple slider right now I think your going to mis out on making it nice. The biggest challenge I think will be the graphic textures we make for it. @gilbertohasnofb that also applies to the window glare effect we want. A big part of that being a real success depends on excellent graphics for the masks.

wlbragg commented 6 years ago

Oh, and the fuselage cutting and effect of oil would go hand in hand with this project. But I don't have the time to take it on right now. I don't want to rush either one of these effects.

wlbragg commented 6 years ago

@legoboyvdlp I'm not trying to turn you off this project, I just question the amount of time to left before the release to do it justice. I think there is going to be a tone of tweaking and possibly more mesh splitting along with custom textures for each piece of split mesh to make it look the way I envisioned it to look. Otherwise I think we will end up with the default dirt effect straight from the shader which isn't awful (like what is currently available with the Cub), but isn't as good as we can tweak it to be by some careful, strategic use of mesh parts and textures for those parts.

Also are we on a closed issue, should we be using Make fuselage and wings dirty #1003

gilbertohasnofb commented 6 years ago

Let's please move to #1003 , I will answer there