1
0
Fork 0
fgdata/Nasal/material.nas

163 lines
4.3 KiB
Text
Raw Normal View History

Melchior FRANZ: Changes: o new skids (yet again) o sun shield for the panel o beautified exhausts o new door handling: "d" ... toggle selected door (default: pilot door) "D" ... select next door (indicated with popup) "Ctrl-d" ... remove selected door if opened (all bo105 doors can easily get removed in RL; it is even flown without doors!) o dropped shadow boxes (once necessary workaround for the disappearing shadow problem, and the reason why the bo105 was so tiny in fgrun) o automatically selects the emblem of the national Red Cross/Red Crescent society on startup o 5 variants, that can be switched at runtime, with different emblems, colors(!), and extra equipment: "c" ... switch to next variant "C" ... pop-up material dialog, as a demonstration of the new "material" animation, well ... and for entertainment purposes :-) The bo105 was and is a testbed for the "material" animation. It uses one to change a texture at runtime. This has the advantage, that only the currently selected texture uses up memory (unlike the textranslate method), and it saves a lot of disk space because it doesn't duplicate all textures (unlike the current <texture-path> method. You can change the texture in the browser: http://localhost:5501/sim/model/bo105/material/emblem/texture (choose one of: emblems/{red-cross,red-crescent-[lr],star-of-life}.rgb (the built-in property browser doesn't grok it, because I used quite long path names. Needs to be fixed in the GUI.) I suggest to add the material.nas file to the global Nasal/ dir, not only because the bo105 update expects it. The Nasal module creates a dialog for material editing, which is quite useful for development purposes, for gaining better understanding of the OpenGL color properties, and finally: it's fun. http://members.aon.at/mfranz/material.jpg [45 kB] The dialog needs to be initialized with a property dir where material redirects are placed. It isn't available from the menu, but may be useful for other aircraft. Also, it's quite small and doesn't get in the way. If people want it removed, I can still move its contents into bo105.nas. The bo keyboard binding says: material.showDialog("/sim/model/bo105/material/fuselage/", "Bo105"); This is documented on top of the *.nas file.
2005-03-22 13:16:59 +00:00
# material dialog
# ===============
#
# Usage: material.showDialog(<path>, [<title>], [<x>], [<y>]);
#
# the path should point to a property "directory" (usually set in
# the aircraft's *-set.xml file) that contains any of:
#
# {diffuse,ambient,specular,emission}-{red,green,blue,factor,offset}
# shininess, transparency, texture
#
# If <title> is omitted, then the last path component is used as title.
# If <x> and <y> are undefined, then the dialog is centered.
#
#
# Example:
# <foo>
# <diffuse-red>1.0</diffuse-red>
# <transparency>0.5</transparency>
# <texture>bar.rgb</texture>
# </foo>
#
#
# material.showDialog("/sim/model/foo/", "FOO");
#
#
#
# Of course, these properties are only used if a "material" animation
# references them via <*-prop> definition.
#
# Example:
#
# <animation>
# <type>material</type>
# <object-name>foo</object-name>
# <diffuse-red-prop>/foo/diffuse-red</diffuse-red-prop>
# <transparency-prop>/foo/transparency</transparency-prop>
# <texture-prop>/foo/texture</texture-prop>
# </animation>
#
dialog = nil;
colorgroup = func {
parent = arg[0];
name = arg[1];
base = arg[2];
undef = func { props.globals.getNode(base ~ name ~ "-" ~ arg[0]) == nil };
if (undef("red") and undef("green") and undef("blue")) {
return;
}
grp = parent.addChild("group");
grp.set("layout", "hbox");
grp.addChild("text").set("label", "-- " ~ name ~ " --");
foreach (color; ["red", "green", "blue", "factor"]) {
mat(parent, color, base ~ name ~ "-" ~ color);
}
mat(parent, "offset", base ~ name ~ "-" ~ "offset", -1.0, 1.0);
}
mat = func {
parent = arg[0];
name = arg[1];
path = arg[2];
if (props.globals.getNode(path) != nil) {
grp = parent.addChild("group");
grp.set("layout", "hbox");
grp.addChild("empty").set("stretch", 1);
grp.addChild("text").set("label", name);
slider = grp.addChild("slider");
slider.set("property", path);
slider.set("live", 1);
if (size(arg) == 5) {
slider.set("min", arg[3]);
slider.set("max", arg[4]);
}
slider.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
number = grp.addChild("text");
number.set("label", "-0.1234567");
number.set("property", path);
number.set("live", 1);
}
}
showDialog = func {
base = arg[0];
while (size(base) and substr(base, size(base) - 1, 1) == "/") {
base = substr(base, 0, size(base) - 1);
}
parentdir = "";
b = base;
while (size(b)) {
c = substr(b, size(b) - 1, 1);
if (c == "/") { break }
b = substr(b, 0, size(b) - 1);
parentdir = c ~ parentdir;
}
title = if (size(arg) > 1 and arg[1] != nil) { arg[1] } else { parentdir };
name = "material-" ~ parentdir;
base = base ~ "/";
dialog = gui.Widget.new();
dialog.set("name", name);
if (size(arg) > 2 and arg[2] != nil) { dialog.set("x", arg[2]) }
if (size(arg) > 3 and arg[3] != nil) { dialog.set("y", arg[3]) }
dialog.set("layout", "vbox");
titlebar = dialog.addChild("group");
titlebar.set("layout", "hbox");
titlebar.addChild("text").set("label", title);
titlebar.addChild("empty").set("stretch", 1);
w = titlebar.addChild("button");
w.set("pref-width", 16);
w.set("pref-height", 16);
w.set("legend", "");
w.set("default", 1);
w.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
w.prop().getNode("binding[1]/command", 1).setValue("dialog-close");
colorgroup(dialog, "diffuse", base);
colorgroup(dialog, "ambient", base);
colorgroup(dialog, "specular", base);
colorgroup(dialog, "emission", base);
undef = func { props.globals.getNode(base ~ arg[0]) == nil };
if (!(undef("shininess") and undef("transparency") and undef("threshold"))) {
w = dialog.addChild("group");
w.set("layout", "hbox");
w.addChild("text").set("label", "-- misc --");
mat(dialog, "shi", base ~ "shininess", 0.0, 128.0);
mat(dialog, "trans", base ~ "transparency");
mat(dialog, "thresh", base ~ "threshold");
}
path = base ~ "texture";
if (props.globals.getNode(path) != nil) {
w = dialog.addChild("group");
w.set("layout", "hbox");
w.addChild("text").set("label", "-- texture --");
w = dialog.addChild("input");
w.set("pref-width", 250);
w.set("property", path);
w.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
}
dialog.addChild("empty").set("pref-height", "3");
fgcommand("dialog-new", dialog.prop());
gui.showDialog(name);
}