1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/***************************************************************************
* XPLMProcessing
***************************************************************************/
/*
* 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.
*
* You can receive a callback either just before or just after the per-frame
* physics calculations happen - you can use post-flightmodel 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 or the XPLMInstance functions for aircraft or models. (One
* exception: you can use a post-flight loop callback to update your own
* off-screen FBOs.)
*
*/
extern "C"
/*
* XPLMFlightLoopPhaseType
*
* You can register a flight loop callback to run either before or after the
* flight model is integrated by X-Plane.
*
*/
XPLM_MAYBE_TYPEDEF enum XPLM_ENUM ;
/* 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.
*
*/
typedef void* XPLMFlightLoopID;
/* XPLM210 */
/*
* XPLMFlightLoop_f
*
* This is your flight loop callback. Each time the flight loop is iterated
* through, you receive this call at the end.
*
* 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:
*
* - 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 pointer constant provided when you registered yor
* callback.
*
* Your return value controls when you will next be called.
*
* - Return 0 to stop receiving callbacks.
* - Return a positive number to specify how many seconds until the next
* callback. (You will be called at or after this time, not before.)
* - Return 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.
*
*/
typedef float ;
/*
* XPLMCreateFlightLoop_t
*
* XPLMCreateFlightLoop_t contains the parameters to create a new flight loop
* callback. The structure may be expanded in future SDKs - always set
* structSize to the size of your structure in bytes.
*
*/
typedef struct XPLMCreateFlightLoop_t;
/* XPLM210 */
/*
* XPLMGetElapsedTime
*
* 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.
*
*/
XPLM_API float ;
/*
* XPLMGetCycleNumber
*
* This routine returns a counter starting at zero for each sim cycle
* computed/video frame rendered.
*
*/
XPLM_API int ;
/*
* XPLMRegisterFlightLoopCallback
*
* This routine registers your flight loop callback. Pass in a pointer to a
* flight loop function and a refcon (an optional reference value determined
* by you). 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.)
*
*/
XPLM_API void ;
/*
* 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.
*
* Only use this on flight loops registered via
* XPLMRegisterFlightLoopCallback.
*
*/
XPLM_API void ;
/*
* 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.
*
* 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.
*
*/
XPLM_API void ;
/*
* 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.
*
*/
XPLM_API ;
/* XPLM210 */
/*
* XPLMDestroyFlightLoop
*
* This routine destroys a flight loop callback by ID. Only call it on flight
* loops created with the newer XPLMCreateFlightLoop API.
*
*/
XPLM_API void ;
/* 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.
*
* If inRelativeToNow is true, times are interpreted 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).
*
*/
XPLM_API void ;
/* XPLM210 */
}