Update XPLM for ARM64
This commit is contained in:
@@ -1,69 +1,64 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMCamera;
|
||||
INTERFACE
|
||||
{
|
||||
XPLMCamera - THEORY OF OPERATION The XPLMCamera APIs allow plug-ins to
|
||||
control the camera angle in X-Plane. This has a number of applications,
|
||||
including but not limited to:
|
||||
The XPLMCamera APIs allow plug-ins to control the camera angle in X-Plane.
|
||||
This has a number of applications, including but not limited to:
|
||||
|
||||
- Creating new views (including dynamic/user-controllable views) for the
|
||||
user.
|
||||
- Creating new views (including dynamic/user-controllable views) for the
|
||||
user.
|
||||
- Creating applications that use X-Plane as a renderer of scenery,
|
||||
aircrafts, or both.
|
||||
|
||||
- Creating applications that use X-Plane as a renderer of scenery,
|
||||
aircrafts, or both.
|
||||
The camera is controlled via six parameters: a location in OpenGL
|
||||
coordinates and pitch, roll and yaw, similar to an airplane's position.
|
||||
OpenGL coordinate info is described in detail in the XPLMGraphics
|
||||
documentation; generally you should use the XPLMGraphics routines to
|
||||
convert from world to local coordinates. The camera's orientation starts
|
||||
facing level with the ground directly up the negative-Z axis (approximately
|
||||
north) with the horizon horizontal. It is then rotated clockwise for yaw,
|
||||
pitched up for positive pitch, and rolled clockwise around the vector it is
|
||||
looking along for roll.
|
||||
|
||||
The camera is controlled via six parameters: a location in OpenGL
|
||||
coordinates and pitch, roll and yaw, similar to an airplane's position.
|
||||
OpenGL coordinate info is described in detail in the XPLMGraphics
|
||||
documentation; generally you should use the XPLMGraphics routines to
|
||||
convert from world to local coordinates. The camera's orientation starts
|
||||
facing level with the ground directly up the negative-Z axis
|
||||
(approximately north) with the horizon horizontal. It is then rotated
|
||||
clockwise for yaw, pitched up for positive pitch, and rolled clockwise
|
||||
around the vector it is looking along for roll.
|
||||
You control the camera either either until the user selects a new view or
|
||||
permanently (the later being similar to how UDP camera control works). You
|
||||
control the camera by registering a callback per frame from which you
|
||||
calculate the new camera positions. This guarantees smooth camera motion.
|
||||
|
||||
You control the camera either either until the user selects a new view or
|
||||
permanently (the later being similar to how UDP camera control works). You
|
||||
control the camera by registering a callback per frame from which you
|
||||
calculate the new camera positions. This guarantees smooth camera motion.
|
||||
Use the XPLMDataAccess APIs to get information like the position of the
|
||||
aircraft, etc. for complex camera positioning.
|
||||
|
||||
Use the XPLMDataAccess APIs to get information like the position of the
|
||||
aircraft, etc. for complex camera positioning.
|
||||
Note: if your goal is to move the virtual pilot in the cockpit, this API is
|
||||
not needed; simply update the datarefs for the pilot's head position.
|
||||
|
||||
For custom exterior cameras, set the camera's mode to an external view
|
||||
first to get correct sound and 2-d panel behavior.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* CAMERA CONTROL
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMCameraControlDuration
|
||||
|
||||
This enumeration states how long you want to retain control of the camera.
|
||||
You can retain it indefinitely or until the user selects a new view.
|
||||
This enumeration states how long you want to retain control of the camera.
|
||||
You can retain it indefinitely or until the user selects a new view.
|
||||
}
|
||||
TYPE
|
||||
XPLMCameraControlDuration = (
|
||||
{ Control the camera until the user picks a new view. }
|
||||
{ Control the camera until the user picks a new view. }
|
||||
xplm_ControlCameraUntilViewChanges = 1
|
||||
|
||||
{ Control the camera until your plugin is disabled or another plugin forcably }
|
||||
{ takes control. }
|
||||
{ Control the camera until your plugin is disabled or another plugin forcably}
|
||||
{ takes control. }
|
||||
,xplm_ControlCameraForever = 2
|
||||
|
||||
);
|
||||
@@ -72,103 +67,89 @@ TYPE
|
||||
{
|
||||
XPLMCameraPosition_t
|
||||
|
||||
This structure contains a full specification of the camera. X, Y, and Z
|
||||
are the camera's position in OpenGL coordiantes; pitch, roll, and yaw are
|
||||
rotations from a camera facing flat north in degrees. Positive pitch means
|
||||
nose up, positive roll means roll right, and positive yaw means yaw right,
|
||||
all in degrees. Zoom is a zoom factor, with 1.0 meaning normal zoom and 2.0
|
||||
magnifying by 2x (objects appear larger).
|
||||
This structure contains a full specification of the camera. X, Y, and Z are
|
||||
the camera's position in OpenGL coordiantes; pitch, roll, and yaw are
|
||||
rotations from a camera facing flat north in degrees. Positive pitch means
|
||||
nose up, positive roll means roll right, and positive yaw means yaw right,
|
||||
all in degrees. Zoom is a zoom factor, with 1.0 meaning normal zoom and 2.0
|
||||
magnifying by 2x (objects appear larger).
|
||||
}
|
||||
XPLMCameraPosition_t = RECORD
|
||||
x : single;
|
||||
y : single;
|
||||
z : single;
|
||||
pitch : single;
|
||||
heading : single;
|
||||
roll : single;
|
||||
zoom : single;
|
||||
x : Single;
|
||||
y : Single;
|
||||
z : Single;
|
||||
pitch : Single;
|
||||
heading : Single;
|
||||
roll : Single;
|
||||
zoom : Single;
|
||||
END;
|
||||
PXPLMCameraPosition_t = ^XPLMCameraPosition_t;
|
||||
|
||||
{
|
||||
XPLMCameraControl_f
|
||||
|
||||
You use an XPLMCameraControl function to provide continuous control over
|
||||
the camera. You are passed in a structure in which to put the new camera
|
||||
position; modify it and return 1 to reposition the camera. Return 0 to
|
||||
surrender control of the camera; camera control will be handled by X-Plane
|
||||
on this draw loop. The contents of the structure as you are called are
|
||||
undefined.
|
||||
You use an XPLMCameraControl function to provide continuous control over
|
||||
the camera. You are passed in a structure in which to put the new camera
|
||||
position; modify it and return 1 to reposition the camera. Return 0 to
|
||||
surrender control of the camera; camera control will be handled by X-Plane
|
||||
on this draw loop. The contents of the structure as you are called are
|
||||
undefined.
|
||||
|
||||
If X-Plane is taking camera control away from you, this function will be
|
||||
called with inIsLosingControl set to 1 and ioCameraPosition NULL.
|
||||
If X-Plane is taking camera control away from you, this function will be
|
||||
called with inIsLosingControl set to 1 and ioCameraPosition NULL.
|
||||
}
|
||||
XPLMCameraControl_f = FUNCTION(
|
||||
outCameraPosition : PXPLMCameraPosition_t; { Can be nil }
|
||||
inIsLosingControl : integer;
|
||||
inRefcon : pointer) : integer; cdecl;
|
||||
inIsLosingControl : Integer;
|
||||
inRefcon : pointer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMControlCamera
|
||||
|
||||
This function repositions the camera on the next drawing cycle. You must
|
||||
pass a non-null control function. Specify in inHowLong how long you'd like
|
||||
control (indefinitely or until a key is pressed).
|
||||
This function repositions the camera on the next drawing cycle. You must
|
||||
pass a non-null control function. Specify in inHowLong how long you'd like
|
||||
control (indefinitely or until a new view mode is set by the user).
|
||||
}
|
||||
PROCEDURE XPLMControlCamera(
|
||||
inHowLong : XPLMCameraControlDuration;
|
||||
inControlFunc : XPLMCameraControl_f;
|
||||
inRefcon : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDontControlCamera
|
||||
|
||||
This function stops you from controlling the camera. If you have a camera
|
||||
control function, it will not be called with an inIsLosingControl flag.
|
||||
X-Plane will control the camera on the next cycle.
|
||||
This function stops you from controlling the camera. If you have a camera
|
||||
control function, it will not be called with an inIsLosingControl flag.
|
||||
X-Plane will control the camera on the next cycle.
|
||||
|
||||
For maximum compatibility you should not use this routine unless you are in
|
||||
posession of the camera.
|
||||
For maximum compatibility you should not use this routine unless you are in
|
||||
posession of the camera.
|
||||
}
|
||||
PROCEDURE XPLMDontControlCamera;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMIsCameraBeingControlled
|
||||
|
||||
This routine returns 1 if the camera is being controlled, zero if it is
|
||||
not. If it is and you pass in a pointer to a camera control duration, the
|
||||
current control duration will be returned.
|
||||
This routine returns 1 if the camera is being controlled, zero if it is
|
||||
not. If it is and you pass in a pointer to a camera control duration, the
|
||||
current control duration will be returned.
|
||||
}
|
||||
FUNCTION XPLMIsCameraBeingControlled(
|
||||
outCameraControlDuration: PXPLMCameraControlDuration) : integer; { Can be nil }
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outCameraControlDuration: PXPLMCameraControlDuration) : Integer; { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMReadCameraPosition
|
||||
|
||||
This function reads the current camera position.
|
||||
This function reads the current camera position.
|
||||
}
|
||||
PROCEDURE XPLMReadCameraPosition(
|
||||
outCameraPosition : PXPLMCameraPosition_t);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,28 +1,22 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMDefs;
|
||||
INTERFACE
|
||||
{
|
||||
This file is contains the cross-platform and basic definitions for the
|
||||
X-Plane SDK.
|
||||
This file is contains the cross-platform and basic definitions for the
|
||||
X-Plane SDK.
|
||||
|
||||
The preprocessor macros APL and IBM must be defined to specify the
|
||||
compilation target; define APL to 1 and IBM 0 to compile on Macintosh and
|
||||
APL to 0 and IBM to 1 for Windows. You must specify these macro definitions
|
||||
before including XPLMDefs.h or any other XPLM headers. You can do this
|
||||
using the -D command line option or a preprocessor header.
|
||||
The preprocessor macros APL and IBM must be defined to specify the
|
||||
compilation target; define APL to 1 and IBM 0 to compile on Macintosh and
|
||||
APL to 0 and IBM to 1 for Windows. You must specify these macro definitions
|
||||
before including XPLMDefs.h or any other XPLM headers. You can do this
|
||||
using the -D command line option or a preprocessor header.
|
||||
}
|
||||
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{$IFDEF LINUX}
|
||||
{$DEFINE KYLIX}
|
||||
{$ENDIF}
|
||||
@@ -41,86 +35,85 @@ TYPE
|
||||
* DLL Definitions
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These definitions control the importing and exporting of functions within
|
||||
the DLL.
|
||||
These definitions control the importing and exporting of functions within
|
||||
the DLL.
|
||||
|
||||
You can prefix your five required callbacks with the PLUGIN_API macro to
|
||||
declare them as exported C functions. The XPLM_API macro identifies
|
||||
functions that are provided to you via the plugin SDK. (Link against
|
||||
XPLM.lib to use these functions.)
|
||||
You can prefix your five required callbacks with the PLUGIN_API macro to
|
||||
declare them as exported C functions. The XPLM_API macro identifies
|
||||
functions that are provided to you via the plugin SDK. (Link against
|
||||
XPLM.lib to use these functions.)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
{___________________________________________________________________________
|
||||
* GLOBAL DEFINITIONS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These definitions are used in all parts of the SDK.
|
||||
These definitions are used in all parts of the SDK.
|
||||
}
|
||||
|
||||
|
||||
|
||||
TYPE
|
||||
{
|
||||
XPLMPluginID
|
||||
|
||||
Each plug-in is identified by a unique integer ID. This ID can be used to
|
||||
disable or enable a plug-in, or discover what plug-in is 'running' at the
|
||||
time. A plug-in ID is unique within the currently running instance of
|
||||
X-Plane unless plug-ins are reloaded. Plug-ins may receive a different
|
||||
unique ID each time they are loaded.
|
||||
Each plug-in is identified by a unique integer ID. This ID can be used to
|
||||
disable or enable a plug-in, or discover what plug-in is 'running' at the
|
||||
time. A plug-in ID is unique within the currently running instance of
|
||||
X-Plane unless plug-ins are reloaded. Plug-ins may receive a different
|
||||
unique ID each time they are loaded. This includes the unloading and
|
||||
reloading of plugins that are part of the user's aircraft.
|
||||
|
||||
For persistent identification of plug-ins, use XPLMFindPluginBySignature in
|
||||
XPLMUtiltiies.h
|
||||
For persistent identification of plug-ins, use XPLMFindPluginBySignature in
|
||||
XPLMUtiltiies.h
|
||||
|
||||
-1 indicates no plug-in.
|
||||
-1 indicates no plug-in.
|
||||
}
|
||||
XPLMPluginID = integer;
|
||||
XPLMPluginID = Integer;
|
||||
PXPLMPluginID = ^XPLMPluginID;
|
||||
|
||||
CONST
|
||||
{ No plugin. }
|
||||
{ No plugin. }
|
||||
XPLM_NO_PLUGIN_ID = (-1);
|
||||
|
||||
{ X-Plane itself }
|
||||
{ X-Plane itself }
|
||||
XPLM_PLUGIN_XPLANE = (0);
|
||||
|
||||
{ The current XPLM revision is 2.10 (210). }
|
||||
kXPLM_Version = (210);
|
||||
{ The current XPLM revision is 4.00 (400). }
|
||||
kXPLM_Version = (400);
|
||||
|
||||
{
|
||||
XPLMKeyFlags
|
||||
|
||||
These bitfields define modifier keys in a platform independent way. When a
|
||||
key is pressed, a series of messages are sent to your plugin. The down
|
||||
flag is set in the first of these messages, and the up flag in the last.
|
||||
While the key is held down, messages are sent with neither to indicate that
|
||||
the key is being held down as a repeated character.
|
||||
These bitfields define modifier keys in a platform independent way. When a
|
||||
key is pressed, a series of messages are sent to your plugin. The down
|
||||
flag is set in the first of these messages, and the up flag in the last.
|
||||
While the key is held down, messages are sent with neither to indicate that
|
||||
the key is being held down as a repeated character.
|
||||
|
||||
The control flag is mapped to the control flag on Macintosh and PC.
|
||||
Generally X-Plane uses the control key and not the command key on
|
||||
Macintosh, providing a consistent interface across platforms that does not
|
||||
necessarily match the Macintosh user interface guidelines. There is not
|
||||
yet a way for plugins to access the Macintosh control keys without using
|
||||
#ifdefed code.
|
||||
The control flag is mapped to the control flag on Macintosh and PC.
|
||||
Generally X-Plane uses the control key and not the command key on
|
||||
Macintosh, providing a consistent interface across platforms that does not
|
||||
necessarily match the Macintosh user interface guidelines. There is not
|
||||
yet a way for plugins to access the Macintosh control keys without using
|
||||
#ifdefed code.
|
||||
}
|
||||
TYPE
|
||||
XPLMKeyFlags = (
|
||||
{ The shift key is down }
|
||||
{ The shift key is down }
|
||||
xplm_ShiftFlag = 1
|
||||
|
||||
{ The option or alt key is down }
|
||||
{ The option or alt key is down }
|
||||
,xplm_OptionAltFlag = 2
|
||||
|
||||
{ The control key is down* }
|
||||
{ The control key is down* }
|
||||
,xplm_ControlFlag = 4
|
||||
|
||||
{ The key is being pressed down }
|
||||
{ The key is being pressed down }
|
||||
,xplm_DownFlag = 8
|
||||
|
||||
{ The key is being released }
|
||||
{ The key is being released }
|
||||
,xplm_UpFlag = 16
|
||||
|
||||
);
|
||||
@@ -130,19 +123,19 @@ TYPE
|
||||
* ASCII CONTROL KEY CODES
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These definitions define how various control keys are mapped to ASCII key
|
||||
codes. Not all key presses generate an ASCII value, so plugin code should
|
||||
be prepared to see null characters come from the keyboard...this usually
|
||||
represents a key stroke that has no equivalent ASCII, like a page-down
|
||||
press. Use virtual key codes to find these key strokes. ASCII key codes
|
||||
take into account modifier keys; shift keys will affect capitals and
|
||||
punctuation; control key combinations may have no vaild ASCII and produce
|
||||
NULL. To detect control-key combinations, use virtual key codes, not ASCII
|
||||
keys.
|
||||
These definitions define how various control keys are mapped to ASCII key
|
||||
codes. Not all key presses generate an ASCII value, so plugin code should
|
||||
be prepared to see null characters come from the keyboard...this usually
|
||||
represents a key stroke that has no equivalent ASCII, like a page-down
|
||||
press. Use virtual key codes to find these key strokes.
|
||||
|
||||
ASCII key codes take into account modifier keys; shift keys will affect
|
||||
capitals and punctuation; control key combinations may have no vaild ASCII
|
||||
and produce NULL. To detect control-key combinations, use virtual key
|
||||
codes, not ASCII keys.
|
||||
}
|
||||
|
||||
|
||||
|
||||
CONST
|
||||
XPLM_KEY_RETURN = 13;
|
||||
|
||||
@@ -186,35 +179,32 @@ CONST
|
||||
* VIRTUAL KEY CODES
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These are cross-platform defines for every distinct keyboard press on the
|
||||
computer. Every physical key on the keyboard has a virtual key code. So
|
||||
the "two" key on the top row of the main keyboard has a different code
|
||||
from the "two" key on the numeric key pad. But the 'w' and 'W' character
|
||||
are indistinguishable by virtual key code because they are the same
|
||||
physical key (one with and one without the shift key).
|
||||
These are cross-platform defines for every distinct keyboard press on the
|
||||
computer. Every physical key on the keyboard has a virtual key code. So
|
||||
the "two" key on the top row of the main keyboard has a different code from
|
||||
the "two" key on the numeric key pad. But the 'w' and 'W' character are
|
||||
indistinguishable by virtual key code because they are the same physical
|
||||
key (one with and one without the shift key).
|
||||
|
||||
Use virtual key codes to detect keystrokes that do not have ASCII
|
||||
equivalents, allow the user to map the numeric keypad separately from the
|
||||
main keyboard, and detect control key and other modifier-key combinations
|
||||
that generate ASCII control key sequences (many of which are not available
|
||||
directly via character keys in the SDK).
|
||||
Use virtual key codes to detect keystrokes that do not have ASCII
|
||||
equivalents, allow the user to map the numeric keypad separately from the
|
||||
main keyboard, and detect control key and other modifier-key combinations
|
||||
that generate ASCII control key sequences (many of which are not available
|
||||
directly via character keys in the SDK).
|
||||
|
||||
To assign virtual key codes we started with the Microsoft set but made some
|
||||
additions and changes. A few differences:
|
||||
To assign virtual key codes we started with the Microsoft set but made some
|
||||
additions and changes. A few differences:
|
||||
|
||||
1. Modifier keys are not available as virtual key codes. You cannot get
|
||||
distinct modifier press and release messages. Please do not try to use
|
||||
modifier keys as regular keys; doing so will almost certainly interfere
|
||||
with users' abilities to use the native x-plane key bindings.
|
||||
|
||||
2. Some keys that do not exist on both Mac and PC keyboards are removed.
|
||||
|
||||
3. Do not assume that the values of these keystrokes are interchangeable
|
||||
with MS v-keys.
|
||||
1. Modifier keys are not available as virtual key codes. You cannot get
|
||||
distinct modifier press and release messages. Please do not try to use
|
||||
modifier keys as regular keys; doing so will almost certainly interfere
|
||||
with users' abilities to use the native X-Plane key bindings.
|
||||
2. Some keys that do not exist on both Mac and PC keyboards are removed.
|
||||
3. Do not assume that the values of these keystrokes are interchangeable
|
||||
with MS v-keys.
|
||||
}
|
||||
|
||||
|
||||
|
||||
CONST
|
||||
XPLM_VK_BACK = $08;
|
||||
|
||||
@@ -258,7 +248,7 @@ CONST
|
||||
|
||||
XPLM_VK_HELP = $2F;
|
||||
|
||||
{ XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) }
|
||||
{ XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) }
|
||||
XPLM_VK_0 = $30;
|
||||
|
||||
XPLM_VK_1 = $31;
|
||||
@@ -279,7 +269,7 @@ CONST
|
||||
|
||||
XPLM_VK_9 = $39;
|
||||
|
||||
{ XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) }
|
||||
{ XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) }
|
||||
XPLM_VK_A = $41;
|
||||
|
||||
XPLM_VK_B = $42;
|
||||
@@ -412,8 +402,8 @@ CONST
|
||||
|
||||
XPLM_VK_F24 = $87;
|
||||
|
||||
{ The following definitions are extended and are not based on the Microsoft }
|
||||
{ key set. }
|
||||
{ The following definitions are extended and are not based on the Microsoft }
|
||||
{ key set. }
|
||||
XPLM_VK_EQUAL = $B0;
|
||||
|
||||
XPLM_VK_MINUS = $B1;
|
||||
@@ -442,5 +432,7 @@ CONST
|
||||
|
||||
XPLM_VK_NUMPAD_EQ = $BD;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
+1309
-514
File diff suppressed because it is too large
Load Diff
+254
-271
@@ -1,75 +1,76 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMGraphics;
|
||||
INTERFACE
|
||||
{
|
||||
Graphics routines for X-Plane and OpenGL.
|
||||
A few notes on coordinate systems:
|
||||
|
||||
A few notes on coordinate systems:
|
||||
X-Plane uses three kinds of coordinates. Global coordinates are specified
|
||||
as latitude, longitude and elevation. This coordinate system never changes
|
||||
but is not very precise.
|
||||
|
||||
X-Plane uses three kinds of coordinates. Global coordinates are specified
|
||||
as latitude, longitude and elevation. This coordinate system never changes
|
||||
but is not very precise.
|
||||
OpenGL (or 'local') coordinates are cartesian and shift with the plane.
|
||||
They offer more precision and are used for 3-d OpenGL drawing. The X axis
|
||||
is aligned east-west with positive X meaning east. The Y axis is aligned
|
||||
straight up and down at the point 0,0,0 (but since the earth is round it is
|
||||
not truly straight up and down at other points). The Z axis is aligned
|
||||
north-south at 0, 0, 0 with positive Z pointing south (but since the earth
|
||||
is round it isn't exactly north-south as you move east or west of 0, 0, 0).
|
||||
One unit is one meter and the point 0,0,0 is on the surface of the earth at
|
||||
sea level for some latitude and longitude picked by the sim such that the
|
||||
user's aircraft is reasonably nearby.
|
||||
|
||||
OpenGL (or 'local') coordinates are cartesian and shift with the plane.
|
||||
They offer more precision and are used for 3-d OpenGL drawing. The X axis
|
||||
is aligned east-west with positive X meaning east. The Y axis is aligned
|
||||
straight up and down at the point 0,0,0 (but since the earth is round it is
|
||||
not truly straight up and down at other points). The Z axis is aligned
|
||||
north-south at 0, 0, 0 with positive Z pointing south (but since the earth
|
||||
is round it isn't exactly north-south as you move east or west of 0, 0, 0).
|
||||
One unit is one meter and the point 0,0,0 is on the surface of the earth
|
||||
at sea level for some latitude and longitude picked by the sim such that
|
||||
the user's aircraft is reasonably nearby.
|
||||
2-d Panel coordinates are 2d, with the X axis horizontal and the Y axis
|
||||
vertical. The point 0,0 is the bottom left and 1024,768 is the upper
|
||||
right of the screen. This is true no matter what resolution the user's
|
||||
monitor is in; when running in higher resolution, graphics will be
|
||||
scaled.
|
||||
|
||||
Cockpit coordinates are 2d, with the X axis horizontal and the Y axis
|
||||
vertical. The point 0,0 is the bottom left and 1024,768 is the upper right
|
||||
of the screen. This is true no matter what resolution the user's monitor is
|
||||
in; when running in higher resolution, graphics will be scaled.
|
||||
|
||||
Use X-Plane's routines to convert between global and local coordinates. Do
|
||||
not attempt to do this conversion yourself; the precise 'roundness' of
|
||||
X-Plane's physics model may not match your own, and (to make things
|
||||
weirder) the user can potentially customize the physics of the current
|
||||
planet.
|
||||
Use X-Plane's routines to convert between global and local coordinates. Do
|
||||
not attempt to do this conversion yourself; the precise 'roundness' of
|
||||
X-Plane's physics model may not match your own, and (to make things
|
||||
weirder) the user can potentially customize the physics of the current
|
||||
planet.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE GRAPHICS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These routines allow you to use OpenGL with X-Plane.
|
||||
These routines allow you to use OpenGL with X-Plane.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMTextureID
|
||||
|
||||
XPLM Texture IDs name well-known textures in the sim for you to use. This
|
||||
allows you to recycle textures from X-Plane, saving VRAM.
|
||||
XPLM Texture IDs name well-known textures in the sim for you to use. This
|
||||
allows you to recycle textures from X-Plane, saving VRAM.
|
||||
|
||||
*Warning*: do not use these enums. The only remaining use they have is to
|
||||
access the legacy compatibility v10 UI texture; if you need this, get it
|
||||
via the Widgets library.
|
||||
}
|
||||
TYPE
|
||||
XPLMTextureID = (
|
||||
{ The bitmap that contains window outlines, button outlines, fonts, etc. }
|
||||
{ The bitmap that contains window outlines, button outlines, fonts, etc. }
|
||||
xplm_Tex_GeneralInterface = 0
|
||||
|
||||
{ The exterior paint for the user's aircraft (daytime). }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ The exterior paint for the user's aircraft (daytime). }
|
||||
,xplm_Tex_AircraftPaint = 1
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ The exterior light map for the user's aircraft. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ The exterior light map for the user's aircraft. }
|
||||
,xplm_Tex_AircraftLiteMap = 2
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
);
|
||||
PXPLMTextureID = ^XPLMTextureID;
|
||||
@@ -77,274 +78,270 @@ TYPE
|
||||
{
|
||||
XPLMSetGraphicsState
|
||||
|
||||
XPLMSetGraphicsState changes OpenGL's graphics state in a number of ways:
|
||||
XPLMSetGraphicsState changes OpenGL's fixed function pipeline state. You
|
||||
are not responsible for restoring any state that is accessed via
|
||||
XPLMSetGraphicsState, but you are responsible for not accessing this state
|
||||
directly.
|
||||
|
||||
inEnableFog - enables or disables fog, equivalent to: glEnable(GL_FOG);
|
||||
- inEnableFog - enables or disables fog, equivalent to: glEnable(GL_FOG);
|
||||
- inNumberTexUnits - enables or disables a number of multitexturing units.
|
||||
If the number is 0, 2d texturing is disabled entirely, as in
|
||||
glDisable(GL_TEXTURE_2D); Otherwise, 2d texturing is enabled, and a
|
||||
number of multitexturing units are enabled sequentially, starting with
|
||||
unit 0, e.g. glActiveTextureARB(GL_TEXTURE0_ARB); glEnable
|
||||
(GL_TEXTURE_2D);
|
||||
- inEnableLighting - enables or disables OpenGL lighting, e.g.
|
||||
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
|
||||
- inEnableAlphaTesting - enables or disables the alpha test per pixel, e.g.
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
- inEnableAlphaBlending - enables or disables alpha blending per pixel,
|
||||
e.g. glEnable(GL_BLEND);
|
||||
- inEnableDepthTesting - enables per pixel depth testing, as in
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
- inEnableDepthWriting - enables writing back of depth information to the
|
||||
depth bufffer, as in glDepthMask(GL_TRUE);
|
||||
|
||||
inNumberTexUnits - enables or disables a number of multitexturing units. If
|
||||
the number is 0, 2d texturing is disabled entirely, as in
|
||||
glDisable(GL_TEXTURE_2D); Otherwise, 2d texturing is enabled, and a
|
||||
number of multitexturing units are enabled sequentially, starting with
|
||||
unit 0, e.g. glActiveTextureARB(GL_TEXTURE0_ARB); glEnable
|
||||
(GL_TEXTURE_2D);
|
||||
The purpose of this function is to change OpenGL state while keeping
|
||||
X-Plane aware of the state changes; this keeps X-Plane from getting
|
||||
surprised by OGL state changes, and prevents X-Plane and plug-ins from
|
||||
having to set all state before all draws; XPLMSetGraphicsState internally
|
||||
skips calls to change state that is already properly enabled.
|
||||
|
||||
inEnableLighting - enables or disables OpenGL lighting, e.g.
|
||||
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
|
||||
X-Plane does not have a 'default' OGL state for plug-ins with respect to
|
||||
the above state vector; plug-ins should totally set OGL state using this
|
||||
API before drawing. Use XPLMSetGraphicsState instead of any of the above
|
||||
OpenGL calls.
|
||||
|
||||
inEnableAlphaTesting - enables or disables the alpha test per pixel, e.g.
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
WARNING: Any routine that performs drawing (e.g. XPLMDrawString or widget
|
||||
code) may change X-Plane's state. Always set state before drawing after
|
||||
unknown code has executed.
|
||||
|
||||
inEnableAlphaBlending - enables or disables alpha blending per pixel, e.g.
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
inEnableDepthTesting - enables per pixel depth testing, as in
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
inEnableDepthWriting - enables writing back of depth information to the
|
||||
depth bufffer, as in glDepthMask(GL_TRUE);
|
||||
|
||||
The purpose of this function is to change OpenGL state while keeping
|
||||
X-Plane aware of the state changes; this keeps X-Plane from getting
|
||||
surprised by OGL state changes, and prevents X-Plane and plug-ins from
|
||||
having to set all state before all draws; XPLMSetGraphicsState internally
|
||||
skips calls to change state that is already properly enabled.
|
||||
|
||||
X-Plane does not have a 'default' OGL state to plug-ins; plug-ins should
|
||||
totally set OGL state before drawing. Use XPLMSetGraphicsState instead of
|
||||
any of the above OpenGL calls.
|
||||
|
||||
WARNING: Any routine that performs drawing (e.g. XPLMDrawString or widget
|
||||
code) may change X-Plane's state. Always set state before drawing after
|
||||
unknown code has executed.
|
||||
*Deprecation Warnings*: X-Plane's lighting and fog environemnt is
|
||||
significantly more complex than the fixed function pipeline can express;
|
||||
do not assume that lighting and fog state is a good approximation for 3-d
|
||||
drawing. Prefer to use XPLMInstancing to draw objects. All calls to
|
||||
XPLMSetGraphicsState should have no fog or lighting.
|
||||
}
|
||||
PROCEDURE XPLMSetGraphicsState(
|
||||
inEnableFog : integer;
|
||||
inNumberTexUnits : integer;
|
||||
inEnableLighting : integer;
|
||||
inEnableAlphaTesting: integer;
|
||||
inEnableAlphaBlending: integer;
|
||||
inEnableDepthTesting: integer;
|
||||
inEnableDepthWriting: integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inEnableFog : Integer;
|
||||
inNumberTexUnits : Integer;
|
||||
inEnableLighting : Integer;
|
||||
inEnableAlphaTesting: Integer;
|
||||
inEnableAlphaBlending: Integer;
|
||||
inEnableDepthTesting: Integer;
|
||||
inEnableDepthWriting: Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMBindTexture2d
|
||||
|
||||
XPLMBindTexture2d changes what texture is bound to the 2d texturing target.
|
||||
This routine caches the current 2d texture across all texturing units in
|
||||
the sim and plug-ins, preventing extraneous binding. For example, consider
|
||||
several plug-ins running in series; if they all use the 'general interface'
|
||||
bitmap to do UI, calling this function will skip the rebinding of the
|
||||
general interface texture on all but the first plug-in, which can provide
|
||||
better frame rate son some graphics cards.
|
||||
XPLMBindTexture2d changes what texture is bound to the 2d texturing
|
||||
target. This routine caches the current 2d texture across all texturing
|
||||
units in the sim and plug-ins, preventing extraneous binding. For
|
||||
example, consider several plug-ins running in series; if they all use the
|
||||
'general interface' bitmap to do UI, calling this function will skip the
|
||||
rebinding of the general interface texture on all but the first plug-in,
|
||||
which can provide better frame rate son some graphics cards.
|
||||
|
||||
inTextureID is the ID of the texture object to bind; inTextureUnit is a
|
||||
zero-based texture unit (e.g. 0 for the first one), up to a maximum of 4
|
||||
units. (This number may increase in future versions of x-plane.)
|
||||
inTextureID is the ID of the texture object to bind; inTextureUnit is a
|
||||
zero-based texture unit (e.g. 0 for the first one), up to a maximum of 4
|
||||
units. (This number may increase in future versions of X-Plane.)
|
||||
|
||||
Use this routine instead of glBindTexture(GL_TEXTURE_2D, ....);
|
||||
Use this routine instead of glBindTexture(GL_TEXTURE_2D, ....);
|
||||
}
|
||||
PROCEDURE XPLMBindTexture2d(
|
||||
inTextureNum : integer;
|
||||
inTextureUnit : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inTextureNum : Integer;
|
||||
inTextureUnit : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGenerateTextureNumbers
|
||||
|
||||
This routine generates unused texture numbers that a plug-in can use to
|
||||
safely bind textures. Use this routine instead of glGenTextures;
|
||||
glGenTextures will allocate texture numbers in ranges that X-Plane reserves
|
||||
for its own use but does not always use; for example, it might provide an
|
||||
ID within the range of textures reserved for terrain...loading a new .env
|
||||
file as the plane flies might then cause X-Plane to use this texture ID.
|
||||
X-Plane will then overwrite the plug-ins texture. This routine returns
|
||||
texture IDs that are out of X-Plane's usage range.
|
||||
Use this routine instead of glGenTextures to generate new texture object
|
||||
IDs. This routine historically ensured that plugins don't use texure IDs
|
||||
that X-Plane is reserving for its own use.
|
||||
}
|
||||
PROCEDURE XPLMGenerateTextureNumbers(
|
||||
outTextureIDs : Pinteger;
|
||||
inCount : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outTextureIDs : PInteger;
|
||||
inCount : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMGetTexture
|
||||
|
||||
XPLMGetTexture returns the OpenGL texture enumeration of an X-Plane texture
|
||||
based on a generic identifying code. For example, you can get the texture
|
||||
for X-Plane's UI bitmaps. This allows you to build new gauges that take
|
||||
advantage of x-plane's textures, for smooth artwork integration and also
|
||||
saving texture memory. Note that the texture might not be loaded yet,
|
||||
depending on what the plane's panel contains.
|
||||
|
||||
OPEN ISSUE: We really need a way to make sure X-Plane loads this texture if
|
||||
it isn't around, or at least a way to find out whether it is loaded or not.
|
||||
XPLMGetTexture returns the OpenGL texture ID of an X-Plane texture based on
|
||||
a generic identifying code. For example, you can get the texture for
|
||||
X-Plane's UI bitmaps.
|
||||
}
|
||||
FUNCTION XPLMGetTexture(
|
||||
inTexture : XPLMTextureID) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inTexture : XPLMTextureID) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{
|
||||
XPLMWorldToLocal
|
||||
|
||||
This routine translates coordinates from latitude, longitude, and altitude
|
||||
to local scene coordinates. Latitude and longitude are in decimal degrees,
|
||||
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
|
||||
meters in the local OpenGL coordinate system.
|
||||
This routine translates coordinates from latitude, longitude, and altitude
|
||||
to local scene coordinates. Latitude and longitude are in decimal degrees,
|
||||
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
|
||||
meters in the local OpenGL coordinate system.
|
||||
}
|
||||
PROCEDURE XPLMWorldToLocal(
|
||||
inLatitude : real;
|
||||
inLongitude : real;
|
||||
inAltitude : real;
|
||||
outX : Preal;
|
||||
outY : Preal;
|
||||
outZ : Preal);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inLatitude : Real;
|
||||
inLongitude : Real;
|
||||
inAltitude : Real;
|
||||
outX : PReal;
|
||||
outY : PReal;
|
||||
outZ : PReal);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMLocalToWorld
|
||||
|
||||
This routine translates a local coordinate triplet back into latitude,
|
||||
longitude, and altitude. Latitude and longitude are in decimal degrees,
|
||||
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
|
||||
meters in the local OpenGL coordinate system.
|
||||
This routine translates a local coordinate triplet back into latitude,
|
||||
longitude, and altitude. Latitude and longitude are in decimal degrees,
|
||||
and altitude is in meters MSL (mean sea level). The XYZ coordinates are in
|
||||
meters in the local OpenGL coordinate system.
|
||||
|
||||
NOTE: world coordinates are less precise than local coordinates; you should
|
||||
try to avoid round tripping from local to world and back.
|
||||
NOTE: world coordinates are less precise than local coordinates; you should
|
||||
try to avoid round tripping from local to world and back.
|
||||
}
|
||||
PROCEDURE XPLMLocalToWorld(
|
||||
inX : real;
|
||||
inY : real;
|
||||
inZ : real;
|
||||
outLatitude : Preal;
|
||||
outLongitude : Preal;
|
||||
outAltitude : Preal);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inX : Real;
|
||||
inY : Real;
|
||||
inZ : Real;
|
||||
outLatitude : PReal;
|
||||
outLongitude : PReal;
|
||||
outAltitude : PReal);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDrawTranslucentDarkBox
|
||||
|
||||
This routine draws a translucent dark box, partially obscuring parts of the
|
||||
screen but making text easy to read. This is the same graphics primitive
|
||||
used by X-Plane to show text files and ATC info.
|
||||
This routine draws a translucent dark box, partially obscuring parts of the
|
||||
screen but making text easy to read. This is the same graphics primitive
|
||||
used by X-Plane to show text files and ATC info.
|
||||
}
|
||||
PROCEDURE XPLMDrawTranslucentDarkBox(
|
||||
inLeft : integer;
|
||||
inTop : integer;
|
||||
inRight : integer;
|
||||
inBottom : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inLeft : Integer;
|
||||
inTop : Integer;
|
||||
inRight : Integer;
|
||||
inBottom : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE TEXT
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMFontID
|
||||
|
||||
X-Plane features some fixed-character fonts. Each font may have its own
|
||||
metrics.
|
||||
X-Plane features some fixed-character fonts. Each font may have its own
|
||||
metrics.
|
||||
|
||||
WARNING: Some of these fonts are no longer supported or may have changed
|
||||
geometries. For maximum copmatibility, see the comments below.
|
||||
WARNING: Some of these fonts are no longer supported or may have changed
|
||||
geometries. For maximum copmatibility, see the comments below.
|
||||
|
||||
Note: X-Plane 7 supports proportional-spaced fonts. Since no measuring
|
||||
routine is available yet, the SDK will normally draw using a fixed-width
|
||||
font. You can use a dataref to enable proportional font drawing on XP7 if
|
||||
you want to.
|
||||
Note: X-Plane 7 supports proportional-spaced fonts. Since no measuring
|
||||
routine is available yet, the SDK will normally draw using a fixed-width
|
||||
font. You can use a dataref to enable proportional font drawing on XP7 if
|
||||
you want to.
|
||||
}
|
||||
TYPE
|
||||
XPLMFontID = (
|
||||
{ Mono-spaced font for user interface. Available in all versions of the SDK. }
|
||||
{ Mono-spaced font for user interface. Available in all versions of the SDK.}
|
||||
xplmFont_Basic = 0
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Menus = 1
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Metal = 2
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Led = 3
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_LedWide = 4
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelHUD = 5
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelEFIS = 6
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelGPS = 7
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosGA = 8
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosBC = 9
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosHM = 10
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosGANarrow = 11
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosBCNarrow = 12
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosHMNarrow = 13
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Timer = 14
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_FullRound = 15
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_SmallRound = 16
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{ Deprecated, do not use. }
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Menus_Localized = 17
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{ Proportional UI font. }
|
||||
{ Proportional UI font. }
|
||||
,xplmFont_Proportional = 18
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
);
|
||||
PXPLMFontID = ^XPLMFontID;
|
||||
@@ -352,90 +349,76 @@ TYPE
|
||||
{
|
||||
XPLMDrawString
|
||||
|
||||
This routine draws a NULL termianted string in a given font. Pass in the
|
||||
lower left pixel that the character is to be drawn onto. Also pass the
|
||||
character and font ID. This function returns the x offset plus the width of
|
||||
all drawn characters. The color to draw in is specified as a pointer to an
|
||||
array of three floating point colors, representing RGB intensities from 0.0
|
||||
to 1.0.
|
||||
This routine draws a NULL termianted string in a given font. Pass in the
|
||||
lower left pixel that the character is to be drawn onto. Also pass the
|
||||
character and font ID. This function returns the x offset plus the width of
|
||||
all drawn characters. The color to draw in is specified as a pointer to an
|
||||
array of three floating point colors, representing RGB intensities from 0.0
|
||||
to 1.0.
|
||||
}
|
||||
PROCEDURE XPLMDrawString(
|
||||
inColorRGB : Psingle;
|
||||
inXOffset : integer;
|
||||
inYOffset : integer;
|
||||
inChar : Pchar;
|
||||
inWordWrapWidth : Pinteger; { Can be nil }
|
||||
inColorRGB : PSingle;
|
||||
inXOffset : Integer;
|
||||
inYOffset : Integer;
|
||||
inChar : XPLMString;
|
||||
inWordWrapWidth : PInteger; { Can be nil }
|
||||
inFontID : XPLMFontID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDrawNumber
|
||||
|
||||
This routine draws a number similar to the digit editing fields in
|
||||
PlaneMaker and data output display in X-Plane. Pass in a color, a
|
||||
position, a floating point value, and formatting info. Specify how many
|
||||
integer and how many decimal digits to show and whether to show a sign, as
|
||||
well as a character set. This routine returns the xOffset plus width of the
|
||||
string drawn.
|
||||
This routine draws a number similar to the digit editing fields in
|
||||
PlaneMaker and data output display in X-Plane. Pass in a color, a
|
||||
position, a floating point value, and formatting info. Specify how many
|
||||
integer and how many decimal digits to show and whether to show a sign, as
|
||||
well as a character set. This routine returns the xOffset plus width of the
|
||||
string drawn.
|
||||
}
|
||||
PROCEDURE XPLMDrawNumber(
|
||||
inColorRGB : Psingle;
|
||||
inXOffset : integer;
|
||||
inYOffset : integer;
|
||||
inValue : real;
|
||||
inDigits : integer;
|
||||
inDecimals : integer;
|
||||
inShowSign : integer;
|
||||
inColorRGB : PSingle;
|
||||
inXOffset : Integer;
|
||||
inYOffset : Integer;
|
||||
inValue : Real;
|
||||
inDigits : Integer;
|
||||
inDecimals : Integer;
|
||||
inShowSign : Integer;
|
||||
inFontID : XPLMFontID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetFontDimensions
|
||||
|
||||
This routine returns the width and height of a character in a given font.
|
||||
It also tells you if the font only supports numeric digits. Pass NULL if
|
||||
you don't need a given field. Note that for a proportional font the width
|
||||
will be an arbitrary, hopefully average width.
|
||||
This routine returns the width and height of a character in a given font.
|
||||
It also tells you if the font only supports numeric digits. Pass NULL if
|
||||
you don't need a given field. Note that for a proportional font the width
|
||||
will be an arbitrary, hopefully average width.
|
||||
}
|
||||
PROCEDURE XPLMGetFontDimensions(
|
||||
inFontID : XPLMFontID;
|
||||
outCharWidth : Pinteger; { Can be nil }
|
||||
outCharHeight : Pinteger; { Can be nil }
|
||||
outDigitsOnly : Pinteger); { Can be nil }
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outCharWidth : PInteger; { Can be nil }
|
||||
outCharHeight : PInteger; { Can be nil }
|
||||
outDigitsOnly : PInteger); { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMMeasureString
|
||||
|
||||
This routine returns the width in pixels of a string using a given font.
|
||||
The string is passed as a pointer plus length (and does not need to be null
|
||||
terminated); this is used to allow for measuring substrings. The return
|
||||
value is floating point; it is possible that future font drawing may allow
|
||||
for fractional pixels.
|
||||
This routine returns the width in pixels of a string using a given font.
|
||||
The string is passed as a pointer plus length (and does not need to be null
|
||||
terminated); this is used to allow for measuring substrings. The return
|
||||
value is floating point; it is possible that future font drawing may allow
|
||||
for fractional pixels.
|
||||
}
|
||||
FUNCTION XPLMMeasureString(
|
||||
inFontID : XPLMFontID;
|
||||
inChar : Pchar;
|
||||
inNumChars : integer) : single;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
inChar : XPLMString;
|
||||
inNumChars : Integer) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMInstance;
|
||||
INTERFACE
|
||||
{
|
||||
This API provides instanced drawing of X-Plane objects (.obj files). In
|
||||
contrast to old drawing APIs, which required you to draw your own objects
|
||||
per-frame, the instancing API allows you to simply register an OBJ for
|
||||
drawing, then move or manipulate it later (as needed).
|
||||
|
||||
This provides one tremendous benefit: it keeps all dataref operations for
|
||||
your object in one place. Because datarefs are main thread only, allowing
|
||||
dataref access anywhere is a serious performance bottleneck for the
|
||||
simulator---the whole simulator has to pause and wait for each dataref
|
||||
access. This performance penalty will only grow worse as X-Plane moves
|
||||
toward an ever more heavily multithreaded engine.
|
||||
|
||||
The instancing API allows X-Plane to isolate all dataref manipulations for
|
||||
all plugin object drawing to one place, potentially providing huge
|
||||
performance gains.
|
||||
|
||||
Here's how it works:
|
||||
|
||||
When an instance is created, it provides a list of all datarefs you want to
|
||||
manipulate in for the OBJ in the future. This list of datarefs replaces the
|
||||
ad-hoc collections of dataref objects previously used by art assets. Then,
|
||||
per-frame, you can manipulate the instance by passing in a "block" of
|
||||
packed floats representing the current values of the datarefs for your
|
||||
instance. (Note that the ordering of this set of packed floats must exactly
|
||||
match the ordering of the datarefs when you created your instance.)
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs, XPLMScenery;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* Instance Creation and Destruction
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
Registers and unregisters instances.
|
||||
}
|
||||
|
||||
|
||||
TYPE
|
||||
{
|
||||
XPLMInstanceRef
|
||||
|
||||
An opaque handle to an instance.
|
||||
}
|
||||
XPLMInstanceRef = pointer;
|
||||
PXPLMInstanceRef = ^XPLMInstanceRef;
|
||||
|
||||
{
|
||||
XPLMCreateInstance
|
||||
|
||||
XPLMCreateInstance creates a new instance, managed by your plug-in, and
|
||||
returns a handle to the instance. A few important requirements:
|
||||
|
||||
* The object passed in must be fully loaded and returned from the XPLM
|
||||
before you can create your instance; you cannot pass a null obj ref, nor
|
||||
can you change the ref later.
|
||||
|
||||
* If you use any custom datarefs in your object, they must be registered
|
||||
before the object is loaded. This is true even if their data will be
|
||||
provided via the instance dataref list.
|
||||
|
||||
* The instance dataref array must be a valid ptr to an array of at least
|
||||
one item that is null terminated. That is, if you do not want any
|
||||
datarefs, you must passa ptr to an array with a null item. You cannot
|
||||
pass null for this.
|
||||
}
|
||||
FUNCTION XPLMCreateInstance(
|
||||
obj : XPLMObjectRef;
|
||||
datarefs : PXPLMString) : XPLMInstanceRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDestroyInstance
|
||||
|
||||
XPLMDestroyInstance destroys and deallocates your instance; once called,
|
||||
you are still responsible for releasing the OBJ ref.
|
||||
|
||||
Tip: you can release your OBJ ref after you call XPLMCreateInstance as long
|
||||
as you never use it again; the instance will maintain its own reference to
|
||||
the OBJ and the object OBJ be deallocated when the instance is destroyed.
|
||||
}
|
||||
PROCEDURE XPLMDestroyInstance(
|
||||
instance : XPLMInstanceRef);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* Instance Manipulation
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPLMInstanceSetPosition
|
||||
|
||||
Updates both the position of the instance and all datarefs you registered
|
||||
for it. Call this from a flight loop callback or UI callback.
|
||||
|
||||
__DO NOT__ call XPLMInstanceSetPosition from a drawing callback; the whole
|
||||
point of instancing is that you do not need any drawing callbacks. Setting
|
||||
instance data from a drawing callback may have undefined consequences, and
|
||||
the drawing callback hurts FPS unnecessarily.
|
||||
|
||||
The memory pointed to by the data pointer must be large enough to hold one
|
||||
float for every data ref you have registered, and must contain valid
|
||||
floating point data.
|
||||
|
||||
BUG: before X-Plane 11.50, if you have no dataref registered, you must
|
||||
still pass a valid pointer for data and not null.
|
||||
}
|
||||
PROCEDURE XPLMInstanceSetPosition(
|
||||
instance : XPLMInstanceRef;
|
||||
new_position : PXPLMDrawInfo_t;
|
||||
data : PSingle);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,608 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMMap;
|
||||
INTERFACE
|
||||
{
|
||||
This API allows you to create new layers within X-Plane maps. Your layers
|
||||
can draw arbitrary OpenGL, but they conveniently also have access to
|
||||
X-Plane's built-in icon and label drawing functions.
|
||||
|
||||
As of X-Plane 11, map drawing happens in three stages:
|
||||
|
||||
1. backgrounds and "fill,"
|
||||
2. icons, and
|
||||
3. labels.
|
||||
|
||||
Thus, all background drawing gets layered beneath all icons, which likewise
|
||||
get layered beneath all labels. Within each stage, the map obeys a
|
||||
consistent layer ordering, such that "fill" layers (layers that cover a
|
||||
large amount of map area, like the terrain and clouds) appear beneath
|
||||
"markings" layers (like airport icons). This ensures that layers with fine
|
||||
details don't get obscured by layers with larger details.
|
||||
|
||||
The XPLM map API reflects both aspects of this draw layering: you can
|
||||
register a layer as providing either markings or fill, and X-Plane will
|
||||
draw your fill layers beneath your markings layers (regardless of
|
||||
registration order). Likewise, you are guaranteed that your layer's icons
|
||||
(added from within an icon callback) will go above your layer's OpenGL
|
||||
drawing, and your labels will go above your icons.
|
||||
|
||||
The XPLM guarantees that all plugin-created fill layers go on top of all
|
||||
native X-Plane fill layers, and all plugin-created markings layers go on
|
||||
top of all X-Plane markings layers (with the exception of the aircraft
|
||||
icons). It also guarantees that the draw order of your own plugin's layers
|
||||
will be consistent. But, for layers created by different plugins, the only
|
||||
guarantee is that we will draw all of one plugin's layers of each type
|
||||
(fill, then markings), then all of the others'; we don't guarantee which
|
||||
plugin's fill and markings layers go on top of the other's.
|
||||
|
||||
As of X-Plane 11, maps use true cartographic projections for their drawing,
|
||||
and different maps may use different projections. For that reason, all
|
||||
drawing calls include an opaque handle for the projection you should use to
|
||||
do the drawing. Any time you would draw at a particular latitude/longitude,
|
||||
you'll need to ask the projection to translate that position into "map
|
||||
coordinates." (Note that the projection is guaranteed not to change between
|
||||
calls to your prepare-cache hook, so if you cache your map coordinates
|
||||
ahead of time, there's no need to re-project them when you actually draw.)
|
||||
|
||||
In addition to mapping normal latitude/longitude locations into map
|
||||
coordinates, the projection APIs also let you know the current heading for
|
||||
north. (Since X-Plane 11 maps can rotate to match the heading of the user's
|
||||
aircraft, it's not safe to assume that north is at zero degrees rotation.)
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* DRAWING CALLBACKS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
When you create a new map layer (using XPLMCreateMapLayer), you can provide
|
||||
any or all of these callbacks. They allow you to insert your own OpenGL
|
||||
drawing, text labels, and icons into the X-Plane map at the appropriate
|
||||
places, allowing your layer to behave as similarly to X-Plane's built-in
|
||||
layers as possible.
|
||||
}
|
||||
|
||||
|
||||
TYPE
|
||||
{
|
||||
XPLMMapLayerID
|
||||
|
||||
This is an opaque handle for a plugin-created map layer. Pass it to the map
|
||||
drawing APIs from an appropriate callback to draw in the layer you created.
|
||||
}
|
||||
XPLMMapLayerID = pointer;
|
||||
PXPLMMapLayerID = ^XPLMMapLayerID;
|
||||
|
||||
{
|
||||
XPLMMapProjectionID
|
||||
|
||||
This is an opaque handle for a map projection. Pass it to the projection
|
||||
APIs to translate between map coordinates and latitude/longitudes.
|
||||
}
|
||||
XPLMMapProjectionID = pointer;
|
||||
PXPLMMapProjectionID = ^XPLMMapProjectionID;
|
||||
|
||||
{
|
||||
XPLMMapStyle
|
||||
|
||||
Indicates the visual style being drawn by the map. In X-Plane, the user can
|
||||
choose between a number of map types, and different map types may have use
|
||||
a different visual representation for the same elements (for instance, the
|
||||
visual style of the terrain layer changes drastically between the VFR and
|
||||
IFR layers), or certain layers may be disabled entirely in some map types
|
||||
(e.g., localizers are only visible in the IFR low-enroute style).
|
||||
}
|
||||
XPLMMapStyle = (
|
||||
xplm_MapStyle_VFR_Sectional = 0
|
||||
|
||||
,xplm_MapStyle_IFR_LowEnroute = 1
|
||||
|
||||
,xplm_MapStyle_IFR_HighEnroute = 2
|
||||
|
||||
);
|
||||
PXPLMMapStyle = ^XPLMMapStyle;
|
||||
|
||||
{
|
||||
XPLMMapDrawingCallback_f
|
||||
|
||||
This is the OpenGL map drawing callback for plugin-created map layers. You
|
||||
can perform arbitrary OpenGL drawing from this callback, with one
|
||||
exception: changes to the Z-buffer are not permitted, and will result in
|
||||
map drawing errors.
|
||||
|
||||
All drawing done from within this callback appears beneath all built-in
|
||||
X-Plane icons and labels, but above the built-in "fill" layers (layers
|
||||
providing major details, like terrain and water). Note, however, that the
|
||||
relative ordering between the drawing callbacks of different plugins is not
|
||||
guaranteed.
|
||||
}
|
||||
XPLMMapDrawingCallback_f = PROCEDURE(
|
||||
inLayer : XPLMMapLayerID;
|
||||
inMapBoundsLeftTopRightBottom: PSingle;
|
||||
zoomRatio : Single;
|
||||
mapUnitsPerUserInterfaceUnit: Single;
|
||||
mapStyle : XPLMMapStyle;
|
||||
projection : XPLMMapProjectionID;
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMMapIconDrawingCallback_f
|
||||
|
||||
This is the icon drawing callback that enables plugin-created map layers to
|
||||
draw icons using X-Plane's built-in icon drawing functionality. You can
|
||||
request an arbitrary number of PNG icons to be drawn via
|
||||
XPLMDrawMapIconFromSheet() from within this callback, but you may not
|
||||
perform any OpenGL drawing here.
|
||||
|
||||
Icons enqueued by this function will appear above all OpenGL drawing
|
||||
(performed by your optional XPLMMapDrawingCallback_f), and above all
|
||||
built-in X-Plane map icons of the same layer type ("fill" or "markings," as
|
||||
determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
|
||||
however, that the relative ordering between the drawing callbacks of
|
||||
different plugins is not guaranteed.
|
||||
}
|
||||
XPLMMapIconDrawingCallback_f = PROCEDURE(
|
||||
inLayer : XPLMMapLayerID;
|
||||
inMapBoundsLeftTopRightBottom: PSingle;
|
||||
zoomRatio : Single;
|
||||
mapUnitsPerUserInterfaceUnit: Single;
|
||||
mapStyle : XPLMMapStyle;
|
||||
projection : XPLMMapProjectionID;
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMMapLabelDrawingCallback_f
|
||||
|
||||
This is the label drawing callback that enables plugin-created map layers
|
||||
to draw text labels using X-Plane's built-in labeling functionality. You
|
||||
can request an arbitrary number of text labels to be drawn via
|
||||
XPLMDrawMapLabel() from within this callback, but you may not perform any
|
||||
OpenGL drawing here.
|
||||
|
||||
Labels enqueued by this function will appear above all OpenGL drawing
|
||||
(performed by your optional XPLMMapDrawingCallback_f), and above all
|
||||
built-in map icons and labels of the same layer type ("fill" or "markings,"
|
||||
as determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note,
|
||||
however, that the relative ordering between the drawing callbacks of
|
||||
different plugins is not guaranteed.
|
||||
}
|
||||
XPLMMapLabelDrawingCallback_f = PROCEDURE(
|
||||
inLayer : XPLMMapLayerID;
|
||||
inMapBoundsLeftTopRightBottom: PSingle;
|
||||
zoomRatio : Single;
|
||||
mapUnitsPerUserInterfaceUnit: Single;
|
||||
mapStyle : XPLMMapStyle;
|
||||
projection : XPLMMapProjectionID;
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* LAYER MANAGEMENT CALLBACKS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These are various "bookkeeping" callbacks that your map layer can receive
|
||||
(if you provide the callback in your XPLMCreateMapLayer_t). They allow you
|
||||
to manage the lifecycle of your layer, as well as cache any
|
||||
computationally-intensive preparation you might need for drawing.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMMapPrepareCacheCallback_f
|
||||
|
||||
A callback used to allow you to cache whatever information your layer needs
|
||||
to draw in the current map area.
|
||||
|
||||
This is called each time the map's total bounds change. This is typically
|
||||
triggered by new DSFs being loaded, such that X-Plane discards old,
|
||||
now-distant DSFs and pulls in new ones. At that point, the available bounds
|
||||
of the map also change to match the new DSF area.
|
||||
|
||||
By caching just the information you need to draw in this area, your future
|
||||
draw calls can be made faster, since you'll be able to simply "splat" your
|
||||
precomputed information each frame.
|
||||
|
||||
We guarantee that the map projection will not change between successive
|
||||
prepare cache calls, nor will any draw call give you bounds outside these
|
||||
total map bounds. So, if you cache the projected map coordinates of all the
|
||||
items you might want to draw in the total map area, you can be guaranteed
|
||||
that no draw call will be asked to do any new work.
|
||||
}
|
||||
TYPE
|
||||
XPLMMapPrepareCacheCallback_f = PROCEDURE(
|
||||
inLayer : XPLMMapLayerID;
|
||||
inTotalMapBoundsLeftTopRightBottom: PSingle;
|
||||
projection : XPLMMapProjectionID;
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMMapWillBeDeletedCallback_f
|
||||
|
||||
Called just before your map layer gets deleted. Because SDK-created map
|
||||
layers have the same lifetime as the X-Plane map that contains them, if the
|
||||
map gets unloaded from memory, your layer will too.
|
||||
}
|
||||
XPLMMapWillBeDeletedCallback_f = PROCEDURE(
|
||||
inLayer : XPLMMapLayerID;
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* MAP LAYER CREATION AND DESTRUCTION
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
Enables the creation of new map layers. Layers are created for a particular
|
||||
instance of the X-Plane map. For instance, if you want your layer to appear
|
||||
in both the normal map interface and the Instructor Operator Station (IOS),
|
||||
you would need two separate calls to XPLMCreateMapLayer(), with two
|
||||
different values for your XPLMCreateMapLayer_t::layer_name.
|
||||
|
||||
Your layer's lifetime will be determined by the lifetime of the map it is
|
||||
created in. If the map is destroyed (on the X-Plane side), your layer will
|
||||
be too, and you'll receive a callback to your
|
||||
XPLMMapWillBeDeletedCallback_f.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMMapLayerType
|
||||
|
||||
Indicates the type of map layer you are creating. Fill layers will always
|
||||
be drawn beneath markings layers.
|
||||
}
|
||||
TYPE
|
||||
XPLMMapLayerType = (
|
||||
{ A layer that draws "fill" graphics, like weather patterns, terrain, etc. }
|
||||
{ Fill layers frequently cover a large portion of the visible map area. }
|
||||
xplm_MapLayer_Fill = 0
|
||||
|
||||
{ A layer that provides markings for particular map features, like NAVAIDs, }
|
||||
{ airports, etc. Even dense markings layers cover a small portion of the }
|
||||
{ total map area. }
|
||||
,xplm_MapLayer_Markings = 1
|
||||
|
||||
);
|
||||
PXPLMMapLayerType = ^XPLMMapLayerType;
|
||||
|
||||
CONST
|
||||
{ Globally unique identifier for X-Plane's Map window, used as the }
|
||||
{ mapToCreateLayerIn parameter in XPLMCreateMapLayer_t }
|
||||
XPLM_MAP_USER_INTERFACE = "XPLM_MAP_USER_INTERFACE";
|
||||
|
||||
{ Globally unique identifier for X-Plane's Instructor Operator Station }
|
||||
{ window, used as the mapToCreateLayerIn parameter in XPLMCreateMapLayer_t }
|
||||
XPLM_MAP_IOS = "XPLM_MAP_IOS";
|
||||
|
||||
{
|
||||
XPLMCreateMapLayer_t
|
||||
|
||||
This structure defines all of the parameters used to create a map layer
|
||||
using XPLMCreateMapLayer. The structure will be expanded in future SDK APIs
|
||||
to include more features. Always set the structSize member to the size of
|
||||
your struct in bytes!
|
||||
|
||||
Each layer must be associated with exactly one map instance in X-Plane.
|
||||
That map, and that map alone, will call your callbacks. Likewise, when that
|
||||
map is deleted, your layer will be as well.
|
||||
}
|
||||
TYPE
|
||||
XPLMCreateMapLayer_t = RECORD
|
||||
{ Used to inform XPLMCreateMapLayer() of the SDK version you compiled }
|
||||
{ against; should always be set to sizeof(XPLMCreateMapLayer_t) }
|
||||
structSize : Integer;
|
||||
{ Globally unique string identifying the map you want this layer to appear }
|
||||
{ in. As of XPLM300, this is limited to one of XPLM_MAP_USER_INTERFACE or }
|
||||
{ XPLM_MAP_IOS }
|
||||
mapToCreateLayerIn : XPLMString;
|
||||
{ The type of layer you are creating, used to determine draw order (all }
|
||||
{ plugin-created markings layers are drawn above all plugin-created fill }
|
||||
{ layers) }
|
||||
layerType : XPLMMapLayerType;
|
||||
{ Optional callback to inform you this layer is being deleted (due to its }
|
||||
{ owning map being destroyed) }
|
||||
willBeDeletedCallback : XPLMMapWillBeDeletedCallback_f;
|
||||
{ Optional callback you want to use to prepare your draw cache when the map }
|
||||
{ bounds change (set to NULL if you don't want this callback) }
|
||||
prepCacheCallback : XPLMMapPrepareCacheCallback_f;
|
||||
{ Optional callback you want to use for arbitrary OpenGL drawing, which goes }
|
||||
{ beneath all icons in the map's layering system (set to NULL if you don't }
|
||||
{ want this callback) }
|
||||
drawCallback : XPLMMapDrawingCallback_f;
|
||||
{ Optional callback you want to use for drawing icons, which go above all }
|
||||
{ built-in X-Plane icons (except the aircraft) in the map's layering system }
|
||||
{ (set to NULL if you don't want this callback) }
|
||||
iconCallback : XPLMMapIconDrawingCallback_f;
|
||||
{ Optional callback you want to use for drawing map labels, which go above }
|
||||
{ all built-in X-Plane icons and labels (except those of aircraft) in the }
|
||||
{ map's layering system (set to NULL if you don't want this callback) }
|
||||
labelCallback : XPLMMapLabelDrawingCallback_f;
|
||||
{ True if you want a checkbox to be created in the map UI to toggle this }
|
||||
{ layer on and off; false if the layer should simply always be enabled }
|
||||
showUiToggle : Integer;
|
||||
{ Short label to use for this layer in the user interface }
|
||||
layerName : XPLMString;
|
||||
{ A reference to arbitrary data that will be passed to your callbacks }
|
||||
refcon : pointer;
|
||||
END;
|
||||
PXPLMCreateMapLayer_t = ^XPLMCreateMapLayer_t;
|
||||
|
||||
{
|
||||
XPLMCreateMapLayer
|
||||
|
||||
This routine creates a new map layer. You pass in an XPLMCreateMapLayer_t
|
||||
structure with all of the fields set in. You must set the structSize of
|
||||
the structure to the size of the actual structure you used.
|
||||
|
||||
Returns NULL if the layer creation failed. This happens most frequently
|
||||
because the map you specified in your
|
||||
XPLMCreateMapLayer_t::mapToCreateLayerIn field doesn't exist (that is, if
|
||||
XPLMMapExists() returns 0 for the specified map). You can use
|
||||
XPLMRegisterMapCreationHook() to get a notification each time a new map is
|
||||
opened in X-Plane, at which time you can create layers in it.
|
||||
}
|
||||
FUNCTION XPLMCreateMapLayer(
|
||||
inParams : PXPLMCreateMapLayer_t) : XPLMMapLayerID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDestroyMapLayer
|
||||
|
||||
Destroys a map layer you created (calling your
|
||||
XPLMMapWillBeDeletedCallback_f if applicable). Returns true if a deletion
|
||||
took place.
|
||||
}
|
||||
FUNCTION XPLMDestroyMapLayer(
|
||||
inLayer : XPLMMapLayerID) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMMapCreatedCallback_f
|
||||
|
||||
A callback to notify your plugin that a new map has been created in
|
||||
X-Plane. This is the best time to add a custom map layer using
|
||||
XPLMCreateMapLayer().
|
||||
|
||||
No OpenGL drawing is permitted within this callback.
|
||||
}
|
||||
TYPE
|
||||
XPLMMapCreatedCallback_f = PROCEDURE(
|
||||
mapIdentifier : XPLMString;
|
||||
refcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMRegisterMapCreationHook
|
||||
|
||||
Registers your callback to receive a notification each time a new map is
|
||||
constructed in X-Plane. This callback is the best time to add your custom
|
||||
map layer using XPLMCreateMapLayer().
|
||||
|
||||
Note that you will not be notified about any maps that already exist---you
|
||||
can use XPLMMapExists() to check for maps that were created previously.
|
||||
}
|
||||
PROCEDURE XPLMRegisterMapCreationHook(
|
||||
callback : XPLMMapCreatedCallback_f;
|
||||
refcon : pointer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMMapExists
|
||||
|
||||
Returns 1 if the map with the specified identifier already exists in
|
||||
X-Plane. In that case, you can safely call XPLMCreateMapLayer() specifying
|
||||
that your layer should be added to that map.
|
||||
}
|
||||
FUNCTION XPLMMapExists(
|
||||
mapIdentifier : XPLMString) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* MAP DRAWING
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These APIs are only valid from within a map drawing callback (one of
|
||||
XPLMIconDrawingCallback_t or XPLMMapLabelDrawingCallback_f). Your drawing
|
||||
callbacks are registered when you create a new map layer as part of your
|
||||
XPLMCreateMapLayer_t. The functions here hook into X-Plane's built-in map
|
||||
drawing functionality for icons and labels, so that you get a consistent
|
||||
style with the rest of the X-Plane map.
|
||||
|
||||
Note that the X-Plane 11 map introduces a strict ordering: layers of type
|
||||
xplm_MapLayer_Fill get drawn beneath all xplm_MapLayer_Markings layers.
|
||||
Likewise, all OpenGL drawing (performed in your layer's
|
||||
XPLMMapDrawingCallback_f) will appear beneath any icons and labels you
|
||||
draw.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMMapOrientation
|
||||
|
||||
Indicates whether a map element should be match its rotation to the map
|
||||
itself, or to the user interface. For instance, the map itself may be
|
||||
rotated such that "up" matches the user's aircraft, but you may want to
|
||||
draw a text label such that it is always rotated zero degrees relative to
|
||||
the user's perspective. In that case, you would have it draw with UI
|
||||
orientation.
|
||||
}
|
||||
TYPE
|
||||
XPLMMapOrientation = (
|
||||
{ Orient such that a 0 degree rotation matches the map's north }
|
||||
xplm_MapOrientation_Map = 0
|
||||
|
||||
{ Orient such that a 0 degree rotation is "up" relative to the user interface}
|
||||
,xplm_MapOrientation_UI = 1
|
||||
|
||||
);
|
||||
PXPLMMapOrientation = ^XPLMMapOrientation;
|
||||
|
||||
{
|
||||
XPLMDrawMapIconFromSheet
|
||||
|
||||
Enables plugin-created map layers to draw PNG icons using X-Plane's
|
||||
built-in icon drawing functionality. Only valid from within an
|
||||
XPLMIconDrawingCallback_t (but you can request an arbitrary number of icons
|
||||
to be drawn from within your callback).
|
||||
|
||||
X-Plane will automatically manage the memory for your texture so that it
|
||||
only has to be loaded from disk once as long as you continue drawing it
|
||||
per-frame. (When you stop drawing it, the memory may purged in a "garbage
|
||||
collection" pass, require a load from disk in the future.)
|
||||
|
||||
Instead of having X-Plane draw a full PNG, this method allows you to use UV
|
||||
coordinates to request a portion of the image to be drawn. This allows you
|
||||
to use a single texture load (of an icon sheet, for example) to draw many
|
||||
icons. Doing so is much more efficient than drawing a dozen different small
|
||||
PNGs.
|
||||
|
||||
The UV coordinates used here treat the texture you load as being comprised
|
||||
of a number of identically sized "cells." You specify the width and height
|
||||
in cells (ds and dt, respectively), as well as the coordinates within the
|
||||
cell grid for the sub-image you'd like to draw.
|
||||
|
||||
Note that you can use different ds and dt values in subsequent calls with
|
||||
the same texture sheet. This enables you to use icons of different sizes in
|
||||
the same sheet if you arrange them properly in the PNG.
|
||||
|
||||
This function is only valid from within an XPLMIconDrawingCallback_t (but
|
||||
you can request an arbitrary number of icons to be drawn from within your
|
||||
callback).
|
||||
}
|
||||
PROCEDURE XPLMDrawMapIconFromSheet(
|
||||
layer : XPLMMapLayerID;
|
||||
inPngPath : XPLMString;
|
||||
s : Integer;
|
||||
t : Integer;
|
||||
ds : Integer;
|
||||
dt : Integer;
|
||||
mapX : Single;
|
||||
mapY : Single;
|
||||
orientation : XPLMMapOrientation;
|
||||
rotationDegrees : Single;
|
||||
mapWidth : Single);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDrawMapLabel
|
||||
|
||||
Enables plugin-created map layers to draw text labels using X-Plane's
|
||||
built-in labeling functionality. Only valid from within an
|
||||
XPLMMapLabelDrawingCallback_f (but you can request an arbitrary number of
|
||||
text labels to be drawn from within your callback).
|
||||
}
|
||||
PROCEDURE XPLMDrawMapLabel(
|
||||
layer : XPLMMapLayerID;
|
||||
inText : XPLMString;
|
||||
mapX : Single;
|
||||
mapY : Single;
|
||||
orientation : XPLMMapOrientation;
|
||||
rotationDegrees : Single);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* MAP PROJECTIONS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
As of X-Plane 11, the map draws using true cartographic projections, and
|
||||
different maps may use different projections. Thus, to draw at a particular
|
||||
latitude and longitude, you must first transform your real-world
|
||||
coordinates into map coordinates.
|
||||
|
||||
The map projection is also responsible for giving you the current scale of
|
||||
the map. That is, the projection can tell you how many map units correspond
|
||||
to 1 meter at a given point.
|
||||
|
||||
Finally, the map projection can give you the current rotation of the map.
|
||||
Since X-Plane 11 maps can rotate to match the heading of the aircraft, the
|
||||
map's rotation can potentially change every frame.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMMapProject
|
||||
|
||||
Projects a latitude/longitude into map coordinates. This is the inverse of
|
||||
XPLMMapUnproject().
|
||||
|
||||
Only valid from within a map layer callback (one of
|
||||
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
|
||||
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
|
||||
}
|
||||
PROCEDURE XPLMMapProject(
|
||||
projection : XPLMMapProjectionID;
|
||||
latitude : Real;
|
||||
longitude : Real;
|
||||
outX : PSingle;
|
||||
outY : PSingle);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMMapUnproject
|
||||
|
||||
Transforms map coordinates back into a latitude and longitude. This is the
|
||||
inverse of XPLMMapProject().
|
||||
|
||||
Only valid from within a map layer callback (one of
|
||||
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
|
||||
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
|
||||
}
|
||||
PROCEDURE XPLMMapUnproject(
|
||||
projection : XPLMMapProjectionID;
|
||||
mapX : Single;
|
||||
mapY : Single;
|
||||
outLatitude : PReal;
|
||||
outLongitude : PReal);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMMapScaleMeter
|
||||
|
||||
Returns the number of map units that correspond to a distance of one meter
|
||||
at a given set of map coordinates.
|
||||
|
||||
Only valid from within a map layer callback (one of
|
||||
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
|
||||
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
|
||||
}
|
||||
FUNCTION XPLMMapScaleMeter(
|
||||
projection : XPLMMapProjectionID;
|
||||
mapX : Single;
|
||||
mapY : Single) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMMapGetNorthHeading
|
||||
|
||||
Returns the heading (in degrees clockwise) from the positive Y axis in the
|
||||
cartesian mapping coordinate system to true north at the point passed in.
|
||||
You can use it as a clockwise rotational offset to align icons and other
|
||||
2-d drawing with true north on the map, compensating for rotations in the
|
||||
map due to projection.
|
||||
|
||||
Only valid from within a map layer callback (one of
|
||||
XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f,
|
||||
XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.)
|
||||
}
|
||||
FUNCTION XPLMMapGetNorthHeading(
|
||||
projection : XPLMMapProjectionID;
|
||||
mapX : Single;
|
||||
mapY : Single) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
+148
-130
@@ -1,54 +1,62 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMMenus;
|
||||
INTERFACE
|
||||
{
|
||||
XPLMMenus - Theory of Operation
|
||||
Plug-ins can create menus in the menu bar of X-Plane. This is done by
|
||||
creating a menu and then creating items. Menus are referred to by an
|
||||
opaque ID. Items are referred to by (zero-based) index number.
|
||||
|
||||
Plug-ins can create menus in the menu bar of X-Plane. This is done by
|
||||
creating a menu and then creating items. Menus are referred to by an
|
||||
opaque ID. Items are referred to by index number. For each menu and item
|
||||
you specify a void *. Per menu you specify a handler function that is
|
||||
called with each void * when the menu item is picked. Menu item indices
|
||||
are zero based.
|
||||
Menus are "sandboxed" between plugins---no plugin can access the menus of
|
||||
any other plugin. Furthermore, all menu indices are relative to your
|
||||
plugin's menus only; if your plugin creates two sub-menus in the Plugins
|
||||
menu at different times, it doesn't matter how many other plugins also
|
||||
create sub-menus of Plugins in the intervening time: your sub-menus will be
|
||||
given menu indices 0 and 1. (The SDK does some work in the back-end to
|
||||
filter out menus that are irrelevant to your plugin in order to deliver
|
||||
this consistency for each plugin.)
|
||||
|
||||
When you create a menu item, you specify how we should handle clicks on
|
||||
that menu item. You can either have the XPLM trigger a callback (the
|
||||
XPLMMenuHandler_f associated with the menu that contains the item), or you
|
||||
can simply have a command be triggered (with no associated call to your
|
||||
menu handler). The advantage of the latter method is that X-Plane will
|
||||
display any keyboard shortcuts associated with the command. (In contrast,
|
||||
there are no keyboard shortcuts associated with menu handler callbacks with
|
||||
specific parameters.)
|
||||
|
||||
Menu text in X-Plane is UTF8; X-Plane's character set covers latin, greek
|
||||
and cyrillic characters, Katakana, as well as some Japanese symbols. Some
|
||||
APIs have a inDeprecatedAndIgnored parameter that used to select a
|
||||
character set; since X-Plane 9 all localization is done via UTF-8 only.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs, XPLMUtilities;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* XPLM MENUS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMMenuCheck
|
||||
|
||||
These enumerations define the various 'check' states for an X-Plane menu.
|
||||
'checking' in x-plane actually appears as a light which may or may not be
|
||||
lit. So there are three possible states.
|
||||
These enumerations define the various 'check' states for an X-Plane menu.
|
||||
'checking' in X-Plane actually appears as a light which may or may not be
|
||||
lit. So there are three possible states.
|
||||
}
|
||||
TYPE
|
||||
XPLMMenuCheck = (
|
||||
{ there is no symbol to the left of the menu item. }
|
||||
{ there is no symbol to the left of the menu item. }
|
||||
xplm_Menu_NoCheck = 0
|
||||
|
||||
{ the menu has a mark next to it that is unmarked (not lit). }
|
||||
{ the menu has a mark next to it that is unmarked (not lit). }
|
||||
,xplm_Menu_Unchecked = 1
|
||||
|
||||
{ the menu has a mark next to it that is checked (lit). }
|
||||
{ the menu has a mark next to it that is checked (lit). }
|
||||
,xplm_Menu_Checked = 2
|
||||
|
||||
);
|
||||
@@ -57,7 +65,7 @@ TYPE
|
||||
{
|
||||
XPLMMenuID
|
||||
|
||||
This is a unique ID for each menu you create.
|
||||
This is a unique ID for each menu you create.
|
||||
}
|
||||
XPLMMenuID = pointer;
|
||||
PXPLMMenuID = ^XPLMMenuID;
|
||||
@@ -65,9 +73,9 @@ TYPE
|
||||
{
|
||||
XPLMMenuHandler_f
|
||||
|
||||
A menu handler function takes two reference pointers, one for the menu
|
||||
(specified when the menu was created) and one for the item (specified when
|
||||
the item was created).
|
||||
A menu handler function takes two reference pointers, one for the menu
|
||||
(specified when the menu was created) and one for the item (specified when
|
||||
the item was created).
|
||||
}
|
||||
XPLMMenuHandler_f = PROCEDURE(
|
||||
inMenuRef : pointer;
|
||||
@@ -76,184 +84,194 @@ TYPE
|
||||
{
|
||||
XPLMFindPluginsMenu
|
||||
|
||||
This function returns the ID of the plug-ins menu, which is created for you
|
||||
at startup.
|
||||
This function returns the ID of the plug-ins menu, which is created for you
|
||||
at startup.
|
||||
}
|
||||
FUNCTION XPLMFindPluginsMenu: XPLMMenuID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM300}
|
||||
{
|
||||
XPLMFindAircraftMenu
|
||||
|
||||
This function returns the ID of the menu for the currently-loaded aircraft,
|
||||
used for showing aircraft-specific commands.
|
||||
|
||||
The aircraft menu is created by X-Plane at startup, but it remains hidden
|
||||
until it is populated via XPLMAppendMenuItem() or
|
||||
XPLMAppendMenuItemWithCommand().
|
||||
|
||||
Only plugins loaded with the user's current aircraft are allowed to access
|
||||
the aircraft menu. For all other plugins, this will return NULL, and any
|
||||
attempts to add menu items to it will fail.
|
||||
}
|
||||
FUNCTION XPLMFindAircraftMenu: XPLMMenuID;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM300}
|
||||
|
||||
{
|
||||
XPLMCreateMenu
|
||||
|
||||
This function creates a new menu and returns its ID. It returns NULL if
|
||||
the menu cannot be created. Pass in a parent menu ID and an item index to
|
||||
create a submenu, or NULL for the parent menu to put the menu in the menu
|
||||
bar. The menu's name is only used if the menu is in the menubar. You also
|
||||
pass a handler function and a menu reference value. Pass NULL for the
|
||||
handler if you do not need callbacks from the menu (for example, if it only
|
||||
contains submenus).
|
||||
This function creates a new menu and returns its ID. It returns NULL if
|
||||
the menu cannot be created. Pass in a parent menu ID and an item index to
|
||||
create a submenu, or NULL for the parent menu to put the menu in the menu
|
||||
bar. The menu's name is only used if the menu is in the menubar. You also
|
||||
pass a handler function and a menu reference value. Pass NULL for the
|
||||
handler if you do not need callbacks from the menu (for example, if it only
|
||||
contains submenus).
|
||||
|
||||
Important: you must pass a valid, non-empty menu title even if the menu is
|
||||
a submenu where the title is not visible.
|
||||
Important: you must pass a valid, non-empty menu title even if the menu is
|
||||
a submenu where the title is not visible.
|
||||
}
|
||||
FUNCTION XPLMCreateMenu(
|
||||
inName : Pchar;
|
||||
inName : XPLMString;
|
||||
inParentMenu : XPLMMenuID;
|
||||
inParentItem : integer;
|
||||
inParentItem : Integer;
|
||||
inHandler : XPLMMenuHandler_f;
|
||||
inMenuRef : pointer) : XPLMMenuID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDestroyMenu
|
||||
|
||||
This function destroys a menu that you have created. Use this to remove a
|
||||
submenu if necessary. (Normally this function will not be necessary.)
|
||||
This function destroys a menu that you have created. Use this to remove a
|
||||
submenu if necessary. (Normally this function will not be necessary.)
|
||||
}
|
||||
PROCEDURE XPLMDestroyMenu(
|
||||
inMenuID : XPLMMenuID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMClearAllMenuItems
|
||||
|
||||
This function removes all menu items from a menu, allowing you to rebuild
|
||||
it. Use this function if you need to change the number of items on a menu.
|
||||
This function removes all menu items from a menu, allowing you to rebuild
|
||||
it. Use this function if you need to change the number of items on a menu.
|
||||
}
|
||||
PROCEDURE XPLMClearAllMenuItems(
|
||||
inMenuID : XPLMMenuID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMAppendMenuItem
|
||||
|
||||
This routine appends a new menu item to the bottom of a menu and returns
|
||||
its index. Pass in the menu to add the item to, the items name, and a void
|
||||
* ref for this item. If you pass in inForceEnglish, this menu item will be
|
||||
drawn using the english character set no matter what language x-plane is
|
||||
running in. Otherwise the menu item will be drawn localized. (An example
|
||||
of why you'd want to do this is for a proper name.) See XPLMUtilities for
|
||||
determining the current langauge.
|
||||
This routine appends a new menu item to the bottom of a menu and returns
|
||||
its index. Pass in the menu to add the item to, the items name, and a void
|
||||
* ref for this item.
|
||||
|
||||
Returns a negative index if the append failed (due to an invalid parent
|
||||
menu argument).
|
||||
|
||||
Note that all menu indices returned are relative to your plugin's menus
|
||||
only; if your plugin creates two sub-menus in the Plugins menu at different
|
||||
times, it doesn't matter how many other plugins also create sub-menus of
|
||||
Plugins in the intervening time: your sub-menus will be given menu indices
|
||||
0 and 1. (The SDK does some work in the back-end to filter out menus that
|
||||
are irrelevant to your plugin in order to deliver this consistency for each
|
||||
plugin.)
|
||||
}
|
||||
FUNCTION XPLMAppendMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
inItemName : Pchar;
|
||||
inItemName : XPLMString;
|
||||
inItemRef : pointer;
|
||||
inForceEnglish : integer) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inDeprecatedAndIgnored: Integer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM300}
|
||||
{
|
||||
XPLMAppendMenuItemWithCommand
|
||||
|
||||
Like XPLMAppendMenuItem(), but instead of the new menu item triggering the
|
||||
XPLMMenuHandler_f of the containiner menu, it will simply execute the
|
||||
command you pass in. Using a command for your menu item allows the user to
|
||||
bind a keyboard shortcut to the command and see that shortcut represented
|
||||
in the menu.
|
||||
|
||||
Returns a negative index if the append failed (due to an invalid parent
|
||||
menu argument).
|
||||
|
||||
Like XPLMAppendMenuItem(), all menu indices are relative to your plugin's
|
||||
menus only.
|
||||
}
|
||||
FUNCTION XPLMAppendMenuItemWithCommand(
|
||||
inMenu : XPLMMenuID;
|
||||
inItemName : XPLMString;
|
||||
inCommandToExecute : XPLMCommandRef) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM300}
|
||||
|
||||
{
|
||||
XPLMAppendMenuSeparator
|
||||
|
||||
This routine adds a seperator to the end of a menu.
|
||||
This routine adds a separator to the end of a menu.
|
||||
|
||||
Returns a negative index if the append failed (due to an invalid parent
|
||||
menu argument).
|
||||
}
|
||||
PROCEDURE XPLMAppendMenuSeparator(
|
||||
inMenu : XPLMMenuID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetMenuItemName
|
||||
|
||||
This routine changes the name of an existing menu item. Pass in the menu
|
||||
ID and the index of the menu item.
|
||||
This routine changes the name of an existing menu item. Pass in the menu
|
||||
ID and the index of the menu item.
|
||||
}
|
||||
PROCEDURE XPLMSetMenuItemName(
|
||||
inMenu : XPLMMenuID;
|
||||
inIndex : integer;
|
||||
inItemName : Pchar;
|
||||
inForceEnglish : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer;
|
||||
inItemName : XPLMString;
|
||||
inDeprecatedAndIgnored: Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCheckMenuItem
|
||||
|
||||
Set whether a menu item is checked. Pass in the menu ID and item index.
|
||||
Set whether a menu item is checked. Pass in the menu ID and item index.
|
||||
}
|
||||
PROCEDURE XPLMCheckMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
index : integer;
|
||||
index : Integer;
|
||||
inCheck : XPLMMenuCheck);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCheckMenuItemState
|
||||
|
||||
This routine returns whether a menu item is checked or not. A menu item's
|
||||
check mark may be on or off, or a menu may not have an icon at all.
|
||||
This routine returns whether a menu item is checked or not. A menu item's
|
||||
check mark may be on or off, or a menu may not have an icon at all.
|
||||
}
|
||||
PROCEDURE XPLMCheckMenuItemState(
|
||||
inMenu : XPLMMenuID;
|
||||
index : integer;
|
||||
index : Integer;
|
||||
outCheck : PXPLMMenuCheck);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMEnableMenuItem
|
||||
|
||||
Sets whether this menu item is enabled. Items start out enabled.
|
||||
Sets whether this menu item is enabled. Items start out enabled.
|
||||
}
|
||||
PROCEDURE XPLMEnableMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
index : integer;
|
||||
enabled : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
index : Integer;
|
||||
enabled : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMRemoveMenuItem
|
||||
|
||||
Removes one item from a menu. Note that all menu items below are moved up
|
||||
one; your plugin must track the change in index numbers.
|
||||
Removes one item from a menu. Note that all menu items below are moved up
|
||||
one; your plugin must track the change in index numbers.
|
||||
}
|
||||
PROCEDURE XPLMRemoveMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
inIndex : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
@@ -1,51 +1,39 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMNavigation;
|
||||
INTERFACE
|
||||
{
|
||||
XPLMNavigation - THEORY OF OPERATION
|
||||
The XPLM Navigation APIs give you some access to the navigation databases
|
||||
inside X-Plane. X-Plane stores all navigation information in RAM, so by
|
||||
using these APIs you can gain access to most information without having to
|
||||
go to disk or parse the files yourself.
|
||||
|
||||
The XPLM Navigation APIs give you some access to the navigation databases
|
||||
inside X-Plane. X-Plane stores all navigation information in RAM, so by
|
||||
using these APIs you can gain access to most information without having to
|
||||
go to disk or parse the files yourself.
|
||||
|
||||
You can also use this API to program the FMS. You must use the navigation
|
||||
APIs to find the nav-aids you want to program into the FMS, since the FMS
|
||||
is powered internally by x-plane's navigation database.
|
||||
You can also use this API to program the FMS. You must use the navigation
|
||||
APIs to find the nav-aids you want to program into the FMS, since the FMS
|
||||
is powered internally by X-Plane's navigation database.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* NAVIGATION DATABASE ACCESS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMNavType
|
||||
|
||||
These enumerations define the different types of navaids. They are each
|
||||
defined with a separate bit so that they may be bit-wise added together to
|
||||
form sets of nav-aid types.
|
||||
These enumerations define the different types of navaids. They are each
|
||||
defined with a separate bit so that they may be bit-wise added together to
|
||||
form sets of nav-aid types.
|
||||
|
||||
NOTE: xplm_Nav_LatLon is a specific lat-lon coordinate entered into the
|
||||
FMS. It will not exist in the database, and cannot be programmed into the
|
||||
FMS. Querying the FMS for navaids will return it. Use
|
||||
XPLMSetFMSEntryLatLon to set a lat/lon waypoint.
|
||||
NOTE: xplm_Nav_LatLon is a specific lat-lon coordinate entered into the
|
||||
FMS. It will not exist in the database, and cannot be programmed into the
|
||||
FMS. Querying the FMS for navaids will return it. Use
|
||||
XPLMSetFMSEntryLatLon to set a lat/lon waypoint.
|
||||
}
|
||||
TYPE
|
||||
XPLMNavType = (
|
||||
@@ -81,17 +69,17 @@ TYPE
|
||||
{
|
||||
XPLMNavRef
|
||||
|
||||
XPLMNavRef is an iterator into the navigation database. The navigation
|
||||
database is essentially an array, but it is not necessarily densely
|
||||
populated. The only assumption you can safely make is that like-typed
|
||||
nav-aids are grouped together.
|
||||
XPLMNavRef is an iterator into the navigation database. The navigation
|
||||
database is essentially an array, but it is not necessarily densely
|
||||
populated. The only assumption you can safely make is that like-typed
|
||||
nav-aids are grouped together.
|
||||
|
||||
Use XPLMNavRef to refer to a nav-aid.
|
||||
Use XPLMNavRef to refer to a nav-aid.
|
||||
|
||||
XPLM_NAV_NOT_FOUND is returned by functions that return an XPLMNavRef when
|
||||
the iterator must be invalid.
|
||||
XPLM_NAV_NOT_FOUND is returned by functions that return an XPLMNavRef when
|
||||
the iterator must be invalid.
|
||||
}
|
||||
XPLMNavRef = integer;
|
||||
XPLMNavRef = Integer;
|
||||
PXPLMNavRef = ^XPLMNavRef;
|
||||
|
||||
CONST
|
||||
@@ -100,335 +88,263 @@ CONST
|
||||
{
|
||||
XPLMGetFirstNavAid
|
||||
|
||||
This returns the very first navaid in the database. Use this to traverse
|
||||
the entire database. Returns XPLM_NAV_NOT_FOUND if the nav database is
|
||||
empty.
|
||||
This returns the very first navaid in the database. Use this to traverse
|
||||
the entire database. Returns XPLM_NAV_NOT_FOUND if the nav database is
|
||||
empty.
|
||||
}
|
||||
FUNCTION XPLMGetFirstNavAid: XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetNextNavAid
|
||||
|
||||
Given a nav aid ref, this routine returns the next navaid. It returns
|
||||
XPLM_NAV_NOT_FOUND if the nav aid passed in was invalid or if the navaid
|
||||
passed in was the last one in the database. Use this routine to iterate
|
||||
across all like-typed navaids or the entire database.
|
||||
|
||||
WARNING: due to a bug in the SDK, when fix loading is disabled in the
|
||||
rendering settings screen, calling this routine with the last airport
|
||||
returns a bogus nav aid. Using this nav aid can crash x-plane.
|
||||
Given a valid nav aid ref, this routine returns the next navaid. It
|
||||
returns XPLM_NAV_NOT_FOUND if the nav aid passed in was invalid or if the
|
||||
navaid passed in was the last one in the database. Use this routine to
|
||||
iterate across all like-typed navaids or the entire database.
|
||||
}
|
||||
FUNCTION XPLMGetNextNavAid(
|
||||
inNavAidRef : XPLMNavRef) : XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMFindFirstNavAidOfType
|
||||
|
||||
This routine returns the ref of the first navaid of the given type in the
|
||||
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
|
||||
database. You must pass exactly one nav aid type to this routine.
|
||||
|
||||
WARNING: due to a bug in the SDK, when fix loading is disabled in the
|
||||
rendering settings screen, calling this routine with fixes returns a bogus
|
||||
nav aid. Using this nav aid can crash x-plane.
|
||||
This routine returns the ref of the first navaid of the given type in the
|
||||
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
|
||||
database. You must pass exactly one nav aid type to this routine.
|
||||
}
|
||||
FUNCTION XPLMFindFirstNavAidOfType(
|
||||
inType : XPLMNavType) : XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMFindLastNavAidOfType
|
||||
|
||||
This routine returns the ref of the last navaid of the given type in the
|
||||
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
|
||||
database. You must pass exactly one nav aid type to this routine.
|
||||
|
||||
WARNING: due to a bug in the SDK, when fix loading is disabled in the
|
||||
rendering settings screen, calling this routine with fixes returns a bogus
|
||||
nav aid. Using this nav aid can crash x-plane.
|
||||
This routine returns the ref of the last navaid of the given type in the
|
||||
database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the
|
||||
database. You must pass exactly one nav aid type to this routine.
|
||||
}
|
||||
FUNCTION XPLMFindLastNavAidOfType(
|
||||
inType : XPLMNavType) : XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMFindNavAid
|
||||
|
||||
This routine provides a number of searching capabilities for the nav
|
||||
database. XPLMFindNavAid will search through every nav aid whose type is
|
||||
within inType (multiple types may be added together) and return any
|
||||
nav-aids found based on the following rules:
|
||||
This routine provides a number of searching capabilities for the nav
|
||||
database. XPLMFindNavAid will search through every nav aid whose type is
|
||||
within inType (multiple types may be added together) and return any
|
||||
nav-aids found based on the following rules:
|
||||
|
||||
If inLat and inLon are not NULL, the navaid nearest to that lat/lon will be
|
||||
returned, otherwise the last navaid found will be returned.
|
||||
* If inLat and inLon are not NULL, the navaid nearest to that lat/lon will
|
||||
be returned, otherwise the last navaid found will be returned.
|
||||
|
||||
If inFrequency is not NULL, then any navaids considered must match this
|
||||
frequency. Note that this will screen out radio beacons that do not have
|
||||
frequency data published (like inner markers) but not fixes and airports.
|
||||
* If inFrequency is not NULL, then any navaids considered must match this
|
||||
frequency. Note that this will screen out radio beacons that do not have
|
||||
frequency data published (like inner markers) but not fixes and airports.
|
||||
|
||||
If inNameFragment is not NULL, only navaids that contain the fragment in
|
||||
their name will be returned.
|
||||
* If inNameFragment is not NULL, only navaids that contain the fragment in
|
||||
their name will be returned.
|
||||
|
||||
If inIDFragment is not NULL, only navaids that contain the fragment in
|
||||
their IDs will be returned.
|
||||
* If inIDFragment is not NULL, only navaids that contain the fragment in
|
||||
their IDs will be returned.
|
||||
|
||||
This routine provides a simple way to do a number of useful searches:
|
||||
|
||||
Find the nearest navaid on this frequency. Find the nearest airport. Find
|
||||
the VOR whose ID is "KBOS". Find the nearest airport whose name contains
|
||||
"Chicago".
|
||||
This routine provides a simple way to do a number of useful searches:
|
||||
* Find the nearest navaid on this frequency.
|
||||
* Find the nearest airport.
|
||||
* Find the VOR whose ID is "KBOS".
|
||||
* Find the nearest airport whose name contains "Chicago".
|
||||
}
|
||||
FUNCTION XPLMFindNavAid(
|
||||
inNameFragment : Pchar; { Can be nil }
|
||||
inIDFragment : Pchar; { Can be nil }
|
||||
inLat : Psingle; { Can be nil }
|
||||
inLon : Psingle; { Can be nil }
|
||||
inFrequency : Pinteger; { Can be nil }
|
||||
inNameFragment : XPLMString; { Can be nil }
|
||||
inIDFragment : XPLMString; { Can be nil }
|
||||
inLat : PSingle; { Can be nil }
|
||||
inLon : PSingle; { Can be nil }
|
||||
inFrequency : PInteger; { Can be nil }
|
||||
inType : XPLMNavType) : XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetNavAidInfo
|
||||
|
||||
This routine returns information about a navaid. Any non-null field is
|
||||
filled out with information if it is available.
|
||||
This routine returns information about a navaid. Any non-null field is
|
||||
filled out with information if it is available.
|
||||
|
||||
Frequencies are in the nav.dat convention as described in the X-Plane nav
|
||||
database FAQ: NDB frequencies are exact, all others are multiplied by 100.
|
||||
Frequencies are in the nav.dat convention as described in the X-Plane nav
|
||||
database FAQ: NDB frequencies are exact, all others are multiplied by 100.
|
||||
|
||||
The buffer for IDs should be at least 6 chars and the buffer for names
|
||||
should be at least 41 chars, but since these values are likely to go up, I
|
||||
recommend passing at least 32 chars for IDs and 256 chars for names when
|
||||
possible.
|
||||
The buffer for IDs should be at least 6 chars and the buffer for names
|
||||
should be at least 41 chars, but since these values are likely to go up, I
|
||||
recommend passing at least 32 chars for IDs and 256 chars for names when
|
||||
possible.
|
||||
|
||||
The outReg parameter tells if the navaid is within the local "region" of
|
||||
loaded DSFs. (This information may not be particularly useful to plugins.)
|
||||
The parameter is a single byte value 1 for true or 0 for false, not a C
|
||||
string.
|
||||
The outReg parameter tells if the navaid is within the local "region" of
|
||||
loaded DSFs. (This information may not be particularly useful to plugins.)
|
||||
The parameter is a single byte value 1 for true or 0 for false, not a C
|
||||
string.
|
||||
}
|
||||
PROCEDURE XPLMGetNavAidInfo(
|
||||
inRef : XPLMNavRef;
|
||||
outType : PXPLMNavType; { Can be nil }
|
||||
outLatitude : Psingle; { Can be nil }
|
||||
outLongitude : Psingle; { Can be nil }
|
||||
outHeight : Psingle; { Can be nil }
|
||||
outFrequency : Pinteger; { Can be nil }
|
||||
outHeading : Psingle; { Can be nil }
|
||||
outID : Pchar; { Can be nil }
|
||||
outName : Pchar; { Can be nil }
|
||||
outReg : Pchar); { Can be nil }
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outLatitude : PSingle; { Can be nil }
|
||||
outLongitude : PSingle; { Can be nil }
|
||||
outHeight : PSingle; { Can be nil }
|
||||
outFrequency : PInteger; { Can be nil }
|
||||
outHeading : PSingle; { Can be nil }
|
||||
outID : XPLMString; { Can be nil }
|
||||
outName : XPLMString; { Can be nil }
|
||||
outReg : XPLMString); { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* FLIGHT MANAGEMENT COMPUTER
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
Note: the FMS works based on an array of entries. Indices into the array
|
||||
are zero-based. Each entry is a nav-aid plus an altitude. The FMS tracks
|
||||
the currently displayed entry and the entry that it is flying to.
|
||||
Note: the FMS works based on an array of entries. Indices into the array
|
||||
are zero-based. Each entry is a nav-aid plus an altitude. The FMS tracks
|
||||
the currently displayed entry and the entry that it is flying to.
|
||||
|
||||
The FMS must be programmed with contiguous entries, so clearing an entry at
|
||||
the end shortens the effective flight plan. There is a max of 100
|
||||
waypoints in the flight plan.
|
||||
The FMS must be programmed with contiguous entries, so clearing an entry at
|
||||
the end shortens the effective flight plan. There is a max of 100
|
||||
waypoints in the flight plan.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMCountFMSEntries
|
||||
|
||||
This routine returns the number of entries in the FMS.
|
||||
This routine returns the number of entries in the FMS.
|
||||
}
|
||||
FUNCTION XPLMCountFMSEntries: integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMCountFMSEntries: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDisplayedFMSEntry
|
||||
|
||||
This routine returns the index of the entry the pilot is viewing.
|
||||
This routine returns the index of the entry the pilot is viewing.
|
||||
}
|
||||
FUNCTION XPLMGetDisplayedFMSEntry: integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMGetDisplayedFMSEntry: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDestinationFMSEntry
|
||||
|
||||
This routine returns the index of the entry the FMS is flying to.
|
||||
This routine returns the index of the entry the FMS is flying to.
|
||||
}
|
||||
FUNCTION XPLMGetDestinationFMSEntry: integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMGetDestinationFMSEntry: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDisplayedFMSEntry
|
||||
|
||||
This routine changes which entry the FMS is showing to the index specified.
|
||||
}
|
||||
This routine changes which entry the FMS is showing to the index specified.
|
||||
}
|
||||
PROCEDURE XPLMSetDisplayedFMSEntry(
|
||||
inIndex : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDestinationFMSEntry
|
||||
|
||||
This routine changes which entry the FMS is flying the aircraft toward.
|
||||
This routine changes which entry the FMS is flying the aircraft toward.
|
||||
}
|
||||
PROCEDURE XPLMSetDestinationFMSEntry(
|
||||
inIndex : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetFMSEntryInfo
|
||||
|
||||
This routine returns information about a given FMS entry. A reference to a
|
||||
navaid can be returned allowing you to find additional information (such as
|
||||
a frequency, ILS heading, name, etc.). Some information is available
|
||||
immediately. For a lat/lon entry, the lat/lon is returned by this routine
|
||||
but the navaid cannot be looked up (and the reference will be
|
||||
XPLM_NAV_NOT_FOUND. FMS name entry buffers should be at least 256 chars in
|
||||
length.
|
||||
This routine returns information about a given FMS entry. If the entry is
|
||||
an airport or navaid, a reference to a nav entry can be returned allowing
|
||||
you to find additional information (such as a frequency, ILS heading, name,
|
||||
etc.). Note that this reference can be XPLM_NAV_NOT_FOUND until the
|
||||
information has been looked up asynchronously, so after flightplan changes,
|
||||
it might take up to a second for this field to become populated. The other
|
||||
information is available immediately. For a lat/lon entry, the lat/lon is
|
||||
returned by this routine but the navaid cannot be looked up (and the
|
||||
reference will be XPLM_NAV_NOT_FOUND). FMS name entry buffers should be at
|
||||
least 256 chars in length.
|
||||
|
||||
WARNING: Due to a bug in X-Plane prior to 11.31, the navaid reference will
|
||||
not be set to XPLM_NAV_NOT_FOUND while no data is available, and instead
|
||||
just remain the value of the variable that you passed the pointer to.
|
||||
Therefore, always initialize the variable to XPLM_NAV_NOT_FOUND before
|
||||
passing the pointer to this function.
|
||||
}
|
||||
PROCEDURE XPLMGetFMSEntryInfo(
|
||||
inIndex : integer;
|
||||
inIndex : Integer;
|
||||
outType : PXPLMNavType; { Can be nil }
|
||||
outID : Pchar; { Can be nil }
|
||||
outID : XPLMString; { Can be nil }
|
||||
outRef : PXPLMNavRef; { Can be nil }
|
||||
outAltitude : Pinteger; { Can be nil }
|
||||
outLat : Psingle; { Can be nil }
|
||||
outLon : Psingle); { Can be nil }
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outAltitude : PInteger; { Can be nil }
|
||||
outLat : PSingle; { Can be nil }
|
||||
outLon : PSingle); { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetFMSEntryInfo
|
||||
|
||||
This routine changes an entry in the FMS to have the destination navaid
|
||||
passed in and the altitude specified. Use this only for airports, fixes,
|
||||
and radio-beacon navaids. Currently of radio beacons, the FMS can only
|
||||
support VORs and NDBs. Use the routines below to clear or fly to a lat/lon.
|
||||
This routine changes an entry in the FMS to have the destination navaid
|
||||
passed in and the altitude specified. Use this only for airports, fixes,
|
||||
and radio-beacon navaids. Currently of radio beacons, the FMS can only
|
||||
support VORs and NDBs. Use the routines below to clear or fly to a lat/lon.
|
||||
}
|
||||
PROCEDURE XPLMSetFMSEntryInfo(
|
||||
inIndex : integer;
|
||||
inIndex : Integer;
|
||||
inRef : XPLMNavRef;
|
||||
inAltitude : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inAltitude : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetFMSEntryLatLon
|
||||
|
||||
This routine changes the entry in the FMS to a lat/lon entry with the given
|
||||
coordinates.
|
||||
This routine changes the entry in the FMS to a lat/lon entry with the given
|
||||
coordinates.
|
||||
}
|
||||
PROCEDURE XPLMSetFMSEntryLatLon(
|
||||
inIndex : integer;
|
||||
inLat : single;
|
||||
inLon : single;
|
||||
inAltitude : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer;
|
||||
inLat : Single;
|
||||
inLon : Single;
|
||||
inAltitude : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMClearFMSEntry
|
||||
|
||||
This routine clears the given entry, potentially shortening the flight
|
||||
plan.
|
||||
This routine clears the given entry, potentially shortening the flight
|
||||
plan.
|
||||
}
|
||||
PROCEDURE XPLMClearFMSEntry(
|
||||
inIndex : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* GPS RECEIVER
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These APIs let you read data from the GPS unit.
|
||||
These APIs let you read data from the GPS unit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMGetGPSDestinationType
|
||||
|
||||
This routine returns the type of the currently selected GPS destination,
|
||||
one of fix, airport, VOR or NDB.
|
||||
This routine returns the type of the currently selected GPS destination,
|
||||
one of fix, airport, VOR or NDB.
|
||||
}
|
||||
FUNCTION XPLMGetGPSDestinationType: XPLMNavType;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetGPSDestination
|
||||
|
||||
This routine returns the current GPS destination.
|
||||
This routine returns the current GPS destination.
|
||||
}
|
||||
FUNCTION XPLMGetGPSDestination: XPLMNavRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
+167
-183
@@ -1,162 +1,158 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMPlanes;
|
||||
INTERFACE
|
||||
{
|
||||
The XPLMPlanes APIs allow you to control the various aircraft in x-plane,
|
||||
both the user's and the sim's.
|
||||
The XPLMPlanes APIs allow you to control the various aircraft in X-Plane,
|
||||
both the user's and the sim's.
|
||||
|
||||
*Note*: unlike almost all other APIs in the SDK, aircraft paths are _full_
|
||||
file system paths for historical reasons. You'll need to prefix all
|
||||
relative paths with the X-Plane path as accessed via XPLMGetSystemPath.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* USER AIRCRAFT ACCESS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMSetUsersAircraft
|
||||
|
||||
This routine changes the user's aircraft. Note that this will reinitialize
|
||||
the user to be on the nearest airport's first runway. Pass in a full path
|
||||
(hard drive and everything including the .acf extension) to the .acf file.
|
||||
This routine changes the user's aircraft. Note that this will reinitialize
|
||||
the user to be on the nearest airport's first runway. Pass in a full path
|
||||
(hard drive and everything including the .acf extension) to the .acf file.
|
||||
}
|
||||
PROCEDURE XPLMSetUsersAircraft(
|
||||
inAircraftPath : Pchar);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inAircraftPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
{
|
||||
XPLMPlaceUserAtAirport
|
||||
|
||||
This routine places the user at a given airport. Specify the airport by
|
||||
its ICAO code (e.g. 'KBOS').
|
||||
This routine places the user at a given airport. Specify the airport by
|
||||
its X-Plane airport ID (e.g. 'KBOS').
|
||||
}
|
||||
PROCEDURE XPLMPlaceUserAtAirport(
|
||||
inAirportCode : Pchar);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inAirportCode : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$IFDEF XPLM300}
|
||||
{
|
||||
XPLMPlaceUserAtLocation
|
||||
|
||||
Places the user at a specific location after performing any necessary
|
||||
scenery loads.
|
||||
|
||||
As with in-air starts initiated from the X-Plane user interface, the
|
||||
aircraft will always start with its engines running, regardless of the
|
||||
user's preferences (i.e., regardless of what the dataref
|
||||
`sim/operation/prefs/startup_running` says).
|
||||
}
|
||||
PROCEDURE XPLMPlaceUserAtLocation(
|
||||
latitudeDegrees : Real;
|
||||
longitudeDegrees : Real;
|
||||
elevationMetersMSL : Single;
|
||||
headingDegreesTrue : Single;
|
||||
speedMetersPerSecond: Single);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* GLOBAL AIRCRAFT ACCESS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
{ The user's aircraft is always index 0. }
|
||||
{ The user's aircraft is always index 0. }
|
||||
XPLM_USER_AIRCRAFT = 0;
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMPlaneDrawState_t
|
||||
|
||||
This structure contains additional plane parameter info to be passed to
|
||||
draw plane. Make sure to fill in the size of the structure field with
|
||||
sizeof(XPLMDrawPlaneState_t) so that the XPLM can tell how many fields you
|
||||
knew about when compiling your plugin (since more fields may be added
|
||||
later).
|
||||
This structure contains additional plane parameter info to be passed to
|
||||
draw plane. Make sure to fill in the size of the structure field with
|
||||
sizeof(XPLMDrawPlaneState_t) so that the XPLM can tell how many fields you
|
||||
knew about when compiling your plugin (since more fields may be added
|
||||
later).
|
||||
|
||||
Most of these fields are ratios from 0 to 1 for control input. X-Plane
|
||||
calculates what the actual controls look like based on the .acf file for
|
||||
that airplane. Note for the yoke inputs, this is what the pilot of the
|
||||
plane has commanded (post artificial stability system if there were one)
|
||||
and affects aelerons, rudder, etc. It is not necessarily related to the
|
||||
actual position of the plane!
|
||||
Most of these fields are ratios from 0 to 1 for control input. X-Plane
|
||||
calculates what the actual controls look like based on the .acf file for
|
||||
that airplane. Note for the yoke inputs, this is what the pilot of the
|
||||
plane has commanded (post artificial stability system if there were one)
|
||||
and affects aelerons, rudder, etc. It is not necessarily related to the
|
||||
actual position of the plane!
|
||||
}
|
||||
TYPE
|
||||
XPLMPlaneDrawState_t = RECORD
|
||||
{ The size of the draw state struct. }
|
||||
structSize : integer;
|
||||
{ A ratio from [0..1] describing how far the landing gear is extended. }
|
||||
gearPosition : single;
|
||||
{ Ratio of flap deployment, 0 = up, 1 = full deploy. }
|
||||
flapRatio : single;
|
||||
{ Ratio of spoiler deployment, 0 = none, 1 = full deploy. }
|
||||
spoilerRatio : single;
|
||||
{ Ratio of speed brake deployment, 0 = none, 1 = full deploy. }
|
||||
speedBrakeRatio : single;
|
||||
{ Ratio of slat deployment, 0 = none, 1 = full deploy. }
|
||||
slatRatio : single;
|
||||
{ Wing sweep ratio, 0 = forward, 1 = swept. }
|
||||
wingSweep : single;
|
||||
{ Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. }
|
||||
thrust : single;
|
||||
{ Total pitch input for this plane. }
|
||||
yokePitch : single;
|
||||
{ Total Heading input for this plane. }
|
||||
yokeHeading : single;
|
||||
{ Total Roll input for this plane. }
|
||||
yokeRoll : single;
|
||||
{ The size of the draw state struct. }
|
||||
structSize : Integer;
|
||||
{ A ratio from [0..1] describing how far the landing gear is extended. }
|
||||
gearPosition : Single;
|
||||
{ Ratio of flap deployment, 0 = up, 1 = full deploy. }
|
||||
flapRatio : Single;
|
||||
{ Ratio of spoiler deployment, 0 = none, 1 = full deploy. }
|
||||
spoilerRatio : Single;
|
||||
{ Ratio of speed brake deployment, 0 = none, 1 = full deploy. }
|
||||
speedBrakeRatio : Single;
|
||||
{ Ratio of slat deployment, 0 = none, 1 = full deploy. }
|
||||
slatRatio : Single;
|
||||
{ Wing sweep ratio, 0 = forward, 1 = swept. }
|
||||
wingSweep : Single;
|
||||
{ Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. }
|
||||
thrust : Single;
|
||||
{ Total pitch input for this plane. }
|
||||
yokePitch : Single;
|
||||
{ Total Heading input for this plane. }
|
||||
yokeHeading : Single;
|
||||
{ Total Roll input for this plane. }
|
||||
yokeRoll : Single;
|
||||
END;
|
||||
PXPLMPlaneDrawState_t = ^XPLMPlaneDrawState_t;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMCountAircraft
|
||||
|
||||
This function returns the number of aircraft X-Plane is capable of having,
|
||||
as well as the number of aircraft that are currently active. These numbers
|
||||
count the user's aircraft. It can also return the plugin that is currently
|
||||
controlling aircraft. In X-Plane 7, this routine reflects the number of
|
||||
aircraft the user has enabled in the rendering options window.
|
||||
This function returns the number of aircraft X-Plane is capable of having,
|
||||
as well as the number of aircraft that are currently active. These numbers
|
||||
count the user's aircraft. It can also return the plugin that is currently
|
||||
controlling aircraft. In X-Plane 7, this routine reflects the number of
|
||||
aircraft the user has enabled in the rendering options window.
|
||||
}
|
||||
PROCEDURE XPLMCountAircraft(
|
||||
outTotalAircraft : Pinteger;
|
||||
outActiveAircraft : Pinteger;
|
||||
outTotalAircraft : PInteger;
|
||||
outActiveAircraft : PInteger;
|
||||
outController : PXPLMPluginID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{
|
||||
XPLMGetNthAircraftModel
|
||||
|
||||
This function returns the aircraft model for the Nth aircraft. Indices are
|
||||
zero based, with zero being the user's aircraft. The file name should be
|
||||
at least 256 chars in length; the path should be at least 512 chars in
|
||||
length.
|
||||
This function returns the aircraft model for the Nth aircraft. Indices are
|
||||
zero based, with zero being the user's aircraft. The file name should be
|
||||
at least 256 chars in length; the path should be at least 512 chars in
|
||||
length.
|
||||
}
|
||||
PROCEDURE XPLMGetNthAircraftModel(
|
||||
inIndex : integer;
|
||||
outFileName : Pchar;
|
||||
outPath : Pchar);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer;
|
||||
outFileName : XPLMString;
|
||||
outPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
{___________________________________________________________________________
|
||||
* EXCLUSIVE AIRCRAFT ACCESS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The following routines require exclusive access to the airplane APIs. Only
|
||||
one plugin may have this access at a time.
|
||||
The following routines require exclusive access to the airplane APIs. Only
|
||||
one plugin may have this access at a time.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMPlanesAvailable_f
|
||||
|
||||
Your airplanes available callback is called when another plugin gives up
|
||||
access to the multiplayer planes. Use this to wait for access to
|
||||
multiplayer.
|
||||
Your airplanes available callback is called when another plugin gives up
|
||||
access to the multiplayer planes. Use this to wait for access to
|
||||
multiplayer.
|
||||
}
|
||||
TYPE
|
||||
XPLMPlanesAvailable_f = PROCEDURE(
|
||||
@@ -165,130 +161,118 @@ TYPE
|
||||
{
|
||||
XPLMAcquirePlanes
|
||||
|
||||
XPLMAcquirePlanes grants your plugin exclusive access to the aircraft. It
|
||||
returns 1 if you gain access, 0 if you do not. inAircraft - pass in an
|
||||
array of pointers to strings specifying the planes you want loaded. For
|
||||
any plane index you do not want loaded, pass a 0-length string. Other
|
||||
strings should be full paths with the .acf extension. NULL terminates this
|
||||
array, or pass NULL if there are no planes you want loaded. If you pass in
|
||||
a callback and do not receive access to the planes your callback will be
|
||||
called when the airplanes are available. If you do receive airplane access,
|
||||
your callback will not be called.
|
||||
XPLMAcquirePlanes grants your plugin exclusive access to the aircraft. It
|
||||
returns 1 if you gain access, 0 if you do not.
|
||||
|
||||
inAircraft - pass in an array of pointers to strings specifying the planes
|
||||
you want loaded. For any plane index you do not want loaded, pass a
|
||||
0-length string. Other strings should be full paths with the .acf
|
||||
extension. NULL terminates this array, or pass NULL if there are no planes
|
||||
you want loaded.
|
||||
|
||||
If you pass in a callback and do not receive access to the planes your
|
||||
callback will be called when the airplanes are available. If you do receive
|
||||
airplane access, your callback will not be called.
|
||||
}
|
||||
FUNCTION XPLMAcquirePlanes(
|
||||
inAircraft : PPchar; { Can be nil }
|
||||
inAircraft : PXPLMString; { Can be nil }
|
||||
inCallback : XPLMPlanesAvailable_f;
|
||||
inRefcon : pointer) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inRefcon : pointer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMReleasePlanes
|
||||
|
||||
Call this function to release access to the planes. Note that if you are
|
||||
disabled, access to planes is released for you and you must reacquire it.
|
||||
Call this function to release access to the planes. Note that if you are
|
||||
disabled, access to planes is released for you and you must reacquire it.
|
||||
}
|
||||
PROCEDURE XPLMReleasePlanes;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetActiveAircraftCount
|
||||
|
||||
This routine sets the number of active planes. If you pass in a number
|
||||
higher than the total number of planes availables, only the total number of
|
||||
planes available is actually used.
|
||||
This routine sets the number of active planes. If you pass in a number
|
||||
higher than the total number of planes availables, only the total number of
|
||||
planes available is actually used.
|
||||
}
|
||||
PROCEDURE XPLMSetActiveAircraftCount(
|
||||
inCount : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inCount : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetAircraftModel
|
||||
|
||||
This routine loads an aircraft model. It may only be called if you have
|
||||
exclusive access to the airplane APIs. Pass in the path of the model with
|
||||
the .acf extension. The index is zero based, but you may not pass in 0
|
||||
(use XPLMSetUsersAircraft to load the user's aircracft).
|
||||
This routine loads an aircraft model. It may only be called if you have
|
||||
exclusive access to the airplane APIs. Pass in the path of the model with
|
||||
the .acf extension. The index is zero based, but you may not pass in 0
|
||||
(use XPLMSetUsersAircraft to load the user's aircracft).
|
||||
}
|
||||
PROCEDURE XPLMSetAircraftModel(
|
||||
inIndex : integer;
|
||||
inAircraftPath : Pchar);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer;
|
||||
inAircraftPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDisableAIForPlane
|
||||
|
||||
This routine turns off X-Plane's AI for a given plane. The plane will
|
||||
continue to draw and be a real plane in X-Plane, but will not move itself.
|
||||
This routine turns off X-Plane's AI for a given plane. The plane will
|
||||
continue to draw and be a real plane in X-Plane, but will not move itself.
|
||||
}
|
||||
PROCEDURE XPLMDisableAIForPlane(
|
||||
inPlaneIndex : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inPlaneIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMDrawAircraft
|
||||
|
||||
This routine draws an aircraft. It can only be called from a 3-d drawing
|
||||
callback. Pass in the position of the plane in OpenGL local coordinates
|
||||
and the orientation of the plane. A 1 for full drawing indicates that the
|
||||
whole plane must be drawn; a 0 indicates you only need the nav lights
|
||||
drawn. (This saves rendering time when planes are far away.)
|
||||
WARNING: Aircraft drawing via this API is deprecated and will not work in
|
||||
future versions of X-Plane. Use XPLMInstance for 3-d drawing of custom
|
||||
aircraft models.
|
||||
|
||||
This routine draws an aircraft. It can only be called from a 3-d drawing
|
||||
callback. Pass in the position of the plane in OpenGL local coordinates
|
||||
and the orientation of the plane. A 1 for full drawing indicates that the
|
||||
whole plane must be drawn; a 0 indicates you only need the nav lights
|
||||
drawn. (This saves rendering time when planes are far away.)
|
||||
}
|
||||
PROCEDURE XPLMDrawAircraft(
|
||||
inPlaneIndex : integer;
|
||||
inX : single;
|
||||
inY : single;
|
||||
inZ : single;
|
||||
inPitch : single;
|
||||
inRoll : single;
|
||||
inYaw : single;
|
||||
inFullDraw : integer;
|
||||
inPlaneIndex : Integer;
|
||||
inX : Single;
|
||||
inY : Single;
|
||||
inZ : Single;
|
||||
inPitch : Single;
|
||||
inRoll : Single;
|
||||
inYaw : Single;
|
||||
inFullDraw : Integer;
|
||||
inDrawStateInfo : PXPLMPlaneDrawState_t);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMReinitUsersPlane
|
||||
|
||||
This function recomputes the derived flight model data from the aircraft
|
||||
structure in memory. If you have used the data access layer to modify the
|
||||
aircraft structure, use this routine to resynchronize x-plane; since
|
||||
X-plane works at least partly from derived values, the sim will not behave
|
||||
properly until this is called.
|
||||
WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or
|
||||
XPLMPlaceUserAtLocation.
|
||||
|
||||
WARNING: this routine does not necessarily place the airplane at the
|
||||
airport; use XPLMSetUsersAircraft to be compatible. This routine is
|
||||
provided to do special experimentation with flight models without resetting
|
||||
flight.
|
||||
This function recomputes the derived flight model data from the aircraft
|
||||
structure in memory. If you have used the data access layer to modify the
|
||||
aircraft structure, use this routine to resynchronize X-Plane; since
|
||||
X-Plane works at least partly from derived values, the sim will not behave
|
||||
properly until this is called.
|
||||
|
||||
WARNING: this routine does not necessarily place the airplane at the
|
||||
airport; use XPLMSetUsersAircraft to be compatible. This routine is
|
||||
provided to do special experimentation with flight models without resetting
|
||||
flight.
|
||||
}
|
||||
PROCEDURE XPLMReinitUsersPlane;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
+245
-213
@@ -1,381 +1,413 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMPlugin;
|
||||
INTERFACE
|
||||
{
|
||||
These APIs provide facilities to find and work with other plugins and
|
||||
manage other plugins.
|
||||
These APIs provide facilities to find and work with other plugins and
|
||||
manage other plugins.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* FINDING PLUGINS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These APIs allow you to find another plugin or yourself, or iterate across
|
||||
all plugins. For example, if you wrote an FMS plugin that needed to talk
|
||||
to an autopilot plugin, you could use these APIs to locate the autopilot
|
||||
plugin.
|
||||
These APIs allow you to find another plugin or yourself, or iterate across
|
||||
all plugins. For example, if you wrote an FMS plugin that needed to talk
|
||||
to an autopilot plugin, you could use these APIs to locate the autopilot
|
||||
plugin.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMGetMyID
|
||||
|
||||
This routine returns the plugin ID of the calling plug-in. Call this to
|
||||
get your own ID.
|
||||
This routine returns the plugin ID of the calling plug-in. Call this to
|
||||
get your own ID.
|
||||
}
|
||||
FUNCTION XPLMGetMyID: XPLMPluginID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCountPlugins
|
||||
|
||||
This routine returns the total number of plug-ins that are loaded, both
|
||||
disabled and enabled.
|
||||
This routine returns the total number of plug-ins that are loaded, both
|
||||
disabled and enabled.
|
||||
}
|
||||
FUNCTION XPLMCountPlugins: integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMCountPlugins: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetNthPlugin
|
||||
|
||||
This routine returns the ID of a plug-in by index. Index is 0 based from 0
|
||||
to XPLMCountPlugins-1, inclusive. Plugins may be returned in any arbitrary
|
||||
order.
|
||||
This routine returns the ID of a plug-in by index. Index is 0 based from 0
|
||||
to XPLMCountPlugins-1, inclusive. Plugins may be returned in any arbitrary
|
||||
order.
|
||||
}
|
||||
FUNCTION XPLMGetNthPlugin(
|
||||
inIndex : integer) : XPLMPluginID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inIndex : Integer) : XPLMPluginID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMFindPluginByPath
|
||||
|
||||
This routine returns the plug-in ID of the plug-in whose file exists at the
|
||||
passed in absolute file system path. XPLM_NO_PLUGIN_ID is returned if the
|
||||
path does not point to a currently loaded plug-in.
|
||||
This routine returns the plug-in ID of the plug-in whose file exists at the
|
||||
passed in absolute file system path. XPLM_NO_PLUGIN_ID is returned if the
|
||||
path does not point to a currently loaded plug-in.
|
||||
}
|
||||
FUNCTION XPLMFindPluginByPath(
|
||||
inPath : Pchar) : XPLMPluginID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inPath : XPLMString) : XPLMPluginID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMFindPluginBySignature
|
||||
|
||||
This routine returns the plug-in ID of the plug-in whose signature matches
|
||||
what is passed in or XPLM_NO_PLUGIN_ID if no running plug-in has this
|
||||
signature. Signatures are the best way to identify another plug-in as they
|
||||
are independent of the file system path of a plug-in or the human-readable
|
||||
plug-in name, and should be unique for all plug-ins. Use this routine to
|
||||
locate another plugin that your plugin interoperates with
|
||||
This routine returns the plug-in ID of the plug-in whose signature matches
|
||||
what is passed in or XPLM_NO_PLUGIN_ID if no running plug-in has this
|
||||
signature. Signatures are the best way to identify another plug-in as they
|
||||
are independent of the file system path of a plug-in or the human-readable
|
||||
plug-in name, and should be unique for all plug-ins. Use this routine to
|
||||
locate another plugin that your plugin interoperates with
|
||||
}
|
||||
FUNCTION XPLMFindPluginBySignature(
|
||||
inSignature : Pchar) : XPLMPluginID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inSignature : XPLMString) : XPLMPluginID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetPluginInfo
|
||||
|
||||
This routine returns information about a plug-in. Each parameter should be
|
||||
a pointer to a buffer of at least 256 characters, or NULL to not receive
|
||||
the information.
|
||||
This routine returns information about a plug-in. Each parameter should be
|
||||
a pointer to a buffer of at least
|
||||
256 characters, or NULL to not receive the information.
|
||||
|
||||
outName - the human-readable name of the plug-in. outFilePath - the
|
||||
absolute file path to the file that contains this plug-in. outSignature - a
|
||||
unique string that identifies this plug-in. outDescription - a
|
||||
human-readable description of this plug-in.
|
||||
outName - the human-readable name of the plug-in. outFilePath - the
|
||||
absolute file path to the file that contains this plug-in. outSignature - a
|
||||
unique string that identifies this plug-in. outDescription - a
|
||||
human-readable description of this plug-in.
|
||||
}
|
||||
PROCEDURE XPLMGetPluginInfo(
|
||||
inPlugin : XPLMPluginID;
|
||||
outName : Pchar; { Can be nil }
|
||||
outFilePath : Pchar; { Can be nil }
|
||||
outSignature : Pchar; { Can be nil }
|
||||
outDescription : Pchar); { Can be nil }
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
outName : XPLMString; { Can be nil }
|
||||
outFilePath : XPLMString; { Can be nil }
|
||||
outSignature : XPLMString; { Can be nil }
|
||||
outDescription : XPLMString); { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* ENABLING/DISABLING PLUG-INS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These routines are used to work with plug-ins and manage them. Most
|
||||
plugins will not need to use these APIs.
|
||||
These routines are used to work with plug-ins and manage them. Most
|
||||
plugins will not need to use these APIs.
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMIsPluginEnabled
|
||||
|
||||
Returns whether the specified plug-in is enabled for running.
|
||||
Returns whether the specified plug-in is enabled for running.
|
||||
}
|
||||
FUNCTION XPLMIsPluginEnabled(
|
||||
inPluginID : XPLMPluginID) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inPluginID : XPLMPluginID) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMEnablePlugin
|
||||
|
||||
This routine enables a plug-in if it is not already enabled. It returns 1
|
||||
if the plugin was enabled or successfully enables itself, 0 if it does not.
|
||||
Plugins may fail to enable (for example, if resources cannot be acquired)
|
||||
by returning 0 from their XPluginEnable callback.
|
||||
This routine enables a plug-in if it is not already enabled. It returns 1
|
||||
if the plugin was enabled or successfully enables itself, 0 if it does not.
|
||||
Plugins may fail to enable (for example, if resources cannot be acquired)
|
||||
by returning 0 from their XPluginEnable callback.
|
||||
}
|
||||
FUNCTION XPLMEnablePlugin(
|
||||
inPluginID : XPLMPluginID) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inPluginID : XPLMPluginID) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDisablePlugin
|
||||
|
||||
This routine disableds an enabled plug-in.
|
||||
This routine disableds an enabled plug-in.
|
||||
}
|
||||
PROCEDURE XPLMDisablePlugin(
|
||||
inPluginID : XPLMPluginID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMReloadPlugins
|
||||
|
||||
This routine reloads all plug-ins. Once this routine is called and you
|
||||
return from the callback you were within (e.g. a menu select callback) you
|
||||
will receive your XPluginDisable and XPluginStop callbacks and your DLL
|
||||
will be unloaded, then the start process happens as if the sim was starting
|
||||
up.
|
||||
This routine reloads all plug-ins. Once this routine is called and you
|
||||
return from the callback you were within (e.g. a menu select callback) you
|
||||
will receive your XPluginDisable and XPluginStop callbacks and your DLL
|
||||
will be unloaded, then the start process happens as if the sim was starting
|
||||
up.
|
||||
}
|
||||
PROCEDURE XPLMReloadPlugins;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* INTERPLUGIN MESSAGING
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF
|
||||
are reserved for X-Plane and the plugin SDK.
|
||||
Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF
|
||||
are reserved for X-Plane and the plugin SDK.
|
||||
|
||||
Messages have two conceptual uses: notifications and commands. Commands
|
||||
are sent from one plugin to another to induce behavior; notifications are
|
||||
sent from one plugin to all others for informational purposes. It is
|
||||
important that commands and notifications not have the same values because
|
||||
this could cause a notification sent by one plugin to accidentally induce a
|
||||
command in another.
|
||||
Messages come with a pointer parameter; the meaning of this pointer depends
|
||||
on the message itself. In some messages, the pointer parameter contains an
|
||||
actual typed pointer to data that can be inspected in the plugin; in these
|
||||
cases the documentation will state that the parameter "points to"
|
||||
information.
|
||||
|
||||
By convention, plugin-defined notifications should have the high bit set
|
||||
(e.g. be greater or equal to unsigned 0x8000000) while commands should have
|
||||
this bit be cleared.
|
||||
in other cases, the value of the pointer is actually an integral number
|
||||
stuffed into the pointer's storage. In these second cases, the pointer
|
||||
parameter needs to be cast, not dereferenced. In these caess, the
|
||||
documentation will state that the parameter "contains" a value, which will
|
||||
always be an integral type.
|
||||
|
||||
The following messages are sent to your plugin by x-plane.
|
||||
Some messages don't use the pointer parameter - in this case your plugin
|
||||
should ignore it.
|
||||
|
||||
Messages have two conceptual uses: notifications and commands. Commands
|
||||
are sent from one plugin to another to induce behavior; notifications are
|
||||
sent from one plugin to all others for informational purposes. It is
|
||||
important that commands and notifications not have the same values because
|
||||
this could cause a notification sent by one plugin to accidentally induce a
|
||||
command in another.
|
||||
|
||||
By convention, plugin-defined notifications should have the high bit set
|
||||
(e.g. be greater or equal to unsigned 0x8000000) while commands should have
|
||||
this bit be cleared.
|
||||
|
||||
The following messages are sent to your plugin by X-Plane.
|
||||
}
|
||||
|
||||
|
||||
|
||||
CONST
|
||||
{ This message is sent to your plugin whenever the user's plane crashes. }
|
||||
{ This message is sent to your plugin whenever the user's plane crashes. The }
|
||||
{ parameter is ignored. }
|
||||
XPLM_MSG_PLANE_CRASHED = 101;
|
||||
|
||||
{ This message is sent to your plugin whenever a new plane is loaded. The }
|
||||
{ parameter is the number of the plane being loaded; 0 indicates the user's }
|
||||
{ plane. }
|
||||
{ This message is sent to your plugin whenever a new plane is loaded. The }
|
||||
{ parameter contains the index number of the plane being loaded; 0 indicates }
|
||||
{ the user's plane. }
|
||||
XPLM_MSG_PLANE_LOADED = 102;
|
||||
|
||||
{ This messages is called whenever the user's plane is positioned at a new }
|
||||
{ airport. }
|
||||
{ This messages is sent whenever the user's plane is positioned at a new }
|
||||
{ airport. The parameter is ignored. }
|
||||
XPLM_MSG_AIRPORT_LOADED = 103;
|
||||
|
||||
{ This message is sent whenever new scenery is loaded. Use datarefs to }
|
||||
{ determine the new scenery files that were loaded. }
|
||||
{ This message is sent whenever new scenery is loaded. Use datarefs to }
|
||||
{ determine the new scenery files that were loaded. The parameter is ignored.}
|
||||
XPLM_MSG_SCENERY_LOADED = 104;
|
||||
|
||||
{ This message is sent whenever the user adjusts the number of X-Plane }
|
||||
{ aircraft models. You must use XPLMCountPlanes to find out how many planes }
|
||||
{ are now available. This message will only be sent in XP7 and higher }
|
||||
{ because in XP6 the number of aircraft is not user-adjustable. }
|
||||
{ This message is sent whenever the user adjusts the number of X-Plane }
|
||||
{ aircraft models. You must use XPLMCountPlanes to find out how many planes }
|
||||
{ are now available. This message will only be sent in XP7 and higher }
|
||||
{ because in XP6 the number of aircraft is not user-adjustable. The parameter}
|
||||
{ is ignored. }
|
||||
XPLM_MSG_AIRPLANE_COUNT_CHANGED = 105;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{ This message is sent to your plugin whenever a plane is unloaded. The }
|
||||
{ parameter is the number of the plane being unloaded; 0 indicates the user's }
|
||||
{ plane. The parameter is of type int, passed as the value of the pointer. }
|
||||
{ (That is: the parameter is an int, not a pointer to an int.) }
|
||||
CONST
|
||||
{ This message is sent to your plugin whenever a plane is unloaded. The }
|
||||
{ parameter contains the index number of the plane being unloaded; 0 }
|
||||
{ indicates the user's plane. The parameter is of type int, passed as the }
|
||||
{ value of the pointer. (That is: the parameter is an int, not a pointer to }
|
||||
{ an int.) }
|
||||
XPLM_MSG_PLANE_UNLOADED = 106;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{ This message is sent to your plugin right before X-Plane writes its }
|
||||
{ preferences file. You can use this for two purposes: to write your own }
|
||||
{ preferences, and to modify any datarefs to influence preferences output. }
|
||||
{ For example, if your plugin temporarily modifies saved preferences, you can }
|
||||
{ put them back to their default values here to avoid having the tweaks be }
|
||||
{ persisted if your plugin is not loaded on the next invocation of X-Plane. }
|
||||
CONST
|
||||
{ This message is sent to your plugin right before X-Plane writes its }
|
||||
{ preferences file. You can use this for two purposes: to write your own }
|
||||
{ preferences, and to modify any datarefs to influence preferences output. }
|
||||
{ For example, if your plugin temporarily modifies saved preferences, you can}
|
||||
{ put them back to their default values here to avoid having the tweaks be }
|
||||
{ persisted if your plugin is not loaded on the next invocation of X-Plane. }
|
||||
{ The parameter is ignored. }
|
||||
XPLM_MSG_WILL_WRITE_PREFS = 107;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{ This message is sent to your plugin right after a livery is loaded for an }
|
||||
{ airplane. You can use this to check the new livery (via datarefs) and }
|
||||
{ react accordingly. The parameter is of type int, passed as the value of a }
|
||||
{ pointer and represents the aicraft plane number - 0 is the user's plane. }
|
||||
{ This message is sent to your plugin right after a livery is loaded for an }
|
||||
{ airplane. You can use this to check the new livery (via datarefs) and }
|
||||
{ react accordingly. The parameter contains the index number of the aircraft}
|
||||
{ whose livery is changing. }
|
||||
XPLM_MSG_LIVERY_LOADED = 108;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM301}
|
||||
CONST
|
||||
{ Sent to your plugin right before X-Plane enters virtual reality mode (at }
|
||||
{ which time any windows that are not positioned in VR mode will no longer be}
|
||||
{ visible to the user). The parameter is unused and should be ignored. }
|
||||
XPLM_MSG_ENTERED_VR = 109;
|
||||
{$ENDIF XPLM301}
|
||||
|
||||
{$IFDEF XPLM301}
|
||||
{ Sent to your plugin right before X-Plane leaves virtual reality mode (at }
|
||||
{ which time you may want to clean up windows that are positioned in VR }
|
||||
{ mode). The parameter is unused and should be ignored. }
|
||||
XPLM_MSG_EXITING_VR = 110;
|
||||
{$ENDIF XPLM301}
|
||||
|
||||
{$IFDEF XPLM303}
|
||||
CONST
|
||||
{ Sent to your plugin if another plugin wants to take over AI planes. If you }
|
||||
{ are a synthetic traffic provider, that probably means a plugin for an }
|
||||
{ online network has connected and wants to supply aircraft flown by real }
|
||||
{ humans and you should cease to provide synthetic traffic. If however you }
|
||||
{ are providing online traffic from real humans, you probably don't want to }
|
||||
{ disconnect, in which case you just ignore this message. The sender is the }
|
||||
{ plugin ID of the plugin asking for control of the planes now. You can use }
|
||||
{ it to find out who is requesting and whether you should yield to them. }
|
||||
{ Synthetic traffic providers should always yield to online networks. The }
|
||||
{ parameter is unused and should be ignored. }
|
||||
XPLM_MSG_RELEASE_PLANES = 111;
|
||||
{$ENDIF XPLM303}
|
||||
|
||||
{
|
||||
XPLMSendMessageToPlugin
|
||||
|
||||
This function sends a message to another plug-in or X-Plane. Pass
|
||||
XPLM_NO_PLUGIN_ID to broadcast to all plug-ins. Only enabled plug-ins with
|
||||
a message receive function receive the message.
|
||||
This function sends a message to another plug-in or X-Plane. Pass
|
||||
XPLM_NO_PLUGIN_ID to broadcast to all plug-ins. Only enabled plug-ins with
|
||||
a message receive function receive the message.
|
||||
}
|
||||
PROCEDURE XPLMSendMessageToPlugin(
|
||||
inPlugin : XPLMPluginID;
|
||||
inMessage : integer;
|
||||
inMessage : Integer;
|
||||
inParam : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{___________________________________________________________________________
|
||||
* Plugin Features API
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The plugin features API allows your plugin to "sign up" for additional
|
||||
capabilities and plugin system features that are normally disabled for
|
||||
backward compatibility. This allows advanced plugins to "opt-in" to new
|
||||
behavior.
|
||||
The plugin features API allows your plugin to "sign up" for additional
|
||||
capabilities and plugin system features that are normally disabled for
|
||||
backward compatibility. This allows advanced plugins to "opt-in" to new
|
||||
behavior.
|
||||
|
||||
Each feature is defined by a permanent string name. The feature string
|
||||
names will vary with the particular installation of X-Plane, so plugins
|
||||
should not expect a feature to be guaranteed present.
|
||||
Each feature is defined by a permanent string name. The feature string
|
||||
names will vary with the particular installation of X-Plane, so plugins
|
||||
should not expect a feature to be guaranteed present.
|
||||
|
||||
XPLM_WANTS_REFLECTIONS
|
||||
----------------------
|
||||
|
||||
Available in the SDK 2.0 and later for X-Plane 9, enabling this capability
|
||||
causes your plugin to receive drawing hook callbacks when X-Plane builds
|
||||
its off-screen reflection and shadow rendering passes. Plugins should
|
||||
enable this and examine the dataref sim/graphics/view/plane_render_type to
|
||||
determine whether the drawing callback is for a reflection, shadow
|
||||
calculation, or the main screen. Rendering can be simlified or omitted for
|
||||
reflections, and non-solid drawing should be skipped for shadow
|
||||
calculations.
|
||||
|
||||
**Note**: direct drawing via draw callbacks is not recommended; use the
|
||||
XPLMInstance API to create object models instead.
|
||||
|
||||
XPLM_USE_NATIVE_PATHS
|
||||
---------------------
|
||||
|
||||
available in the SDK 2.1 and later for X-Plane 10, this modifies the plugin
|
||||
system to use Unix-style paths on all operating systems. With this enabled:
|
||||
|
||||
* OS X paths will match the native OS X Unix.
|
||||
* Windows will use forward slashes but preserve C:\ or another drive letter
|
||||
when using complete file paths.
|
||||
* Linux uses its native file system path scheme.
|
||||
|
||||
Without this enabled:
|
||||
|
||||
* OS X will use CFM file paths separated by a colon.
|
||||
* Windows will use back-slashes and conventional DOS paths.
|
||||
* Linux uses its native file system path scheme.
|
||||
|
||||
All plugins should enable this feature on OS X to access the native file
|
||||
system.
|
||||
|
||||
XPLM_USE_NATIVE_WIDGET_WINDOWS
|
||||
------------------------------
|
||||
|
||||
Available in the SDK 3.0.2 SDK, this capability tells the widgets library
|
||||
to use new, modern X-Plane backed XPLMDisplay windows to anchor all widget
|
||||
trees. Without it, widgets will always use legacy windows.
|
||||
|
||||
Plugins should enable this to allow their widget hierarchies to respond to
|
||||
the user's UI size settings and to map widget-based windwos to a VR HMD.
|
||||
|
||||
Before enabling this, make sure any custom widget code in your plugin is
|
||||
prepared to cope with the UI coordinate system not being th same as the
|
||||
OpenGL window coordinate system.
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMFeatureEnumerator_f
|
||||
|
||||
You pass an XPLMFeatureEnumerator_f to get a list of all features supported
|
||||
by a given version running version of X-Plane. This routine is called once
|
||||
for each feature.
|
||||
You pass an XPLMFeatureEnumerator_f to get a list of all features supported
|
||||
by a given version running version of X-Plane. This routine is called once
|
||||
for each feature.
|
||||
}
|
||||
TYPE
|
||||
XPLMFeatureEnumerator_f = PROCEDURE(
|
||||
inFeature : Pchar;
|
||||
inFeature : XPLMString;
|
||||
inRef : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMHasFeature
|
||||
|
||||
This returns 1 if the given installation of X-Plane supports a feature, or
|
||||
0 if it does not.
|
||||
This returns 1 if the given installation of X-Plane supports a feature, or
|
||||
0 if it does not.
|
||||
}
|
||||
FUNCTION XPLMHasFeature(
|
||||
inFeature : Pchar) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inFeature : XPLMString) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMIsFeatureEnabled
|
||||
|
||||
This returns 1 if a feature is currently enabled for your plugin, or 0 if
|
||||
it is not enabled. It is an error to call this routine with an unsupported
|
||||
feature.
|
||||
This returns 1 if a feature is currently enabled for your plugin, or 0 if
|
||||
it is not enabled. It is an error to call this routine with an unsupported
|
||||
feature.
|
||||
}
|
||||
FUNCTION XPLMIsFeatureEnabled(
|
||||
inFeature : Pchar) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inFeature : XPLMString) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMEnableFeature
|
||||
|
||||
This routine enables or disables a feature for your plugin. This will
|
||||
change the running behavior of X-Plane and your plugin in some way,
|
||||
depending on the feature.
|
||||
This routine enables or disables a feature for your plugin. This will
|
||||
change the running behavior of X-Plane and your plugin in some way,
|
||||
depending on the feature.
|
||||
}
|
||||
PROCEDURE XPLMEnableFeature(
|
||||
inFeature : Pchar;
|
||||
inEnable : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
inFeature : XPLMString;
|
||||
inEnable : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMEnumerateFeatures
|
||||
|
||||
This routine calls your enumerator callback once for each feature that this
|
||||
running version of X-Plane supports. Use this routine to determine all of
|
||||
the features that X-Plane can support.
|
||||
This routine calls your enumerator callback once for each feature that this
|
||||
running version of X-Plane supports. Use this routine to determine all of
|
||||
the features that X-Plane can support.
|
||||
}
|
||||
PROCEDURE XPLMEnumerateFeatures(
|
||||
inEnumerator : XPLMFeatureEnumerator_f;
|
||||
inRef : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$ENDIF}
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
@@ -1,276 +1,254 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMProcessing;
|
||||
INTERFACE
|
||||
{
|
||||
This API allows you to get regular callbacks during the flight loop, the
|
||||
part of X-Plane where the plane's position calculates the physics of
|
||||
flight, etc. Use these APIs to accomplish periodic tasks like logging data
|
||||
and performing I/O.
|
||||
This API allows you to get regular callbacks during the flight loop, the
|
||||
part of X-Plane where the plane's position calculates the physics of
|
||||
flight, etc. Use these APIs to accomplish periodic tasks like logging data
|
||||
and performing I/O.
|
||||
|
||||
WARNING: Do NOT use these callbacks to draw! You cannot draw during flight
|
||||
loop callbacks. Use the drawing callbacks (see XPLMDisplay for more info)
|
||||
for graphics.
|
||||
You can receive a callback either just before or just after the per-frame
|
||||
physics calculations happen - you can use post-FM callbacks to "patch" the
|
||||
flight model after it has run.
|
||||
|
||||
If the user has set the number of flight model iterations per frame greater
|
||||
than one your plugin will _not_ see this; these integrations run on the
|
||||
sub-section of the flight model where iterations improve responsiveness
|
||||
(e.g. physical integration, not simple systems tracking) and are thus
|
||||
opaque to plugins.
|
||||
|
||||
Flight loop scheduling, when scheduled by time, is scheduled by a "first
|
||||
callback after the deadline" schedule, e.g. your callbacks will always be
|
||||
slightly late to ensure that we don't run faster than your deadline.
|
||||
|
||||
WARNING: Do NOT use these callbacks to draw! You cannot draw during flight
|
||||
loop callbacks. Use the drawing callbacks (see XPLMDisplay for more info)
|
||||
for graphics. (One exception: you can use a post-flight loop callback to
|
||||
update your own off-screen FBOs.)
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{___________________________________________________________________________
|
||||
* FLIGHT LOOP CALLBACKS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMFlightLoopPhaseType
|
||||
|
||||
You can register a flight loop callback to run either before or after the
|
||||
flight model is integrated by X-Plane.
|
||||
You can register a flight loop callback to run either before or after the
|
||||
flight model is integrated by X-Plane.
|
||||
}
|
||||
TYPE
|
||||
XPLMFlightLoopPhaseType = (
|
||||
{ Your callback runs before X-Plane integrates the flight model. }
|
||||
{ Your callback runs before X-Plane integrates the flight model. }
|
||||
xplm_FlightLoop_Phase_BeforeFlightModel = 0
|
||||
|
||||
{ Your callback runs after X-Plane integrates the flight model. }
|
||||
{ Your callback runs after X-Plane integrates the flight model. }
|
||||
,xplm_FlightLoop_Phase_AfterFlightModel = 1
|
||||
|
||||
);
|
||||
PXPLMFlightLoopPhaseType = ^XPLMFlightLoopPhaseType;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMFlightLoopID
|
||||
|
||||
This is an opaque identifier for a flight loop callback. You can use this
|
||||
identifier to easily track and remove your callbacks, or to use the new
|
||||
flight loop APIs.
|
||||
This is an opaque identifier for a flight loop callback. You can use this
|
||||
identifier to easily track and remove your callbacks, or to use the new
|
||||
flight loop APIs.
|
||||
}
|
||||
XPLMFlightLoopID = pointer;
|
||||
PXPLMFlightLoopID = ^XPLMFlightLoopID;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{
|
||||
XPLMFlightLoop_f
|
||||
|
||||
This is your flight loop callback. Each time the flight loop is iterated
|
||||
through, you receive this call at the end. You receive a time since you
|
||||
were last called and a time since the last loop, as well as a loop counter.
|
||||
The 'phase' parameter is deprecated and should be ignored.
|
||||
This is your flight loop callback. Each time the flight loop is iterated
|
||||
through, you receive this call at the end.
|
||||
|
||||
Your return value controls when you will next be called. Return 0 to stop
|
||||
receiving callbacks. Pass a positive number to specify how many seconds
|
||||
until the next callback. (You will be called at or after this time, not
|
||||
before.) Pass a negative number to specify how many loops must go by until
|
||||
you are called. For example, -1.0 means call me the very next loop. Try
|
||||
to run your flight loop as infrequently as is practical, and suspend it
|
||||
(using return value 0) when you do not need it; lots of flight loop
|
||||
callbacks that do nothing lowers x-plane's frame rate.
|
||||
Flight loop callbacks receive a number of input timing parameters. These
|
||||
input timing parameters are not particularly useful; you may need to track
|
||||
your own timing data (e.g. by reading datarefs). The input parameters are:
|
||||
|
||||
Your callback will NOT be unregistered if you return 0; it will merely be
|
||||
inactive.
|
||||
- inElapsedSinceLastCall: the wall time since your last callback.
|
||||
- inElapsedTimeSinceLastFlightLoop: the wall time since any flight loop was
|
||||
dispatched.
|
||||
- inCounter: a monotonically increasing counter, bumped once per flight
|
||||
loop dispatch from the sim.
|
||||
- inRefcon: your own ptr constant from when you regitered yor callback.
|
||||
|
||||
The reference constant you passed to your loop is passed back to you.
|
||||
Your return value controls when you will next be called.
|
||||
|
||||
- Return 0 to stop receiving callbacks.
|
||||
- Pass a positive number to specify how many seconds until the next
|
||||
callback. (You will be called at or after this time, not before.)
|
||||
- Pass a negative number to specify how many loops must go by until you
|
||||
are called. For example, -1.0 means call me the very next loop.
|
||||
|
||||
Try to run your flight loop as infrequently as is practical, and suspend it
|
||||
(using return value 0) when you do not need it; lots of flight loop
|
||||
callbacks that do nothing lowers X-Plane's frame rate.
|
||||
|
||||
Your callback will NOT be unregistered if you return 0; it will merely be
|
||||
inactive.
|
||||
}
|
||||
TYPE
|
||||
XPLMFlightLoop_f = FUNCTION(
|
||||
inElapsedSinceLastCall: single;
|
||||
inElapsedTimeSinceLastFlightLoop: single;
|
||||
inCounter : integer;
|
||||
inRefcon : pointer) : single; cdecl;
|
||||
inElapsedSinceLastCall: Single;
|
||||
inElapsedTimeSinceLastFlightLoop: Single;
|
||||
inCounter : Integer;
|
||||
inRefcon : pointer) : Single; cdecl;
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMCreateFlightLoop_t
|
||||
|
||||
XPLMCreateFlightLoop_t contains the parameters to create a new flight loop
|
||||
callback. The strsucture can be expanded in future SDKs - always set
|
||||
structSize to the size of your structure in bytes.
|
||||
XPLMCreateFlightLoop_t contains the parameters to create a new flight loop
|
||||
callback. The strsucture can be expanded in future SDKs - always set
|
||||
structSize to the size of your structure in bytes.
|
||||
}
|
||||
TYPE
|
||||
XPLMCreateFlightLoop_t = RECORD
|
||||
structSize : integer;
|
||||
structSize : Integer;
|
||||
phase : XPLMFlightLoopPhaseType;
|
||||
callbackFunc : XPLMFlightLoop_f;
|
||||
refcon : pointer;
|
||||
END;
|
||||
PXPLMCreateFlightLoop_t = ^XPLMCreateFlightLoop_t;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{
|
||||
XPLMGetElapsedTime
|
||||
|
||||
This routine returns the elapsed time since the sim started up in decimal
|
||||
seconds.
|
||||
This routine returns the elapsed time since the sim started up in decimal
|
||||
seconds. This is a wall timer; it keeps counting upward even if the sim is
|
||||
pasued.
|
||||
|
||||
__WARNING__: XPLMGetElapsedTime is not a very good timer! It lacks
|
||||
precision in both its data type and its source. Do not attempt to use it
|
||||
for timing critical applications like network multiplayer.
|
||||
}
|
||||
FUNCTION XPLMGetElapsedTime: single;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMGetElapsedTime: Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetCycleNumber
|
||||
|
||||
This routine returns a counter starting at zero for each sim cycle
|
||||
computed/video frame rendered.
|
||||
This routine returns a counter starting at zero for each sim cycle
|
||||
computed/video frame rendered.
|
||||
}
|
||||
FUNCTION XPLMGetCycleNumber: integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
FUNCTION XPLMGetCycleNumber: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMRegisterFlightLoopCallback
|
||||
|
||||
This routine registers your flight loop callback. Pass in a pointer to a
|
||||
flight loop function and a refcon. inInterval defines when you will be
|
||||
called. Pass in a positive number to specify seconds from registration
|
||||
time to the next callback. Pass in a negative number to indicate when you
|
||||
will be called (e.g. pass -1 to be called at the next cylcle). Pass 0 to
|
||||
not be called; your callback will be inactive.
|
||||
This routine registers your flight loop callback. Pass in a pointer to a
|
||||
flight loop function and a refcon. inInterval defines when you will be
|
||||
called. Pass in a positive number to specify seconds from registration time
|
||||
to the next callback. Pass in a negative number to indicate when you will
|
||||
be called (e.g. pass -1 to be called at the next cylcle). Pass 0 to not be
|
||||
called; your callback will be inactive.
|
||||
|
||||
(This legacy function only installs pre-flight-loop callbacks; use
|
||||
XPLMCreateFlightLoop for more control.)
|
||||
}
|
||||
PROCEDURE XPLMRegisterFlightLoopCallback(
|
||||
inFlightLoop : XPLMFlightLoop_f;
|
||||
inInterval : single;
|
||||
inInterval : Single;
|
||||
inRefcon : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMUnregisterFlightLoopCallback
|
||||
|
||||
This routine unregisters your flight loop callback. Do NOT call it from
|
||||
your flight loop callback. Once your flight loop callback is
|
||||
unregistered, it will not be called again.
|
||||
This routine unregisters your flight loop callback. Do NOT call it from
|
||||
your flight loop callback. Once your flight loop callback is unregistered,
|
||||
it will not be called again.
|
||||
|
||||
Only use this on flight loops registered via
|
||||
XPLMRegisterFlightLoopCallback.
|
||||
}
|
||||
PROCEDURE XPLMUnregisterFlightLoopCallback(
|
||||
inFlightLoop : XPLMFlightLoop_f;
|
||||
inRefcon : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetFlightLoopCallbackInterval
|
||||
|
||||
This routine sets when a callback will be called. Do NOT call it from your
|
||||
callback; use the return value of the callback to change your callback
|
||||
interval from inside your callback.
|
||||
This routine sets when a callback will be called. Do NOT call it from your
|
||||
callback; use the return value of the callback to change your callback
|
||||
interval from inside your callback.
|
||||
|
||||
inInterval is formatted the same way as in XPLMRegisterFlightLoopCallback;
|
||||
positive for seconds, negative for cycles, and 0 for deactivating the
|
||||
callback. If inRelativeToNow is 1, times are from the time of this call;
|
||||
otherwise they are from the time the callback was last called (or the time
|
||||
it was registered if it has never been called.
|
||||
inInterval is formatted the same way as in XPLMRegisterFlightLoopCallback;
|
||||
positive for seconds, negative for cycles, and 0 for deactivating the
|
||||
callback. If inRelativeToNow is 1, times are from the time of this call;
|
||||
otherwise they are from the time the callback was last called (or the time
|
||||
it was registered if it has never been called.
|
||||
}
|
||||
PROCEDURE XPLMSetFlightLoopCallbackInterval(
|
||||
inFlightLoop : XPLMFlightLoop_f;
|
||||
inInterval : single;
|
||||
inRelativeToNow : integer;
|
||||
inInterval : Single;
|
||||
inRelativeToNow : Integer;
|
||||
inRefcon : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMCreateFlightLoop
|
||||
|
||||
This routine creates a flight loop callback and returns its ID. The flight
|
||||
loop callback is created using the input param struct, and is inited to be
|
||||
unscheduled.
|
||||
This routine creates a flight loop callback and returns its ID. The flight
|
||||
loop callback is created using the input param struct, and is inited to be
|
||||
unscheduled.
|
||||
}
|
||||
FUNCTION XPLMCreateFlightLoop(
|
||||
inParams : PXPLMCreateFlightLoop_t) : XPLMFlightLoopID;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMDestroyFlightLoop
|
||||
|
||||
This routine destroys a flight loop callback by ID.
|
||||
This routine destroys a flight loop callback by ID. Only call it on flight
|
||||
loops created with the newer XPLMCreateFlightLoop API.
|
||||
}
|
||||
PROCEDURE XPLMDestroyFlightLoop(
|
||||
inFlightLoopID : XPLMFlightLoopID);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMScheduleFlightLoop
|
||||
|
||||
This routine schedules a flight loop callback for future execution. If
|
||||
inInterval is negative, it is run in a certain number of frames based on
|
||||
the absolute value of the input. If the interval is positive, it is a
|
||||
duration in seconds.
|
||||
This routine schedules a flight loop callback for future execution. If
|
||||
inInterval is negative, it is run in a certain number of frames based on
|
||||
the absolute value of the input. If the interval is positive, it is a
|
||||
duration in seconds.
|
||||
|
||||
If inRelativeToNow is true, ties are interpretted relative to the time this
|
||||
routine is called; otherwise they are relative to the last call time or the
|
||||
time the flight loop was registered (if never called).
|
||||
|
||||
THREAD SAFETY: it is legal to call this routine from any thread under the
|
||||
following conditions:
|
||||
|
||||
1. The call must be between the beginning of an XPLMEnable and the end of
|
||||
an XPLMDisable sequence. (That is, you must not call this routine from
|
||||
thread activity when your plugin was supposed to be disabled. Since
|
||||
plugins are only enabled while loaded, this also implies you cannot run
|
||||
this routine outside an XPLMStart/XPLMStop sequence.)
|
||||
|
||||
2. You may not call this routine re-entrantly for a single flight loop ID.
|
||||
(That is, you can't enable from multiple threads at the same time.)
|
||||
|
||||
3. You must call this routine between the time after XPLMCreateFlightLoop
|
||||
returns a value and the time you call XPLMDestroyFlightLoop. (That is, you
|
||||
must ensure that your threaded activity is within the life of the object.
|
||||
The SDK does not check this for you, nor does it synchronize destruction of
|
||||
the object.)
|
||||
|
||||
4. The object must be unscheduled if this routine is to be called from a
|
||||
thread other than the main thread.
|
||||
If inRelativeToNow is true, ties are interpretted relative to the time this
|
||||
routine is called; otherwise they are relative to the last call time or the
|
||||
time the flight loop was registered (if never called).
|
||||
}
|
||||
PROCEDURE XPLMScheduleFlightLoop(
|
||||
inFlightLoopID : XPLMFlightLoopID;
|
||||
inInterval : single;
|
||||
inRelativeToNow : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
inInterval : Single;
|
||||
inRelativeToNow : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
+250
-235
@@ -1,67 +1,63 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik
|
||||
|
||||
All rights reserved. See license.txt for usage.
|
||||
|
||||
X-Plane SDK Version: 2.1.1
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMScenery;
|
||||
INTERFACE
|
||||
{
|
||||
This package contains APIs to interact with X-Plane's scenery system.
|
||||
This package contains APIs to interact with X-Plane's scenery system.
|
||||
}
|
||||
|
||||
USES XPLMDefs;
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$IFDEF MSWINDOWS}
|
||||
{$DEFINE DELPHI}
|
||||
{$ENDIF}
|
||||
{$IFDEF XPLM200}
|
||||
{___________________________________________________________________________
|
||||
* Terrain Y-Testing
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The Y-testing API allows you to locate the physical scenery mesh. This
|
||||
would be used to place dynamic graphics on top of the ground in a
|
||||
plausible way or do physics interactions.
|
||||
The Y-testing API allows you to locate the physical scenery mesh. This
|
||||
would be used to place dynamic graphics on top of the ground in a plausible
|
||||
way or do physics interactions.
|
||||
|
||||
The Y-test API works via probe objects, which are allocated by your plugin
|
||||
and used to query terrain. Probe objects exist both to capture which
|
||||
algorithm you have requested (see probe types) and also to cache query
|
||||
information.
|
||||
The Y-test API works via probe objects, which are allocated by your plugin
|
||||
and used to query terrain. Probe objects exist both to capture which
|
||||
algorithm you have requested (see probe types) and also to cache query
|
||||
information.
|
||||
|
||||
Performance guidelines: It is generally faster to use the same probe for
|
||||
nearby points and different probes for different points. Try not to
|
||||
allocate more than "hundreds" of probes at most. Share probes if you need
|
||||
more. Generally, probing operations are expensive, and should be avoided
|
||||
via caching when possible.
|
||||
Performance Guidelines
|
||||
----------------------
|
||||
|
||||
Y testing returns a location on the terrain, a normal vectory, and a
|
||||
velocity vector. The normal vector tells you the slope of the terrain at
|
||||
that point. The velocity vector tells you if that terrain is moving (and
|
||||
is in meters/second). For example, if your Y test hits the aircraft carrier
|
||||
deck, this tells you the velocity of that point on the deck.
|
||||
It is generally faster to use the same probe for nearby points and
|
||||
different probes for different points. Try not to allocate more than
|
||||
"hundreds" of probes at most. Share probes if you need more. Generally,
|
||||
probing operations are expensive, and should be avoided via caching when
|
||||
possible.
|
||||
|
||||
Note: the Y-testing API is limited to probing the loaded scenery area,
|
||||
which is approximately 300x300 km in X-Plane 9. Probes outside this area
|
||||
will return the height of a 0 MSL sphere.
|
||||
Y testing returns a location on the terrain, a normal vectory, and a
|
||||
velocity vector. The normal vector tells you the slope of the terrain at
|
||||
that point. The velocity vector tells you if that terrain is moving (and is
|
||||
in meters/second). For example, if your Y test hits the aircraft carrier
|
||||
deck, this tells you the velocity of that point on the deck.
|
||||
|
||||
Note: the Y-testing API is limited to probing the loaded scenery area,
|
||||
which is approximately 300x300 km in X-Plane 9. Probes outside this area
|
||||
will return the height of a 0 MSL sphere.
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMProbeType
|
||||
|
||||
XPLMProbeType defines the type of terrain probe - each probe has a
|
||||
different algorithm. (Only one type of probe is provided right now, but
|
||||
future APIs will expose more flexible or poewrful or useful probes.
|
||||
XPLMProbeType defines the type of terrain probe - each probe has a
|
||||
different algorithm. (Only one type of probe is provided right now, but
|
||||
future APIs will expose more flexible or poewrful or useful probes.
|
||||
}
|
||||
TYPE
|
||||
XPLMProbeType = (
|
||||
{ The Y probe gives you the location of the tallest physical scenery along }
|
||||
{ the Y axis going through the queried point. }
|
||||
{ The Y probe gives you the location of the tallest physical scenery along }
|
||||
{ the Y axis going through the queried point. }
|
||||
xplm_ProbeY = 0
|
||||
|
||||
);
|
||||
@@ -70,18 +66,18 @@ TYPE
|
||||
{
|
||||
XPLMProbeResult
|
||||
|
||||
Probe results - possible results from a probe query.
|
||||
Probe results - possible results from a probe query.
|
||||
}
|
||||
XPLMProbeResult = (
|
||||
{ The probe hit terrain and returned valid values. }
|
||||
{ The probe hit terrain and returned valid values. }
|
||||
xplm_ProbeHitTerrain = 0
|
||||
|
||||
{ An error in the API call. Either the probe struct size is bad, or the }
|
||||
{ probe is invalid or the type is mismatched for the specific query call. }
|
||||
{ An error in the API call. Either the probe struct size is bad, or the }
|
||||
{ probe is invalid or the type is mismatched for the specific query call. }
|
||||
,xplm_ProbeError = 1
|
||||
|
||||
{ The probe call succeeded but there is no terrain under this point (perhaps }
|
||||
{ it is off the side of the planet?) }
|
||||
{ The probe call succeeded but there is no terrain under this point (perhaps }
|
||||
{ it is off the side of the planet?) }
|
||||
,xplm_ProbeMissed = 2
|
||||
|
||||
);
|
||||
@@ -90,8 +86,8 @@ TYPE
|
||||
{
|
||||
XPLMProbeRef
|
||||
|
||||
An XPLMProbeRef is an opaque handle to a probe, used for querying the
|
||||
terrain.
|
||||
An XPLMProbeRef is an opaque handle to a probe, used for querying the
|
||||
terrain.
|
||||
}
|
||||
XPLMProbeRef = pointer;
|
||||
PXPLMProbeRef = ^XPLMProbeRef;
|
||||
@@ -99,321 +95,340 @@ TYPE
|
||||
{
|
||||
XPLMProbeInfo_t
|
||||
|
||||
XPLMProbeInfo_t contains the results of a probe call. Make sure to set
|
||||
structSize to the size of the struct before using it.
|
||||
XPLMProbeInfo_t contains the results of a probe call. Make sure to set
|
||||
structSize to the size of the struct before using it.
|
||||
}
|
||||
XPLMProbeInfo_t = RECORD
|
||||
{ Size of structure in bytes - always set this before calling the XPLM. }
|
||||
structSize : integer;
|
||||
{ Resulting X location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationX : single;
|
||||
{ Resulting Y location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationY : single;
|
||||
{ Resulting Z location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationZ : single;
|
||||
{ X component of the normal vector to the terrain we found. }
|
||||
normalX : single;
|
||||
{ Y component of the normal vector to the terrain we found. }
|
||||
normalY : single;
|
||||
{ Z component of the normal vector to the terrain we found. }
|
||||
normalZ : single;
|
||||
{ X component of the velocity vector of the terrain we found. }
|
||||
velocityX : single;
|
||||
{ Y component of the velocity vector of the terrain we found. }
|
||||
velocityY : single;
|
||||
{ Z component of the velocity vector of the terrain we found. }
|
||||
velocityZ : single;
|
||||
{ Tells if the surface we hit is water (otherwise it is land). }
|
||||
is_wet : integer;
|
||||
{ Size of structure in bytes - always set this before calling the XPLM. }
|
||||
structSize : Integer;
|
||||
{ Resulting X location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationX : Single;
|
||||
{ Resulting Y location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationY : Single;
|
||||
{ Resulting Z location of the terrain point we hit, in local OpenGL }
|
||||
{ coordinates. }
|
||||
locationZ : Single;
|
||||
{ X component of the normal vector to the terrain we found. }
|
||||
normalX : Single;
|
||||
{ Y component of the normal vector to the terrain we found. }
|
||||
normalY : Single;
|
||||
{ Z component of the normal vector to the terrain we found. }
|
||||
normalZ : Single;
|
||||
{ X component of the velocity vector of the terrain we found. }
|
||||
velocityX : Single;
|
||||
{ Y component of the velocity vector of the terrain we found. }
|
||||
velocityY : Single;
|
||||
{ Z component of the velocity vector of the terrain we found. }
|
||||
velocityZ : Single;
|
||||
{ Tells if the surface we hit is water (otherwise it is land). }
|
||||
is_wet : Integer;
|
||||
END;
|
||||
PXPLMProbeInfo_t = ^XPLMProbeInfo_t;
|
||||
|
||||
{
|
||||
XPLMCreateProbe
|
||||
|
||||
Creates a new probe object of a given type and returns.
|
||||
Creates a new probe object of a given type and returns.
|
||||
}
|
||||
FUNCTION XPLMCreateProbe(
|
||||
inProbeType : XPLMProbeType) : XPLMProbeRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDestroyProbe
|
||||
|
||||
Deallocates an existing probe object.
|
||||
Deallocates an existing probe object.
|
||||
}
|
||||
PROCEDURE XPLMDestroyProbe(
|
||||
inProbe : XPLMProbeRef);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMProbeTerrainXYZ
|
||||
|
||||
Probes the terrain. Pass in the XYZ coordinate of the probe point, a probe
|
||||
object, and an XPLMProbeInfo_t struct that has its structSize member set
|
||||
properly. Other fields are filled in if we hit terrain, and a probe result
|
||||
is returned.
|
||||
Probes the terrain. Pass in the XYZ coordinate of the probe point, a probe
|
||||
object, and an XPLMProbeInfo_t struct that has its structSize member set
|
||||
properly. Other fields are filled in if we hit terrain, and a probe result
|
||||
is returned.
|
||||
}
|
||||
FUNCTION XPLMProbeTerrainXYZ(
|
||||
inProbe : XPLMProbeRef;
|
||||
inX : single;
|
||||
inY : single;
|
||||
inZ : single;
|
||||
inX : Single;
|
||||
inY : Single;
|
||||
inZ : Single;
|
||||
outInfo : PXPLMProbeInfo_t) : XPLMProbeResult;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM200}
|
||||
{$IFDEF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* Magnetic Variation
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
Use the magnetic variation (more properly, the "magnetic declination") API
|
||||
to find the offset of magnetic north from true north at a given latitude
|
||||
and longitude within the simulator.
|
||||
|
||||
In the real world, the Earth's magnetic field is irregular, such that true
|
||||
north (the direction along a meridian toward the north pole) does not
|
||||
necessarily match what a magnetic compass shows as north.
|
||||
|
||||
Using this API ensures that you present the same offsets to users as
|
||||
X-Plane's built-in instruments.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMGetMagneticVariation
|
||||
|
||||
Returns X-Plane's simulated magnetic variation (declination) at the
|
||||
indication latitude and longitude.
|
||||
}
|
||||
FUNCTION XPLMGetMagneticVariation(
|
||||
latitude : Real;
|
||||
longitude : Real) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDegTrueToDegMagnetic
|
||||
|
||||
Converts a heading in degrees relative to true north into a value relative
|
||||
to magnetic north at the user's current location.
|
||||
}
|
||||
FUNCTION XPLMDegTrueToDegMagnetic(
|
||||
headingDegreesTrue : Single) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDegMagneticToDegTrue
|
||||
|
||||
Converts a heading in degrees relative to magnetic north at the user's
|
||||
current location into a value relative to true north.
|
||||
}
|
||||
FUNCTION XPLMDegMagneticToDegTrue(
|
||||
headingDegreesMagnetic: Single) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM300}
|
||||
{___________________________________________________________________________
|
||||
* Object Drawing
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The object drawing routines let you load and draw X-Plane OBJ files.
|
||||
Objects are loaded by file path and managed via an opaque handle. X-Plane
|
||||
naturally reference counts objects, so it is important that you balance
|
||||
every successful call to XPLMLoadObject with a call to XPLMUnloadObject!
|
||||
The object drawing routines let you load and draw X-Plane OBJ files.
|
||||
Objects are loaded by file path and managed via an opaque handle. X-Plane
|
||||
naturally reference counts objects, so it is important that you balance
|
||||
every successful call to XPLMLoadObject with a call to XPLMUnloadObject!
|
||||
}
|
||||
|
||||
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
TYPE
|
||||
{
|
||||
XPLMObjectRef
|
||||
|
||||
An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
|
||||
into memory.
|
||||
An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
|
||||
into memory.
|
||||
}
|
||||
XPLMObjectRef = pointer;
|
||||
PXPLMObjectRef = ^XPLMObjectRef;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMDrawInfo_t
|
||||
|
||||
The XPLMDrawInfo_t structure contains positioning info for one object that
|
||||
is to be drawn. Be sure to set structSize to the size of the structure for
|
||||
future expansion.
|
||||
The XPLMDrawInfo_t structure contains positioning info for one object that
|
||||
is to be drawn. Be sure to set structSize to the size of the structure for
|
||||
future expansion.
|
||||
}
|
||||
XPLMDrawInfo_t = RECORD
|
||||
{ Set this to the size of this structure! }
|
||||
structSize : integer;
|
||||
{ X location of the object in local coordinates. }
|
||||
x : single;
|
||||
{ Y location of the object in local coordinates. }
|
||||
y : single;
|
||||
{ Z location of the object in local coordinates. }
|
||||
z : single;
|
||||
{ Pitch in degres to rotate the object, positive is up. }
|
||||
pitch : single;
|
||||
{ Heading in local coordinates to rotate the object, clockwise. }
|
||||
heading : single;
|
||||
{ Roll to rotate the object. }
|
||||
roll : single;
|
||||
{ Set this to the size of this structure! }
|
||||
structSize : Integer;
|
||||
{ X location of the object in local coordinates. }
|
||||
x : Single;
|
||||
{ Y location of the object in local coordinates. }
|
||||
y : Single;
|
||||
{ Z location of the object in local coordinates. }
|
||||
z : Single;
|
||||
{ Pitch in degres to rotate the object, positive is up. }
|
||||
pitch : Single;
|
||||
{ Heading in local coordinates to rotate the object, clockwise. }
|
||||
heading : Single;
|
||||
{ Roll to rotate the object. }
|
||||
roll : Single;
|
||||
END;
|
||||
PXPLMDrawInfo_t = ^XPLMDrawInfo_t;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMObjectLoaded_f
|
||||
|
||||
You provide this callback when loading an object asynchronously; it will be
|
||||
called once the object is loaded. Your refcon is passed back. The object
|
||||
ref passed in is the newly loaded object (ready for use) or NULL if an
|
||||
error occured.
|
||||
You provide this callback when loading an object asynchronously; it will be
|
||||
called once the object is loaded. Your refcon is passed back. The object
|
||||
ref passed in is the newly loaded object (ready for use) or NULL if an
|
||||
error occured.
|
||||
|
||||
If your plugin is disabled, this callback will be delivered as soon as the
|
||||
plugin is re-enabled. If your plugin is unloaded before this callback is
|
||||
ever called, the SDK will release the object handle for you.
|
||||
If your plugin is disabled, this callback will be delivered as soon as the
|
||||
plugin is re-enabled. If your plugin is unloaded before this callback is
|
||||
ever called, the SDK will release the object handle for you.
|
||||
}
|
||||
TYPE
|
||||
XPLMObjectLoaded_f = PROCEDURE(
|
||||
inObject : XPLMObjectRef;
|
||||
inRefcon : pointer); cdecl;
|
||||
{$ENDIF}
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMLoadObject
|
||||
|
||||
This routine loads an OBJ file and returns a handle to it. If X-plane has
|
||||
already loaded the object, the handle to the existing object is returned.
|
||||
Do not assume you will get the same handle back twice, but do make sure to
|
||||
call unload once for every load to avoid "leaking" objects. The object
|
||||
will be purged from memory when no plugins and no scenery are using it.
|
||||
This routine loads an OBJ file and returns a handle to it. If X-Plane has
|
||||
already loaded the object, the handle to the existing object is returned.
|
||||
Do not assume you will get the same handle back twice, but do make sure to
|
||||
call unload once for every load to avoid "leaking" objects. The object will
|
||||
be purged from memory when no plugins and no scenery are using it.
|
||||
|
||||
The path for the object must be relative to the X-System base folder. If
|
||||
the path is in the root of the X-System folder you may need to prepend ./
|
||||
to it; loading objects in the root of the X-System folder is STRONGLY
|
||||
discouraged - your plugin should not dump art resources in the root folder!
|
||||
The path for the object must be relative to the X-System base folder. If
|
||||
the path is in the root of the X-System folder you may need to prepend ./
|
||||
to it; loading objects in the root of the X-System folder is STRONGLY
|
||||
discouraged - your plugin should not dump art resources in the root folder!
|
||||
|
||||
XPLMLoadObject will return NULL if the object cannot be loaded (either
|
||||
because it is not found or the file is misformatted). This routine will
|
||||
load any object that can be used in the X-Plane scenery system.
|
||||
|
||||
XPLMLoadObject will return NULL if the object cannot be loaded (either
|
||||
because it is not found or the file is misformatted). This routine will
|
||||
load any object that can be used in the X-Plane scenery system.
|
||||
|
||||
It is important that the datarefs an object uses for animation already be
|
||||
loaded before you load the object. For this reason it may be necessary to
|
||||
defer object loading until the sim has fully started.
|
||||
It is important that the datarefs an object uses for animation already be
|
||||
loaded before you load the object. For this reason it may be necessary to
|
||||
defer object loading until the sim has fully started.
|
||||
}
|
||||
FUNCTION XPLMLoadObject(
|
||||
inPath : Pchar) : XPLMObjectRef;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
inPath : XPLMString) : XPLMObjectRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMLoadObjectAsync
|
||||
|
||||
This routine loads an object asynchronously; control is returned to you
|
||||
immediately while X-Plane loads the object. The sim will not stop flying
|
||||
while the object loads. For large objects, it may be several seconds
|
||||
before the load finishes.
|
||||
This routine loads an object asynchronously; control is returned to you
|
||||
immediately while X-Plane loads the object. The sim will not stop flying
|
||||
while the object loads. For large objects, it may be several seconds before
|
||||
the load finishes.
|
||||
|
||||
You provide a callback function that is called once the load has completed.
|
||||
Note that if the object cannot be loaded, you will not find out until the
|
||||
callback function is called with a NULL object handle.
|
||||
You provide a callback function that is called once the load has completed.
|
||||
Note that if the object cannot be loaded, you will not find out until the
|
||||
callback function is called with a NULL object handle.
|
||||
|
||||
There is no way to cancel an asynchronous object load; you must wait for
|
||||
the load to complete and then release the object if it is no longer
|
||||
desired.
|
||||
There is no way to cancel an asynchronous object load; you must wait for
|
||||
the load to complete and then release the object if it is no longer
|
||||
desired.
|
||||
}
|
||||
PROCEDURE XPLMLoadObjectAsync(
|
||||
inPath : Pchar;
|
||||
inPath : XPLMString;
|
||||
inCallback : XPLMObjectLoaded_f;
|
||||
inRefcon : pointer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMDrawObjects
|
||||
|
||||
XPLMDrawObjects draws an object from an OBJ file one or more times. You
|
||||
pass in the object and an array of XPLMDrawInfo_t structs, one for each
|
||||
place you would like the object to be drawn.
|
||||
__Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating
|
||||
instances, rather than these APIs from draw callbacks.
|
||||
|
||||
X-Plane will attempt to cull the objects based on LOD and visibility, and
|
||||
will pick the appropriate LOD.
|
||||
XPLMDrawObjects draws an object from an OBJ file one or more times. You
|
||||
pass in the object and an array of XPLMDrawInfo_t structs, one for each
|
||||
place you would like the object to be drawn.
|
||||
|
||||
Lighting is a boolean; pass 1 to show the night version of object with
|
||||
night-only lights lit up. Pass 0 to show the daytime version of the
|
||||
object.
|
||||
X-Plane will attempt to cull the objects based on LOD and visibility, and
|
||||
will pick the appropriate LOD.
|
||||
|
||||
earth_relative controls the coordinate system. If this is 1, the rotations
|
||||
you specify are applied to the object after its coordinate system is
|
||||
transformed from local to earth-relative coordinates -- that is, an object
|
||||
with no rotations will point toward true north and the Y axis will be up
|
||||
against gravity. If this is 0, the object is drawn with your rotations
|
||||
from local coordanates -- that is, an object with no rotations is drawn
|
||||
pointing down the -Z axis and the Y axis of the object matches the local
|
||||
coordinate Y axis.
|
||||
Lighting is a boolean; pass 1 to show the night version of object with
|
||||
night-only lights lit up. Pass 0 to show the daytime version of the object.
|
||||
|
||||
earth_relative controls the coordinate system. If this is 1, the rotations
|
||||
you specify are applied to the object after its coordinate system is
|
||||
transformed from local to earth-relative coordinates -- that is, an object
|
||||
with no rotations will point toward true north and the Y axis will be up
|
||||
against gravity. If this is 0, the object is drawn with your rotations from
|
||||
local coordanates -- that is, an object with no rotations is drawn pointing
|
||||
down the -Z axis and the Y axis of the object matches the local coordinate
|
||||
Y axis.
|
||||
}
|
||||
PROCEDURE XPLMDrawObjects(
|
||||
inObject : XPLMObjectRef;
|
||||
inCount : integer;
|
||||
inCount : Integer;
|
||||
inLocations : PXPLMDrawInfo_t;
|
||||
lighting : integer;
|
||||
earth_relative : integer);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
lighting : Integer;
|
||||
earth_relative : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMUnloadObject
|
||||
|
||||
This routine marks an object as no longer being used by your plugin.
|
||||
Objects are reference counted: once no plugins are using an object, it is
|
||||
purged from memory. Make sure to call XPLMUnloadObject once for each
|
||||
successful call to XPLMLoadObject.
|
||||
This routine marks an object as no longer being used by your plugin.
|
||||
Objects are reference counted: once no plugins are using an object, it is
|
||||
purged from memory. Make sure to call XPLMUnloadObject once for each
|
||||
successful call to XPLMLoadObject.
|
||||
}
|
||||
PROCEDURE XPLMUnloadObject(
|
||||
inObject : XPLMObjectRef);
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{___________________________________________________________________________
|
||||
* Library Access
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The library access routines allow you to locate scenery objects via the
|
||||
X-Plane library system. Right now library access is only provided for
|
||||
objects, allowing plugin-drawn objects to be extended using the library
|
||||
system.
|
||||
The library access routines allow you to locate scenery objects via the
|
||||
X-Plane library system. Right now library access is only provided for
|
||||
objects, allowing plugin-drawn objects to be extended using the library
|
||||
system.
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
XPLMLibraryEnumerator_f
|
||||
|
||||
An XPLMLibraryEnumerator_f is a callback you provide that is called once
|
||||
for each library element that is located. The returned paths will be
|
||||
relative to the X-System folder.
|
||||
An XPLMLibraryEnumerator_f is a callback you provide that is called once
|
||||
for each library element that is located. The returned paths will be
|
||||
relative to the X-System folder.
|
||||
}
|
||||
TYPE
|
||||
XPLMLibraryEnumerator_f = PROCEDURE(
|
||||
inFilePath : Pchar;
|
||||
inFilePath : XPLMString;
|
||||
inRef : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMLookupObjects
|
||||
|
||||
This routine looks up a virtual path in the library system and returns all
|
||||
matching elements. You provide a callback - one virtual path may match
|
||||
many objects in the library. XPLMLookupObjects returns the number of
|
||||
objects found.
|
||||
This routine looks up a virtual path in the library system and returns all
|
||||
matching elements. You provide a callback - one virtual path may match many
|
||||
objects in the library. XPLMLookupObjects returns the number of objects
|
||||
found.
|
||||
|
||||
The latitude and longitude parameters specify the location the object will
|
||||
be used. The library system allows for scenery packages to only provide
|
||||
objects to certain local locations. Only objects that are allowed at the
|
||||
latitude/longitude you provide will be returned.
|
||||
The latitude and longitude parameters specify the location the object will
|
||||
be used. The library system allows for scenery packages to only provide
|
||||
objects to certain local locations. Only objects that are allowed at the
|
||||
latitude/longitude you provide will be returned.
|
||||
}
|
||||
FUNCTION XPLMLookupObjects(
|
||||
inPath : Pchar;
|
||||
inLatitude : single;
|
||||
inLongitude : single;
|
||||
inPath : XPLMString;
|
||||
inLatitude : Single;
|
||||
inLongitude : Single;
|
||||
enumerator : XPLMLibraryEnumerator_f;
|
||||
ref : pointer) : integer;
|
||||
{$IFDEF DELPHI}
|
||||
cdecl; external 'XPLM.DLL';
|
||||
{$ELSE}
|
||||
cdecl; external '';
|
||||
{$ENDIF}
|
||||
ref : pointer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$ENDIF}
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
|
||||
+698
-674
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user