Saturday, January 10, 2009

Panel Texture and Panel Clicking

As of X-Plane 9, life was simple: ATTR_cockpit and ATTR_cockpit_region caused your triangles to be textured by the panel, and they could be clicked. ATTR_no_cockpit went back to regular texture and no clicking.

Well, it turns out that secretly ATTR_cockpit was two attributes jammed into one:

Panel texture - that is, changing the texture from the object texture to the panel texture.

Panel clickability - that is, mouse clicks are sent to the 2-d panel and act on those instruments.

With X-Plane 920 and the manipulator commands, this "clickability" aspect is revealed as a separate attribute, e.g. ATTR_manip_none sets no clickability, and ATTR_manip_command makes a command be run when the triangle is clicked. These attributes can be applied to any kind of texture - panel texture or object texture.

So how does ATTR_cockpit work in this context? Basically you can think of ATTR_cockpit as two "hidden" attributes:

ATTR_texture_panelATTR_manip_paneland similarly, ATTR_no_cockpit is likeATTR_texture_objectATTR_manip_noneWith this you can actually get any number of combinations of attributes, but the code is sometimes unexpected. In particular: if you want a manipulator other than the panel or none, you have to specify it again. Example:# set command manipATTR_manip_command hand sim/operation/pause PauseTRIS 0 3ATTR_cockpit# we now have to reset the cmd manipulator!ATTR_manip_command hand sim/operation/pause PauseTRIS 3 3ATTR_no_cockpit# we have to reset the cmd manipulator again!ATTR_manip_command hand sim/operation/pause PauseTRIS 6 3Similarly, if you want the panel manipulator, you may have to reset the cockpit!ATTR_cockpitTRIS 0 3# now make the mesh not clickableATTR_manip_noneTRIS 3 3# Mesh clickable againATTR_cockpitTRIS 6 3The good news is: this isn't nearly as wasteful as it seems. X-Plane's object attribute optimizer is smart enough that it will remove the unnecessary attributes in both cases. In the first one, what you end up with is one manipulator change (to the command manipulator), and the panel texture change is done without changing manipulator state at all. In the second case, you end up with the manipulator change, but the panel texture is kept loaded the whole time.

In other words, even though the double-attributes or duplicate attrbibutes might seem to be inefficient, the optimizer will fix them for you.

One reason you might care: the cost of panel texture is one-time - that is, you pay for the size of the panel texture once per frame. But the cost of manipulatable triangles is per-triangle! So having more is bad. With ATTR_manip_none, you can use the panel texture but not have it be clickable, which can be a big performance win.

930 will handle manipulatable triangles a lot faster than 920 -- but that's still not a good reason to have all of your triangles be clickable!

This article is still unfinished, but I am trying to put together some info on how to detect performance problems like too many clickable triangles.