topic: Scenery

ATC Taxi Route Authoring

Basics

The ATC Taxi routes are used by X-Plane ATC to provide navigation guidance around the airport.  ATC does not use any information other than the taxi routes; it does not matter where concrete and asphalt actually are, only where the Taxi Routes are.

Taxi Route Authoring in WED

A taxi route is a collection of line segments. Each taxiway segment can be defined as:

  • One way
  • On a runway
  • Departure/arrival hot zones
  • ILS precision areas
  • Size restricted

In order for the taxi route to function correctly, a few things must always be true:

  • Taxi route segments cannot cross each other unless they are connected by a common node. WED automatically prevents this from happening by placing a node where two crossing taxi route segments overlap.
  • The ENTIRE grid of taxi routes must be connected – there should be a continuous path from any one route to any other route.  (This means you CANNOT build an airport with disjoint movement areas, even if it exists in the real world!)
  • Every runway that is used in ANY flow needs to have a taxi route on it so aircraft can get from and to the runway.

node example 1

Segments are color coded when viewed in the ATC Taxi + Flow tab, to provide an immediate sense of the properties assigned to each segment.

wed color coding 1

Basic Taxi Route Segments

The most basic taxi route segment that can be defined is for taxiway on the pavement surrounding an airport. Typically these are drawn over the line markings that guide aircraft around the airport. They are a collection of nodes and segments which are color coded yellow in the map pane.

These segments are typically named to match the real world route letters. You can leave the name blank for very small connectors and routes along the gate line. They can also be defined as one-way routes if planes always use it in only one direction.

To make a new taxi route, select the taxi routes tool and set the name and other properties in the tool bar, then click in the map pane to place the taxi route segments. The taxi route tool does not support bezier curves, so use short segments to approximate curves.

If you cross an existing taxi route segment while creating a new taxi route, WED will automatically insert a node at the intersection.

Runway Taxi Route Segments

A runway taxi route is defined by selecting the appropriate runway from the Runway drop down menu. The Name, Departures, Arrivals, and ILS Precision Area fields will be all be set automatically by WED. Runway segments are normally color coded blue in the WED map pane, but may also be purple – if portions of that runway are also hot zones for other runways (see below for information on hot zones).

For all runway taxi routes:

  • Taxi route nodes must be inside of the runway’s bounds. Only a small overflow zone past the ends of the runways is allowed.
  • Taxi routes must be parallel to and as close as possible to the runway’s centerline.
  • The runway must be sufficiently covered by the taxi route. This includes displaced thresholds, but excludes blast pads.
  • All runway taxi routes must be properly connected to the rest of the taxi route, as discussed in the Basics section

The property “Size” of runway segments has no function at all in X-plane.

Hot Zones

Hot zones are a location on an airport with a potential risk of collision or runway incursion, and where heightened attention by pilots and drivers is necessary. Usually a segment of the taxiway closest to the runway, or where runways overlap, hot zones are color coded red or purple (when crossing or on a runway) in the map pane.

All taxi route segments inside the hold short lines of the real airport should be marked as hot zones. The presence of the hot zone will cause the AI aircraft to correctly hold short at those hold short lines.

If the real world airport is missing a hold short line on one side of the runway (this is rare, but does sometimes happen) you still need to mark a hot zone approximately where the aircraft would have to stop in order to be out of the way of runway operations.

Runways need hot zones too. When two runways cross, each one needs to have a hot zone marked near the crossing point of the other runway. If there are real land-and-hold-short markings (LAHSO) lines on the runway, this is a good place to start the hot zone. The hot zones are used when a runway is inactive (and being used as a taxiway), and also to detect conflicts between a landed aircraft that is taxiing off the runway and crossing arrivals and departures.

hot zone KOJC 1

ILS Precision Areas

An ILS critical zone is a designated area of an airport that all physical obstructions must remain clear of when one or more Instrument Landing Systems are in use, to protect against signal interference or attenuation that may lead to navigation errors, or accident. ILS critical zones are color coded orange in the WED map pane.

Taxi Route Sizes

Each taxi route segment has a size letter, which restricts the use of that segment by aircraft larger than the specified size. The sizes depend on only the aircraft’s wingspan in X-Plane and are identical to ICAO aircraft size classifications:

Size        Wingspan        Examples

A        < 15m        C172, B58

B        < 24m        King Air C90

C        < 36m        B737, A320, MD-80

D        < 52m        B767, A310, MD-10

E        < 65m        B777, B747, A340

F        < 80m        A380

Although this is useful to prevent oversized aircraft visibly hitting their wings on nearby scenery objects, care must be taken to not specify small sizes for no valid reason. The maximum size of aircraft that may taxi or be present at a given airport is limited by the largest size taxi route size specified in any of the ramp starts at that airport, plus runway size restrictions. If there is no path from any ramp start to the active runway wide enough to accommodate that aircraft, the ATC system may come to a full halt.

Taxi Route Obstructions

A similar “stuck forever” situation can occur if ramp start positions that can be used by AI (of type Tiedown or Gate) are on or close to taxi routes. ATC route planning will not check for such obstructions ahead of time, and if the shortest route to the runway happens to go along a route obstructed by a parked aircraft, AI traffic will stop indefinitely as it cannot re-route.

Validation

WED 1.5 (and greater) now has more validations to ensure airport ATC taxi routes are accurate and sensible.

If there are no ATC runway use rules specified, all runways are examined. Otherwise, only the runways mentioned in a runway use rule that also have at least one runway taxi route of the same name are checked during validation.

WED will display the boundaries where ATC taxi routes need hotzone after any failed validation in purple.

Final Tips

A good rule of thumb is to avoid “micromanaging” taxi routes. ATC and Ground Vehicle routes are intended to get traffic close enough to their destination that the built-in logic can taxi the vehicles to their final destination as needed. Specify only the preferred routes, as in general X-Plane can not tell non-plausible, obsolete or rarely used routes from the ones where you want aircraft to go.

Avoid connecting taxi routes directly to ramp starts so that the aircraft has room to maneuver between the taxi network and the ramp start for the best, most realistic results.

Use the fewest segments possible to specify only the desired & safe taxi routes. The taxi route is determined without checking for obstructions along the entire route–only the very next segment of the route is checked ahead of time, and the aircraft will not reroute if it becomes stuck.

7 Comments

ATC Flow Authoring in WED

Basics

