add dialog for cursor positioning. HOWTO:
- fly ufo to target - click on terrain to place cursor - open Tab-key dialog, adjust cursor position - dump position/orientation (d-key)
This commit is contained in:
parent
a5cdda9b8d
commit
48245e20d5
2 changed files with 285 additions and 33 deletions
|
@ -46,10 +46,19 @@
|
|||
<keyboard>
|
||||
<key n="100">
|
||||
<name>d</name>
|
||||
<desc>Dump cursor coordinates</desc>
|
||||
<desc>Dump cursor/UFO coordinates</desc>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>ufo.dump_coords()</script>
|
||||
<script>ufo.dumpCoords()</script>
|
||||
</binding>
|
||||
</key>
|
||||
|
||||
<key n="9">
|
||||
<name>Ctrl-I</name>
|
||||
<desc>Show cursor dialog</desc>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>ufo.showDialog()</script>
|
||||
</binding>
|
||||
</key>
|
||||
</keyboard>
|
||||
|
@ -59,20 +68,24 @@
|
|||
<model>
|
||||
<name>cursor</name>
|
||||
<path>Aircraft/ufo/Models/cursor.ac</path>
|
||||
<longitude-deg-prop>/models/model/cursor/longitude-deg</longitude-deg-prop>
|
||||
<latitude-deg-prop>/models/model/cursor/latitude-deg</latitude-deg-prop>
|
||||
<elevation-ft-prop>/models/model/cursor/elevation-ft</elevation-ft-prop>
|
||||
<heading-deg-prop>/models/model/cursor/heading-deg</heading-deg-prop>
|
||||
|
||||
<cursor>
|
||||
<longitude-deg type="double">0.0</longitude-deg>
|
||||
<latitude-deg type="double">0.0</latitude-deg>
|
||||
<elevation-ft type="double">-1000.0</elevation-ft>
|
||||
<heading-deg type="double">0.0</heading-deg>
|
||||
</cursor>
|
||||
<longitude-deg-prop>/cursor/longitude-deg</longitude-deg-prop>
|
||||
<latitude-deg-prop>/cursor/latitude-deg</latitude-deg-prop>
|
||||
<elevation-ft-prop>/cursor/elevation-ft</elevation-ft-prop>
|
||||
<heading-deg-prop>/cursor/heading-deg</heading-deg-prop>
|
||||
<pitch-deg-prop>/cursor/pitch-deg</pitch-deg-prop>
|
||||
<roll-deg-prop>/cursor/roll-deg</roll-deg-prop>
|
||||
</model>
|
||||
</models>
|
||||
|
||||
<cursor>
|
||||
<longitude-deg type="double">0.0</longitude-deg>
|
||||
<latitude-deg type="double">0.0</latitude-deg>
|
||||
<elevation-ft type="double">-1000.0</elevation-ft>
|
||||
<heading-deg type="double">0.0</heading-deg>
|
||||
<pitch-deg type="double">0.0</pitch-deg>
|
||||
<roll-deg type="double">0.0</roll-deg>
|
||||
</cursor>
|
||||
|
||||
<nasal>
|
||||
<ufo>
|
||||
<file>Aircraft/ufo/ufo.nas</file>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# MAXIMUM SPEED ###################################################################################
|
||||
|
||||
var maxspeed = props.globals.getNode("engines/engine/speed-max-mps");
|
||||
var speed = [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000];
|
||||
var current = 7;
|
||||
|
@ -17,14 +19,8 @@ controls.flapsDown = func(x) {
|
|||
}
|
||||
|
||||
|
||||
var clon = props.globals.getNode("/models/model/cursor/longitude-deg");
|
||||
var clat = props.globals.getNode("/models/model/cursor/latitude-deg");
|
||||
var celev = props.globals.getNode("/models/model/cursor/elevation-ft");
|
||||
|
||||
setlistener("/sim/input/click/longitude-deg", func { clon.setValue(cmdarg().getValue()) });
|
||||
setlistener("/sim/input/click/latitude-deg", func { clat.setValue(cmdarg().getValue()) });
|
||||
setlistener("/sim/input/click/elevation-ft", func { celev.setValue(cmdarg().getValue()) });
|
||||
|
||||
# CURSOR ##########################################################################################
|
||||
|
||||
ft2m = func { arg[0] * 0.3048 }
|
||||
m2ft = func { arg[0] / 0.3048 }
|
||||
|
@ -47,22 +43,266 @@ format = func(lon, lat) {
|
|||
}
|
||||
|
||||
|
||||
tilepath = func(lon, lat) {
|
||||
bucket_span = func(lat) {
|
||||
if (lat >= 89.0 ) {
|
||||
360.0;
|
||||
} elsif (lat >= 88.0 ) {
|
||||
8.0;
|
||||
} elsif (lat >= 86.0 ) {
|
||||
4.0;
|
||||
} elsif (lat >= 83.0 ) {
|
||||
2.0;
|
||||
} elsif (lat >= 76.0 ) {
|
||||
1.0;
|
||||
} elsif (lat >= 62.0 ) {
|
||||
0.5;
|
||||
} elsif (lat >= 22.0 ) {
|
||||
0.25;
|
||||
} elsif (lat >= -22.0 ) {
|
||||
0.125;
|
||||
} elsif (lat >= -62.0 ) {
|
||||
0.25;
|
||||
} elsif (lat >= -76.0 ) {
|
||||
0.5;
|
||||
} elsif (lat >= -83.0 ) {
|
||||
1.0;
|
||||
} elsif (lat >= -86.0 ) {
|
||||
2.0;
|
||||
} elsif (lat >= -88.0 ) {
|
||||
4.0;
|
||||
} elsif (lat >= -89.0 ) {
|
||||
8.0;
|
||||
} else {
|
||||
360.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tile_index = func(lon, lat) {
|
||||
lon_floor = floor(lon);
|
||||
lat_floor = floor(lat);
|
||||
span = bucket_span(lat);
|
||||
|
||||
if (span < 0.0000001) {
|
||||
lon = 0;
|
||||
x = 0;
|
||||
} elsif (span <= 1.0) {
|
||||
x = int((lon - lon_floor) / span);
|
||||
} else {
|
||||
if (lon >= 0) {
|
||||
lon = int(int(lon / span) * span);
|
||||
} else {
|
||||
lon = int(int((lon + 1) / span) * span - span);
|
||||
if (lon < -180) {
|
||||
lon = -180;
|
||||
}
|
||||
}
|
||||
x = 0;
|
||||
}
|
||||
|
||||
y = int((lat - lat_floor) * 8);
|
||||
(lon_floor + 180) * 16384 + (lat_floor + 90) * 64 + y * 8 + x;
|
||||
}
|
||||
|
||||
|
||||
tile_path = func(lon, lat) {
|
||||
var lon_floor = floor(lon);
|
||||
var lat_floor = floor(lat);
|
||||
var lon_chunk = floor(lon / 10.0) * 10;
|
||||
var lat_chunk = floor(lat / 10.0) * 10;
|
||||
var tile = getprop("/environment/current-tile-id");
|
||||
format(lon_chunk, lat_chunk) ~ "/" ~ format(lon_floor, lat_floor) ~ "/" ~ tile ~ ".stg";
|
||||
format(lon_chunk, lat_chunk) ~ "/" ~ format(lon_floor, lat_floor)
|
||||
~ "/" ~ tile_index(lon, lat) ~ ".stg";
|
||||
}
|
||||
|
||||
|
||||
dump_coords = func {
|
||||
var ce = celev.getValue();
|
||||
print("\n--------------------------- Cursor ---------------------------");
|
||||
print(sprintf("Longitude: %.6f deg", clon.getValue()));
|
||||
print(sprintf("Latitude: %.6f deg", clat.getValue()));
|
||||
print(sprintf("Altitude: %.4f m (%.4f ft)", ft2m(ce), ce));
|
||||
Value = {
|
||||
new : func(baseN, name, init) {
|
||||
m = { parents : [Value] };
|
||||
m.lastOffs = 0;
|
||||
m.init = init;
|
||||
|
||||
m.inOffsN = baseN.getNode("offset-" ~ name, 1);
|
||||
m.inOffsN.setValue(m.lastOffs);
|
||||
|
||||
m.outN = baseN.getNode(name, 1);
|
||||
m.outN.setValue(m.init);
|
||||
|
||||
m.lst = setlistener(m.inOffsN, func { m.update() });
|
||||
return m;
|
||||
},
|
||||
del : func {
|
||||
removelistener(me.lst);
|
||||
},
|
||||
reset : func {
|
||||
me.center();
|
||||
me.outN.setValue(me.init);
|
||||
},
|
||||
center : func {
|
||||
me.update();
|
||||
me.inOffsN.setValue(me.lastOffs = 0);
|
||||
},
|
||||
update : func {
|
||||
var offs = me.inOffsN.getValue();
|
||||
me.outN.setValue(me.outN.getValue() + offs - me.lastOffs);
|
||||
me.lastOffs = offs;
|
||||
},
|
||||
set : func(v) {
|
||||
me.center();
|
||||
me.outN.setValue(v);
|
||||
},
|
||||
get : func {
|
||||
me.outN.getValue();
|
||||
},
|
||||
add : func(v) {
|
||||
me.center();
|
||||
me.outN.setValue(me.outN.getValue() + v);
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
Object = {
|
||||
new : func {
|
||||
m = { parents : [Object] };
|
||||
baseN = props.globals.getNode("/cursor", 1);
|
||||
m.values = {
|
||||
lon: Value.new(baseN, "longitude-deg", 0),
|
||||
lat: Value.new(baseN, "latitude-deg", 0),
|
||||
alt: Value.new(baseN, "elevation-ft", -1000),
|
||||
|
||||
hdg: Value.new(baseN, "heading-deg", 0),
|
||||
pitch: Value.new(baseN, "pitch-deg", 0),
|
||||
roll: Value.new(baseN, "roll-deg", 0),
|
||||
};
|
||||
return m;
|
||||
},
|
||||
reset : func {
|
||||
foreach (v; keys(me.values)) { me.values[v].reset() }
|
||||
},
|
||||
center : func {
|
||||
foreach (v; keys(me.values)) { me.values[v].center() }
|
||||
},
|
||||
update : func {
|
||||
foreach (v; keys(me.values)) { me.valuse[v].update() }
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
var cursor = Object.new();
|
||||
setlistener("/sim/input/click/longitude-deg", func { cursor.values["lon"].set(cmdarg().getValue())});
|
||||
setlistener("/sim/input/click/latitude-deg", func { cursor.values["lat"].set(cmdarg().getValue())});
|
||||
setlistener("/sim/input/click/elevation-ft", func { cursor.values["alt"].set(cmdarg().getValue())});
|
||||
|
||||
|
||||
|
||||
|
||||
dialog = nil;
|
||||
|
||||
showDialog = func {
|
||||
name = "ufo-cursor-dialog";
|
||||
if (dialog != nil) {
|
||||
fgcommand("dialog-close", props.Node.new({ "dialog-name" : name }));
|
||||
dialog = nil;
|
||||
return;
|
||||
}
|
||||
|
||||
cursor.center();
|
||||
|
||||
dialog = gui.Widget.new();
|
||||
dialog.set("layout", "vbox");
|
||||
dialog.set("name", name);
|
||||
dialog.set("x", -40);
|
||||
dialog.set("y", -40);
|
||||
|
||||
# "window" titlebar
|
||||
titlebar = dialog.addChild("group");
|
||||
titlebar.set("layout", "hbox");
|
||||
titlebar.addChild("empty").set("stretch", 1);
|
||||
titlebar.addChild("text").set("label", "Position Cursor");
|
||||
titlebar.addChild("empty").set("stretch", 1);
|
||||
|
||||
dialog.addChild("hrule").addChild("dummy");
|
||||
|
||||
w = titlebar.addChild("button");
|
||||
w.set("pref-width", 16);
|
||||
w.set("pref-height", 16);
|
||||
w.set("legend", "");
|
||||
w.set("default", 1);
|
||||
w.set("keynum", 27);
|
||||
w.set("border", 1);
|
||||
w.prop().getNode("binding[0]/command", 1).setValue("nasal");
|
||||
w.prop().getNode("binding[0]/script", 1).setValue("ufo.dialog = nil");
|
||||
w.prop().getNode("binding[1]/command", 1).setValue("dialog-close");
|
||||
|
||||
slider = func(p, legend, col, coarse, fine) {
|
||||
group = dialog.addChild("group");
|
||||
group.set("layout", "hbox");
|
||||
group.set("default-padding", 0);
|
||||
button = func(leg, step) {
|
||||
b = group.addChild("button");
|
||||
b.set("legend", leg);
|
||||
b.set("pref-width", 22);
|
||||
b.set("pref-height", 22);
|
||||
b.set("live", 1);
|
||||
b.prop().getNode("binding[0]/command", 1).setValue("nasal");
|
||||
b.prop().getNode("binding[0]/script", 1).setValue
|
||||
('ufo.cursor.values["'~legend~'"].add('~step~');ufo.cursor.center()');
|
||||
return b;
|
||||
}
|
||||
|
||||
cl = button("<<", -coarse);
|
||||
fl = button("<", -fine);
|
||||
|
||||
s = group.addChild("slider");
|
||||
s.set("property", p.getPath());
|
||||
s.set("legend", legend);
|
||||
s.set("pref-width", 250);
|
||||
s.set("live", 1);
|
||||
s.set("min", -2 * fine);
|
||||
s.set("max", 2 * fine);
|
||||
s.setColor(col[0], col[1], col[2]);
|
||||
s.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
|
||||
|
||||
fr = button(">", fine);
|
||||
cr = button(">>", coarse);
|
||||
}
|
||||
|
||||
slider(cursor.values["lon"].inOffsN, "lon", [1.0, 0.6, 0.6], 0.0002, 0.00002);
|
||||
slider(cursor.values["lat"].inOffsN, "lat", [0.6, 1.0, 0.6], 0.0002, 0.00002);
|
||||
slider(cursor.values["alt"].inOffsN, "alt", [0.6, 0.6, 1.0], 10, 2);
|
||||
|
||||
slider(cursor.values["hdg"].inOffsN, "hdg", [1.0, 1.0, 0.6], 36, 6);
|
||||
slider(cursor.values["pitch"].inOffsN, "pitch", [1.0, 0.6, 1.0], 36, 6);
|
||||
slider(cursor.values["roll"].inOffsN, "roll", [0.6, 1.0, 1.0], 36, 6);
|
||||
|
||||
w = dialog.addChild("button");
|
||||
w.set("legend", "center");
|
||||
w.set("pref-height", 22);
|
||||
w.set("pref-width", 50);
|
||||
w.prop().getNode("binding[0]/command", 1).setValue("nasal");
|
||||
w.prop().getNode("binding[0]/script", 1).setValue("ufo.cursor.center()");
|
||||
|
||||
fgcommand("dialog-new", dialog.prop());
|
||||
gui.showDialog(name);
|
||||
}
|
||||
|
||||
|
||||
dumpCoords = func {
|
||||
print("\n\n--------------------------- Cursor ---------------------------");
|
||||
|
||||
var alt = cursor.values["alt"].get();
|
||||
print(sprintf("Longitude: %.6f deg", var clon = cursor.values["lon"].get()));
|
||||
print(sprintf("Latitude: %.6f deg", var clat = cursor.values["lat"].get()));
|
||||
print(sprintf("Altitude: %.4f m (%.4f ft)", var celev = ft2m(alt), alt));
|
||||
print("");
|
||||
print(sprintf("Heading: %.1f deg", var chdg = normdeg(cursor.values["hdg"].get())));
|
||||
print(sprintf("Pitch: %.1f deg", normdeg(cursor.values["pitch"].get())));
|
||||
print(sprintf("Roll: %.1f deg", normdeg(cursor.values["roll"].get())));
|
||||
print("");
|
||||
print(tile_path(clon, clat));
|
||||
print(sprintf("OBJECT_STATIC %.6f %.6f %.4f %.1f", clon, clat, celev, normdeg(360 - chdg)));
|
||||
|
||||
|
||||
print("\n---------------------------- UFO -----------------------------");
|
||||
|
||||
var lon = getprop("/position/longitude-deg");
|
||||
var lat = getprop("/position/latitude-deg");
|
||||
|
@ -71,7 +311,6 @@ dump_coords = func {
|
|||
var heading = getprop("/orientation/heading-deg");
|
||||
var agl_ft = alt_ft - m2ft(elev_m);
|
||||
|
||||
print("\n---------------------------- UFO -----------------------------");
|
||||
print(sprintf("Longitude: %.6f deg", lon));
|
||||
print(sprintf("Latitude: %.6f deg", lat));
|
||||
print(sprintf("Altitude ASL: %.4f m (%.4f ft)", ft2m(alt_ft), alt_ft));
|
||||
|
@ -79,9 +318,9 @@ dump_coords = func {
|
|||
print(sprintf("Heading: %.1f deg", normdeg(heading)));
|
||||
print(sprintf("Ground Elev: %.4f m (%.4f ft)", elev_m, m2ft(elev_m)));
|
||||
print("");
|
||||
print(tilepath(lon, lat));
|
||||
print(sprintf("OBJECT_S %.6f %.6f %.4f %.1f", lon, lat, elev_m, normdeg(360 - heading)));
|
||||
print(tile_path(lon, lat));
|
||||
print(sprintf("OBJECT_STATIC %.6f %.6f %.4f %.1f", lon, lat, elev_m, normdeg(360 - heading)));
|
||||
print("--------------------------------------------------------------");
|
||||
print("\n");
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue