diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 0abf953c..41088b16 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -48,7 +48,7 @@ var myCockpit_switches = { "toggle_waypoints": {path: "/inputs/wpt", value:0, type:"BOOL"}, "toggle_position": {path: "/inputs/pos", value:0, type:"BOOL"}, "toggle_data": {path: "/inputs/data",value:0, type:"BOOL"}, - "toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, + #"toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, "toggle_traffic": {path: "/inputs/tfc",value:0, type:"BOOL"}, "toggle_centered": {path: "/inputs/nd-centered",value:0, type:"BOOL"}, "toggle_lh_vor_adf": {path: "/input/lh-vor-adf",value:0, type:"INT"}, diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 7778f57c..c9eab922 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -374,6 +374,11 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if(wxr_live_enabled == nil or wxr_live_enabled == '') wxr_live_enabled = 0; me.set_switch('toggle_weather_live', wxr_live_enabled); + + var terr_enabled = getprop("/controls/switches/terr_on_nd_l"); + if (terr_enabled == nil) terr_enabled = 0; + if (me.get_switch('toggle_terrain') != terr_enabled) me.set_switch('toggle_terrain', terr_enabled); + call(me.update_sub, nil, nil, caller(0)[0]); # call this in the same namespace to "steal" its variables # MapStructure update! diff --git a/Models/Instruments/ND/canvas/loaders.nas b/Models/Instruments/ND/canvas/loaders.nas index d0345237..ed72a08d 100644 --- a/Models/Instruments/ND/canvas/loaders.nas +++ b/Models/Instruments/ND/canvas/loaders.nas @@ -16,7 +16,7 @@ setlistener("/nasal/canvas/loaded", func() { var aircraft_root = getprop("/sim/aircraft-dir"); var load = func(file, name) { - print("Loading ..." ~ file); + #print("Loading ..." ~ file); if (name == nil) var name = split("/", file)[-1]; if (substr(name, size(name)-4) == ".draw") diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller index 6d062b85..9528ee29 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -41,8 +41,8 @@ var searchCmd = func { #if(lat == nil or lon == nil) { var pos = geo.aircraft_position(); - lat = pos.lat(); - lon = pos.lon(); + var lat = pos.lat(); + var lon = pos.lon(); #} var result = geo.Coord.new(); diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 6c2a2b2f..98cfa985 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,43 +7,110 @@ DotSym.makeinstance( name, __self__ ); var element_type = "group"; -var tile_list = ["tile_00.png","tile_04.png","tile_06.png"]; +var tile_list = ["tile_01.png","tile_01.png","tile_02.png","tile_03.png","tile_03.png","tile_03.png","tile_04.png","tile_04.png","tile_06.png","tile_09.png",]; + +var radar_beacon = 0; +var radar_cycle = 0; + +var get_elevation = func (lat, lon) { + + var info = geodinfo(lat, lon); + var elevation = 0; + if (info != nil) { elevation = int(info[0] * 3.2808399); } + else { elevation = nil; } + return elevation; + +} + + +var updateTerrain = func(r_scaled){ -var updateTerrain = func(size){ if(me.fetching) return; - var pos = geo.aircraft_position(); - var lat = pos.lat(); - var lon = pos.lon(); + me.fetching = 1; - for (var a=0; a < me.tileradius; a+=1) { + var RAD2DEG = 57.2957795; + var DEG2RAD = 0.016774532925; - var len = size(me.terrlayer["L" ~ a]); + var pos = geo.aircraft_position(); + var pos_lat = pos.lat(); + var pos_lon = pos.lon(); + + var heading = getprop("orientation/heading-magnetic-deg"); + var altitudeagl = getprop("/position/altitude-agl-ft"); + + var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; + var a = int(me.radar_beacon/2); + var col = a; + + if (side == "L") { + col = -1 + (-1 * a); + } + + var col = me.radar_beacon - me.tileradius; + + #for (var a=0; a < me.tileradius; a+=1) { + + #var trnL = me.terrlayer["L" ~ a]; + #var trnR = me.terrlayer["R" ~ a]; + var trn = me.terrlayer[side ~ a]; + + var len = size(trn); + var range = me.range; + + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 60); + var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 60); + + var elevft = []; + + for (var row = 0; row <= len; row += 1) { + + var point_lon = proj_lon + ((row * (range/30) / 60) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/30) / 60) * math.cos(DEG2RAD * heading)); + + var elev = me.get_elevation(point_lat, point_lon); + if (elev != nil) { + var grad = int((elev - altitudeagl + 500)/500); + if (grad>6) grad = 6; + else if (grad<-3) grad = -3; + + append(elevft,grad+2); # (-1)-8 + } else { + append(elevft,8); # magenta + } + + } for (var r=0; r < len; r+=1) { - var imgx = math.mod(r*a,3); - - me.terrlayer["L" ~ a].setFile(me.imgpath ~ me.tile_list[imgx]).show(); - me.terrlayer["R" ~ a].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); + var imgx = elevft[r]; + if (imgx < 0) trn[r].hide(); + else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); + #trnR[r].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); } + #} + + me.radar_beacon += 1; + if (me.radar_beacon >= (me.tileradius*2)) { + me.radar_beacon = 0; + me.radar_cycle += 1; } - me.last_request = getprop("sim/time/elapsed-sec"); + #me.last_request = getprop("sim/time/elapsed-sec"); me.fetching = 0; }; var init = func { - print('TERRAIN init'); - me.tile = 20; + #print('TERRAIN init'); + me.tile = 33; # better 34 me.fetching = 0; me.timeStamp = nil; me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); - me.imgpath = get_local_path('res/'); + me.imgpath = get_local_path('res/terrain/'); var tile = me.tile; @@ -53,27 +120,28 @@ var init = func { me.terrlayer = {}; #me.element.createChild("image").set("z-index", -100).hide(); - var centx = me.viewport_radius; + var centx = 0; #me.viewport_radius * -0.5; + var centy = -me.viewport_radius; for (var c=0; c me.update_interval) { + var rot = getprop("orientation/heading-deg"); + rot -= me.layer.map.getHdg(); + me.element.setRotation(rot*D2R); + + + #if(getprop("sim/time/elapsed-sec") - me.last_request >= me.update_interval) { me.updateTerrain(r_scaled); - } + #} }; diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_01.png b/Models/Instruments/ND/canvas/res/terrain/tile_01.png new file mode 100644 index 00000000..e6b7d711 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_01.png differ diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_02.png b/Models/Instruments/ND/canvas/res/terrain/tile_02.png new file mode 100644 index 00000000..c20336c8 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_02.png differ diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_03.png b/Models/Instruments/ND/canvas/res/terrain/tile_03.png new file mode 100644 index 00000000..ca873469 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_03.png differ diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_04.png b/Models/Instruments/ND/canvas/res/terrain/tile_04.png new file mode 100644 index 00000000..aa077829 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_04.png differ diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_05.png b/Models/Instruments/ND/canvas/res/terrain/tile_05.png new file mode 100644 index 00000000..cb4a1616 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_05.png differ diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_06.png b/Models/Instruments/ND/canvas/res/terrain/tile_06.png new file mode 100644 index 00000000..151be7c4 Binary files /dev/null and b/Models/Instruments/ND/canvas/res/terrain/tile_06.png differ diff --git a/Models/Instruments/ND/canvas/res/tile_00.png b/Models/Instruments/ND/canvas/res/tile_00.png deleted file mode 100644 index f99f027a..00000000 Binary files a/Models/Instruments/ND/canvas/res/tile_00.png and /dev/null differ diff --git a/Models/Instruments/ND/canvas/res/tile_04.png b/Models/Instruments/ND/canvas/res/tile_04.png deleted file mode 100644 index 5cd0732c..00000000 Binary files a/Models/Instruments/ND/canvas/res/tile_04.png and /dev/null differ diff --git a/Models/Instruments/ND/canvas/res/tile_06.png b/Models/Instruments/ND/canvas/res/tile_06.png deleted file mode 100644 index 997be7f0..00000000 Binary files a/Models/Instruments/ND/canvas/res/tile_06.png and /dev/null differ diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index db27f681..f2c61112 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -88,17 +88,33 @@ canvas.NDStyles["Airbus"] = { name:"TERRAIN", isMapStructure:1, always_update: 1, - update_on:[ "toggle_range","toggle_display_mode","toggle_terrain"], + update_on:[ {rate_hz: 0.4}, "toggle_range","toggle_display_mode","toggle_terrain"], predicate: func(nd, layer) { - var visible=nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); + #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); + var visible = nd.get_switch("toggle_terrain") and + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); layer.group.setVisible(visible); if (visible) { layer.update(); } }, # end of layer update predicate options: { - viewport_radius: 706 + viewport_radius: 706, + model: { + parents: [geo.Coord], + id: 999999, + pos: props.globals.getNode("position"), + type: "position", + latlon: func(){ + me.pos = props.globals.getNode("position"); + return [ + me.pos.getValue("latitude-deg"), + me.pos.getValue("longitude-deg"), + me.pos.getValue("altitude-ft") + ]; + }, + equals: func(o){me.id == o.id} + }, }, "z-index": -100, }, @@ -106,11 +122,11 @@ canvas.NDStyles["Airbus"] = { name:"WXR_live", isMapStructure:1, always_update: 1, - update_on:[ "toggle_range","toggle_weather","toggle_display_mode","toggle_weather_live"], + update_on:[ "toggle_range","toggle_weather","toggle_display_mode","toggle_weather_live","toggle_terrain"], predicate: func(nd, layer) { var visible=nd.get_switch("toggle_weather") and nd.get_switch("toggle_weather_live") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); + nd.get_switch("toggle_display_mode") != "PLAN" and !nd.get_switch("toggle_terrain") and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); layer.group.setVisible(visible); if (visible) { layer.update();