Real world ATC is all about efficiency – runway space at major airports is limited, so ATC aims to use the existing runways, taxiways, and airspace in the most efficient manner to arrive and depart as many planes per hour as possible. The “flow” system in WED/X-Plane aim to model real world procedures that were designed for real world efficiency.

An airport ATC “flow” defines how the runways in an airport are used. Each flow tells ATC:

  • Which runways are used, and in which directions
  • Whether the runway is used for takeoffs, landings, or both
  • What kinds of planes use which runways.

Real world flows are often named after the direction of traffic, e.g. “east flow” and “west flow” but these names are never exposed to pilots. In the same manner, WED’s flows are named for reference and log output only and are never displayed to X-Plane users.

Flows are picked based on wind and weather conditions so aircraft can land and take off into the wind. They are also sometimes based on noise abatement – the route the aircraft flies may be restricted to not fly over residential areas at low altitude and high power.

Only one “flow” is used at an airport at a single time – each flow is designed so that all of the runways used in the flow can be used at the same time safely to have maximum efficiency at the airport.

While X-Plane doesn’t move as many airplanes as KORD, we support the same kinds of rules for realistic routings and flow.

A detailed example: KBOS

Boston Logan has five runways that it uses for major operations: two parallel runways (4L/4R), two near-parallel runways (33L and 32) and one additional runway (9). The airport also has a noise restrictions: no aircraft ever land on runway 14 or depart on runway 32.

Based on this, KBOS has four possible main flows:

“Northeast” VFR flow:
Jets land on 4R
Jets depart 4L and 9
Heavy jets depart 4R
Props land and depart 4L

“Southwest” flow:
Jets land on 27
Jets depart 22R
Heavy jets depart 22L
Props land 22L and hold short of 27

“Northwest” flow
Jets depart 27
Heavy jets depart 33L
Props depart 27
Jets land 33L and 27
Props land 34

“Southeast” flow
Jets land 15R
Props land 15R and 15L (15L is tiny)
Jets depart 15R
Props depart 14

These flows are ordered from most efficient to least efficient for the airport. The southeast flow is a huge bottleneck because KBOS can’t land on runways 9 or 14; all planes have to land on one runway. It is also hard for ATC to land a prop behind a jet because of wake turbulence rules and the difference in speeds. By comparison the northeast flow provides the highest operations rate, with jets landing parallel to props (with each stream of aircraft packed tightly) and room for completely independent departures on runway 9.

Flows in WED & X-Plane

Selection Rules and Priority

The main rules for flow selection in X-Plane are:

  • Only one flow may be running at a time.
  • X-Plane will evaluate each of your flows in the order they appear in WED – the top flow in the hierarchy is evaluated first.
  • The first flow in which all of its rules “pass” is selected.

This means flows should be arranged in WED so that the ideal, most-used flow is first. It will be picked the majority of the time and will only be bypassed if it absolutely cannot be used. In our KBOS example, you would want to arrange the flows in WED in the order they’re listed above (ordered by high to low efficiency).

It is important that for any conditions at least one flow be selected; given bad enough weather conditions in real life the airport might be shut down, but in X-Plane the airport must remain open. So it may make sense to have your last flow have no rules, so it is a “catch-all”.

Flow basics & rules

Each airport in WED can have one or more flows – if no flow is provided, X-Plane just makes one up.

Flows contain two kinds of data:

  • Runway use rules tell which runways will be used.
  • Restrictions that control whether the flow can be used at any given time in the sim (time & wind rules).
Runway Use Rules

Each flow has one or more “runway use” that describes a particular runway with use restrictions.

Runway use rules describe:

  • The end of the runway to start from
  • Departure frequency for aircraft departing from this runway using this rule
  • Whether it is used for arrivals, departures, or both
  • The type of aircraft operations
  • Departure direction range
  • Initial assigned heading range

Flows also have a “pattern” runway for VFR traffic patterns, but X-Plane ignores the Pattern Runway and Pattern Direction fields on flows because we don’t support VFR traffic patterns yet. You must still include a runway use – just having the traffic pattern runway will not make that runway used. (The VFR pattern runway on the flow doesn’t tell us what kinds of planes use the runway, etc.)

The runway use rule for the pattern runway should include both arrivals and departures. But do not set a flow to allow arrivals (or departures) on both ends of a runway, or you risk head on collisions! For example, do NOT arrive on 4R AND arrive on 22L. In the majority of cases, if a runway allows arrivals and departures at the same time they will go the same direction and use the same runway.

It is okay to have a runway in a flow more than once – you might need this for complex rules.

Example:

KBOS north flow:
4R – arrivals, jets + heavies
4R – departures, heavies

In this case we need to use the 4R runway use twice. For arrivals jets and heavies land 4R, but for departure, ONLY heavies use 4R. The logic behind this case is the heavies need the long runway 4R for departure, but the jets can depart runway 9 for more operations.

You can set this example up in WED two different ways with the same result.

Option 1:
Create a use rule and set traffic type to Jets & Heavy Jets
Set Operations to Arrivals only
Create another use rule
Set traffic type to Heavy Jets
Set operations to departures

Option 2:
Create a use rule
Set traffic type to Heavy Jets
Set operations to departures & arrivals
Create a new rule
Set traffic to Jets
Set operations to arrivals only

The departure frequency field is required but is not fully implemented in X-Plane. Unless you have created a custom ATC frequency file, this field will be rewritten by X-Plane to match its 23 ATC frequency sectors. (ATC departure frequencies can be specified in WED but will only appear on the local map as pilot reference. They are not actually in use by X-Plane at this time.)

Runway uses also include the departure direction range. This is the rough direction from the airport that the aircraft will fly (e.g. if we depart KBOS for San Francisco, our direction is west). This is specified in the Legal on-course hdg min/max in WED. Given two runways that can both depart an aircraft, X-Plane will pick a runway based on departure direction when possible. This lets you specify things like “north departures use 27R, south departures use 27L”, to avoid aircraft crossing in-air.

Runway uses also contain an initial heading. These are the ATC Assigned hdg min/max fields in WED. This is the heading that ATC will assign the aircraft off of the runway – it can be a range so that ATC can “fan out” aircraft for faster departures. This is another case where two runway uses can be used, e.g. from our example KBOS northeast flow:

9 – departures – jets, initial heading 090, departure heading 000 – 360
9 – departure – props, initial heading 150, departure heading 090 – 180
4L – departure – props, initial heading 360, departure heading 180 – 090

