|
|
Line 22: |
Line 22: |
|
| |
|
| == Development news == | | == Development news == |
|
| |
| === Creating Canvas UI dialogs procedurally ===
| |
| {{Main article|Draw masks}}
| |
| [[File:Draw-masks-via-canvas.png|thumb|FlightGear [[Draw masks]] GUI dialog procedurally created by the [[Canvas]] system.s]]
| |
|
| |
| Most end-users will hardly be familiar with so called [[Draw masks]], however one stated goal is to add more node bits (and a GUI dialog to control them) so various categories of objects can be disabled during the update pass.
| |
|
| |
| This will mean the direct hit of, say, AI models vs particles vs random trees can be measured.
| |
|
| |
| Of course it won't account for resources (memory, textures) burned by such things, but would still help different people identify slowness on their setups. <ref>{{cite web
| |
| |url = https://sourceforge.net/p/flightgear/mailman/message/29564161/
| |
| |title = <nowiki> Re: [Flightgear-devel] Rendering passes question </nowiki>
| |
| |author = <nowiki> James Turner </nowiki>
| |
| |date = Jul 19th, 2012
| |
| |added = Jul 19th, 2012
| |
| |script_version = 0.40
| |
| }}</ref>
| |
|
| |
| The following snippet of Nasal/Canvas code (mostly based on code taken from [[Canvas Snippets]] demonstrates how easily such a dialog can be procedurally created using the Canvas system:
| |
|
| |
| <syntaxhighlight lang="nasal">
| |
| var (width,height) = (320,160);
| |
| var title = 'Draw Masks';
| |
|
| |
| var window = canvas.Window.new([width,height],"dialog").set('title',title);
| |
|
| |
| window.del = func()
| |
| {
| |
| print("Cleaning up window:",title,"\n");
| |
| call(canvas.Window.del, [], me);
| |
| };
| |
|
| |
| # adding a canvas to the new window and setting up background colors/transparency
| |
| var myCanvas = window.createCanvas().set("background", canvas.style.getColor("bg_color"));
| |
|
| |
| # creating the top-level/root group which will contain all other elements/group
| |
| var root = myCanvas.createGroup();
| |
|
| |
| var drawMasks = props.globals.getNode("/sim/rendering/draw-mask").getChildren();
| |
|
| |
| # create a new layout
| |
| window.Layout = canvas.VBoxLayout.new();
| |
|
| |
| # assign it to the Canvas
| |
| myCanvas.setLayout(window.Layout);
| |
|
| |
|
| |
| foreach(var mask; drawMasks) {
| |
|
| |
| (func() {
| |
| var m = mask;
| |
|
| |
| # print("Found mask:", mask.getName(), "=", mask.getValue() );
| |
|
| |
| var checkbox = canvas.gui.widgets.CheckBox.new(root, canvas.style, {wordWrap: 0})
| |
| .setText( "render " ~ m.getName() )
| |
| .listen("toggled", func(e) {
| |
| setprop(m.getPath(), e.detail.checked);
| |
| })
| |
| .setChecked( m.getValue() );
| |
| window.Layout.addItem(checkbox);
| |
|
| |
| }) ();
| |
|
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| This piece of code can now be easily dropped into $FG_ROOT/Nasal/canvas/gui/dialogs or just added to a nasal binding as part of the menubar.
| |
|
| |
| Technically, there is no reason why the same piece of Nasal code could not be used to also support localized lookups of the corresponding checkbox labels, i.e. to provide a description and/or tooltip using a language other than English; all at the mere cost of adding the corresponding attributes to /sim/rendering/draw-mask in the form of "tooltip" and "label" attributes.
| |
|
| |
| {{See also|Canvas_Troubleshooting#Adding_draw_masks_for_Canvas}}
| |
|
| |
|
| == In the hangar == | | == In the hangar == |