In other words, most props will depart runway 4L and head directly north. But props departing to the south or east will depart runway 9 and immediately turn south-east, getting out of the way of jets. Jets will take off runway 9 and go straight.

(The southeast runway 9 heading lets small airplanes going to cape cod go straight out toward their destination – the jets fly straight to get out over water and to not make noise over the city of Boston.)

Note that departure direction and initial direction do not have to match. E.g. at KBOS a jet whose departure direction is West might still get an initial direction of East – this means the plane initially flies the wrong way (usually for noise abatement) and is then turned around.

Time, wind and visibility rules

Flow rules come in three flavors:

  • Time rules define during what times of day the flow may be used.
  • Wind rules define under what wind conditions the flow may be used.
  • Visibility rules define what visibility is required to use the flow.

You can have more than one wind and time rule for a flow; if you do, the flow will pass if any of the rules of that type pass. In other words, you can do this:

Flow “northeast”
Wind < 4 knots, 0-360
Wind < 15 knots, 270 – 090
Flow “southwest”
Wind < 15 knots, 090 – 270

In other words, if the wind is less than four knots or the wind is coming from the north, we use the northeast flow. This “or” behavior is useful because often airports will use the most efficient flow when the wind is very low.

Similarly, the time rules can have more than one time, e.g. for two peak periods.

For all weather-related rules (wind, visibility), you specify the ICAO code of a METAR reporting station. For major airports, this is the airport’s ICAO, but for small satellite airports, you can use the ICAO code of a larger nearby airport. This is for cases where a small GA airport’s runway use must be changed to affect the runway use of the neighboring large airport, or where several airports must adjust their runway uses all at once due to proximity.

Typically an airport with multiple runways will have higher priority “VFR” flows with higher visibility requirements and multiple runways in use, and then lower priority “IFR” flows with no visibility requirements. This lets X-Plane’s ATC use more runways in good conditions and just one runway in bad conditions.

Debugging Flows and Flow Changes

When the weather changes, X-Plane will wait one minute before beginning to change flows. When it starts to change flows, the sim goes through three phase:

  • Departure drain. All new departures are held, but existing departures are allowed to depart using the old flow. All arrivals continue to arrive using the old flow.
  • Arrival drain. Once the number of non-held departures falls to zero, all arrivals not on final are re-routed to the new flow. Existing arrivals are allowed to land on the old flow.
  • Complete change-over. Once the existing legacy arrivals have landed, the new flow is fully in effect and the ground hold is lifted.

Note that if the weather changes back to the old flow in phase 1, the old flow is resumed; if the weather changes back in phase 2, we continue to the new flow.

The logic behind step 1 is: we have to let all taxiing departures depart on the old runway because there might not be enough room for aircraft to turn around on the pavement. While this is happening we don’t re-route arrivals to avoid a head-on collision. The logic behind step 2 is: as long as pending arrivals are arriving in the old runway, we can’t release the gate hold because the departing aircraft might block the arrivals’ route to the gate.

By default the ATC system logs some information about flow changes to Log.txt, but you can turn on advanced and detailed logging by setting the art control atc/debug/rwy_flow to 1. Detailed logging starts after the art control is set. Log.txt can be viewed in real-time using the “developer console” menu item in the Special menu.

You can also view more details about runway selection by setting the art control atc/debug/rwy_selection to 1.

16 Comments

Guide to Ramp Starts

Starting with X-Plane 10.50 and WED 1.5, ramp starts can be customized with a lot of data to help specify their use. Ramps starts should be designed based on their use in the real world and should never have aircraft scenery objects placed on them as this would interfere with the “Draw Parked Aircraft” and “AI Aircraft” functions in X-plane 10.50 and newer.

Ramp start type

The majority of ramp starts should be either Gate or Tie-down spots. Static aircraft will show up only at these ramp types.

Misc and hangar type ramp starts should only be used for human player starts.  X-Plane will ignore Misc type and will not spawn static aircraft there. When Hangar is set, X-Plane assumes the aircraft is in a building (and therefore not visible) and won’t spend resources placing aircraft there. AI aircraft will use the Misc and Hangar types as a last resort, if no tie down or gate spots are open.

Set only one type from the drop down here.

Equipment Type

This field determines what type of aircraft should use this parking spot. Set at least one type from the drop down here, but multiple types are supported on the same spot. The differentiation between “Heavy Jets” and “Jets” is historic – all aircraft size E or larger are usually classified as “Heavy” in X-Plane, while those of size D and below as “Jets”. It is recommended to always include both “Heavy Jets” and “Jets” as equipment types for all ramp starts of size D and larger to avoid creating unintended restrictions.

Size

This field determines what size (wingspan) aircraft can be drawn as parked aircraft at that spot. X-Plane will place aircraft that are marked in X-Plane’s scenery library as the specified size & one lower (i.e., size C will be used by size C & B aircraft).

The classification of these sizes follows ICAO Aircraft Size Standards and is as follows:

Letter Wingspan Example
A <15m C-172, Baron 58
B 15-24m King Air C90
C 24-36m B737, A320, MD80
D 36-52m B767, A310, MD10
E 52-65m B777, B747, A340
F 65-80m A380

Ramp Operation Type

To further limit what type of aircraft can be shown as parked aircraft at that ramp, set an operation type. When set to “none,” no parked aircraft will be placed, but AI aircraft of a suitable size can still use this ramp start. Pick only one type from the drop down here.

Airlines

Case insensitive in WED, three letter ICAO codes as per the  Airline Codes Wiki Page separated by spaces.

If you have included more than one airline code in this spot, X-Plane will randomly pick one before the available liveries in the library are checked. If the airline code X-Plane selected is not found in the user’s library, a random result will be placed instead. So limit your definitions to airlines code most people actually have static aircraft installed for, otherwise most people will only see completely random liveries at those starts. X-Plane by default includes liveries for only a small number of major airlines, but these will always work. See the category lib/airport/aircraft/airliners/ for available liveries on ramp starts marked as Operation Type=’Airline’. Or the equivalent categories corresponding to the other operation types, if selected.

Designing sceneries with Ramp Starts

All ramp starts of types “Tiedown” or “Gate” must be placed to allow aircraft taxing along ATC taxi routes to safely pass any aircraft parked there. To check for interference, switch to the “Taxi+Flow” view mode in WED and verify the yellow aircraft shapes are completely clear of the ATC taxi routes depicted in any color, with preferably 10-20 feet of clearance to spare.

Debugging Ramp Starts & AI Aircraft

If AI don’t seem to be using your airport or ramp starts, there are a couple art controls that you can turn on to help debug the situation. (Note you will need to set the art control then make sure the airport reloads by leaving entirely and coming back.):

  • atc/debug/log_spawn=1  (Prints log info on AI aircraft arrival & departure logic. Use developer console to see this in-sim)
  • airp/debug_ramp_starts=1 (Leaves on screen a bunch of visual debug markers telling you about the ramp starts, so if a static airplane is missing or wrong you can SEE the data.)
2 Comments

RFC: Airport-ID Based Exclusion

This RFC is for a scheme that allows overlay scenery elements (points, polygons/poly-lines and road networks) in a DSF to be associated with an airport ID; if the airport is specified by a higher priority scenery pack than the one that the DSF resides within, then those DSF elements are not loaded. This mirrors the behavior of apt.dat elements (where all apt.dat elements for an airport whose ID is replaced by a higher priority scenery pack are not loaded).

Implementation Details

This scheme is built on top of a number of layered extensions to the DSF file format.

Comment Types

The DSF file format has (since its inception over a decade ago) contained comment blocks. A comment is a blob of variable-sized arbitrary binary data in the DSF command stream. The comment’s size is known to a DSF parser even if the comment’s contents are opaque, allowing for extension to DSFs with forward compatibility.

Until now, X-Plane did not use comments. This scheme introduces comments with a 16-bit comment type starting the comment block, followed by data specific to the comment type. Comment types can be used in any comment command (8, 16, or 32-bit) as long as the comment’s payload is at least 2  bytes long.

Filter Index Comments

Comment type 1 is defined as a change of the filter index.  The filter index is a 32-bit signed integer indicating what filter is used to process certain DSF commands; a filter of -1 means “no filter is applied”. No filter is treated as the default state; as filter index comments go by, it effectively changes the filter applied to the next command.

Filters are applied to road network, polygon/poly-line and point commands, but not to patches and base mesh.

Filtering Scheme

X-Plane defines filters to include or not include overlay elements by airport ID code using new properties: the property sim/filter/aptid defines a new filter; the value of the property is the airport ID to match.  The filter is defined as including overlay elements if the airport whose ID matches the value is defined by this scenery pack, and as excluding overlay elements if the airport whose ID matches the value is defined by another scenery pack.

X-Plane also uses the filter properties to filter exclusion zone properties; any of the sim/exclude_XXX properties that are after a sim/filter/aptid property in the DSF property table will be included only if the filter is defined as including overlay elements. Exclusion zones defined before any of the filter/aptid filters are always included.

 

Leave a comment

Scenery System Version History

X-Plane 8.00 (11/6/04)

This is the initial version available on DVD.

  • First version to read X-Plane DSF files and use the new library system and packaging.
  • OBJ7 cockpit texture commands added for 3-d cockpit objects with working panels.

X-Plane 8.01 (11/10/04)

This is a demo download of X-Plane 8.00.

  • Checkbox added to disable DSF loading, so users can use ENV or DSF scenery without moving files.

X-Plane 8.03 (12/30/04)

This is the first major bug-fix update to the original X-Plane. Besides a number of enhancements to the scenery system to improve the look of the new scenery, it also fixes a number of big performance-killing bugs. Note: this build was originally called X-Plane 8.02 but was accidentally released without a beta label. It has been renamed to 8.03 to prevent confusion about what build is most recent.

  • On two texture unit machines, X-Plane will load only the base layer of composite terrain types when there is a border texture. Previously borders would not be visible because X-Plane would run out of texture units, so this change effectively prefers borders to composite textures.
  • Object Version 2 support restored to the sim. This is a legacy format and not recommended for new development, but is supported by 802 for scenery migration.
  • Libraries may reference multiple objects or facades for one virtual path, providing for variation on an object to be provided by an add-on library.
  • Facades can have night lighting textures via the TEXTURE_LIT command.
  • Facades can have real textured roofs instead of a solid color.
  • Composite textures may be used in any terrain, not just terrain that was composite in the default artwork.
  • BUMPY and WET commands added to the terrain type file format to allow for customized terrain surfaces.

X-Plane 8.04 – 8.06 (2/2/05)

This is an additonal bug-fix release that also integrates a number of systems changes.

  • Load order preference has changed: in 8.04 ENV files in the custom scenery folder are preferred to DSFs in the default scenery folder.

X-Plane 8.10-8.11 (3/19/05)

This feature release mostly focuses on systems features but also has a few scenery features to support global scenery.

  • The sim/require_object property is recognized to force objects in a DSF to be shown at low rendering details.
  • Terrain files can control clamping vs. wrapping and other properties.

X-Plane 8.15 (6/19/05)

This feature release also focuses on systems, but does have a few fixes to ENV handling.

  • ENVs draw taxiway lines.
  • Bug Fix: ENV water-land physics properties now match V7.
  • Bug Fix: Tall objects with hard surfaces now track correctly.
  • Bug Fix: No more occasional “NaN” errors with ENVs.

X-Plane 8.20 (11/15/05)

This feature release provides a bunch of new scenery features and the new OBJ8-based object engine.

  • New .ter file commands for more control of projection, wrapping and composite borders.
  • New .net command to keep the number of texture repetitions even – useful for bridges.
  • New .net command for more carefully controlling polygon offset – also useful for bridges.
  • New .bch file format for beach textures around waterboddies.
  • New OBJ8 file format with animation, per vertex normals, blending control.
  • Bug fixes to the OBJ8 engine: poylgon offset and materials now work correctly.
  • Scenery Engine Improvements: async texture loading, faster ENV processing, compressed textures, better rendering of road network intersections.

X-Plane 8.30 (1/15/06)

This is mainly a performance-tuning relase, but with a few new scenery features–overlays are the important one.

  • Sim support for Overlay DSFs.
  • Datarefs allow a plugin to tell which object is being drawn.
  • Asynchronous 3-d clutter instantiation.
  • Bug fixes for culling and speed improvements.

X-Plane 8.40 (4/13/06)

The main purpose of this release was to get X-Plane working on the Intel Macintoshes.

  • Library system regionalization added.
  • Object-location datarefs allow for animating multiple instances of one object.

X-Plane 8.50 (7/18/06)

This release features the new apt.dat system as well as other OBJ extensions.

  • New apt.dat 850 file format support.
  • New DSF polygon types for draped polygons, painted lines and strings of lights.
  • OBJ8 supports control over blending, hard surfaces and draw order.
  • New show/hide OBJ8 animation commands.
  • OBJ8 supports a new light system.
  • .net road files support cars and hard pavement.
  • Facades support hard surfaces and blending control.
  • Default ships and other default scenery re-implemented as library objects.
  • Library regions may be defined with PNG files.

X-Plane 8.60 (11/28/06)

A few new features for custom scenery packages, and some bug fixes.

  • .pol overlay polygons can have texture coordinates, for overlay orthophotos.
  • .pol files can have clamped textures using new commands.
  • .For files can prevent trees from being placed over water.
  • New EXPORT_BACKUP library command lets DSFs use objects from other packages optionally.
  • Better memory management for overlays in long flights.
  • Bug fix: Facade walls are now randomized.

X-Plane 8.64 (11/1/07)

  • Various low-level bug fixes for the scenery system.
  • Better alignment of OBJs.

X-Plane 9.00 (11/24/07)

New major version, which supports all v8 scenery features plus new ones. The rendering engine no longer pauses on scenery load, uses shaders more heavily, and has increased forest capacity.

  • OBJ file format supports key frames.
  • New OBJ command to use part of the panel texture for VRAM savings.
  • Road .net files extended to support trains.
  • Road networks are legal in DSF overlays.
  • New .ter commands to hide terrain repetition using pixel shaders.
  • Improvements to .pol placement in overlays
  • Improved forest exclusion zones
  • It is possible to fly under hard surfaces.

X-Plane 9.20 (10/4/08)

Feature Release with internationalization support, new aircraft and systems code.

  • OBJ supports manipulators.
  • Texture Paging Implemented for .ter and .pol files.
  • Texture engine heavily threaded.

X-Plane 9.30 (Beta 1 2/4/09)

New OBJ features.

  • OBJ supports variable LIT texture, no draw, solid walls.
  • OBJ hard surfaces can be animated.
  • Draped orthophotos with bezier curves now work.
  • DSFs can contain multiple LOD patches.

X-Plane 9.40 (12/4/09)

New OBJ features, better multi-thread support

  • Most 3-d Scenery Processes run on up to 8 or more cores
  • Normal/Specular maps
  • Parameterized Lights

X-Plane 9.50 (4/15/09)

Performance improvements for large orthophoto sceneries.

  • Parameterized light list extended to cover all aspects of airplanes.
Comments Off on Scenery System Version History

Scenery System for MSFS Developers

Differences of Approach

Perhaps the most important structural difference between the X-Plane and MSFS scenery systems is that MSFS integrates and processes scenery data while the sim runs, while X-Plane scenery is pre-processed. Some examples:

  • With MSFS, you can specify a water polygon as part of scenery – this data will be merged with land-class data when scenery is loaded. In X-Plane, you specify a water polygon when you build a mesh file; that data has already been merged by the time your .dsf file is ready for distribution.
  • With MSFS, land-class, orthophoto, and DEM data are combined when the sim runs to create the final mesh. With X-Plane, this data is combined when you create your finished DSF scenery file.
  • With MSFS, objects are placed on terrain while you fly (auto-gen); with X-Plane, objects are placed on terrain when the DSF file is built (pre-gen).

The X-Plane approach has strengths and weaknesses and a few big implications for scenery developers:

  • Overall, scenery add-ons must be more monolithic for X-Plane than for MSFS – see integrated mesh vs. layers below. There may be categories of MSFS scenery that cannot be created as ship-alone products on X-Plane. For example, you cannot create scenery that only improves land class data without also providing a mesh in X-Plane.
  • In some cases, processing time for scenery data is a non-issue for X-Plane. For example, you can input very complex coastlines to X-Plane’s scenery tool; that expensive polygon processing is done during scenery creation and a finished mesh is created.

See Anatomy of the X-Plane Scenery System for the various types of add-ons that can be created.

Comparison of Architecture

Irregular Mesh vs. Dynamic Mesh

Irregular_mesh1
Irregular_mesh2

X-Plane’s terrain meshes are pre-defined in a DSF file – they are not created by X-Plane from raster elevation data. For this reason, any water-tight mesh can be used in X-Plane. We say that X-Plane uses an irregular mesh because the Laminar-provided mesh-creation tools create irregular meshes and the default scenery that ships with X-Plane uses irregular meshes, but it might be more correct to say that we use a mesh of any form.

X-Plane uses an irregular mesh because it can provide superior accuracy for a given vertex count, relative to a regular grid. With an irregular mesh:

  • Mesh triangles edges can be placed along any polygonal border. This means that polygonal water bodies and orthophotos efficiently shape the mesh.
  • Mesh triangles can fit the contours of terrain.
  • We can reduce mesh triangles where they aren’t adding value (e.g. flat locations).

X-Plane has support for detail-removing LOD in version 8 and later (that is, you can provide alternate meshes in a scenery single DSF file and X-Plane will pick between them based on view distance). The scenery tools, as of this writing, have relatively limited support for mesh LOD.

Texture Use

Mesh textures in X-Plane are used directly as part of the mesh – the mesh is more like a big model in that regard. (Compare to MSFS, where the final terrain texture for an area may be built up and pre-mixed from multiple layers.) This means that the performance of a mesh scenery may be improved by careful texture planning. A small number of large textures will outperform a large number of small textures, by reducing batch count to the graphics card.

X-Plane can “page” textures, that is, load lower and higher resolution versions as the user flies. This feature is only available for .pol and .ter textures, that is, base mesh imagery and overlay imagery – it is not available for 3-d models. Paging is done on multiple cores, so flight can be very smooth even with a lot of imagery on a multi-core machine.

For best texture performance, use .dds files – this saves time calculating mipmaps, provides higher compression quality (pre-compressing using a slow offline algorithm reduces artifacts) and improves paging speed.

Integrated Mesh Tiles Vs. Layers

An X-Plane base mesh covers a 1×1 degree “square” of the world (they’re actually not square when viewed in 3-d). The entire mesh for this degree must come from one file, and that mesh must be “integrated” – that is, it contains all land-use, orthophoto, and elevation data, as well as polygonal features like water.

For this reason, you cannot combine an orthophoto add-on and a mesh add-on for the same area in X-Plane; for base meshes you must combine any land-use/orthophoto customizations with mesh improvements.

It is possible to make “overlay” scenery, and overlays can “drape” orthophotos over the mesh. However, the performance of “draped” orthophotos is significantly lower than base mesh orthophotos; for a large area a base mesh is a must for good framerate. Draped orthophotos are targeted at localized modeling, e.g. to customize the surface area of an airport.

Pre-Generation Vs. Auto-Generation

X-Plane does not have auto-gen as it exists in MSFS. With X-Plane scenery, all model, road and vegetation placements (sometimes collectively called ‘clutter’) have their locations specifically defined in a scenery file. Scenery files might have hundreds of thousands of model placements.

Clutter in X-Plane is defined by an abstract placement and an art asset. That is, while you must specifically provide lat/lon coordinates for all houses in your scenery files, you can refer to a single separate model for the house – you do not have to copy the house’s geometry into the scenery file.

It is possible to replace, augment, or customize the actual models used in this process. All art assets go through a library system, which lets third parties utilize X-Plane built-in art assets by reference, or let third parties augment X-Plane’s built-in art assets.

Land-Class vs. Terrain

X-Plane’s scenery system does not distinguish between land-class and orthophotos as a way of covering the mesh. Instead, any given part of the mesh is covered with a “terrain” (defined by a .ter file); the terrain definition will specify the texture res for repeating textures, physical properties, etc.

X-Plane can support both land-class and orthophoto-style texturing. For land-class textures, the terrain file specifies a texture size and orientation and that they should wrap around to form repeating tiles. For orthophoto-style texures, you can specify the coordinate placement of the texture on the terrain in your scenery file.

See Also

Anatomy of the X-Plane Scenery System provides a road map to the various components of the X-Plane scenery system; this can help you locate the useful parts of the scenery system.

Leave a comment

Performance Tuning and Scenery

Textures

Textures play a huge role in determining X-Plane frame rate. The harsh decision to use only one or two textures per airplane and only one texture per object was based on the enormous performance benefits to restricting objects and planes to one texture each.

(Think of each texture X-Plane uses as a crayon you use to color your scenery. But the box of crayons is in the other room, so each time you have to change crayons, it takes a long time. The one-texture-per object rule guarantees that X-Plane won’t be “changing crayons” all the time.)

Pack Textures

Video card memory is at a premium in X-Plane; this is obvious, but don’t waste space in your textures. If you can resize your image to be smaller in Photoshop without losing (much) quality, consider making the texture smaller. If you look at some of the textures Sergio Santagada has done for X-Plane, you will see that every pixel is utilized, and every image is reduced until each detail is one pixel. This helps maximize video card memory.

Use Fewer Large Textures

Use fewer large textures rather than lots of small ones. For example, use one large texture for many objects, allocating the texture space as needed. This both improves frame rate and gives you the flexibility to use non-power-of-2 rectangles within the one larger texture.

Use Textures for Nearby Objects

If you have so many textures that you will need multiple large bitmap files, combine objects that are nearby in your scenery onto one texture. This way if only some of your objects are visible, they will be more likely to all come from the same texture.

Use Alpha Only When Needed

If your texture does not have any transparent parts, make sure to save it without an alpha channel as a PNG file. X-Plane will enable alpha processing if the alpha channel is  detected, even if the entire texture is opaque.

Make sure pixels that are supposed to be transparent are 100% transparent. It is faster on older video cards to render pixels that are totally transparent than to render pixels that are, say, 90% transparent. Also, translucent pixels may cause Z-buffer problems.

Terrain

The rule to use fewer larger textures applies doubly to terrain. In the old scenery system, it was best to use a 1024×1024 bitmap and apply the texture over multiple quads. Similar optimizations will help newer versions of X-Plane.

Objects

The overall rules for textures apply to objects as well, especially regarding sharing of textures. Here are some additional things that will help object performance.

Optimal Size for Objects

Probably the biggest factor in object performance is the number of objects vs. the number of polygons in the objects. Here you face a trade-off. There is a certain overhead for drawing an object at all, so making 1000 objects, each with one quad, will be a lot slower than making 1 object with 1000 quads. On the other hand, X-Plane chooses to draw or not draw an object based on whether any of the object is visible. So if your object is very very large, the whole object will be drawn even if only a tiny portion of it is on screen.

Please remember, these are only guidelines – use these guidelines when you have
flexibility as to how you build your objects, but do not bend over backward to hit these numbers. They are meant only to give you a sense of X-Plane’s ideal performance range.

The ideal object dimensions are no larger than 1000 meters on a side – 500 meters on a side is good. Larger than 1000 meters and you will be drawing the object even when it is almost entirely not on screen. 500 meters is the granularity of X-Plane’s rough culling pass.

Ideally an object should have as many polygons as possible – there is no upper limit to the number of polygons; better to have all of your polygons in one object than split between multiple objects. But it can be a problem to have an object with too few polygons. Objects with less than 24 vertices are not efficient in X-Plane. Do not add polygons just to get above this minimum, but if you have objects with a very small number of polygons, consider merging a few objects together.

  • If an object models one entity, do not break it up for the sake of frame rate; it is very difficult to place multiple objects near each other and get precise alignment. For example, if you have a suspension bridge, use one object rather than three. (If you use three objects, getting the sections to line up will be impossible.
  • If you have a number of objects near each other that always use the same texture and are not repeated, consider merging them into one bigger object, to get closer to the optimal size. For example, a series of trees or taxiway lines in an airport could be merged into larger chunks to hit optimal object size.
  • By the same logic as above, consider breaking up collections of objects if they are too big (e.g. too large on screen.)
  • If you are going to employ level of detail (explained in detail below), make sure you use separate objects, as level of detail decisions are done per object.

One other warning: If an object is heavily repeated, you may not want to merge it because this effectively means more memory usage. X-Plane’s object memory usage is primarily a function of the number of commands in the total set of OBJ files you use. The individual placements of an object are very cheap, but the OBJs themselves can be expensive. If you have 1000 house OBJs, each different, each used once, this is a lot more memory than 1000 placements of a single house object. So you may not want to make a single object with 100 houses if you were using one house object over and over…you will effectively be increasing memory usage.

For New Objects

Definitely take a look at the OBJ Overview document; it contains a ton of OBJ8 specific advice. One note in particular: if you view the bottom of your OBJ8 file (skip all of the IDX entries) to the commands section, the number of TRI commands is a good indication of how well optimized your object is. If you have a ton of commands after the IDX section, your object is probably not optimized.

Object Command Ordering

X-Plane does some minimal reordering of the commands in your object, but for the most part the commands in your object are executed in order. You will get best performance if:

  • all of the commands of the same type are together when possible. (E.g. all of the TRI commands are back to back.
  • all of the polygon commands (triangles, quads, etc.) are together. Keep the lines together. Keep the light commands together.

This may be impractical for authors and is mentioned primarily for programmers who develop software that creates OBJ files.

Note: the motivation for not optimizing polygons in OBJ files is partially to keep load times down (by having this done at scenery creation time) and partially to give authors total control over render order within an object. This allows an author to create an object with translucency without Z-buffer problems.

Level of Detail

Level of detail control is one of your most powerful tools to optimize object performance. The level of detail OBJ command lets you specify more than one version of your object for different distances, and also puts a hard limit on how far away your object will be drawn. LOD improves frame rate by reducing the amount of work X-Plane has to do in rendering objects.

If your object does not contain LOD commands, X-Plane will pick a maximum distance for your object based on its dimensions. X-Plane’s guess is just a guess and will either be too low (causing your object to disappear) or too high (causing your object to be drawn needlessly), so consider putting LOD commands on all objects, even if they only have one version.

Multiple representations of your object take time to create, so do an estimate of which objects are worth creating multiple versions of. Some examples:

  • A skyscraper that is placed in the scenery once that contains 50 polygons. 50 polygons x 1 object is not a lot of polygons – creating a second version of the skyscraper is probably not worth it.
  • The statue of liberty, as the centerpiece of a scenery package, modeled with 30,000 polygons. In this case, the one object does cost a lot, and may be visible from a long way away due to its large size. This is a case where a second LOD (with, say, 1000 or less polygons) could be worth it.
  • A house used everywhere with 10 polygons. This is a dubious case – even though the house is used a lot, at best you will only save a few polygons, and the reduced LOD object will be below X-Plane’s efficient sizes. Experimentation will show whether this is a win, but it wouldn’t be the first object to optimize.
  • A jetway, used 100 times on an airport, with 350 polygons. This is a huge win. This one object causes 35,000 polygons to be drawn, and all 100 objects are probably visible on final approach. Creating a reduced LOD version to be used 500 meters away with only 50 polygons will cut almost 30,000 polygons off of X-Plane’s load without much noticeable degradation.

Even with single representations, good LOD choices are important for frame rate. Taxiway signs, for example, should have low LOD levels because many of them are visible when overflying an airport, but they are very small and disappear from view rapidly.

Avoid hard quads

The hard quad command is more expensive than the regular quad command. Avoid using it unless the polygon absolutely has to be hard.

Facades

Unlike objects, each individual placement of a facade takes up additional memory. In other words, using 2 facade definitions once each takes only a tiny bit more memory than using one facade definition twice. Polygon memory for objects is saved once for the .OBJ file. Polygon memory for facades has to be created once for each instance of the facade because each facade is slightly different in shape. X-Plane has no mechanism for recognizing and pooling same-sized facades.

Avoid excess stretching

The biggest danger to performance from facades is to extrude a facade into a footprint that is much larger than the facade’s ideal size, or to add more floors than the facade’s ideal height.

When X-Plane “extrudes” a facade to make a building in your scenery, it looks at your panel and floor split points and takes as many or as few panels and floors as is needed to meet the height and wall length requirements specified by the DSF file. X-Plane combines adjacent panels, and only adds more polygons to cut out parts of the texture or to duplicate parts of the facade.

Image:perftune_facade.gif

In the above picture, a facade is shown in its original form with cutlines and then in three instantiations. The quads X-Plane creates are shown by separating the facade into its component quads. In the first case, the facade is smaller than its ideal size, so four quads are produced. In the second case, the facade is the exact size of the texture, so only one quad is produced. In the third case, the quad has been stretched. Two quad are needed vertically, but many facades are needed horizontally because the facade is so much wider than the texture. This facade is horizontally overextended.

Avoid overextending facades either horizontally or vertically; at most a facade
instantiation should be no larger than twice its ideal size either horizontally or vertically. Make sure your facade definitions match the way they are used in the DSF. For example, if you have a facade that is used 100 times and is overextended to form 10 polygons horizontally and 10 polygons vertically, you will have 40000 polygons where you should have had 1600 polygons.

Leave a comment

Named Lights for Scenery

Named lights are lighting billboards that are designed and implemented by Laminar Research and built into X-Plane. You can add a named light to your aircraft or scenery by using the LIGHT_NAMED command in an object.

The behavior of named lights cannot be customized – each named light comes with preset behavior, such as blinking or changing colors.

Named lights are affected by animation – that is, a named light is hidden if inside an ATTR_hide command, and the directionality of a named light is affected by both the orientation of the object/aircraft and any rotation/translation animations that the named light is inside.

Lights.txt

You can locate the master list of named lights in the file Resources/bitmaps/world/lites/lights.txt. Do not edit this text file! This file will be updated by the X-Plane updater and should be considered part of the sim, not for third party modification. If you need a new named light, send feature requests to LR. The file can be useful for checking for the existence of a particular named light in an older version of X-Plane.

List of Named Lights

Lights for Boats and Ships

ship_nav_left ship_nav_right ship_mast_obs ship_mast_grn ship_nav_tail ship_mast_powered carrier_datum carrier_waveoff carrier_meatball1 carrier_meatball2 carrier_meatball3 carrier_meatball4 carrier_meatball5 carrier_mast_strobe carrier_deck_blue_s carrier_deck_blue_w carrier_deck_blue_n carrier_deck_blue_e carrier_pitch_lights carrier_foul_line_red carrier_foul_line_white carrier_center_white carrier_edge_white carrier_thresh_white frigate_SGSI_lo frigate_SGSI_on frigate_SGSI_hi frigate_deck_green oilrig_deck_blue

Lights for Towns

town_light_60 town_light_90 town_light_150 town_light_180 town_light_220 town_light_280 town_light_330 town_light_350 town_light_omni town_tiny_light_60 town_tiny_light_90 town_tiny_light_150 town_tiny_light_180 town_tiny_light_220 town_tiny_light_280 town_tiny_light_330 town_tiny_light_350 town_tiny_light_omni

Lights for Obstacles

obs_strobe_day obs_strobe_night obs_red_day obs_red_night hospital_helipad_blue

Comments Off on Named Lights for Scenery

Correctly Forming Taxiways and Junctions

Revision History:
         01/26/18   Updated with Joining Taxiways to Runways
         06/25/08   Updated With Taxiline Guidelines
         10/25/07   Initial Draft

Correct Formation of T Junctions

A “T” junction is any connection between lines in an airport layout where one line ends in the middle of another line. T junctions would include a T-shaped meeting of taxiway lines (shown in these examples), but the junctions formed by the edges of taxiway pavement are also T junctions and need to be formed using the same technique.

The key points are:

  • Two lines in a WED layout (of any type) should always meet at their endpoints.
  • One line should not end in the middle of another line.
  • This means that you must split a line at the point another line intersects it.

You should not simply attempt to visually line up your layout. Consider this T junction:

Apt_guidelines_badt

It looks correct but upon zooming it becomes clear that the taxiway line ends “near” the next line but is not actually on it. With no vertex to join to, this join can never be clean.

Apt_guidelines_badtc

Junctions like this can suffer from all sorts of problems in X-Plane:

  • The alignment error may look significantly worse in the sim–the only way to guarantee a good connection is to have two vertices with the exact same location.
  • If one of the lines is a bezier curve, the approximation of the bezier in X-Plane may be different from WED, causing a disconnect.
  • If these lines were taxiway edges, the “sliver” of a gap could cause bumps when a plane rolls over it or ugly rendering errors in the pavement.

The correct way to build a T junction is a two-step process.

Split one of the lines so there is a vertex at the location where the two nodes will meet. :

Apt_guidelines_goodt1

Then drag the connecting line to that vertex. In WED you can use the “snap to vertex” option to get precise positioning of the two vertices on top of each other.  :

Apt_guidelines_goodt2

This T junction will look correct at any zoom, and will render correctly in X-Plane.

Remember: close visual alignment in WED is not good enough! You must create an extra vertex and snap the vertices together to create precisely aligned layouts.

Correct Bezier T Junctions

When a T junction is made up of a bezier curve, another issue comes into play: besides needing the end vertices to be snapped together, the bezier curve handles must not be “over-curved”. Consider this layout:

Apt_guidelines_badc

It looks okay in WED, but note that the lower control handle of the bezier curve is on the left side of the straight taxiway line (and yet the bezier curve itself is on the right side. This is a mistake in the layout! Here’s what it looks like close up:

Apt_guidelines_badcc

The problem is that the bezier curve control handle (by being on the left side of the taxiway line) pulls the bezier to left a little bit too much. The result is that the bezier crosses over the centerline before joining with it. This error looks small in WED, but in X-Plane, where the taxiway lines aren’t as smooth, the error is significantly more noticeable.

In order to fix this problem, the lower bezier control handle must be on the same side of the joining line as the curve itself–in this case on the right side.

Apt_guidelines_goodcc

This creates a bezier curve that looks good no matter how closely it is zoomed.

The key here is to err on the side of caution: position the bezier control point on the right side of the connecting line; do not trust the preview of the curve to show if there is a problem.

Do Not Add Extra Vertices to Make Smooth Curves

You must add vertices to make T junctions correct. However, you should use the smallest number of vertices possible to correctly describe your layout. For example: this is a bad taxiway line.

Apt_guidelines_tessb

The taxiway line is bad because it uses a huge number of vertices – way more than necessary. The line should be built like this:

Apt_guidelines_tessg

Use a small number of bezier curves to shape your lines. Do not add extra vertices in an attempt to make the line look smoother in X-Plane.

X-Plane uses an “error” heuristic to draw taxiway lines–basically it will add vertices to minimize the “squareness” of lines. The problem with adding vertices is that you have to add a very large number of vertices to force X-Plane to render at a higher quality. If you add a few vertices, you increase file size, download time, load time, and RAM use, and X-Plane simply adds fewer of its own points (since fewer are needed to reach the same amount of roundness). Only by adding an insane number of vertices can you markedly improve visual quality; this comes at the expense of RAM use for your layout.

Leave smoothness of lines up to X-Plane; this setting will be wired to the user interface. Some users will need lower rendering quality to use your airport on slower computers. If you add too many vertices, you simply assure that these users cannot fly to your airport at all.

Joining Taxiways to Runways

Taxiways should be drawn to the runway edge, not just to the runway shoulder edge:

WED taxiway & runway examples

Connecting the taxiway to the runway in this manner will result in correctly recessed runway edge lights and a better looking connection between the pavements. The taxiways are automatically drawn above the shoulders and below the runways. If you stop the taxiway at the shoulder edge, it often leaves a gap between the runway pavement and the taxiway.

Comments Off on Correctly Forming Taxiways and Junctions

Physical Polygon RFC

Problem Specification

In X-Plane 9, you can create a draped polygon by specifying a polygonal outline in a DSF and a .pol text file with the properties for the polygon. The .pol file references a texture, and optionally applies a physical surface to the polygon. If a physical surface is applied, it acts “over” the base terrain. In this way, the image of a concrete pad (on top of base mesh grass) can act like concrete, with correct physics wherever the plane drives.

There is one limitation with this system: if the author places a large orthophoto (showing heterogeneous terrain) into the scenery, the orthophoto (whether via a .pol or .ter file) can have only one physical property. Thus an airport orthophoto must be “all grass” or “all concrete”.

There is a work-around for this problem, but it is very expensive: an author can place multiple polygons using the same orthophoto texture and shape each polygon to the distinct regions. So the author would put one polygon in place for the whole orthophoto, then a second polygon for only the concrete. Two .pol files reference separate surfaces but one texture.

While X-Plane will efficiently load the texture only once, the resulting polygon mesh is particularly inefficient, because:

  • X-Plane will dutifully clip the top polygon visually, even though there is no need to do so and
  • The concrete areas must be drawn twice (once for the bottom and once for the top). To avoid over-draw, the bottom polygon must be clipped as well, which makes even more triangles.

The Proposed Fix

The proposed fix is a new .pol attribute, something like “NO_DRAW”. When present, the polygon would only apply physical properties to the mesh, but not apply any paint. Under this scenario the author would:

  • Set the physical property of the orthophoto to the “lowest priority” surface, typically grass or dirt.
  • Use no-draw, concrete-surface polygons to “annotate” the hard physical areas on top of the orthophoto.

X-Plane would perform no clipping on the bottom orthophoto, for maximum mesh efficiency, and would have no overdraw since the texture is only drawn once.

Leave a comment