Compare commits
74
Commits
master
...
396aa8d807
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
396aa8d807 | ||
|
|
eafe0b18f6 | ||
|
|
42acea35bb | ||
|
|
150031c11d | ||
|
|
064474a312 | ||
|
|
4b679cec71 | ||
|
|
18257e987e | ||
|
|
23db85c2a5 | ||
|
|
997586b8aa | ||
|
|
bbb0c220e1 | ||
|
|
afd63f92ad | ||
|
|
174c20bd8f | ||
|
|
40067a606d | ||
|
|
52da1262b0 | ||
|
|
a50d89f4aa | ||
|
|
6e27fc27fb | ||
|
|
f344ffb727 | ||
|
|
e677a345e0 | ||
|
|
46214e9dc3 | ||
|
|
9deae93fdd | ||
|
|
ace71d7670 | ||
|
|
488fcb87cc | ||
|
|
115e4d9265 | ||
|
|
07487e9e51 | ||
|
|
46a0607b55 | ||
|
|
de8b282ab1 | ||
|
|
6027095c38 | ||
|
|
2cf03d2933 | ||
|
|
161941ac1b | ||
|
|
4445f1f12a | ||
|
|
d6d3c0b4d9 | ||
|
|
94fbc1f558 | ||
|
|
2fc2170763 | ||
|
|
699e2a4784 | ||
|
|
b050c23577 | ||
|
|
a5e23f4b43 | ||
|
|
7d45ca71ba | ||
|
|
8b9f5d0406 | ||
|
|
2bda541bce | ||
|
|
25c4d8474d | ||
|
|
910afad3b5 | ||
|
|
2aa658c15e | ||
|
|
3559b124a7 | ||
|
|
2510f4968c | ||
|
|
752646c744 | ||
|
|
b22a60c85e | ||
|
|
9dcca746ed | ||
|
|
0612afb37b | ||
|
|
ff179ee3a4 | ||
|
|
cd022c8063 | ||
|
|
a536a9c918 | ||
|
|
3dce2ca488 | ||
|
|
b695f4cb6c | ||
|
|
2914e1fa59 | ||
|
|
71656e4a66 | ||
|
|
5e80c41538 | ||
|
|
c6ad412df9 | ||
|
|
0fe7335987 | ||
|
|
3b2f146679 | ||
|
|
a820f7456a | ||
|
|
fbee417594 | ||
|
|
7439747876 | ||
|
|
27edf28f42 | ||
|
|
ca5aab1344 | ||
|
|
d7b765fba5 | ||
|
|
3ec41a1a19 | ||
|
|
107ae2d6c9 | ||
|
|
50ea28b78e | ||
|
|
0a4e95cd30 | ||
|
|
4b893ca726 | ||
|
|
eca1efdf83 | ||
|
|
61b98ce4e5 | ||
|
|
7a1ac45e29 | ||
|
|
0adf122d1d |
No files matched your search
@@ -0,0 +1,55 @@
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -4
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllArgumentsOnNextLine: false
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AlignAfterOpenBracket: Align
|
||||
AllowShortFunctionsOnASingleLine: true
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BreakBeforeBinaryOperators: false
|
||||
BreakBeforeBraces: Linux
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: "^ IWYU pragma:"
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerBinding: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
IndentAccessModifiers: true
|
||||
IndentCaseLabels: true
|
||||
IndentFunctionDeclarationAfterType: true
|
||||
IndentWidth: 2
|
||||
MaxEmptyLinesToKeep: 2
|
||||
NamespaceIndentation: Inner
|
||||
ObjCSpaceAfterProperty: true
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
ObjCBlockIndentWidth: 4
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 100000
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerBindsToType: false
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
Standard: c++14
|
||||
SortIncludes: true
|
||||
TabWidth: 2
|
||||
UseTab: Never
|
||||
@@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
+366
@@ -0,0 +1,366 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# Cmake
|
||||
build*/
|
||||
Vendored
+81
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"configurations": [{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"LIN",
|
||||
"XP",
|
||||
"XPLM200",
|
||||
"XPLM210"
|
||||
],
|
||||
"compilerPath": "/opt/llvm-mingw/bin/clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "linux-clang-x64"
|
||||
},
|
||||
{
|
||||
"name": "Windows",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"IBM",
|
||||
"XP",
|
||||
"XPLM200",
|
||||
"XPLM210"
|
||||
],
|
||||
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "windows-clang-x64"
|
||||
},
|
||||
{
|
||||
"name": "Windows ESP 32",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"BIT=\"32\"",
|
||||
"IBM"
|
||||
],
|
||||
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "windows-clang-x64"
|
||||
},
|
||||
{
|
||||
"name": "Windows ESP 64",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"BIT=\"64\"",
|
||||
"IBM",
|
||||
"MSFS"
|
||||
],
|
||||
"compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "windows-clang-x64"
|
||||
},
|
||||
{
|
||||
"name": "Mac",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"APL",
|
||||
"XP",
|
||||
"XPLM200",
|
||||
"XPLM210"
|
||||
],
|
||||
"compilerPath": "/opt/osxcross/target/bin/o64-clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "macos-clang-x64"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
[{
|
||||
"name": "Clang 13.0.0 Mac",
|
||||
"toolchainFile": "${workspaceFolder}/toolchain-mac.cmake"
|
||||
},
|
||||
{
|
||||
"name": "Clang 13.0.0 Linux",
|
||||
"toolchainFile": "${workspaceFolder}/toolchain-lin.cmake"
|
||||
},
|
||||
{
|
||||
"name": "Clang 13.0.0 Windows 32",
|
||||
"toolchainFile": "${workspaceFolder}/toolchain-win-32.cmake"
|
||||
},
|
||||
{
|
||||
"name": "Clang 13.0.0 Windows 64",
|
||||
"toolchainFile": "${workspaceFolder}/toolchain-win-64.cmake"
|
||||
}
|
||||
]
|
||||
Vendored
+91
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"cmake.generator": "Unix Makefiles",
|
||||
"files.associations": {
|
||||
"algorithm": "cpp",
|
||||
"array": "cpp",
|
||||
"atomic": "cpp",
|
||||
"bit": "cpp",
|
||||
"*.tcc": "cpp",
|
||||
"bitset": "cpp",
|
||||
"cctype": "cpp",
|
||||
"chrono": "cpp",
|
||||
"clocale": "cpp",
|
||||
"cmath": "cpp",
|
||||
"codecvt": "cpp",
|
||||
"condition_variable": "cpp",
|
||||
"cstdarg": "cpp",
|
||||
"cstddef": "cpp",
|
||||
"cstdint": "cpp",
|
||||
"cstdio": "cpp",
|
||||
"cstdlib": "cpp",
|
||||
"cstring": "cpp",
|
||||
"ctime": "cpp",
|
||||
"cwchar": "cpp",
|
||||
"cwctype": "cpp",
|
||||
"deque": "cpp",
|
||||
"forward_list": "cpp",
|
||||
"list": "cpp",
|
||||
"map": "cpp",
|
||||
"set": "cpp",
|
||||
"unordered_map": "cpp",
|
||||
"vector": "cpp",
|
||||
"exception": "cpp",
|
||||
"functional": "cpp",
|
||||
"iterator": "cpp",
|
||||
"memory": "cpp",
|
||||
"memory_resource": "cpp",
|
||||
"numeric": "cpp",
|
||||
"optional": "cpp",
|
||||
"random": "cpp",
|
||||
"ratio": "cpp",
|
||||
"regex": "cpp",
|
||||
"string": "cpp",
|
||||
"string_view": "cpp",
|
||||
"system_error": "cpp",
|
||||
"tuple": "cpp",
|
||||
"type_traits": "cpp",
|
||||
"utility": "cpp",
|
||||
"fstream": "cpp",
|
||||
"future": "cpp",
|
||||
"initializer_list": "cpp",
|
||||
"iomanip": "cpp",
|
||||
"iosfwd": "cpp",
|
||||
"iostream": "cpp",
|
||||
"istream": "cpp",
|
||||
"limits": "cpp",
|
||||
"mutex": "cpp",
|
||||
"new": "cpp",
|
||||
"ostream": "cpp",
|
||||
"shared_mutex": "cpp",
|
||||
"sstream": "cpp",
|
||||
"stdexcept": "cpp",
|
||||
"streambuf": "cpp",
|
||||
"thread": "cpp",
|
||||
"cinttypes": "cpp",
|
||||
"typeinfo": "cpp",
|
||||
"valarray": "cpp",
|
||||
"__threading_support": "cpp",
|
||||
"__config": "cpp",
|
||||
"__undef_macros": "cpp",
|
||||
"ios": "cpp",
|
||||
"__bit_reference": "cpp",
|
||||
"__bits": "cpp",
|
||||
"__debug": "cpp",
|
||||
"__errc": "cpp",
|
||||
"__hash_table": "cpp",
|
||||
"__locale": "cpp",
|
||||
"__mutex_base": "cpp",
|
||||
"__node_handle": "cpp",
|
||||
"__nullptr": "cpp",
|
||||
"__split_buffer": "cpp",
|
||||
"__string": "cpp",
|
||||
"__tree": "cpp",
|
||||
"__tuple": "cpp",
|
||||
"compare": "cpp",
|
||||
"concepts": "cpp",
|
||||
"locale": "cpp",
|
||||
"queue": "cpp",
|
||||
"stack": "cpp",
|
||||
"variant": "cpp"
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
cmake_policy(SET CMP0068 NEW)
|
||||
|
||||
project(GermanAirlinesVA_GAConnector C CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR TRUE)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
||||
set(PLUGIN_NAME GAConnector)
|
||||
|
||||
option(DEBUG "Debug symbols" OFF)
|
||||
option(XP "X-Plane" OFF)
|
||||
option(BIT "Bitnes" 64)
|
||||
option(MSFS "MSFS" OFF)
|
||||
|
||||
add_subdirectory(
|
||||
ixwebsocket
|
||||
)
|
||||
if(XP)
|
||||
add_subdirectory(
|
||||
xplugin
|
||||
)
|
||||
else()
|
||||
add_subdirectory(
|
||||
esp
|
||||
)
|
||||
endif()
|
||||
Vendored
+77
@@ -0,0 +1,77 @@
|
||||
pipeline {
|
||||
agent any
|
||||
stages {
|
||||
stage('Build Windows Debug') {
|
||||
when {
|
||||
branch 'develop'
|
||||
beforeAgent true
|
||||
}
|
||||
agent {
|
||||
docker {
|
||||
image 'llvm-mingw:latest'
|
||||
reuseNode true
|
||||
}
|
||||
}
|
||||
environment {
|
||||
DEBUG = 1
|
||||
}
|
||||
steps {
|
||||
sh 'bash ./build.sh win32'
|
||||
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/i686-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win32'
|
||||
sh 'bash ./build.sh win64-ESP'
|
||||
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/x86_64-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win64-ESP'
|
||||
sh 'bash ./build.sh win64'
|
||||
sh 'analyze-build --verbose --use-analyzer /opt/llvm-mingw/bin/x86_64-w64-mingw32-clang++ --cdb build/compile_commands.json --output build/Analysis/win64'
|
||||
}
|
||||
}
|
||||
stage('Build Linux Debug') {
|
||||
when {
|
||||
branch 'develop'
|
||||
beforeAgent true
|
||||
}
|
||||
agent {
|
||||
docker {
|
||||
image 'llvm:latest'
|
||||
reuseNode true
|
||||
}
|
||||
}
|
||||
environment {
|
||||
DEBUG = 1
|
||||
}
|
||||
steps {
|
||||
sh 'bash ./build.sh lin'
|
||||
sh 'analyze-build --verbose --cdb build/compile_commands.json --output build/Analysis/lin'
|
||||
}
|
||||
}
|
||||
stage('Build MacOSX Debug') {
|
||||
when {
|
||||
branch 'develop'
|
||||
beforeAgent true
|
||||
}
|
||||
agent {
|
||||
docker {
|
||||
image 'osxcross:latest'
|
||||
reuseNode true
|
||||
}
|
||||
}
|
||||
environment {
|
||||
DEBUG = 1
|
||||
}
|
||||
steps {
|
||||
sh 'bash ./build.sh mac'
|
||||
sh 'analyze-build --verbose --use-analyzer /opt/osxcross/target/bin/o64-clang++ --cdb build/compile_commands.json --output build/Analysis/mac'
|
||||
}
|
||||
}
|
||||
stage('Archive Debug') {
|
||||
when {
|
||||
branch 'develop'
|
||||
}
|
||||
steps {
|
||||
zip zipFile: 'X-Plane Debug.zip', archive: true, dir: 'build/X-Plane'
|
||||
zip zipFile: 'ESP Debug.zip', archive: true, dir: 'build/ESP'
|
||||
zip zipFile: 'Analysis.zip', archive: true, dir: 'build/Analysis'
|
||||
sh 'rm -rf build'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
### Develop Status
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/develop)
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/develop)
|
||||
|
||||
### Stage Status
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/stage)
|
||||
|
||||
### Prod Status
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/prod)
|
||||
|
||||
### Master Status
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/WebSocketTest/job/master)
|
||||
[](https://jenkins.hofmannnet.myhome-server.de/job/GermanAirlinesVA-GAConnector/job/master)
|
||||
|
||||
X-Plane Plugin for all supported platforms.
|
||||
Demo of WebSocket capabilities
|
||||
|
||||
Requirements:
|
||||
- openSSL 1.1.x
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,746 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All Rights Reserved.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _SIMCONNECT_H_
|
||||
#define _SIMCONNECT_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef SIMCONNECT_H_NOMANIFEST
|
||||
#if _MSC_FULL_VER >= 140040130
|
||||
#ifdef _M_IX86
|
||||
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
|
||||
"name='" "Microsoft.FlightSimulator.SimConnect" "' " \
|
||||
"version='" "10.0.61259.0" "' " \
|
||||
"processorArchitecture='x86' " \
|
||||
"publicKeyToken='" "67c7c14424d61b5b" "'\"")
|
||||
#endif
|
||||
#endif
|
||||
#endif //SIMCONNECT_H_NOMANIFEST
|
||||
|
||||
#ifndef DWORD_MAX
|
||||
#define DWORD_MAX 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
#include <float.h>
|
||||
|
||||
typedef DWORD SIMCONNECT_OBJECT_ID;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Constants
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID
|
||||
static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID
|
||||
|
||||
static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument.
|
||||
|
||||
static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter
|
||||
|
||||
|
||||
// Notification Group priority values
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored
|
||||
|
||||
//Weather observations Metar strings
|
||||
static const DWORD MAX_METAR_LENGTH = 2000;
|
||||
|
||||
// Maximum thermal size is 100 km.
|
||||
static const float MAX_THERMAL_SIZE = 100000;
|
||||
static const float MAX_THERMAL_RATE = 1000;
|
||||
|
||||
// SIMCONNECT_DATA_INITPOSITION.Airspeed
|
||||
static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed
|
||||
static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed
|
||||
|
||||
// AddToClientDataDefinition dwSizeOrType parameter type values
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float)
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double)
|
||||
|
||||
// AddToClientDataDefinition dwOffset parameter special values
|
||||
static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable
|
||||
|
||||
// Open ConfigIndex parameter special value
|
||||
static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Enum definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
// Receive data types
|
||||
enum SIMCONNECT_RECV_ID {
|
||||
SIMCONNECT_RECV_ID_NULL,
|
||||
SIMCONNECT_RECV_ID_EXCEPTION,
|
||||
SIMCONNECT_RECV_ID_OPEN,
|
||||
SIMCONNECT_RECV_ID_QUIT,
|
||||
SIMCONNECT_RECV_ID_EVENT,
|
||||
SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE,
|
||||
SIMCONNECT_RECV_ID_EVENT_FILENAME,
|
||||
SIMCONNECT_RECV_ID_EVENT_FRAME,
|
||||
SIMCONNECT_RECV_ID_SIMOBJECT_DATA,
|
||||
SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE,
|
||||
SIMCONNECT_RECV_ID_WEATHER_OBSERVATION,
|
||||
SIMCONNECT_RECV_ID_CLOUD_STATE,
|
||||
SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID,
|
||||
SIMCONNECT_RECV_ID_RESERVED_KEY,
|
||||
SIMCONNECT_RECV_ID_CUSTOM_ACTION,
|
||||
SIMCONNECT_RECV_ID_SYSTEM_STATE,
|
||||
SIMCONNECT_RECV_ID_CLIENT_DATA,
|
||||
SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE,
|
||||
SIMCONNECT_RECV_ID_AIRPORT_LIST,
|
||||
SIMCONNECT_RECV_ID_VOR_LIST,
|
||||
SIMCONNECT_RECV_ID_NDB_LIST,
|
||||
SIMCONNECT_RECV_ID_WAYPOINT_LIST,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED,
|
||||
SIMCONNECT_RECV_ID_EVENT_RACE_END,
|
||||
SIMCONNECT_RECV_ID_EVENT_RACE_LAP,
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Data data types
|
||||
enum SIMCONNECT_DATATYPE {
|
||||
SIMCONNECT_DATATYPE_INVALID, // invalid data type
|
||||
SIMCONNECT_DATATYPE_INT32, // 32-bit integer number
|
||||
SIMCONNECT_DATATYPE_INT64, // 64-bit integer number
|
||||
SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float)
|
||||
SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double)
|
||||
SIMCONNECT_DATATYPE_STRING8, // 8-byte string
|
||||
SIMCONNECT_DATATYPE_STRING32, // 32-byte string
|
||||
SIMCONNECT_DATATYPE_STRING64, // 64-byte string
|
||||
SIMCONNECT_DATATYPE_STRING128, // 128-byte string
|
||||
SIMCONNECT_DATATYPE_STRING256, // 256-byte string
|
||||
SIMCONNECT_DATATYPE_STRING260, // 260-byte string
|
||||
SIMCONNECT_DATATYPE_STRINGV, // variable-length string
|
||||
|
||||
SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION
|
||||
SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE
|
||||
SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT
|
||||
SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT
|
||||
SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ
|
||||
|
||||
SIMCONNECT_DATATYPE_MAX // enum limit
|
||||
};
|
||||
|
||||
// Exception error types
|
||||
enum SIMCONNECT_EXCEPTION {
|
||||
SIMCONNECT_EXCEPTION_NONE,
|
||||
|
||||
SIMCONNECT_EXCEPTION_ERROR,
|
||||
SIMCONNECT_EXCEPTION_SIZE_MISMATCH,
|
||||
SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID,
|
||||
SIMCONNECT_EXCEPTION_UNOPENED,
|
||||
SIMCONNECT_EXCEPTION_VERSION_MISMATCH,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS,
|
||||
SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES,
|
||||
SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_MAPS,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION,
|
||||
SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE,
|
||||
SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE,
|
||||
SIMCONNECT_EXCEPTION_DATA_ERROR,
|
||||
SIMCONNECT_EXCEPTION_INVALID_ARRAY,
|
||||
SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED,
|
||||
SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED,
|
||||
SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE,
|
||||
SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION,
|
||||
SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED,
|
||||
SIMCONNECT_EXCEPTION_INVALID_ENUM,
|
||||
SIMCONNECT_EXCEPTION_DEFINITION_ERROR,
|
||||
SIMCONNECT_EXCEPTION_DUPLICATE_ID,
|
||||
SIMCONNECT_EXCEPTION_DATUM_ID,
|
||||
SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS,
|
||||
SIMCONNECT_EXCEPTION_ALREADY_CREATED,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_CONTAINER,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_AI,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_ATC,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE,
|
||||
};
|
||||
|
||||
// Object types
|
||||
enum SIMCONNECT_SIMOBJECT_TYPE {
|
||||
SIMCONNECT_SIMOBJECT_TYPE_USER,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_ALL,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_BOAT,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_GROUND,
|
||||
};
|
||||
|
||||
// EventState values
|
||||
enum SIMCONNECT_STATE {
|
||||
SIMCONNECT_STATE_OFF,
|
||||
SIMCONNECT_STATE_ON,
|
||||
};
|
||||
|
||||
// Object Data Request Period values
|
||||
enum SIMCONNECT_PERIOD {
|
||||
SIMCONNECT_PERIOD_NEVER,
|
||||
SIMCONNECT_PERIOD_ONCE,
|
||||
SIMCONNECT_PERIOD_VISUAL_FRAME,
|
||||
SIMCONNECT_PERIOD_SIM_FRAME,
|
||||
SIMCONNECT_PERIOD_SECOND,
|
||||
};
|
||||
|
||||
|
||||
enum SIMCONNECT_MISSION_END {
|
||||
SIMCONNECT_MISSION_FAILED,
|
||||
SIMCONNECT_MISSION_CRASHED,
|
||||
SIMCONNECT_MISSION_SUCCEEDED
|
||||
};
|
||||
|
||||
// ClientData Request Period values
|
||||
enum SIMCONNECT_CLIENT_DATA_PERIOD {
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_NEVER,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_ONCE,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_SECOND,
|
||||
};
|
||||
|
||||
enum SIMCONNECT_TEXT_TYPE {
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_BLACK,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_WHITE,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_RED,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_GREEN,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_BLUE,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_CYAN,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_WHITE,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_RED,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_GREEN,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_BLUE,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_YELLOW,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_CYAN,
|
||||
SIMCONNECT_TEXT_TYPE_MENU=0x0200,
|
||||
};
|
||||
|
||||
enum SIMCONNECT_TEXT_RESULT {
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_1,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_2,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_3,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_4,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_5,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_6,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_7,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_8,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_9,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_10,
|
||||
SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000,
|
||||
SIMCONNECT_TEXT_RESULT_QUEUED,
|
||||
SIMCONNECT_TEXT_RESULT_REMOVED,
|
||||
SIMCONNECT_TEXT_RESULT_REPLACED,
|
||||
SIMCONNECT_TEXT_RESULT_TIMEOUT,
|
||||
};
|
||||
|
||||
enum SIMCONNECT_WEATHER_MODE {
|
||||
SIMCONNECT_WEATHER_MODE_THEME,
|
||||
SIMCONNECT_WEATHER_MODE_RWW,
|
||||
SIMCONNECT_WEATHER_MODE_CUSTOM,
|
||||
SIMCONNECT_WEATHER_MODE_GLOBAL,
|
||||
};
|
||||
|
||||
enum SIMCONNECT_FACILITY_LIST_TYPE {
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_NDB,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_VOR,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid
|
||||
};
|
||||
|
||||
typedef DWORD SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST
|
||||
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME
|
||||
|
||||
|
||||
|
||||
// bits for the Waypoint Flags field: may be combined
|
||||
typedef DWORD SIMCONNECT_WAYPOINT_FLAGS;
|
||||
|
||||
static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00;
|
||||
static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid
|
||||
static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage
|
||||
static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint
|
||||
static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL
|
||||
static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground
|
||||
static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint
|
||||
static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint.
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_EVENT_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_DATA_REQUEST_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_DATA_SET_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG;
|
||||
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event
|
||||
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view
|
||||
|
||||
|
||||
typedef DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event
|
||||
|
||||
static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// User-defined enums
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
typedef DWORD SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID
|
||||
typedef DWORD SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID
|
||||
typedef DWORD SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID
|
||||
typedef DWORD SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID
|
||||
|
||||
typedef DWORD SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID
|
||||
typedef DWORD SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID
|
||||
typedef DWORD SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Struct definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
struct SIMCONNECT_RECV
|
||||
{
|
||||
DWORD dwSize; // record size
|
||||
DWORD dwVersion; // interface version
|
||||
DWORD dwID; // see SIMCONNECT_RECV_ID
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION
|
||||
{
|
||||
DWORD dwException; // see SIMCONNECT_EXCEPTION
|
||||
static const DWORD UNKNOWN_SENDID = 0;
|
||||
DWORD dwSendID; // see SimConnect_GetLastSentPacketID
|
||||
static const DWORD UNKNOWN_INDEX = DWORD_MAX;
|
||||
DWORD dwIndex; // index of parameter that was source of error
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN
|
||||
{
|
||||
char szApplicationName[256];
|
||||
DWORD dwApplicationVersionMajor;
|
||||
DWORD dwApplicationVersionMinor;
|
||||
DWORD dwApplicationBuildMajor;
|
||||
DWORD dwApplicationBuildMinor;
|
||||
DWORD dwSimConnectVersionMajor;
|
||||
DWORD dwSimConnectVersionMinor;
|
||||
DWORD dwSimConnectBuildMajor;
|
||||
DWORD dwSimConnectBuildMinor;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT
|
||||
{
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT
|
||||
{
|
||||
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
|
||||
DWORD uGroupID;
|
||||
DWORD uEventID;
|
||||
DWORD dwData; // uEventID-dependent context
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
|
||||
{
|
||||
char szFileName[MAX_PATH]; // uEventID-dependent context
|
||||
DWORD dwFlags;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
|
||||
{
|
||||
SIMCONNECT_SIMOBJECT_TYPE eObjType;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME
|
||||
{
|
||||
float fFrameRate;
|
||||
float fSimSpeed;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_RACE_RESULT
|
||||
struct SIMCONNECT_DATA_RACE_RESULT
|
||||
{
|
||||
DWORD dwNumberOfRacers; // The total number of racers
|
||||
GUID MissionGUID; // The name of the mission to execute, NULL if no mission
|
||||
char szPlayerName[MAX_PATH]; // The name of the player
|
||||
char szSessionType[MAX_PATH]; // The type of the multiplayer session: "LAN", "GAMESPY")
|
||||
char szAircraft[MAX_PATH]; // The aircraft type
|
||||
char szPlayerRole[MAX_PATH]; // The player role in the mission
|
||||
double fTotalTime; // Total time in seconds, 0 means DNF
|
||||
double fPenaltyTime; // Total penalty time in seconds
|
||||
DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END
|
||||
{
|
||||
DWORD dwRacerNumber; // The index of the racer the results are for
|
||||
SIMCONNECT_DATA_RACE_RESULT RacerData;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP
|
||||
{
|
||||
DWORD dwLapIndex; // The index of the lap the results are for
|
||||
SIMCONNECT_DATA_RACE_RESULT RacerData;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwObjectID;
|
||||
DWORD dwDefineID;
|
||||
DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG
|
||||
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
|
||||
DWORD dwoutof; // note: starts with 1, not 0.
|
||||
DWORD dwDefineCount; // data count (number of datums, *not* byte count)
|
||||
DWORD dwData; // data begins here, dwDefineCount data items
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE
|
||||
{
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA
|
||||
{
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
char szMetar[1]; // Variable length string whose maximum size is MAX_METAR_LENGTH
|
||||
};
|
||||
|
||||
static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64;
|
||||
static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH;
|
||||
|
||||
struct SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwArraySize;
|
||||
BYTE rgbData[1];
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwObjectID;
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
|
||||
{
|
||||
char szChoiceReserved[30];
|
||||
char szReservedKey[50];
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwInteger;
|
||||
float fFloat;
|
||||
char szString[MAX_PATH];
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT
|
||||
{
|
||||
GUID guidInstanceId; // Instance id of the action that executed
|
||||
DWORD dwWaitForCompletion; // Wait for completion flag on the action
|
||||
char szPayLoad[1]; // Variable length string payload associated with the mission action.
|
||||
};
|
||||
|
||||
struct SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT
|
||||
{
|
||||
// No event specific data - the new weather mode is in the base structure dwData member.
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_FACILITIES_LIST
|
||||
struct SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwArraySize;
|
||||
DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1)
|
||||
DWORD dwOutOf; // total number of transmissions the list is chopped into
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
struct SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
{
|
||||
char Icao[9]; // ICAO of the object
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // meters
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_AIRPORT_LIST
|
||||
struct SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_DATA_FACILITY_AIRPORT rgData[1];
|
||||
};
|
||||
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_WAYPOINT
|
||||
struct SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
{
|
||||
float fMagVar; // Magvar in degrees
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_WAYPOINT_LIST
|
||||
struct SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_DATA_FACILITY_WAYPOINT rgData[1];
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_NDB
|
||||
struct SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT
|
||||
{
|
||||
DWORD fFrequency; // frequency in Hz
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_NDB_LIST
|
||||
struct SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_DATA_FACILITY_NDB rgData[1];
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_VOR
|
||||
struct SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB
|
||||
{
|
||||
DWORD Flags; // SIMCONNECT_VOR_FLAGS
|
||||
float fLocalizer; // Localizer in degrees
|
||||
double GlideLat; // Glide Slope Location (deg, deg, meters)
|
||||
double GlideLon;
|
||||
double GlideAlt;
|
||||
float fGlideSlopeAngle; // Glide Slope in degrees
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_VOR_LIST
|
||||
struct SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_DATA_FACILITY_VOR rgData[1];
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// SIMCONNECT_DATATYPE_INITPOSITION
|
||||
struct SIMCONNECT_DATA_INITPOSITION
|
||||
{
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // feet
|
||||
double Pitch; // degrees
|
||||
double Bank; // degrees
|
||||
double Heading; // degrees
|
||||
DWORD OnGround; // 1=force to be on the ground
|
||||
DWORD Airspeed; // knots
|
||||
};
|
||||
|
||||
|
||||
// SIMCONNECT_DATATYPE_MARKERSTATE
|
||||
struct SIMCONNECT_DATA_MARKERSTATE
|
||||
{
|
||||
char szMarkerName[64];
|
||||
DWORD dwMarkerState;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATATYPE_WAYPOINT
|
||||
struct SIMCONNECT_DATA_WAYPOINT
|
||||
{
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // feet
|
||||
unsigned long Flags;
|
||||
double ktsSpeed; // knots
|
||||
double percentThrottle;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_LATLONALT
|
||||
struct SIMCONNECT_DATA_LATLONALT
|
||||
{
|
||||
double Latitude;
|
||||
double Longitude;
|
||||
double Altitude;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_XYZ
|
||||
struct SIMCONNECT_DATA_XYZ
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// End of Struct definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#if !defined(SIMCONNECTAPI)
|
||||
#define SIMCONNECTAPI extern "C" HRESULT __stdcall
|
||||
#endif
|
||||
|
||||
|
||||
typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext);
|
||||
|
||||
|
||||
SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = "");
|
||||
SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags);
|
||||
SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState);
|
||||
SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE);
|
||||
SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID);
|
||||
SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority);
|
||||
SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID);
|
||||
SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0);
|
||||
SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
|
||||
SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID);
|
||||
SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
|
||||
SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type);
|
||||
SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE);
|
||||
SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority);
|
||||
SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition);
|
||||
SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID);
|
||||
SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState);
|
||||
SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = "");
|
||||
SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName);
|
||||
SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon);
|
||||
SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt);
|
||||
SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0);
|
||||
SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f);
|
||||
SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID);
|
||||
SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
|
||||
SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
|
||||
SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString);
|
||||
SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError);
|
||||
SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex);
|
||||
SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext);
|
||||
SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData);
|
||||
SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds);
|
||||
SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource);
|
||||
SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg);
|
||||
SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData);
|
||||
SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID);
|
||||
SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData);
|
||||
SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID);
|
||||
SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState);
|
||||
SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString);
|
||||
SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID);
|
||||
SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags);
|
||||
SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
|
||||
SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID);
|
||||
SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
|
||||
SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName);
|
||||
SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags);
|
||||
SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName);
|
||||
SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type);
|
||||
SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
|
||||
|
||||
#endif // _SIMCONNECT_H_
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,847 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All Rights Reserved.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _SIMCONNECT_H_
|
||||
#define _SIMCONNECT_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
// <ASOBO-MOD - GM - now in 64 bit
|
||||
#ifndef SIMCONNECT_H_NOMANIFEST
|
||||
#if _MSC_FULL_VER >= 140040130
|
||||
#if defined(_M_IX86) || defined(_M_X64)
|
||||
//#pragma comment(linker,"/manifestdependency:\"type='win32' " \
|
||||
// "name='" "Microsoft..SimConnect" "' " \
|
||||
// "version='" "" "' " \
|
||||
// "processorArchitecture='amd64' " \
|
||||
// "publicKeyToken='" "" "'\"")
|
||||
#endif // #if defined(_M_IX86) || defined(_M_X64)
|
||||
#endif // #if _MSC_FULL_VER >= 140040130
|
||||
#endif // #ifndef SIMCONNECT_H_NOMANIFEST
|
||||
// ASOBO-MOD/>
|
||||
|
||||
#ifndef DWORD_MAX
|
||||
#define DWORD_MAX 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
#include <float.h>
|
||||
|
||||
typedef DWORD SIMCONNECT_OBJECT_ID;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Constants
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID
|
||||
static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID
|
||||
|
||||
static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument.
|
||||
|
||||
static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter
|
||||
|
||||
|
||||
// Notification Group priority values
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority
|
||||
static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored
|
||||
|
||||
//Weather observations Metar strings
|
||||
static const DWORD MAX_METAR_LENGTH = 2000;
|
||||
|
||||
// Maximum thermal size is 100 km.
|
||||
static const float MAX_THERMAL_SIZE = 100000;
|
||||
static const float MAX_THERMAL_RATE = 1000;
|
||||
|
||||
// SIMCONNECT_DATA_INITPOSITION.Airspeed
|
||||
static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed
|
||||
static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed
|
||||
|
||||
// AddToClientDataDefinition dwSizeOrType parameter type values
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float)
|
||||
static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double)
|
||||
|
||||
// AddToClientDataDefinition dwOffset parameter special values
|
||||
static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable
|
||||
|
||||
// Open ConfigIndex parameter special value
|
||||
static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Enum definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//these came from substituteMacros
|
||||
#define SIMCONNECT_REFSTRUCT struct
|
||||
#define SIMCONNECT_STRUCT struct
|
||||
#define SIMCONNECT_STRING(name, size) char name[size]
|
||||
#define SIMCONNECT_GUID GUID
|
||||
#define SIMCONNECT_STRINGV(name) char name[1]
|
||||
#define SIMCONNECT_DATAV(name, id, count) DWORD name
|
||||
#define SIMCONNECT_FIXEDTYPE_DATAV(type, name, count, cliMarshalAs, cliType) type name[1]
|
||||
#define SIMCONNECT_GUID GUID
|
||||
#define SIMCONNECT_ENUM enum
|
||||
#define SIMCONNECT_ENUM_FLAGS typedef DWORD
|
||||
#define SIMCONNECT_USER_ENUM typedef DWORD
|
||||
|
||||
|
||||
// Receive data types
|
||||
SIMCONNECT_ENUM SIMCONNECT_RECV_ID {
|
||||
SIMCONNECT_RECV_ID_NULL,
|
||||
SIMCONNECT_RECV_ID_EXCEPTION,
|
||||
SIMCONNECT_RECV_ID_OPEN,
|
||||
SIMCONNECT_RECV_ID_QUIT,
|
||||
SIMCONNECT_RECV_ID_EVENT,
|
||||
SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE,
|
||||
SIMCONNECT_RECV_ID_EVENT_FILENAME,
|
||||
SIMCONNECT_RECV_ID_EVENT_FRAME,
|
||||
SIMCONNECT_RECV_ID_SIMOBJECT_DATA,
|
||||
SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE,
|
||||
SIMCONNECT_RECV_ID_WEATHER_OBSERVATION,
|
||||
SIMCONNECT_RECV_ID_CLOUD_STATE,
|
||||
SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID,
|
||||
SIMCONNECT_RECV_ID_RESERVED_KEY,
|
||||
SIMCONNECT_RECV_ID_CUSTOM_ACTION,
|
||||
SIMCONNECT_RECV_ID_SYSTEM_STATE,
|
||||
SIMCONNECT_RECV_ID_CLIENT_DATA,
|
||||
SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE,
|
||||
SIMCONNECT_RECV_ID_AIRPORT_LIST,
|
||||
SIMCONNECT_RECV_ID_VOR_LIST,
|
||||
SIMCONNECT_RECV_ID_NDB_LIST,
|
||||
SIMCONNECT_RECV_ID_WAYPOINT_LIST,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED,
|
||||
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED,
|
||||
SIMCONNECT_RECV_ID_EVENT_RACE_END,
|
||||
SIMCONNECT_RECV_ID_EVENT_RACE_LAP,
|
||||
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
SIMCONNECT_RECV_ID_PICK,
|
||||
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
SIMCONNECT_RECV_ID_EVENT_EX1,
|
||||
SIMCONNECT_RECV_ID_FACILITY_DATA,
|
||||
SIMCONNECT_RECV_ID_FACILITY_DATA_END,
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Data data types
|
||||
SIMCONNECT_ENUM SIMCONNECT_DATATYPE {
|
||||
SIMCONNECT_DATATYPE_INVALID, // invalid data type
|
||||
SIMCONNECT_DATATYPE_INT32, // 32-bit integer number
|
||||
SIMCONNECT_DATATYPE_INT64, // 64-bit integer number
|
||||
SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float)
|
||||
SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double)
|
||||
SIMCONNECT_DATATYPE_STRING8, // 8-byte string
|
||||
SIMCONNECT_DATATYPE_STRING32, // 32-byte string
|
||||
SIMCONNECT_DATATYPE_STRING64, // 64-byte string
|
||||
SIMCONNECT_DATATYPE_STRING128, // 128-byte string
|
||||
SIMCONNECT_DATATYPE_STRING256, // 256-byte string
|
||||
SIMCONNECT_DATATYPE_STRING260, // 260-byte string
|
||||
SIMCONNECT_DATATYPE_STRINGV, // variable-length string
|
||||
|
||||
SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION
|
||||
SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE
|
||||
SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT
|
||||
SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT
|
||||
SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ
|
||||
|
||||
SIMCONNECT_DATATYPE_MAX // enum limit
|
||||
};
|
||||
|
||||
// Exception error types
|
||||
SIMCONNECT_ENUM SIMCONNECT_EXCEPTION {
|
||||
SIMCONNECT_EXCEPTION_NONE,
|
||||
|
||||
SIMCONNECT_EXCEPTION_ERROR,
|
||||
SIMCONNECT_EXCEPTION_SIZE_MISMATCH,
|
||||
SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID,
|
||||
SIMCONNECT_EXCEPTION_UNOPENED,
|
||||
SIMCONNECT_EXCEPTION_VERSION_MISMATCH,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS,
|
||||
SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES,
|
||||
SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_MAPS,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS,
|
||||
SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION,
|
||||
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION,
|
||||
SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE,
|
||||
SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE,
|
||||
SIMCONNECT_EXCEPTION_DATA_ERROR,
|
||||
SIMCONNECT_EXCEPTION_INVALID_ARRAY,
|
||||
SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED,
|
||||
SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED,
|
||||
SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE,
|
||||
SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION,
|
||||
SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED,
|
||||
SIMCONNECT_EXCEPTION_INVALID_ENUM,
|
||||
SIMCONNECT_EXCEPTION_DEFINITION_ERROR,
|
||||
SIMCONNECT_EXCEPTION_DUPLICATE_ID,
|
||||
SIMCONNECT_EXCEPTION_DATUM_ID,
|
||||
SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS,
|
||||
SIMCONNECT_EXCEPTION_ALREADY_CREATED,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_CONTAINER,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_AI,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_ATC,
|
||||
SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE,
|
||||
};
|
||||
|
||||
// Object types
|
||||
SIMCONNECT_ENUM SIMCONNECT_SIMOBJECT_TYPE {
|
||||
SIMCONNECT_SIMOBJECT_TYPE_USER,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_ALL,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_BOAT,
|
||||
SIMCONNECT_SIMOBJECT_TYPE_GROUND,
|
||||
};
|
||||
|
||||
// EventState values
|
||||
SIMCONNECT_ENUM SIMCONNECT_STATE {
|
||||
SIMCONNECT_STATE_OFF,
|
||||
SIMCONNECT_STATE_ON,
|
||||
};
|
||||
|
||||
// Object Data Request Period values
|
||||
SIMCONNECT_ENUM SIMCONNECT_PERIOD {
|
||||
SIMCONNECT_PERIOD_NEVER,
|
||||
SIMCONNECT_PERIOD_ONCE,
|
||||
SIMCONNECT_PERIOD_VISUAL_FRAME,
|
||||
SIMCONNECT_PERIOD_SIM_FRAME,
|
||||
SIMCONNECT_PERIOD_SECOND,
|
||||
};
|
||||
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_MISSION_END {
|
||||
SIMCONNECT_MISSION_FAILED,
|
||||
SIMCONNECT_MISSION_CRASHED,
|
||||
SIMCONNECT_MISSION_SUCCEEDED
|
||||
};
|
||||
|
||||
// ClientData Request Period values
|
||||
SIMCONNECT_ENUM SIMCONNECT_CLIENT_DATA_PERIOD {
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_NEVER,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_ONCE,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET,
|
||||
SIMCONNECT_CLIENT_DATA_PERIOD_SECOND,
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_TEXT_TYPE {
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_BLACK,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_WHITE,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_RED,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_GREEN,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_BLUE,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA,
|
||||
SIMCONNECT_TEXT_TYPE_SCROLL_CYAN,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_WHITE,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_RED,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_GREEN,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_BLUE,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_YELLOW,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA,
|
||||
SIMCONNECT_TEXT_TYPE_PRINT_CYAN,
|
||||
SIMCONNECT_TEXT_TYPE_MENU=0x0200,
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_TEXT_RESULT {
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_1,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_2,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_3,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_4,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_5,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_6,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_7,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_8,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_9,
|
||||
SIMCONNECT_TEXT_RESULT_MENU_SELECT_10,
|
||||
SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000,
|
||||
SIMCONNECT_TEXT_RESULT_QUEUED,
|
||||
SIMCONNECT_TEXT_RESULT_REMOVED,
|
||||
SIMCONNECT_TEXT_RESULT_REPLACED,
|
||||
SIMCONNECT_TEXT_RESULT_TIMEOUT,
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_WEATHER_MODE {
|
||||
SIMCONNECT_WEATHER_MODE_THEME,
|
||||
SIMCONNECT_WEATHER_MODE_RWW,
|
||||
SIMCONNECT_WEATHER_MODE_CUSTOM,
|
||||
SIMCONNECT_WEATHER_MODE_GLOBAL,
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_FACILITY_LIST_TYPE {
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_NDB,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_VOR,
|
||||
SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM SIMCONNECT_FACILITY_DATA_TYPE
|
||||
{
|
||||
SIMCONNECT_FACILITY_DATA_AIRPORT,
|
||||
SIMCONNECT_FACILITY_DATA_RUNWAY,
|
||||
SIMCONNECT_FACILITY_DATA_START,
|
||||
SIMCONNECT_FACILITY_DATA_FREQUENCY,
|
||||
SIMCONNECT_FACILITY_DATA_HELIPAD,
|
||||
SIMCONNECT_FACILITY_DATA_APPROACH,
|
||||
SIMCONNECT_FACILITY_DATA_APPROACH_TRANSITION,
|
||||
SIMCONNECT_FACILITY_DATA_APPROACH_LEG,
|
||||
SIMCONNECT_FACILITY_DATA_FINAL_APPROACH_LEG,
|
||||
SIMCONNECT_FACILITY_DATA_MISSED_APPROACH_LEG,
|
||||
SIMCONNECT_FACILITY_DATA_DEPARTURE,
|
||||
SIMCONNECT_FACILITY_DATA_ARRIVAL,
|
||||
SIMCONNECT_FACILITY_DATA_RUNWAY_TRANSITION,
|
||||
SIMCONNECT_FACILITY_DATA_ENROUTE_TRANSITION,
|
||||
SIMCONNECT_FACILITY_DATA_TAXI_POINT,
|
||||
SIMCONNECT_FACILITY_DATA_TAXI_PARKING,
|
||||
SIMCONNECT_FACILITY_DATA_TAXI_PATH,
|
||||
SIMCONNECT_FACILITY_DATA_TAXI_NAME,
|
||||
SIMCONNECT_FACILITY_DATA_JETWAY,
|
||||
SIMCONNECT_FACILITY_DATA_VOR,
|
||||
SIMCONNECT_FACILITY_DATA_NDB,
|
||||
SIMCONNECT_FACILITY_DATA_WAYPOINT,
|
||||
SIMCONNECT_FACILITY_DATA_ROUTE,
|
||||
};
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal
|
||||
static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME
|
||||
|
||||
|
||||
|
||||
// bits for the Waypoint Flags field: may be combined
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_WAYPOINT_FLAGS;
|
||||
static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00;
|
||||
static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid
|
||||
static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage
|
||||
static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint
|
||||
static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL
|
||||
static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground
|
||||
static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint
|
||||
static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint.
|
||||
static const DWORD SIMCONNECT_WAYPOINT_ALWAYS_BACKUP = 0x00800000; // Go from first waypoint to last one moving only backwards
|
||||
static const DWORD SIMCONNECT_WAYPOINT_KEEP_LAST_HEADING = 0x01000000; // Object doesn't only go from waypoint to waypoint using position but it will also keep the same heading computed on the last 2 waypoints
|
||||
static const DWORD SIMCONNECT_WAYPOINT_YIELD_TO_USER = 0x02000000; // Object will never be too close of the player. If waypoints pass too close of the player, the object will stop and wait
|
||||
static const DWORD SIMCONNECT_WAYPOINT_CAN_REVERSE = 0x04000000; // This flags handle the behaviour of the object if it can't reach a waypoint. By default, it will take a other way and try to reach this point again. With this flag, object will try some stuff to reach this waypoint in a better condition (moving backwards...)
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_EVENT_FLAG;
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat
|
||||
static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_REQUEST_FLAG;
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change
|
||||
static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_SET_FLAG;
|
||||
static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CREATE_CLIENT_DATA_FLAG;
|
||||
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData
|
||||
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_REQUEST_FLAG;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_SET_FLAG;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000;
|
||||
static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format
|
||||
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view
|
||||
static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event
|
||||
static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master
|
||||
|
||||
|
||||
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
|
||||
SIMCONNECT_ENUM_FLAGS SIMCONNECT_PICK_FLAGS
|
||||
{
|
||||
SIMCONNECT_PICK_GROUND = 0x01, // pick ground/ pick result item is ground location
|
||||
SIMCONNECT_PICK_AI = 0x02, // pick AI / pick result item is AI, (dwSimObjectID is valid)
|
||||
SIMCONNECT_PICK_SCENERY = 0x04, // pick scenery/ pick result item is scenery object (hSceneryObject is valid)
|
||||
SIMCONNECT_PICK_ALL = SIMCONNECT_PICK_SCENERY | SIMCONNECT_PICK_AI | SIMCONNECT_PICK_GROUND, // pick all / (not valid on pick result item)
|
||||
SIMCONNECT_PICK_COORDSASPIXELS = 0x08,
|
||||
};
|
||||
|
||||
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// User-defined enums
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID
|
||||
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID
|
||||
SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Struct definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV
|
||||
{
|
||||
DWORD dwSize; // record size
|
||||
DWORD dwVersion; // interface version
|
||||
DWORD dwID; // see SIMCONNECT_RECV_ID
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION
|
||||
{
|
||||
DWORD dwException; // see SIMCONNECT_EXCEPTION
|
||||
static const DWORD UNKNOWN_SENDID = 0;
|
||||
DWORD dwSendID; // see SimConnect_GetLastSentPacketID
|
||||
static const DWORD UNKNOWN_INDEX = DWORD_MAX;
|
||||
DWORD dwIndex; // index of parameter that was source of error
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN
|
||||
{
|
||||
SIMCONNECT_STRING( szApplicationName, 256);
|
||||
DWORD dwApplicationVersionMajor;
|
||||
DWORD dwApplicationVersionMinor;
|
||||
DWORD dwApplicationBuildMajor;
|
||||
DWORD dwApplicationBuildMinor;
|
||||
DWORD dwSimConnectVersionMajor;
|
||||
DWORD dwSimConnectVersionMinor;
|
||||
DWORD dwSimConnectBuildMajor;
|
||||
DWORD dwSimConnectBuildMinor;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT
|
||||
{
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT
|
||||
{
|
||||
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
|
||||
DWORD uGroupID;
|
||||
DWORD uEventID;
|
||||
DWORD dwData; // uEventID-dependent context
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
|
||||
{
|
||||
SIMCONNECT_STRING( szFileName, MAX_PATH); // uEventID-dependent context
|
||||
DWORD dwFlags;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME
|
||||
{
|
||||
SIMCONNECT_SIMOBJECT_TYPE eObjType;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME
|
||||
{
|
||||
float fFrameRate;
|
||||
float fSimSpeed;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED
|
||||
{
|
||||
// No event specific data, for now
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_EX1 : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT_EX1
|
||||
{
|
||||
static const DWORD UNKNOWN_GROUP = DWORD_MAX;
|
||||
DWORD uGroupID;
|
||||
DWORD uEventID;
|
||||
|
||||
// Doesn t support array so, let s list
|
||||
DWORD dwData0;
|
||||
DWORD dwData1;
|
||||
DWORD dwData2;
|
||||
DWORD dwData3;
|
||||
DWORD dwData4;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_RACE_RESULT
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_RACE_RESULT
|
||||
{
|
||||
DWORD dwNumberOfRacers; // The total number of racers
|
||||
SIMCONNECT_GUID MissionGUID; // The name of the mission to execute, NULL if no mission
|
||||
SIMCONNECT_STRING( szPlayerName, MAX_PATH); // The name of the player
|
||||
SIMCONNECT_STRING( szSessionType, MAX_PATH); // The type of the multiplayer session: "LAN", "GAMESPY")
|
||||
SIMCONNECT_STRING( szAircraft, MAX_PATH); // The aircraft type
|
||||
SIMCONNECT_STRING( szPlayerRole, MAX_PATH); // The player role in the mission
|
||||
double fTotalTime; // Total time in seconds, 0 means DNF
|
||||
double fPenaltyTime; // Total penalty time in seconds
|
||||
DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END
|
||||
{
|
||||
DWORD dwRacerNumber; // The index of the racer the results are for
|
||||
SIMCONNECT_DATA_RACE_RESULT RacerData;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP
|
||||
{
|
||||
DWORD dwLapIndex; // The index of the lap the results are for
|
||||
SIMCONNECT_DATA_RACE_RESULT RacerData;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwObjectID;
|
||||
DWORD dwDefineID;
|
||||
DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG
|
||||
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
|
||||
DWORD dwoutof; // note: starts with 1, not 0.
|
||||
DWORD dwDefineCount; // data count (number of datums, *not* byte count)
|
||||
SIMCONNECT_DATAV( dwData, dwDefineID, ); // data begins here, dwDefineCount data items
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE
|
||||
{
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA
|
||||
{
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
SIMCONNECT_STRINGV( szMetar); // Variable length string whose maximum size is MAX_METAR_LENGTH
|
||||
};
|
||||
|
||||
static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64;
|
||||
static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH;
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwArraySize;
|
||||
SIMCONNECT_FIXEDTYPE_DATAV(BYTE, rgbData, dwArraySize, U1 /*member of UnmanagedType enum*/ , System::Byte /*cli type*/);
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwObjectID;
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
|
||||
{
|
||||
SIMCONNECT_STRING( szChoiceReserved, 30);
|
||||
SIMCONNECT_STRING( szReservedKey, 50);
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwInteger;
|
||||
float fFloat;
|
||||
SIMCONNECT_STRING( szString, MAX_PATH);
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT
|
||||
{
|
||||
SIMCONNECT_GUID guidInstanceId; // Instance id of the action that executed
|
||||
DWORD dwWaitForCompletion; // Wait for completion flag on the action
|
||||
SIMCONNECT_STRINGV( szPayLoad); // Variable length string payload associated with the mission action.
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT
|
||||
{
|
||||
// No event specific data - the new weather mode is in the base structure dwData member.
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_FACILITIES_LIST
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV
|
||||
{
|
||||
DWORD dwRequestID;
|
||||
DWORD dwArraySize;
|
||||
DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1)
|
||||
DWORD dwOutOf; // total number of transmissions the list is chopped into
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
{
|
||||
SIMCONNECT_STRING(Icao, 9); // ICAO of the object
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // meters
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_AIRPORT_LIST
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_AIRPORT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_AIRPORT /*cli type*/);
|
||||
};
|
||||
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_WAYPOINT
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT
|
||||
{
|
||||
float fMagVar; // Magvar in degrees
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_WAYPOINT_LIST
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_WAYPOINT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_WAYPOINT /*cli type*/);
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_NDB
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT
|
||||
{
|
||||
DWORD fFrequency; // frequency in Hz
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_NDB_LIST
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_NDB, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_NDB /*cli type*/);
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_FACILITY_VOR
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB
|
||||
{
|
||||
DWORD Flags; // SIMCONNECT_VOR_FLAGS
|
||||
float fLocalizer; // Localizer in degrees
|
||||
double GlideLat; // Glide Slope Location (deg, deg, meters)
|
||||
double GlideLon;
|
||||
double GlideAlt;
|
||||
float fGlideSlopeAngle; // Glide Slope in degrees
|
||||
};
|
||||
|
||||
// SIMCONNECT_RECV_VOR_LIST
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST
|
||||
{
|
||||
SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_VOR, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_VOR /*cli type*/);
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA : public SIMCONNECT_RECV
|
||||
{
|
||||
DWORD UserRequestId;
|
||||
DWORD UniqueRequestId;
|
||||
DWORD ParentUniqueRequestId;
|
||||
DWORD Type;
|
||||
DWORD IsListItem;
|
||||
DWORD ItemIndex;
|
||||
DWORD ListSize;
|
||||
SIMCONNECT_DATAV(Data, Type, );
|
||||
};
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA_END : public SIMCONNECT_RECV
|
||||
{
|
||||
DWORD RequestId;
|
||||
};
|
||||
|
||||
#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
|
||||
SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_PICK : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY
|
||||
{
|
||||
HANDLE hContext;
|
||||
DWORD dwFlags; //
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // feet
|
||||
int xPos; //reserved
|
||||
int yPos; //reserved;
|
||||
DWORD dwSimObjectID;
|
||||
HANDLE hSceneryObject;
|
||||
DWORD dwentrynumber; // if multiple objects returned, this is number <entrynumber> out of <outof>.
|
||||
DWORD dwoutof; // note: starts with 1, not 0.
|
||||
};
|
||||
|
||||
#endif //ENABLE_SIMCONNECT_EXPERIMENTAL
|
||||
|
||||
|
||||
// SIMCONNECT_DATATYPE_INITPOSITION
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_INITPOSITION
|
||||
{
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // feet
|
||||
double Pitch; // degrees
|
||||
double Bank; // degrees
|
||||
double Heading; // degrees
|
||||
DWORD OnGround; // 1=force to be on the ground
|
||||
DWORD Airspeed; // knots
|
||||
};
|
||||
|
||||
|
||||
// SIMCONNECT_DATATYPE_MARKERSTATE
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_MARKERSTATE
|
||||
{
|
||||
SIMCONNECT_STRING( szMarkerName, 64);
|
||||
DWORD dwMarkerState;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATATYPE_WAYPOINT
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_WAYPOINT
|
||||
{
|
||||
double Latitude; // degrees
|
||||
double Longitude; // degrees
|
||||
double Altitude; // feet
|
||||
unsigned long Flags;
|
||||
double ktsSpeed; // knots
|
||||
double percentThrottle;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_LATLONALT
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_LATLONALT
|
||||
{
|
||||
double Latitude;
|
||||
double Longitude;
|
||||
double Altitude;
|
||||
};
|
||||
|
||||
// SIMCONNECT_DATA_XYZ
|
||||
SIMCONNECT_STRUCT SIMCONNECT_DATA_XYZ
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// End of Struct definitions
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#if !defined(SIMCONNECTAPI)
|
||||
#define SIMCONNECTAPI extern "C" HRESULT __stdcall
|
||||
#endif
|
||||
|
||||
|
||||
typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext);
|
||||
|
||||
|
||||
SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = "");
|
||||
SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags);
|
||||
SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState);
|
||||
SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE);
|
||||
SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID);
|
||||
SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority);
|
||||
SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID);
|
||||
SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0);
|
||||
SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
|
||||
SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID);
|
||||
SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
|
||||
SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type);
|
||||
SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE);
|
||||
SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority);
|
||||
SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition);
|
||||
SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID);
|
||||
SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState);
|
||||
SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = "");
|
||||
SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName);
|
||||
SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon);
|
||||
SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt);
|
||||
SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate);
|
||||
SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0);
|
||||
SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f);
|
||||
SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID);
|
||||
SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
|
||||
SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId);
|
||||
SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect);
|
||||
SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString);
|
||||
SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError);
|
||||
SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex);
|
||||
SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext);
|
||||
SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData);
|
||||
SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds);
|
||||
SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource);
|
||||
SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg);
|
||||
SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData);
|
||||
SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID);
|
||||
SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData);
|
||||
SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID);
|
||||
SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState);
|
||||
SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString);
|
||||
SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID);
|
||||
SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags);
|
||||
SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED);
|
||||
SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID);
|
||||
SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0);
|
||||
SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName);
|
||||
SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags);
|
||||
SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName);
|
||||
SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet);
|
||||
SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type);
|
||||
SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
SIMCONNECTAPI SimConnect_TransmitClientEvent_EX1(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags, DWORD dwData0, DWORD dwData1 = 0, DWORD dwData2 = 0, DWORD dwData3 = 0, DWORD dwData4 = 0);
|
||||
SIMCONNECTAPI SimConnect_AddToFacilityDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * FieldName);
|
||||
SIMCONNECTAPI SimConnect_RequestFacilityData(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * ICAO, const char * Region = "");
|
||||
SIMCONNECTAPI SimConnect_SubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID newElemInRangeRequestID, SIMCONNECT_DATA_REQUEST_ID oldElemOutRangeRequestID);
|
||||
SIMCONNECTAPI SimConnect_UnsubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, bool bUnsubscribeNewInRange, bool bUnsubscribeOldOutRange);
|
||||
SIMCONNECTAPI SimConnect_RequestFacilitiesList_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID);
|
||||
|
||||
|
||||
#endif // _SIMCONNECT_H_
|
||||
@@ -0,0 +1,24 @@
|
||||
- SimDatabase
|
||||
- Call to MakeRwys
|
||||
|
||||
- SimConnect
|
||||
- New Facillity API for 64Bit
|
||||
|
||||
- Recording Class
|
||||
- Bundle all threads, databAse, config, websocket
|
||||
- Handle SimConnect DB load based on connected Version
|
||||
- Use SimConnect NavData API for MSFS
|
||||
- Handle 32 Bit to not allow MSFS
|
||||
|
||||
- Websocket
|
||||
- Increase sent data
|
||||
- path: Path to ACF/AIR/Whatever on MSFS
|
||||
- hash: Hash of file at path
|
||||
- Requires mapping akin to C#
|
||||
- Try to be fast
|
||||
- Define Protocoll
|
||||
- Login Master Slave
|
||||
- Commands
|
||||
- Text
|
||||
- Port
|
||||
- Time
|
||||
@@ -0,0 +1,556 @@
|
||||
#ifndef _XPStandardWidgets_h_
|
||||
#define _XPStandardWidgets_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPStandardWidgets
|
||||
***************************************************************************/
|
||||
/*
|
||||
* ## THEORY OF OPERATION
|
||||
*
|
||||
* The standard widgets are widgets built into the widgets library. While you
|
||||
* can gain access to the widget function that drives them, you generally use
|
||||
* them by calling XPCreateWidget and then listening for special messages,
|
||||
* etc.
|
||||
*
|
||||
* The standard widgets often send mesages to themselves when the user
|
||||
* performs an event; these messages are sent up the widget hierarchy until
|
||||
* they are handled. So you can add a widget proc directly to a push button
|
||||
* (for example) to intercept the message when it is clicked, or you can put
|
||||
* one widget proc on a window for all of the push buttons in the window. Most
|
||||
* of these messages contain the original widget ID as a parameter so you can
|
||||
* know which widget is messaging no matter who it is sent to.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPWidgetDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* MAIN WINDOW
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The main window widget class provides a "window" as the user knows it.
|
||||
* These windows are dragable and can be selected. Use them to create floating
|
||||
* windows and non-modal dialogs.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_MainWindow 1
|
||||
|
||||
/*
|
||||
* Main Window Type Values
|
||||
*
|
||||
* These type values are used to control the appearance of a main window.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The standard main window; pin stripes on XP7, metal frame on XP 6. */
|
||||
xpMainWindowStyle_MainWindow = 0,
|
||||
|
||||
/* A translucent dark gray window, like the one ATC messages appear in. */
|
||||
xpMainWindowStyle_Translucent = 1,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Main Window Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This property specifies the type of window. Set to one of the main window *
|
||||
* types above. */
|
||||
xpProperty_MainWindowType = 1100,
|
||||
|
||||
/* This property specifies whether the main window has close boxes in its *
|
||||
* corners. */
|
||||
xpProperty_MainWindowHasCloseBoxes = 1200,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* MainWindow Messages
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This message is sent when the close buttons are pressed for your window. */
|
||||
xpMessage_CloseButtonPushed = 1200,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* SUB WINDOW
|
||||
***************************************************************************/
|
||||
/*
|
||||
* X-Plane dialogs are divided into separate areas; the sub window widgets
|
||||
* allow you to make these areas. Create one main window and place several
|
||||
* subwindows inside it. Then place your controls inside the subwindows.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_SubWindow 2
|
||||
|
||||
/*
|
||||
* SubWindow Type Values
|
||||
*
|
||||
* These values control the appearance of the subwindow.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* A panel that sits inside a main window. */
|
||||
xpSubWindowStyle_SubWindow = 0,
|
||||
|
||||
/* A screen that sits inside a panel for showing text information. */
|
||||
xpSubWindowStyle_Screen = 2,
|
||||
|
||||
/* A list view for scrolling lists. */
|
||||
xpSubWindowStyle_ListView = 3,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* SubWindow Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This property specifies the type of window. Set to one of the subwindow *
|
||||
* types above. */
|
||||
xpProperty_SubWindowType = 1200,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* BUTTON
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The button class provides a number of different button styles and
|
||||
* behaviors, including push buttons, radio buttons, check boxes, etc. The
|
||||
* button label appears on or next to the button depending on the button's
|
||||
* appearance, or type.
|
||||
*
|
||||
* The button's behavior is a separate property that dictates who it hilights
|
||||
* and what kinds of messages it sends. Since behavior and type are different,
|
||||
* you can do strange things like make check boxes that act as push buttons or
|
||||
* push buttons with radio button behavior.
|
||||
*
|
||||
* In X-Plane 6 there were no check box graphics. The result is the following
|
||||
* behavior: in X-Plane
|
||||
* 6 all check box and radio buttons are round (radio-button style) buttons;
|
||||
* in X-Plane 7 they are all square (check-box style) buttons. In a future
|
||||
* version of X-Plane, the xpButtonBehavior enums will provide the correct
|
||||
* graphic (check box or radio button) giving the expected result.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_Button 3
|
||||
|
||||
/*
|
||||
* Button Types
|
||||
*
|
||||
* These define the visual appearance of buttons but not how they respond to
|
||||
* the mouse.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This is a standard push button, like an 'OK' or 'Cancel' button in a dialog*
|
||||
* box. */
|
||||
xpPushButton = 0,
|
||||
|
||||
/* A check box or radio button. Use this and the button behaviors below to *
|
||||
* get the desired behavior. */
|
||||
xpRadioButton = 1,
|
||||
|
||||
/* A window close box. */
|
||||
xpWindowCloseBox = 3,
|
||||
|
||||
/* A small down arrow. */
|
||||
xpLittleDownArrow = 5,
|
||||
|
||||
/* A small up arrow. */
|
||||
xpLittleUpArrow = 6,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Button Behavior Values
|
||||
*
|
||||
* These define how the button responds to mouse clicks.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* Standard push button behavior. The button hilites while the mouse is *
|
||||
* clicked over it and unhilites when the mouse is moved outside of it or *
|
||||
* released. If the mouse is released over the button, the *
|
||||
* xpMsg_PushButtonPressed message is sent. */
|
||||
xpButtonBehaviorPushButton = 0,
|
||||
|
||||
/* Check box behavior. The button immediately toggles its value when the mouse*
|
||||
* is clicked and sends out a xpMsg_ButtonStateChanged message. */
|
||||
xpButtonBehaviorCheckBox = 1,
|
||||
|
||||
/* Radio button behavior. The button immediately sets its state to one and *
|
||||
* sends out a xpMsg_ButtonStateChanged message if it was not already set to *
|
||||
* one. You must turn off other radio buttons in a group in your code. */
|
||||
xpButtonBehaviorRadioButton = 2,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Button Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This property sets the visual type of button. Use one of the button types *
|
||||
* above. */
|
||||
xpProperty_ButtonType = 1300,
|
||||
|
||||
/* This property sets the button's behavior. Use one of the button behaviors *
|
||||
* above. */
|
||||
xpProperty_ButtonBehavior = 1301,
|
||||
|
||||
/* This property tells whether a check box or radio button is "checked" or *
|
||||
* not. Not used for push buttons. */
|
||||
xpProperty_ButtonState = 1302,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Button Messages
|
||||
*
|
||||
* These messages are sent by the button to itself and then up the widget
|
||||
* chain when the button is clicked. (You may intercept them by providing a
|
||||
* widget handler for the button itself or by providing a handler in a parent
|
||||
* widget.)
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This message is sent when the user completes a click and release in a *
|
||||
* button with push button behavior. Parameter one of the message is the *
|
||||
* widget ID of the button. This message is dispatched up the widget *
|
||||
* hierarchy. */
|
||||
xpMsg_PushButtonPressed = 1300,
|
||||
|
||||
/* This message is sent when a button is clicked that has radio button or *
|
||||
* check box behavior and its value changes. (Note that if the value changes *
|
||||
* by setting a property you do not receive this message!) Parameter one is *
|
||||
* the widget ID of the button, parameter 2 is the new state value, either *
|
||||
* zero or one. This message is dispatched up the widget hierarchy. */
|
||||
xpMsg_ButtonStateChanged = 1301,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* TEXT FIELD
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The text field widget provides an editable text field including mouse
|
||||
* selection and keyboard navigation. The contents of the text field are its
|
||||
* descriptor. (The descriptor changes as the user types.)
|
||||
*
|
||||
* The text field can have a number of types, that effect the visual layout of
|
||||
* the text field. The text field sends messages to itself so you may control
|
||||
* its behavior.
|
||||
*
|
||||
* If you need to filter keystrokes, add a new handler and intercept the key
|
||||
* press message. Since key presses are passed by pointer, you can modify the
|
||||
* keystroke and pass it through to the text field widget.
|
||||
*
|
||||
* WARNING: in X-Plane before 7.10 (including 6.70) null characters could
|
||||
* crash X-Plane. To prevent this, wrap this object with a filter function
|
||||
* (more instructions can be found on the SDK website).
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_TextField 4
|
||||
|
||||
/*
|
||||
* Text Field Type Values
|
||||
*
|
||||
* These control the look of the text field.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* A field for text entry. */
|
||||
xpTextEntryField = 0,
|
||||
|
||||
/* A transparent text field. The user can type and the text is drawn, but no *
|
||||
* background is drawn. You can draw your own background by adding a widget *
|
||||
* handler and prehandling the draw message. */
|
||||
xpTextTransparent = 3,
|
||||
|
||||
/* A translucent edit field, dark gray. */
|
||||
xpTextTranslucent = 4,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Text Field Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This is the character position the selection starts at, zero based. If it *
|
||||
* is the same as the end insertion point, the insertion point is not a *
|
||||
* selection. */
|
||||
xpProperty_EditFieldSelStart = 1400,
|
||||
|
||||
/* This is the character position of the end of the selection. */
|
||||
xpProperty_EditFieldSelEnd = 1401,
|
||||
|
||||
/* This is the character position a drag was started at if the user is *
|
||||
* dragging to select text, or -1 if a drag is not in progress. */
|
||||
xpProperty_EditFieldSelDragStart = 1402,
|
||||
|
||||
/* This is the type of text field to display, from the above list. */
|
||||
xpProperty_TextFieldType = 1403,
|
||||
|
||||
/* Set this property to 1 to password protect the field. Characters will be *
|
||||
* drawn as *s even though the descriptor will contain plain-text. */
|
||||
xpProperty_PasswordMode = 1404,
|
||||
|
||||
/* The max number of characters you can enter, if limited. Zero means *
|
||||
* unlimited. */
|
||||
xpProperty_MaxCharacters = 1405,
|
||||
|
||||
/* The first visible character on the left. This effectively scrolls the text*
|
||||
* field. */
|
||||
xpProperty_ScrollPosition = 1406,
|
||||
|
||||
/* The font to draw the field's text with. (An XPLMFontID.) */
|
||||
xpProperty_Font = 1407,
|
||||
|
||||
/* This is the active side of the insert selection. (Internal) */
|
||||
xpProperty_ActiveEditSide = 1408,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Text Field Messages
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The text field sends this message to itself when its text changes. It sends*
|
||||
* the message up the call chain; param1 is the text field's widget ID. */
|
||||
xpMsg_TextFieldChanged = 1400,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* SCROLL BAR
|
||||
***************************************************************************/
|
||||
/*
|
||||
* A standard scroll bar or slider control. The scroll bar has a minimum,
|
||||
* maximum and current value that is updated when the user drags it. The
|
||||
* scroll bar sends continuous messages as it is dragged.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_ScrollBar 5
|
||||
|
||||
/*
|
||||
* Scroll Bar Type Values
|
||||
*
|
||||
* This defines how the scroll bar looks.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* A standard X-Plane scroll bar (with arrows on the ends). */
|
||||
xpScrollBarTypeScrollBar = 0,
|
||||
|
||||
/* A slider, no arrows. */
|
||||
xpScrollBarTypeSlider = 1,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Scroll Bar Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The current position of the thumb (in between the min and max, inclusive) */
|
||||
xpProperty_ScrollBarSliderPosition = 1500,
|
||||
|
||||
/* The value the scroll bar has when the thumb is in the lowest position. */
|
||||
xpProperty_ScrollBarMin = 1501,
|
||||
|
||||
/* The value the scroll bar has when the thumb is in the highest position. */
|
||||
xpProperty_ScrollBarMax = 1502,
|
||||
|
||||
/* How many units to move the scroll bar when clicking next to the thumb. The *
|
||||
* scroll bar always moves one unit when the arrows are clicked. */
|
||||
xpProperty_ScrollBarPageAmount = 1503,
|
||||
|
||||
/* The type of scrollbar from the enums above. */
|
||||
xpProperty_ScrollBarType = 1504,
|
||||
|
||||
/* Used internally. */
|
||||
xpProperty_ScrollBarSlop = 1505,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Scroll Bar Messages
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The scroll bar sends this message when the slider position changes. It *
|
||||
* sends the message up the call chain; param1 is the Scroll Bar widget ID. */
|
||||
xpMsg_ScrollBarSliderPositionChanged = 1500,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* CAPTION
|
||||
***************************************************************************/
|
||||
/*
|
||||
* A caption is a simple widget that shows its descriptor as a string, useful
|
||||
* for labeling parts of a window. It always shows its descriptor as its
|
||||
* string and is otherwise transparent.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_Caption 6
|
||||
|
||||
/*
|
||||
* Caption Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This property specifies whether the caption is lit; use lit captions *
|
||||
* against screens. */
|
||||
xpProperty_CaptionLit = 1600,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* GENERAL GRAPHICS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The general graphics widget can show one of many icons available from
|
||||
* X-Plane.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define xpWidgetClass_GeneralGraphics 7
|
||||
|
||||
/*
|
||||
* General Graphics Types Values
|
||||
*
|
||||
* These define the icon for the general graphics.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xpShip = 4,
|
||||
|
||||
xpILSGlideScope = 5,
|
||||
|
||||
xpMarkerLeft = 6,
|
||||
|
||||
xp_Airport = 7,
|
||||
|
||||
xpNDB = 8,
|
||||
|
||||
xpVOR = 9,
|
||||
|
||||
xpRadioTower = 10,
|
||||
|
||||
xpAircraftCarrier = 11,
|
||||
|
||||
xpFire = 12,
|
||||
|
||||
xpMarkerRight = 13,
|
||||
|
||||
xpCustomObject = 14,
|
||||
|
||||
xpCoolingTower = 15,
|
||||
|
||||
xpSmokeStack = 16,
|
||||
|
||||
xpBuilding = 17,
|
||||
|
||||
xpPowerLine = 18,
|
||||
|
||||
xpVORWithCompassRose = 19,
|
||||
|
||||
xpOilPlatform = 21,
|
||||
|
||||
xpOilPlatformSmall = 22,
|
||||
|
||||
xpWayPoint = 23,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* General Graphics Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This property controls the type of icon that is drawn. */
|
||||
xpProperty_GeneralGraphicsType = 1700,
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* PROGRESS INDICATOR
|
||||
***************************************************************************/
|
||||
/*
|
||||
* This widget implements a progress indicator as seen when X-Plane starts up.
|
||||
*
|
||||
*/
|
||||
|
||||
#define xpWidgetClass_Progress 8
|
||||
|
||||
/*
|
||||
* Progress Indicator Properties
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* This is the current value of the progress indicator. */
|
||||
xpProperty_ProgressPosition = 1800,
|
||||
|
||||
/* This is the minimum value, equivalent to 0% filled. */
|
||||
xpProperty_ProgressMin = 1801,
|
||||
|
||||
/* This is the maximum value, equivalent to 100% filled. */
|
||||
xpProperty_ProgressMax = 1802,
|
||||
|
||||
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,354 @@
|
||||
#ifndef _XPUIGraphics_h_
|
||||
#define _XPUIGraphics_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPUIGraphics
|
||||
***************************************************************************/
|
||||
|
||||
#include "XPWidgetDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* UI GRAPHICS
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPWindowStyle
|
||||
*
|
||||
* There are a few built-in window styles in X-Plane that you can use.
|
||||
*
|
||||
* Note that X-Plane 6 does not offer real shadow-compositing; you must make
|
||||
* sure to put a window on top of another window of the right style to the
|
||||
* shadows work, etc. This applies to elements with insets and shadows. The
|
||||
* rules are:
|
||||
*
|
||||
* Sub windows must go on top of main windows, and screens and list views on
|
||||
* top of subwindows. Only help and main windows can be over the main screen.
|
||||
*
|
||||
* With X-Plane 7 any window or element may be placed over any other element.
|
||||
*
|
||||
* Some windows are scaled by stretching, some by repeating. The drawing
|
||||
* routines know which scaling method to use. The list view cannot be rescaled
|
||||
* in X-Plane 6 because it has both a repeating pattern and a gradient in one
|
||||
* element. All other elements can be rescaled.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* An LCD screen that shows help. */
|
||||
xpWindow_Help = 0,
|
||||
|
||||
/* A dialog box window. */
|
||||
xpWindow_MainWindow = 1,
|
||||
|
||||
/* A panel or frame within a dialog box window. */
|
||||
xpWindow_SubWindow = 2,
|
||||
|
||||
/* An LCD screen within a panel to hold text displays. */
|
||||
xpWindow_Screen = 4,
|
||||
|
||||
/* A list view within a panel for scrolling file names, etc. */
|
||||
xpWindow_ListView = 5,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPWindowStyle;
|
||||
|
||||
/*
|
||||
* XPDrawWindow
|
||||
*
|
||||
* This routine draws a window of the given dimensions at the given offset on
|
||||
* the virtual screen in a given style. The window is automatically scaled as
|
||||
* appropriate using a bitmap scaling technique (scaling or repeating) as
|
||||
* appropriate to the style.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPDrawWindow(
|
||||
int inX1,
|
||||
int inY1,
|
||||
int inX2,
|
||||
int inY2,
|
||||
XPWindowStyle inStyle);
|
||||
|
||||
/*
|
||||
* XPGetWindowDefaultDimensions
|
||||
*
|
||||
* This routine returns the default dimensions for a window. Output is either
|
||||
* a minimum or fixed value depending on whether the window is scalable.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetWindowDefaultDimensions(
|
||||
XPWindowStyle inStyle,
|
||||
int * outWidth, /* Can be NULL */
|
||||
int * outHeight); /* Can be NULL */
|
||||
|
||||
/*
|
||||
* XPElementStyle
|
||||
*
|
||||
* Elements are individually drawable UI things like push buttons, etc. The
|
||||
* style defines what kind of element you are drawing. Elements can be
|
||||
* stretched in one or two dimensions (depending on the element). Some
|
||||
* elements can be lit.
|
||||
*
|
||||
* In X-Plane 6 some elements must be drawn over metal. Some are scalable and
|
||||
* some are not. Any element can be drawn anywhere in X-Plane 7.
|
||||
*
|
||||
* Scalable Axis Required Background
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* x metal */
|
||||
xpElement_TextField = 6,
|
||||
|
||||
/* none metal */
|
||||
xpElement_CheckBox = 9,
|
||||
|
||||
/* none metal */
|
||||
xpElement_CheckBoxLit = 10,
|
||||
|
||||
/* none window header */
|
||||
xpElement_WindowCloseBox = 14,
|
||||
|
||||
/* none window header */
|
||||
xpElement_WindowCloseBoxPressed = 15,
|
||||
|
||||
/* x metal */
|
||||
xpElement_PushButton = 16,
|
||||
|
||||
/* x metal */
|
||||
xpElement_PushButtonLit = 17,
|
||||
|
||||
/* none any */
|
||||
xpElement_OilPlatform = 24,
|
||||
|
||||
/* none any */
|
||||
xpElement_OilPlatformSmall = 25,
|
||||
|
||||
/* none any */
|
||||
xpElement_Ship = 26,
|
||||
|
||||
/* none any */
|
||||
xpElement_ILSGlideScope = 27,
|
||||
|
||||
/* none any */
|
||||
xpElement_MarkerLeft = 28,
|
||||
|
||||
/* none any */
|
||||
xpElement_Airport = 29,
|
||||
|
||||
/* none any */
|
||||
xpElement_Waypoint = 30,
|
||||
|
||||
/* none any */
|
||||
xpElement_NDB = 31,
|
||||
|
||||
/* none any */
|
||||
xpElement_VOR = 32,
|
||||
|
||||
/* none any */
|
||||
xpElement_RadioTower = 33,
|
||||
|
||||
/* none any */
|
||||
xpElement_AircraftCarrier = 34,
|
||||
|
||||
/* none any */
|
||||
xpElement_Fire = 35,
|
||||
|
||||
/* none any */
|
||||
xpElement_MarkerRight = 36,
|
||||
|
||||
/* none any */
|
||||
xpElement_CustomObject = 37,
|
||||
|
||||
/* none any */
|
||||
xpElement_CoolingTower = 38,
|
||||
|
||||
/* none any */
|
||||
xpElement_SmokeStack = 39,
|
||||
|
||||
/* none any */
|
||||
xpElement_Building = 40,
|
||||
|
||||
/* none any */
|
||||
xpElement_PowerLine = 41,
|
||||
|
||||
/* none metal */
|
||||
xpElement_CopyButtons = 45,
|
||||
|
||||
/* none metal */
|
||||
xpElement_CopyButtonsWithEditingGrid = 46,
|
||||
|
||||
/* x, y metal */
|
||||
xpElement_EditingGrid = 47,
|
||||
|
||||
/* THIS CAN PROBABLY BE REMOVED */
|
||||
xpElement_ScrollBar = 48,
|
||||
|
||||
/* none any */
|
||||
xpElement_VORWithCompassRose = 49,
|
||||
|
||||
/* none metal */
|
||||
xpElement_Zoomer = 51,
|
||||
|
||||
/* x, y metal */
|
||||
xpElement_TextFieldMiddle = 52,
|
||||
|
||||
/* none metal */
|
||||
xpElement_LittleDownArrow = 53,
|
||||
|
||||
/* none metal */
|
||||
xpElement_LittleUpArrow = 54,
|
||||
|
||||
/* none metal */
|
||||
xpElement_WindowDragBar = 61,
|
||||
|
||||
/* none metal */
|
||||
xpElement_WindowDragBarSmooth = 62,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPElementStyle;
|
||||
|
||||
/*
|
||||
* XPDrawElement
|
||||
*
|
||||
* XPDrawElement draws a given element at an offset on the virtual screen in
|
||||
* set dimensions.
|
||||
* *Even* if the element is not scalable, it will be scaled if the width and
|
||||
* height do not match the preferred dimensions; it'll just look ugly. Pass
|
||||
* inLit to see the lit version of the element; if the element cannot be lit
|
||||
* this is ignored.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPDrawElement(
|
||||
int inX1,
|
||||
int inY1,
|
||||
int inX2,
|
||||
int inY2,
|
||||
XPElementStyle inStyle,
|
||||
int inLit);
|
||||
|
||||
/*
|
||||
* XPGetElementDefaultDimensions
|
||||
*
|
||||
* This routine returns the recommended or minimum dimensions of a given UI
|
||||
* element. outCanBeLit tells whether the element has both a lit and unlit
|
||||
* state. Pass `NULL` to not receive any of these parameters.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetElementDefaultDimensions(
|
||||
XPElementStyle inStyle,
|
||||
int * outWidth, /* Can be NULL */
|
||||
int * outHeight, /* Can be NULL */
|
||||
int * outCanBeLit); /* Can be NULL */
|
||||
|
||||
/*
|
||||
* XPTrackStyle
|
||||
*
|
||||
* A track is a UI element that displays a value vertically or horizontally.
|
||||
* X-Plane has three kinds of tracks: scroll bars, sliders, and progress bars.
|
||||
* Tracks can be displayed either horizontally or vertically; tracks will
|
||||
* choose their own layout based on the larger dimension of their dimensions
|
||||
* (e.g. they know if they are tall or wide). Sliders may be lit or unlit
|
||||
* (showing the user manipulating them).
|
||||
*
|
||||
* - ScrollBar: this is a standard scroll bar with arrows and a thumb to drag.
|
||||
* - Slider: this is a simple track with a ball in the middle that can be
|
||||
* slid.
|
||||
* - Progress: this is a progress indicator showing how a long task is going.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* not over metal can be lit can be rotated */
|
||||
xpTrack_ScrollBar = 0,
|
||||
|
||||
/* over metal can be lit can be rotated */
|
||||
xpTrack_Slider = 1,
|
||||
|
||||
/* over metal cannot be lit cannot be rotated */
|
||||
xpTrack_Progress = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPTrackStyle;
|
||||
|
||||
/*
|
||||
* XPDrawTrack
|
||||
*
|
||||
* This routine draws a track. You pass in the track dimensions and size; the
|
||||
* track picks the optimal orientation for these dimensions. Pass in the
|
||||
* track's minimum current and maximum values; the indicator will be
|
||||
* positioned appropriately. You can also specify whether the track is lit or
|
||||
* not.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPDrawTrack(
|
||||
int inX1,
|
||||
int inY1,
|
||||
int inX2,
|
||||
int inY2,
|
||||
int inMin,
|
||||
int inMax,
|
||||
int inValue,
|
||||
XPTrackStyle inTrackStyle,
|
||||
int inLit);
|
||||
|
||||
/*
|
||||
* XPGetTrackDefaultDimensions
|
||||
*
|
||||
* This routine returns a track's default smaller dimension; all tracks are
|
||||
* scalable in the larger dimension. It also returns whether a track can be
|
||||
* lit.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetTrackDefaultDimensions(
|
||||
XPTrackStyle inStyle,
|
||||
int * outWidth,
|
||||
int * outCanBeLit);
|
||||
|
||||
/*
|
||||
* XPGetTrackMetrics
|
||||
*
|
||||
* This routine returns the metrics of a track. If you want to write UI code
|
||||
* to manipulate a track, this routine helps you know where the mouse
|
||||
* locations are. For most other elements, the rectangle the element is drawn
|
||||
* in is enough information. However, the scrollbar drawing routine does some
|
||||
* automatic placement; this routine lets you know where things ended up. You
|
||||
* pass almost everything you would pass to the draw routine. You get out the
|
||||
* orientation, and other useful stuff.
|
||||
*
|
||||
* Besides orientation, you get five dimensions for the five parts of a
|
||||
* scrollbar, which are the down button, down area (area before the thumb),
|
||||
* the thumb, and the up area and button. For horizontal scrollers, the left
|
||||
* button decreases; for vertical scrollers, the top button decreases.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetTrackMetrics(
|
||||
int inX1,
|
||||
int inY1,
|
||||
int inX2,
|
||||
int inY2,
|
||||
int inMin,
|
||||
int inMax,
|
||||
int inValue,
|
||||
XPTrackStyle inTrackStyle,
|
||||
int * outIsVertical,
|
||||
int * outDownBtnSize,
|
||||
int * outDownPageSize,
|
||||
int * outThumbSize,
|
||||
int * outUpPageSize,
|
||||
int * outUpBtnSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,472 @@
|
||||
#ifndef _XPWidgetDefs_h_
|
||||
#define _XPWidgetDefs_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPWidgetDefs
|
||||
***************************************************************************/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#if APL
|
||||
#if XPWIDGETS
|
||||
#if __GNUC__ >= 4
|
||||
#define WIDGET_API __attribute__((visibility("default")))
|
||||
#elif __MACH__
|
||||
#define WIDGET_API
|
||||
#else
|
||||
#define WIDGET_API __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#define WIDGET_API
|
||||
#endif
|
||||
#elif IBM
|
||||
#if XPWIDGETS
|
||||
#define WIDGET_API __declspec(dllexport)
|
||||
#else
|
||||
#define WIDGET_API __declspec(dllimport)
|
||||
#endif
|
||||
#elif LIN
|
||||
#if XPWIDGETS
|
||||
#if __GNUC__ >= 4
|
||||
#define WIDGET_API __attribute__((visibility("default")))
|
||||
#else
|
||||
#define WIDGET_API
|
||||
#endif
|
||||
#else
|
||||
#define WIDGET_API
|
||||
#endif
|
||||
#else
|
||||
#pragma error "Platform not defined!"
|
||||
#endif
|
||||
/***************************************************************************
|
||||
* WIDGET DEFINITIONS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* A widget is a call-back driven screen entity like a push-button, window,
|
||||
* text entry field, etc.
|
||||
*
|
||||
* Use the widget API to create widgets of various classes. You can nest them
|
||||
* into trees of widgets to create complex user interfaces.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPWidgetID
|
||||
*
|
||||
* A Widget ID is an opaque unique non-zero handle identifying your widget.
|
||||
* Use 0 to specify "no widget". This type is defined as wide enough to hold a
|
||||
* pointer. You receive a widget ID when you create a new widget and then use
|
||||
* that widget ID to further refer to the widget.
|
||||
*
|
||||
*/
|
||||
typedef void * XPWidgetID;
|
||||
|
||||
/*
|
||||
* XPWidgetPropertyID
|
||||
*
|
||||
* Properties are values attached to instances of your widgets. A property is
|
||||
* identified by a 32-bit ID and its value is the width of a pointer.
|
||||
*
|
||||
* Each widget instance may have a property or not have it. When you set a
|
||||
* property on a widget for the first time, the property is added to the
|
||||
* widget; it then stays there for the life of the widget.
|
||||
*
|
||||
* Some property IDs are predefined by the widget package; you can make up
|
||||
* your own property IDs as well.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* A window's refcon is an opaque value used by client code to find other data*
|
||||
* based on it. */
|
||||
xpProperty_Refcon = 0,
|
||||
|
||||
/* These properties are used by the utlities to implement dragging. */
|
||||
xpProperty_Dragging = 1,
|
||||
|
||||
xpProperty_DragXOff = 2,
|
||||
|
||||
xpProperty_DragYOff = 3,
|
||||
|
||||
/* Is the widget hilited? (For widgets that support this kind of thing.) */
|
||||
xpProperty_Hilited = 4,
|
||||
|
||||
/* Is there a C++ object attached to this widget? */
|
||||
xpProperty_Object = 5,
|
||||
|
||||
/* If this property is 1, the widget package will use OpenGL to restrict *
|
||||
* drawing to the Wiget's exposed rectangle. */
|
||||
xpProperty_Clip = 6,
|
||||
|
||||
/* Is this widget enabled (for those that have a disabled state too)? */
|
||||
xpProperty_Enabled = 7,
|
||||
|
||||
/* NOTE: Property IDs 1 - 999 are reserved for the widgets library. *
|
||||
* *
|
||||
* NOTE: Property IDs 1000 - 9999 are allocated to the standard widget classes*
|
||||
* provided with the library. *
|
||||
* *
|
||||
* Properties 1000 - 1099 are for widget class 0, 1100 - 1199 for widget class*
|
||||
* 1, etc. */
|
||||
xpProperty_UserStart = 10000,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPWidgetPropertyID;
|
||||
|
||||
/*
|
||||
* XPMouseState_t
|
||||
*
|
||||
* When the mouse is clicked or dragged, a pointer to this structure is passed
|
||||
* to your widget function.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
int x;
|
||||
int y;
|
||||
/* Mouse Button number, left = 0 (right button not yet supported. */
|
||||
int button;
|
||||
#if defined(XPLM200)
|
||||
/* Scroll wheel delta (button in this case would be the wheel axis number). */
|
||||
int delta;
|
||||
#endif /* XPLM200 */
|
||||
} XPMouseState_t;
|
||||
|
||||
/*
|
||||
* XPKeyState_t
|
||||
*
|
||||
* When a key is pressed, a pointer to this struct is passed to your widget
|
||||
* function.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
/* The ASCII key that was pressed. WARNING: this may be 0 for some non-ASCII *
|
||||
* key sequences. */
|
||||
char key;
|
||||
/* The flags. Make sure to check this if you only want key-downs! */
|
||||
XPLMKeyFlags flags;
|
||||
/* The virtual key code for the key */
|
||||
char vkey;
|
||||
} XPKeyState_t;
|
||||
|
||||
/*
|
||||
* XPWidgetGeometryChange_t
|
||||
*
|
||||
* This structure contains the deltas for your widget's geometry when it
|
||||
* changes.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
int dx;
|
||||
/* +Y = the widget moved up */
|
||||
int dy;
|
||||
int dwidth;
|
||||
int dheight;
|
||||
} XPWidgetGeometryChange_t;
|
||||
|
||||
/*
|
||||
* XPDispatchMode
|
||||
*
|
||||
* The dispatching modes describe how the widgets library sends out messages.
|
||||
* Currently there are three modes:
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The message will only be sent to the target widget. */
|
||||
xpMode_Direct = 0,
|
||||
|
||||
/* The message is sent to the target widget, then up the chain of parents *
|
||||
* until the message is handled or a parentless widget is reached. */
|
||||
xpMode_UpChain = 1,
|
||||
|
||||
/* The message is sent to the target widget and then all of its children *
|
||||
* recursively depth-first. */
|
||||
xpMode_Recursive = 2,
|
||||
|
||||
/* The message is snet just to the target, but goes to every callback, even if*
|
||||
* it is handled. */
|
||||
xpMode_DirectAllCallbacks = 3,
|
||||
|
||||
/* The message is only sent to the very first handler even if it is not *
|
||||
* accepted. (This is really only useful for some internal widget library *
|
||||
* functions.) */
|
||||
xpMode_Once = 4,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPDispatchMode;
|
||||
|
||||
/*
|
||||
* XPWidgetClass
|
||||
*
|
||||
* Widget classes define predefined widget types. A widget class basically
|
||||
* specifies from a library the widget function to be used for the widget.
|
||||
* Most widgets can be made right from classes.
|
||||
*
|
||||
*/
|
||||
typedef int XPWidgetClass;
|
||||
|
||||
/* An unspecified widget class. Other widget classes are in *
|
||||
* XPStandardWidgets.h */
|
||||
#define xpWidgetClass_None 0
|
||||
|
||||
/***************************************************************************
|
||||
* WIDGET MESSAGES
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPWidgetMessage
|
||||
*
|
||||
* Widgets receive 32-bit messages indicating what action is to be taken or
|
||||
* notifications of events. The list of messages may be expanded.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* No message, should not be sent. */
|
||||
xpMsg_None = 0,
|
||||
|
||||
/* The create message is sent once per widget that is created with your widget*
|
||||
* function and once for any widget that has your widget function attached. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: 1 if you are being added as a subclass, 0 if the widget is first *
|
||||
* being created. */
|
||||
xpMsg_Create = 1,
|
||||
|
||||
/* The destroy message is sent once for each message that is destroyed that *
|
||||
* has your widget function. *
|
||||
* *
|
||||
* Dispatching: Direct for all *
|
||||
* *
|
||||
* Param 1: 1 if being deleted by a recursive delete to the parent, 0 for *
|
||||
* explicit deletion. */
|
||||
xpMsg_Destroy = 2,
|
||||
|
||||
/* The paint message is sent to your widget to draw itself. The paint message *
|
||||
* is the bare-bones message; in response you must draw yourself, draw your *
|
||||
* children, set up clipping and culling, check for visibility, etc. If you *
|
||||
* don't want to do all of this, ignore the paint message and a draw message *
|
||||
* (see below) will be sent to you. *
|
||||
* *
|
||||
* Dispatching: Direct */
|
||||
xpMsg_Paint = 3,
|
||||
|
||||
/* The draw message is sent to your widget when it is time to draw yourself. *
|
||||
* OpenGL will be set up to draw in 2-d global screen coordinates, but you *
|
||||
* should use the XPLM to set up OpenGL state. *
|
||||
* *
|
||||
* Dispatching: Direct */
|
||||
xpMsg_Draw = 4,
|
||||
|
||||
/* The key press message is sent once per key that is pressed. The first *
|
||||
* parameter is the type of key code (integer or char) and the second is the *
|
||||
* code itself. By handling this event, you consume the key stroke. *
|
||||
* *
|
||||
* Handling this message 'consumes' the keystroke; not handling it passes it *
|
||||
* to your parent widget. *
|
||||
* *
|
||||
* Dispatching: Up Chain *
|
||||
* *
|
||||
* Param 1: A pointer to an XPKeyState_t structure with the keystroke. */
|
||||
xpMsg_KeyPress = 5,
|
||||
|
||||
/* Keyboard focus is being given to you. By handling this message you accept *
|
||||
* keyboard focus. The first parameter will be one if a child of yours gave up*
|
||||
* focus to you, 0 if someone set focus on you explicitly. *
|
||||
* *
|
||||
* Handling this message accepts focus; not handling refuses focus. *
|
||||
* *
|
||||
* Dispatching: direct *
|
||||
* *
|
||||
* Param 1: 1 if you are gaining focus because your child is giving it up, 0 *
|
||||
* if someone is explicitly giving you focus. */
|
||||
xpMsg_KeyTakeFocus = 6,
|
||||
|
||||
/* Keyboard focus is being taken away from you. The first parameter will be *
|
||||
* one if you are losing focus because another widget is taking it, or 0 if *
|
||||
* someone called the API to make you lose focus explicitly. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: 1 if focus is being taken by another widget, 0 if code requested *
|
||||
* to remove focus. */
|
||||
xpMsg_KeyLoseFocus = 7,
|
||||
|
||||
/* You receive one mousedown event per click with a mouse-state structure *
|
||||
* pointed to by parameter 1, by accepting this you eat the click, otherwise *
|
||||
* your parent gets it. You will not receive drag and mouse up messages if you*
|
||||
* do not accept the down message. *
|
||||
* *
|
||||
* Handling this message consumes the mouse click, not handling it passes it *
|
||||
* to the next widget. You can act 'transparent' as a window by never handling*
|
||||
* moues clicks to certain areas. *
|
||||
* *
|
||||
* Dispatching: Up chain NOTE: Technically this is direct dispatched, but the *
|
||||
* widgets library will shop it to each widget until one consumes the click, *
|
||||
* making it effectively "up chain". *
|
||||
* *
|
||||
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
|
||||
xpMsg_MouseDown = 8,
|
||||
|
||||
/* You receive a series of mouse drag messages (typically one per frame in the*
|
||||
* sim) as the mouse is moved once you have accepted a mouse down message. *
|
||||
* Parameter one points to a mouse-state structure describing the mouse *
|
||||
* location. You will continue to receive these until the mouse button is *
|
||||
* released. You may receive multiple mouse state messages with the same mouse*
|
||||
* position. You will receive mouse drag events even if the mouse is dragged *
|
||||
* out of your current or original bounds at the time of the mouse down. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
|
||||
xpMsg_MouseDrag = 9,
|
||||
|
||||
/* The mouseup event is sent once when the mouse button is released after a *
|
||||
* drag or click. You only receive this message if you accept the mouseDown *
|
||||
* message. Parameter one points to a mouse state structure. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
|
||||
xpMsg_MouseUp = 10,
|
||||
|
||||
/* Your geometry or a child's geometry is being changed. *
|
||||
* *
|
||||
* Dispatching: Up chain *
|
||||
* *
|
||||
* Param 1: The widget ID of the original reshaped target. *
|
||||
* *
|
||||
* Param 2: A pointer to a XPWidgetGeometryChange_t struct describing the *
|
||||
* change. */
|
||||
xpMsg_Reshape = 11,
|
||||
|
||||
/* Your exposed area has changed. *
|
||||
* *
|
||||
* Dispatching: Direct */
|
||||
xpMsg_ExposedChanged = 12,
|
||||
|
||||
/* A child has been added to you. The child's ID is passed in parameter one. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: The Widget ID of the child being added. */
|
||||
xpMsg_AcceptChild = 13,
|
||||
|
||||
/* A child has been removed from to you. The child's ID is passed in parameter*
|
||||
* one. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: The Widget ID of the child being removed. */
|
||||
xpMsg_LoseChild = 14,
|
||||
|
||||
/* You now have a new parent, or have no parent. The parent's ID is passed in,*
|
||||
* or 0 for no parent. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: The Widget ID of your parent */
|
||||
xpMsg_AcceptParent = 15,
|
||||
|
||||
/* You or a child has been shown. Note that this does not include you being *
|
||||
* shown because your parent was shown, you were put in a new parent, your *
|
||||
* root was shown, etc. *
|
||||
* *
|
||||
* Dispatching: Up chain *
|
||||
* *
|
||||
* Param 1: The widget ID of the shown widget. */
|
||||
xpMsg_Shown = 16,
|
||||
|
||||
/* You have been hidden. See limitations above. *
|
||||
* *
|
||||
* Dispatching: Up chain *
|
||||
* *
|
||||
* Param 1: The widget ID of the hidden widget. */
|
||||
xpMsg_Hidden = 17,
|
||||
|
||||
/* Your descriptor has changed. *
|
||||
* *
|
||||
* Dispatching: Direct */
|
||||
xpMsg_DescriptorChanged = 18,
|
||||
|
||||
/* A property has changed. Param 1 contains the property ID. *
|
||||
* *
|
||||
* Dispatching: Direct *
|
||||
* *
|
||||
* Param 1: The Property ID being changed. *
|
||||
* *
|
||||
* Param 2: The new property value */
|
||||
xpMsg_PropertyChanged = 19,
|
||||
|
||||
#if defined(XPLM200)
|
||||
/* The mouse wheel has moved. *
|
||||
* *
|
||||
* Return 1 to consume the mouse wheel move, or 0 to pass the message to a *
|
||||
* parent. Dispatching: Up chain *
|
||||
* *
|
||||
* Param 1: A pointer to an XPMouseState_t containing the mouse status. */
|
||||
xpMsg_MouseWheel = 20,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(XPLM200)
|
||||
/* The cursor is over your widget. If you consume this message, change the *
|
||||
* XPLMCursorStatus value to indicate the desired result, with the same rules *
|
||||
* as in XPLMDisplay.h. *
|
||||
* *
|
||||
* Return 1 to consume this message, 0 to pass it on. *
|
||||
* *
|
||||
* Dispatching: Up chain Param 1: A pointer to an XPMouseState_t struct *
|
||||
* containing the mouse status. *
|
||||
* *
|
||||
* Param 2: A pointer to a XPLMCursorStatus - set this to the cursor result *
|
||||
* you desire. */
|
||||
xpMsg_CursorAdjust = 21,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
/* NOTE: Message IDs 1000 - 9999 are allocated to the standard widget classes *
|
||||
* provided with the library with 1000 - 1099 for widget class 0, 1100 - 1199 *
|
||||
* for widget class 1, etc. Message IDs 10,000 and beyond are for plugin use. */
|
||||
xpMsg_UserStart = 10000,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPWidgetMessage;
|
||||
|
||||
/***************************************************************************
|
||||
* WIDGET CALLBACK FUNCTION
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPWidgetFunc_t
|
||||
*
|
||||
* This function defines your custom widget's behavior. It will be called by
|
||||
* the widgets library to send messages to your widget. The message and widget
|
||||
* ID are passed in, as well as two ptr-width signed parameters whose meaning
|
||||
* varies with the message. Return 1 to indicate that you have processed the
|
||||
* message, 0 to indicate that you have not. For any message that is not
|
||||
* understood, return 0.
|
||||
*
|
||||
*/
|
||||
typedef int (* XPWidgetFunc_t)(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,232 @@
|
||||
#ifndef _XPWidgetUtils_h_
|
||||
#define _XPWidgetUtils_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPWidgetUtils
|
||||
***************************************************************************/
|
||||
/*
|
||||
* ## USAGE NOTES
|
||||
*
|
||||
* The XPWidgetUtils library contains useful functions that make writing and
|
||||
* using widgets less of a pain.
|
||||
*
|
||||
* One set of functions are the widget behavior functions. These functions
|
||||
* each add specific useful behaviors to widgets. They can be used in two
|
||||
* manners:
|
||||
*
|
||||
* 1. You can add a widget behavior function to a widget as a callback proc
|
||||
* using the XPAddWidgetCallback function. The widget will gain that
|
||||
* behavior. Remember that the last function you add has highest priority.
|
||||
* You can use this to change or augment the behavior of an existing
|
||||
* finished widget.
|
||||
* 2. You can call a widget function from inside your own widget function.
|
||||
* This allows you to include useful behaviors in custom-built widgets. A
|
||||
* number of the standard widgets get their behavior from this library. To
|
||||
* do this, call the behavior function from your function first. If it
|
||||
* returns 1, that means it handled the event and you don't need to; simply
|
||||
* return 1.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPWidgetDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* GENERAL UTILITIES
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Convenience accessors
|
||||
*
|
||||
* It can be clumsy accessing the variables passed in by pointer to a struct
|
||||
* for mouse and reshape messages; these accessors let you simply pass in the param
|
||||
* right from the arguments of your widget proc and get back the value you want.
|
||||
*
|
||||
*/
|
||||
#define MOUSE_X(param) (((XPMouseState_t *) (param))->x)
|
||||
#define MOUSE_Y(param) (((XPMouseState_t *) (param))->y)
|
||||
|
||||
#define DELTA_X(param) (((XPWidgetGeometryChange_t *) (param))->dx)
|
||||
#define DELTA_Y(param) (((XPWidgetGeometryChange_t *) (param))->dy)
|
||||
#define DELTA_W(param) (((XPWidgetGeometryChange_t *) (param))->dwidth)
|
||||
#define DELTA_H(param) (((XPWidgetGeometryChange_t *) (param))->dheight)
|
||||
|
||||
#define KEY_CHAR(param) (((XPKeyState_t *) (param))->key)
|
||||
#define KEY_FLAGS(param) (((XPKeyState_t *) (param))->flags)
|
||||
#define KEY_VKEY(param) (((XPKeyState_t *) (param))->vkey)
|
||||
|
||||
#define IN_RECT(x, y, l, t, r, b) \
|
||||
(((x) >= (l)) && ((x) <= (r)) && ((y) >= (b)) && ((y) <= (t)))
|
||||
|
||||
/*
|
||||
* XPWidgetCreate_t
|
||||
*
|
||||
* This structure contains all of the parameters needed to create a wiget. It
|
||||
* is used with XPUCreateWidgets to create widgets in bulk from an array. All
|
||||
* parameters correspond to those of XPCreateWidget except for the container
|
||||
* index.
|
||||
*
|
||||
* If the container index is equal to the index of a widget in the array, the
|
||||
* widget in the array passed to XPUCreateWidgets is used as the parent of
|
||||
* this widget. Note that if you pass an index greater than your own position
|
||||
* in the array, the parent you are requesting will not exist yet.
|
||||
*
|
||||
* If the container index is NO_PARENT, the parent widget is specified as
|
||||
* NULL. If the container index is PARAM_PARENT, the widget passed into
|
||||
* XPUCreateWidgets is used.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
int left;
|
||||
int top;
|
||||
int right;
|
||||
int bottom;
|
||||
int visible;
|
||||
const char * descriptor;
|
||||
/* Whether ethis widget is a root wiget */
|
||||
int isRoot;
|
||||
/* The index of the widget to contain within, or a constant */
|
||||
int containerIndex;
|
||||
XPWidgetClass widgetClass;
|
||||
} XPWidgetCreate_t;
|
||||
|
||||
#define NO_PARENT -1
|
||||
|
||||
#define PARAM_PARENT -2
|
||||
|
||||
#define WIDGET_COUNT(x) ((sizeof(x) / sizeof(XPWidgetCreate_t)))
|
||||
|
||||
/*
|
||||
* XPUCreateWidgets
|
||||
*
|
||||
* This function creates a series of widgets from a table (see
|
||||
* XPCreateWidget_t above). Pass in an array of widget creation structures and
|
||||
* an array of widget IDs that will receive each widget.
|
||||
*
|
||||
* Widget parents are specified by index into the created widget table,
|
||||
* allowing you to create nested widget structures. You can create multiple
|
||||
* widget trees in one table. Generally you should create widget trees from
|
||||
* the top down.
|
||||
*
|
||||
* You can also pass in a widget ID that will be used when the widget's parent
|
||||
* is listed as PARAM_PARENT; this allows you to embed widgets created with
|
||||
* XPUCreateWidgets in a widget created previously.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPUCreateWidgets(
|
||||
const XPWidgetCreate_t * inWidgetDefs,
|
||||
int inCount,
|
||||
XPWidgetID inParamParent,
|
||||
XPWidgetID * ioWidgets);
|
||||
|
||||
/*
|
||||
* XPUMoveWidgetBy
|
||||
*
|
||||
* Simply moves a widget by an amount, +x = right, +y=up, without resizing the
|
||||
* widget.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPUMoveWidgetBy(
|
||||
XPWidgetID inWidget,
|
||||
int inDeltaX,
|
||||
int inDeltaY);
|
||||
|
||||
/***************************************************************************
|
||||
* LAYOUT MANAGERS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The layout managers are widget behavior functions for handling where
|
||||
* widgets move. Layout managers can be called from a widget function or
|
||||
* attached to a widget later.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPUFixedLayout
|
||||
*
|
||||
* This function causes the widget to maintain its children in fixed position
|
||||
* relative to itself as it is resized. Use this on the top level 'window'
|
||||
* widget for your window.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPUFixedLayout(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
/***************************************************************************
|
||||
* WIDGET PROC BEHAVIORS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These widget behavior functions add other useful behaviors to widgets.
|
||||
* These functions cannot be attached to a widget; they must be called from
|
||||
* your widget function.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPUSelectIfNeeded
|
||||
*
|
||||
* This causes the widget to bring its window to the foreground if it is not
|
||||
* already. inEatClick specifies whether clicks in the background should be
|
||||
* consumed by bringin the window to the foreground.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPUSelectIfNeeded(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2,
|
||||
int inEatClick);
|
||||
|
||||
/*
|
||||
* XPUDefocusKeyboard
|
||||
*
|
||||
* This causes a click in the widget to send keyboard focus back to X-Plane.
|
||||
* This stops editing of any text fields, etc.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPUDefocusKeyboard(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2,
|
||||
int inEatClick);
|
||||
|
||||
/*
|
||||
* XPUDragWidget
|
||||
*
|
||||
* XPUDragWidget drags the widget in response to mouse clicks. Pass in not
|
||||
* only the event, but the global coordinates of the drag region, which might
|
||||
* be a sub-region of your widget (for example, a title bar).
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPUDragWidget(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2,
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,538 @@
|
||||
#ifndef _XPWidgets_h_
|
||||
#define _XPWidgets_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPWidgets
|
||||
***************************************************************************/
|
||||
/*
|
||||
* ## THEORY OF OPERATION AND NOTES
|
||||
*
|
||||
* Widgets are persistent view 'objects' for X-Plane. A widget is an object
|
||||
* referenced by its opaque handle (widget ID) and the APIs in this file. You
|
||||
* cannot access the widget's guts directly. Every Widget has the following
|
||||
* intrinsic data:
|
||||
*
|
||||
* - A bounding box defined in global screen coordinates with 0,0 in the
|
||||
* bottom left and +y = up, +x = right.
|
||||
* - A visible box, which is the intersection of the bounding box with the
|
||||
* widget's parents visible box.
|
||||
* - Zero or one parent widgets. (Always zero if the widget is a root widget.
|
||||
* - Zero or more child widgets.
|
||||
* - Whether the widget is a root. Root widgets are the top level plugin
|
||||
* windows.
|
||||
* - Whether the widget is visible.
|
||||
* - A text string descriptor, whose meaning varies from widget to widget.
|
||||
* - An arbitrary set of 32 bit integral properties defined by 32-bit integral
|
||||
* keys. This is how specific widgets store specific data.
|
||||
* - A list of widget callbacks proc that implements the widgets behaviors.
|
||||
*
|
||||
* The Widgets library sends messages to widgets to request specific behaviors
|
||||
* or notify the widget of things.
|
||||
*
|
||||
* Widgets may have more than one callback function, in which case messages
|
||||
* are sent to the most recently added callback function until the message is
|
||||
* handled. Messages may also be sent to parents or children; see the
|
||||
* XPWidgetDefs.h header file for the different widget message dispatching
|
||||
* functions. By adding a callback function to a window you can 'subclass' its
|
||||
* behavior.
|
||||
*
|
||||
* A set of standard widgets are provided that serve common UI purposes. You
|
||||
* can also customize or implement entirely custom widgets.
|
||||
*
|
||||
* Widgets are different than other view hierarchies (most notably Win32,
|
||||
* which they bear a striking resemblance to) in the following ways:
|
||||
*
|
||||
* - Not all behavior can be patched. State that is managed by the XPWidgets
|
||||
* DLL and not by individual widgets cannot be customized.
|
||||
* - All coordinates are in global screen coordinates. Coordinates are not
|
||||
* relative to an enclosing widget, nor are they relative to a display
|
||||
* window.
|
||||
* - Widget messages are always dispatched synchronously, and there is no
|
||||
* concept of scheduling an update or a dirty region. Messages originate
|
||||
* from X-Plane as the sim cycle goes by. Since X-Plane is constantly
|
||||
* redrawing, so are widgets; there is no need to mark a part of a widget as
|
||||
* 'needing redrawing' because redrawing happens frequently whether the
|
||||
* widget needs it or not.
|
||||
* - Any widget may be a 'root' widget, causing it to be drawn; there is no
|
||||
* relationship between widget class and rootness. Root widgets are
|
||||
* imlemented as XPLMDisply windows.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPWidgetDefs.h"
|
||||
#include "XPLMDisplay.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* WIDGET CREATION AND MANAGEMENT
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPCreateWidget
|
||||
*
|
||||
* This function creates a new widget and returns the new widget's ID to you.
|
||||
* If the widget creation fails for some reason, it returns NULL. Widget
|
||||
* creation will fail either if you pass a bad class ID or if there is not
|
||||
* adequate memory.
|
||||
*
|
||||
* Input Parameters:
|
||||
*
|
||||
* - Top, left, bottom, and right in global screen coordinates defining the
|
||||
* widget's location on the screen.
|
||||
* - inVisible is 1 if the widget should be drawn, 0 to start the widget as
|
||||
* hidden.
|
||||
* - inDescriptor is a null terminated string that will become the widget's
|
||||
* descriptor.
|
||||
* - inIsRoot is 1 if this is going to be a root widget, 0 if it will not be.
|
||||
* - inContainer is the ID of this widget's container. It must be 0 for a root
|
||||
* widget. for a non-root widget, pass the widget ID of the widget to place
|
||||
* this widget within. If this widget is not going to start inside another
|
||||
* widget, pass 0; this new widget will then just be floating off in space
|
||||
* (and will not be drawn until it is placed in a widget.
|
||||
* - inClass is the class of the widget to draw. Use one of the predefined
|
||||
* class-IDs to create a standard widget.
|
||||
*
|
||||
* A note on widget embedding: a widget is only called (and will be drawn,
|
||||
* etc.) if it is placed within a widget that will be called. Root widgets are
|
||||
* always called. So it is possible to have whole chains of widgets that are
|
||||
* simply not called. You can preconstruct widget trees and then place them
|
||||
* into root widgets later to activate them if you wish.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPCreateWidget(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
int inVisible,
|
||||
const char * inDescriptor,
|
||||
int inIsRoot,
|
||||
XPWidgetID inContainer,
|
||||
XPWidgetClass inClass);
|
||||
|
||||
/*
|
||||
* XPCreateCustomWidget
|
||||
*
|
||||
* This function is the same as XPCreateWidget except that instead of passing
|
||||
* a class ID, you pass your widget callback function pointer defining the
|
||||
* widget. Use this function to define a custom widget. All parameters are the
|
||||
* same as XPCreateWidget, except that the widget class has been replaced with
|
||||
* the widget function.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPCreateCustomWidget(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
int inVisible,
|
||||
const char * inDescriptor,
|
||||
int inIsRoot,
|
||||
XPWidgetID inContainer,
|
||||
XPWidgetFunc_t inCallback);
|
||||
|
||||
/*
|
||||
* XPDestroyWidget
|
||||
*
|
||||
* This class destroys a widget. Pass in the ID of the widget to kill. If you
|
||||
* pass 1 for inDestroyChilren, the widget's children will be destroyed first,
|
||||
* then this widget will be destroyed. (Furthermore, the widget's children
|
||||
* will be destroyed with the inDestroyChildren flag set to 1, so the
|
||||
* destruction will recurse down the widget tree.) If you pass 0 for this
|
||||
* flag, the child widgets will simply end up with their parent set to 0.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPDestroyWidget(
|
||||
XPWidgetID inWidget,
|
||||
int inDestroyChildren);
|
||||
|
||||
/*
|
||||
* XPSendMessageToWidget
|
||||
*
|
||||
* This sends any message to a widget. You should probably not go around
|
||||
* simulating the predefined messages that the widgets library defines for
|
||||
* you. You may however define custom messages for your widgets and send them
|
||||
* with this method.
|
||||
*
|
||||
* This method supports several dispatching patterns; see XPDispatchMode for
|
||||
* more info. The function returns 1 if the message was handled, 0 if it was
|
||||
* not.
|
||||
*
|
||||
* For each widget that receives the message (see the dispatching modes), each
|
||||
* widget function from the most recently installed to the oldest one receives
|
||||
* the message in order until it is handled.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPSendMessageToWidget(
|
||||
XPWidgetID inWidget,
|
||||
XPWidgetMessage inMessage,
|
||||
XPDispatchMode inMode,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
/***************************************************************************
|
||||
* WIDGET POSITIONING AND VISIBILITY
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPPlaceWidgetWithin
|
||||
*
|
||||
* This function changes which container a widget resides in. You may NOT use
|
||||
* this function on a root widget! inSubWidget is the widget that will be
|
||||
* moved. Pass a widget ID in inContainer to make inSubWidget be a child of
|
||||
* inContainer. It will become the last/closest widget in the container. Pass
|
||||
* 0 to remove the widget from any container. Any call to this other than
|
||||
* passing the widget ID of the old parent of the affected widget will cause
|
||||
* the widget to be removed from its old parent. Placing a widget within its
|
||||
* own parent simply makes it the last widget.
|
||||
*
|
||||
* NOTE: this routine does not reposition the sub widget in global
|
||||
* coordinates. If the container has layout management code, it will
|
||||
* reposition the subwidget for you, otherwise you must do it with
|
||||
* SetWidgetGeometry.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPPlaceWidgetWithin(
|
||||
XPWidgetID inSubWidget,
|
||||
XPWidgetID inContainer);
|
||||
|
||||
/*
|
||||
* XPCountChildWidgets
|
||||
*
|
||||
* This routine returns the number of widgets another widget contains.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPCountChildWidgets(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPGetNthChildWidget
|
||||
*
|
||||
* This routine returns the widget ID of a child widget by index. Indexes are
|
||||
* 0 based, from 0 to one minus the number of widgets in the parent,
|
||||
* inclusive. If the index is invalid, 0 is returned.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPGetNthChildWidget(
|
||||
XPWidgetID inWidget,
|
||||
int inIndex);
|
||||
|
||||
/*
|
||||
* XPGetParentWidget
|
||||
*
|
||||
* Returns the parent of a widget, or 0 if the widget has no parent. Root
|
||||
* widgets never have parents and therefore always return 0.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPGetParentWidget(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPShowWidget
|
||||
*
|
||||
* This routine makes a widget visible if it is not already. Note that if a
|
||||
* widget is not in a rooted widget hierarchy or one of its parents is not
|
||||
* visible, it will still not be visible to the user.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPShowWidget(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPHideWidget
|
||||
*
|
||||
* Makes a widget invisible. See XPShowWidget for considerations of when a
|
||||
* widget might not be visible despite its own visibility state.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPHideWidget(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPIsWidgetVisible
|
||||
*
|
||||
* This returns 1 if a widget is visible, 0 if it is not. Note that this
|
||||
* routine takes into consideration whether a parent is invisible. Use this
|
||||
* routine to tell if the user can see the widget.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPIsWidgetVisible(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPFindRootWidget
|
||||
*
|
||||
* Returns the Widget ID of the root widget that contains the passed in widget
|
||||
* or NULL if the passed in widget is not in a rooted hierarchy.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPFindRootWidget(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPBringRootWidgetToFront
|
||||
*
|
||||
* This routine makes the specified widget be in the front most widget
|
||||
* hierarchy. If this widget is a root widget, its widget hierarchy comes to
|
||||
* front, otherwise the widget's root is brought to the front. If this widget
|
||||
* is not in an active widget hiearchy (e.g. there is no root widget at the
|
||||
* top of the tree), this routine does nothing.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPBringRootWidgetToFront(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPIsWidgetInFront
|
||||
*
|
||||
* This routine returns true if this widget's hierarchy is the front most
|
||||
* hierarchy. It returns false if the widget's hierarchy is not in front, or
|
||||
* if the widget is not in a rooted hierarchy.
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPIsWidgetInFront(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPGetWidgetGeometry
|
||||
*
|
||||
* This routine returns the bounding box of a widget in global coordinates.
|
||||
* Pass NULL for any parameter you are not interested in.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetWidgetGeometry(
|
||||
XPWidgetID inWidget,
|
||||
int * outLeft, /* Can be NULL */
|
||||
int * outTop, /* Can be NULL */
|
||||
int * outRight, /* Can be NULL */
|
||||
int * outBottom); /* Can be NULL */
|
||||
|
||||
/*
|
||||
* XPSetWidgetGeometry
|
||||
*
|
||||
* This function changes the bounding box of a widget.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPSetWidgetGeometry(
|
||||
XPWidgetID inWidget,
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom);
|
||||
|
||||
/*
|
||||
* XPGetWidgetForLocation
|
||||
*
|
||||
* Given a widget and a location, this routine returns the widget ID of the
|
||||
* child of that widget that owns that location. If inRecursive is true then
|
||||
* this will return a child of a child of a widget as it tries to find the
|
||||
* deepest widget at that location. If inVisibleOnly is true, then only
|
||||
* visible widgets are considered, otherwise all widgets are considered. The
|
||||
* widget ID passed for inContainer will be returned if the location is in
|
||||
* that widget but not in a child widget. 0 is returned if the location is not
|
||||
* in the container.
|
||||
*
|
||||
* NOTE: if a widget's geometry extends outside its parents geometry, it will
|
||||
* not be returned by this call for mouse locations outside the parent
|
||||
* geometry. The parent geometry limits the child's eligibility for mouse
|
||||
* location.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPGetWidgetForLocation(
|
||||
XPWidgetID inContainer,
|
||||
int inXOffset,
|
||||
int inYOffset,
|
||||
int inRecursive,
|
||||
int inVisibleOnly);
|
||||
|
||||
/*
|
||||
* XPGetWidgetExposedGeometry
|
||||
*
|
||||
* This routine returns the bounds of the area of a widget that is completely
|
||||
* within its parent widgets. Since a widget's bounding box can be outside its
|
||||
* parent, part of its area will not be elligible for mouse clicks and should
|
||||
* not draw. Use XPGetWidgetGeometry to find out what area defines your
|
||||
* widget's shape, but use this routine to find out what area to actually draw
|
||||
* into. Note that the widget library does not use OpenGL clipping to keep
|
||||
* frame rates up, although you could use it internally.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPGetWidgetExposedGeometry(
|
||||
XPWidgetID inWidgetID,
|
||||
int * outLeft, /* Can be NULL */
|
||||
int * outTop, /* Can be NULL */
|
||||
int * outRight, /* Can be NULL */
|
||||
int * outBottom); /* Can be NULL */
|
||||
|
||||
/***************************************************************************
|
||||
* ACCESSING WIDGET DATA
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPSetWidgetDescriptor
|
||||
*
|
||||
* Every widget has a descriptor, which is a text string. What the text string
|
||||
* is used for varies from widget to widget; for example, a push button's text
|
||||
* is its descriptor, a caption shows its descriptor, and a text field's
|
||||
* descriptor is the text being edited. In other words, the usage for the text
|
||||
* varies from widget to widget, but this API provides a universal and
|
||||
* convenient way to get at it. While not all UI widgets need their
|
||||
* descriptor, many do.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPSetWidgetDescriptor(
|
||||
XPWidgetID inWidget,
|
||||
const char * inDescriptor);
|
||||
|
||||
/*
|
||||
* XPGetWidgetDescriptor
|
||||
*
|
||||
* This routine returns the widget's descriptor. Pass in the length of the
|
||||
* buffer you are going to receive the descriptor in. The descriptor will be
|
||||
* null terminated for you. This routine returns the length of the actual
|
||||
* descriptor; if you pass NULL for outDescriptor, you can get the
|
||||
* descriptor's length without getting its text. If the length of the
|
||||
* descriptor exceeds your buffer length, the buffer will not be null
|
||||
* terminated (this routine has 'strncpy' semantics).
|
||||
*
|
||||
*/
|
||||
WIDGET_API int XPGetWidgetDescriptor(
|
||||
XPWidgetID inWidget,
|
||||
char * outDescriptor,
|
||||
int inMaxDescLength);
|
||||
|
||||
/*
|
||||
* XPGetWidgetUnderlyingWindow
|
||||
*
|
||||
* Returns the window (from the XPLMDisplay API) that backs your widget
|
||||
* window. If you have opted in to modern windows, via a call to
|
||||
* XPLMEnableFeature("XPLM_USE_NATIVE_WIDGET_WINDOWS", 1), you can use the
|
||||
* returned window ID for display APIs like XPLMSetWindowPositioningMode(),
|
||||
* allowing you to pop the widget window out into a real OS window, or move it
|
||||
* into VR.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPLMWindowID XPGetWidgetUnderlyingWindow(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPSetWidgetProperty
|
||||
*
|
||||
* This function sets a widget's property. Properties are arbitrary values
|
||||
* associated by a widget by ID.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPSetWidgetProperty(
|
||||
XPWidgetID inWidget,
|
||||
XPWidgetPropertyID inProperty,
|
||||
intptr_t inValue);
|
||||
|
||||
/*
|
||||
* XPGetWidgetProperty
|
||||
*
|
||||
* This routine returns the value of a widget's property, or 0 if the property
|
||||
* is not defined. If you need to know whether the property is defined, pass a
|
||||
* pointer to an int for inExists; the existence of that property will be
|
||||
* returned in the int. Pass NULL for inExists if you do not need this
|
||||
* information.
|
||||
*
|
||||
*/
|
||||
WIDGET_API intptr_t XPGetWidgetProperty(
|
||||
XPWidgetID inWidget,
|
||||
XPWidgetPropertyID inProperty,
|
||||
int * inExists); /* Can be NULL */
|
||||
|
||||
/***************************************************************************
|
||||
* KEYBOARD MANAGEMENT
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPSetKeyboardFocus
|
||||
*
|
||||
* Controls which widget will receive keystrokes. Pass the widget ID of the
|
||||
* widget to get the keys. Note that if the widget does not care about
|
||||
* keystrokes, they will go to the parent widget, and if no widget cares about
|
||||
* them, they go to X-Plane.
|
||||
*
|
||||
* If you set the keyboard focus to widget ID 0, X-Plane gets keyboard focus.
|
||||
*
|
||||
* This routine returns the widget ID that ended up with keyboard focus, or 0
|
||||
* for X-Plane.
|
||||
*
|
||||
* Keyboard focus is not changed if the new widget will not accept it. For
|
||||
* setting to X-Plane, keyboard focus is always accepted.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPSetKeyboardFocus(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPLoseKeyboardFocus
|
||||
*
|
||||
* This causes the specified widget to lose focus; focus is passed to its
|
||||
* parent, or the next parent that will accept it. This routine does nothing
|
||||
* if this widget does not have focus.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPLoseKeyboardFocus(
|
||||
XPWidgetID inWidget);
|
||||
|
||||
/*
|
||||
* XPGetWidgetWithFocus
|
||||
*
|
||||
* This routine returns the widget that has keyboard focus, or 0 if X-Plane
|
||||
* has keyboard focus or some other plugin window that does not have widgets
|
||||
* has focus.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetID XPGetWidgetWithFocus(void);
|
||||
|
||||
/***************************************************************************
|
||||
* CREATING CUSTOM WIDGETS
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPAddWidgetCallback
|
||||
*
|
||||
* This function adds a new widget callback to a widget. This widget callback
|
||||
* supercedes any existing ones and will receive messages first; if it does
|
||||
* not handle messages they will go on to be handled by pre-existing widgets.
|
||||
*
|
||||
* The widget function will remain on the widget for the life of the widget.
|
||||
* The creation message will be sent to the new callback immediately with the
|
||||
* widget ID, and the destruction message will be sent before the other widget
|
||||
* function receives a destruction message.
|
||||
*
|
||||
* This provides a way to 'subclass' an existing widget. By providing a second
|
||||
* hook that only handles certain widget messages, you can customize or extend
|
||||
* widget behavior.
|
||||
*
|
||||
*/
|
||||
WIDGET_API void XPAddWidgetCallback(
|
||||
XPWidgetID inWidget,
|
||||
XPWidgetFunc_t inNewCallback);
|
||||
|
||||
/*
|
||||
* XPGetWidgetClassFunc
|
||||
*
|
||||
* Given a widget class, this function returns the callbacks that power that
|
||||
* widget class.
|
||||
*
|
||||
*/
|
||||
WIDGET_API XPWidgetFunc_t XPGetWidgetClassFunc(
|
||||
XPWidgetClass inWidgetClass);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
#include "XPCBroadcaster.h"
|
||||
#include "XPCListener.h"
|
||||
|
||||
XPCBroadcaster::XPCBroadcaster() :
|
||||
mIterator(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
XPCBroadcaster::~XPCBroadcaster()
|
||||
{
|
||||
ListenerVector::iterator iter;
|
||||
mIterator = &iter;
|
||||
for (iter = mListeners.begin(); iter != mListeners.end(); ++iter)
|
||||
{
|
||||
(*iter)->BroadcasterRemoved(this);
|
||||
}
|
||||
}
|
||||
|
||||
void XPCBroadcaster::AddListener(
|
||||
XPCListener * inListener)
|
||||
{
|
||||
mListeners.push_back(inListener);
|
||||
inListener->BroadcasterAdded(this);
|
||||
}
|
||||
|
||||
void XPCBroadcaster::RemoveListener(
|
||||
XPCListener * inListener)
|
||||
{
|
||||
ListenerVector::iterator iter = std::find
|
||||
(mListeners.begin(), mListeners.end(), inListener);
|
||||
if (iter == mListeners.end())
|
||||
return;
|
||||
|
||||
if (mIterator != NULL)
|
||||
{
|
||||
if (*mIterator >= iter)
|
||||
(*mIterator)--;
|
||||
}
|
||||
|
||||
mListeners.erase(iter);
|
||||
inListener->BroadcasterRemoved(this);
|
||||
}
|
||||
|
||||
void XPCBroadcaster::BroadcastMessage(
|
||||
int inMessage,
|
||||
void * inParam)
|
||||
{
|
||||
ListenerVector::iterator iter;
|
||||
mIterator = &iter;
|
||||
for (iter = mListeners.begin(); iter != mListeners.end(); ++iter)
|
||||
{
|
||||
(*iter)->ListenToMessage(inMessage, inParam);
|
||||
}
|
||||
mIterator = NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef _XPCBroadcaster_h_
|
||||
#define _XPCBroadcaster_h_
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
class XPCListener;
|
||||
|
||||
class XPCBroadcaster {
|
||||
public:
|
||||
|
||||
XPCBroadcaster();
|
||||
virtual ~XPCBroadcaster();
|
||||
|
||||
void AddListener(
|
||||
XPCListener * inListener);
|
||||
void RemoveListener(
|
||||
XPCListener * inListener);
|
||||
|
||||
protected:
|
||||
|
||||
void BroadcastMessage(
|
||||
int inMessage,
|
||||
void * inParam=0);
|
||||
|
||||
private:
|
||||
|
||||
typedef std::vector<XPCListener *> ListenerVector;
|
||||
|
||||
ListenerVector mListeners;
|
||||
|
||||
// Reentrancy support
|
||||
|
||||
ListenerVector::iterator * mIterator;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,104 @@
|
||||
#include "XPCDisplay.h"
|
||||
|
||||
XPCKeySniffer::XPCKeySniffer(int inBeforeWindows) : mBeforeWindows(inBeforeWindows)
|
||||
{
|
||||
XPLMRegisterKeySniffer(KeySnifferCB, mBeforeWindows, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
XPCKeySniffer::~XPCKeySniffer()
|
||||
{
|
||||
XPLMUnregisterKeySniffer(KeySnifferCB, mBeforeWindows, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
|
||||
int XPCKeySniffer::KeySnifferCB(
|
||||
char inCharKey,
|
||||
XPLMKeyFlags inFlags,
|
||||
char inVirtualKey,
|
||||
void * inRefCon)
|
||||
{
|
||||
XPCKeySniffer * me = reinterpret_cast<XPCKeySniffer *>(inRefCon);
|
||||
return me->HandleKeyStroke(inCharKey, inFlags, inVirtualKey);
|
||||
}
|
||||
|
||||
XPCWindow::XPCWindow(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
int inIsVisible)
|
||||
{
|
||||
mWindow = XPLMCreateWindow(inLeft, inTop, inRight, inBottom, inIsVisible,
|
||||
DrawCB, HandleKeyCB, MouseClickCB,
|
||||
reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
XPCWindow::~XPCWindow()
|
||||
{
|
||||
XPLMDestroyWindow(mWindow);
|
||||
}
|
||||
|
||||
void XPCWindow::GetWindowGeometry(
|
||||
int * outLeft,
|
||||
int * outTop,
|
||||
int * outRight,
|
||||
int * outBottom)
|
||||
{
|
||||
XPLMGetWindowGeometry(mWindow, outLeft, outTop, outRight, outBottom);
|
||||
}
|
||||
|
||||
void XPCWindow::SetWindowGeometry(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom)
|
||||
{
|
||||
XPLMSetWindowGeometry(mWindow, inLeft, inTop, inRight, inBottom);
|
||||
}
|
||||
|
||||
int XPCWindow::GetWindowIsVisible(void)
|
||||
{
|
||||
return XPLMGetWindowIsVisible(mWindow);
|
||||
}
|
||||
|
||||
void XPCWindow::SetWindowIsVisible(
|
||||
int inIsVisible)
|
||||
{
|
||||
XPLMSetWindowIsVisible(mWindow, inIsVisible);
|
||||
}
|
||||
|
||||
void XPCWindow::TakeKeyboardFocus(void)
|
||||
{
|
||||
XPLMTakeKeyboardFocus(mWindow);
|
||||
}
|
||||
|
||||
void XPCWindow::BringWindowToFront(void)
|
||||
{
|
||||
XPLMBringWindowToFront(mWindow);
|
||||
}
|
||||
|
||||
int XPCWindow::IsWindowInFront(void)
|
||||
{
|
||||
return XPLMIsWindowInFront(mWindow);
|
||||
}
|
||||
|
||||
void XPCWindow::DrawCB(XPLMWindowID inWindowID, void * inRefcon)
|
||||
{
|
||||
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
|
||||
me->DoDraw();
|
||||
}
|
||||
|
||||
void XPCWindow::HandleKeyCB(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon, int losingFocus)
|
||||
{
|
||||
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
|
||||
if (losingFocus)
|
||||
me->LoseFocus();
|
||||
else
|
||||
me->HandleKey(inKey, inFlags, inVirtualKey);
|
||||
}
|
||||
|
||||
int XPCWindow::MouseClickCB(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus inMouse, void * inRefcon)
|
||||
{
|
||||
XPCWindow * me = reinterpret_cast<XPCWindow *>(inRefcon);
|
||||
return me->HandleClick(x, y, inMouse);
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
#ifndef _XPCDisplay_h_
|
||||
#define _XPCDisplay_h_
|
||||
|
||||
#include "XPLMDisplay.h"
|
||||
|
||||
class XPCKeySniffer {
|
||||
public:
|
||||
|
||||
XPCKeySniffer(int inBeforeWindows);
|
||||
virtual ~XPCKeySniffer();
|
||||
|
||||
virtual int HandleKeyStroke(
|
||||
char inCharKey,
|
||||
XPLMKeyFlags inFlags,
|
||||
char inVirtualKey)=0;
|
||||
|
||||
private:
|
||||
|
||||
int mBeforeWindows;
|
||||
|
||||
static int KeySnifferCB(
|
||||
char inCharKey,
|
||||
XPLMKeyFlags inFlags,
|
||||
char inVirtualKey,
|
||||
void * inRefCon);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class XPCWindow {
|
||||
public:
|
||||
|
||||
XPCWindow(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
int inIsVisible);
|
||||
virtual ~XPCWindow();
|
||||
|
||||
virtual void DoDraw(void)=0;
|
||||
virtual void HandleKey(char inKey, XPLMKeyFlags inFlags, char inVirtualKey)=0;
|
||||
virtual void LoseFocus(void)=0;
|
||||
virtual int HandleClick(int x, int y, XPLMMouseStatus inMouse)=0;
|
||||
|
||||
void GetWindowGeometry(
|
||||
int * outLeft,
|
||||
int * outTop,
|
||||
int * outRight,
|
||||
int * outBottom);
|
||||
void SetWindowGeometry(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom);
|
||||
int GetWindowIsVisible(void);
|
||||
void SetWindowIsVisible(
|
||||
int inIsVisible);
|
||||
void TakeKeyboardFocus(void);
|
||||
void BringWindowToFront(void);
|
||||
int IsWindowInFront(void);
|
||||
|
||||
private:
|
||||
|
||||
XPLMWindowID mWindow;
|
||||
|
||||
static void DrawCB(XPLMWindowID inWindowID, void * inRefcon);
|
||||
static void HandleKeyCB(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon, int losingFocus);
|
||||
static int MouseClickCB(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus inMouse, void * inRefcon);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
#include "XPCListener.h"
|
||||
#include "XPCBroadcaster.h"
|
||||
|
||||
XPCListener::XPCListener()
|
||||
{
|
||||
}
|
||||
|
||||
XPCListener::~XPCListener()
|
||||
{
|
||||
while (!mBroadcasters.empty())
|
||||
mBroadcasters.front()->RemoveListener(this);
|
||||
}
|
||||
|
||||
void XPCListener::BroadcasterAdded(
|
||||
XPCBroadcaster * inBroadcaster)
|
||||
{
|
||||
mBroadcasters.push_back(inBroadcaster);
|
||||
}
|
||||
|
||||
void XPCListener::BroadcasterRemoved(
|
||||
XPCBroadcaster * inBroadcaster)
|
||||
{
|
||||
BroadcastVector::iterator iter = std::find(mBroadcasters.begin(),
|
||||
mBroadcasters.end(), inBroadcaster);
|
||||
if (iter != mBroadcasters.end())
|
||||
mBroadcasters.erase(iter);
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef _XPCListener_h_
|
||||
#define _XPCListener_h_
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
class XPCBroadcaster;
|
||||
|
||||
|
||||
class XPCListener {
|
||||
public:
|
||||
|
||||
XPCListener();
|
||||
virtual ~XPCListener();
|
||||
|
||||
virtual void ListenToMessage(
|
||||
int inMessage,
|
||||
void * inParam)=0;
|
||||
|
||||
private:
|
||||
|
||||
typedef std::vector<XPCBroadcaster *> BroadcastVector;
|
||||
|
||||
BroadcastVector mBroadcasters;
|
||||
|
||||
friend class XPCBroadcaster;
|
||||
|
||||
void BroadcasterAdded(
|
||||
XPCBroadcaster * inBroadcaster);
|
||||
|
||||
void BroadcasterRemoved(
|
||||
XPCBroadcaster * inBroadcaster);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,52 @@
|
||||
#include "XPCProcessing.h"
|
||||
#include "XPLMUtilities.h"
|
||||
|
||||
XPCProcess::XPCProcess() :
|
||||
mInCallback(false),
|
||||
mCallbackTime(0)
|
||||
{
|
||||
XPLMRegisterFlightLoopCallback(FlightLoopCB, 0, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
XPCProcess::~XPCProcess()
|
||||
{
|
||||
XPLMUnregisterFlightLoopCallback(FlightLoopCB, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
void XPCProcess::StartProcessTime(float inSeconds)
|
||||
{
|
||||
mCallbackTime = inSeconds;
|
||||
if (!mInCallback)
|
||||
XPLMSetFlightLoopCallbackInterval(
|
||||
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
void XPCProcess::StartProcessCycles(int inCycles)
|
||||
{
|
||||
mCallbackTime = -inCycles;
|
||||
if (!mInCallback)
|
||||
XPLMSetFlightLoopCallbackInterval(
|
||||
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
void XPCProcess::StopProcess(void)
|
||||
{
|
||||
mCallbackTime = 0;
|
||||
if (!mInCallback)
|
||||
XPLMSetFlightLoopCallbackInterval(
|
||||
FlightLoopCB, mCallbackTime, 1/*relative to now*/, reinterpret_cast<void *>(this));
|
||||
}
|
||||
|
||||
|
||||
float XPCProcess::FlightLoopCB(
|
||||
float inElapsedSinceLastCall,
|
||||
float inElapsedTimeSinceLastFlightLoop,
|
||||
int inCounter,
|
||||
void * inRefcon)
|
||||
{
|
||||
XPCProcess * me = reinterpret_cast<XPCProcess *>(inRefcon);
|
||||
me->mInCallback = true;
|
||||
me->DoProcessing(inElapsedSinceLastCall, inElapsedTimeSinceLastFlightLoop, inCounter);
|
||||
me->mInCallback = false;
|
||||
return me->mCallbackTime;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#ifndef _XPCProcessing_h_
|
||||
#define _XPCProcessing_h_
|
||||
|
||||
#include "XPLMProcessing.h"
|
||||
|
||||
class XPCProcess {
|
||||
public:
|
||||
|
||||
XPCProcess();
|
||||
virtual ~XPCProcess();
|
||||
|
||||
void StartProcessTime(float inSeconds);
|
||||
void StartProcessCycles(int inCycles);
|
||||
void StopProcess(void);
|
||||
|
||||
virtual void DoProcessing(
|
||||
float inElapsedSinceLastCall,
|
||||
float inElapsedTimeSinceLastFlightLoop,
|
||||
int inCounter)=0;
|
||||
|
||||
private:
|
||||
|
||||
static float FlightLoopCB(
|
||||
float inElapsedSinceLastCall,
|
||||
float inElapsedTimeSinceLastFlightLoop,
|
||||
int inCounter,
|
||||
void * inRefcon);
|
||||
|
||||
bool mInCallback;
|
||||
float mCallbackTime;
|
||||
|
||||
XPCProcess(const XPCProcess&);
|
||||
XPCProcess& operator=(const XPCProcess&);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,123 @@
|
||||
#include "XPCWidget.h"
|
||||
|
||||
XPCWidget::XPCWidget(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
bool inVisible,
|
||||
const char * inDescriptor,
|
||||
bool inIsRoot,
|
||||
XPWidgetID inParent,
|
||||
XPWidgetClass inClass) :
|
||||
mWidget(NULL),
|
||||
mOwnsChildren(false),
|
||||
mOwnsWidget(true)
|
||||
{
|
||||
mWidget = XPCreateWidget(
|
||||
inLeft, inTop, inRight, inBottom,
|
||||
inVisible ? 1 : 0,
|
||||
inDescriptor,
|
||||
inIsRoot ? 1 : 0,
|
||||
inIsRoot ? NULL : inParent,
|
||||
inClass);
|
||||
|
||||
XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast<intptr_t>(this));
|
||||
XPAddWidgetCallback(mWidget, WidgetCallback);
|
||||
}
|
||||
|
||||
XPCWidget::XPCWidget(
|
||||
XPWidgetID inWidget,
|
||||
bool inOwnsWidget) :
|
||||
mWidget(inWidget),
|
||||
mOwnsChildren(false),
|
||||
mOwnsWidget(inOwnsWidget)
|
||||
{
|
||||
XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast<intptr_t>(this));
|
||||
XPAddWidgetCallback(mWidget, WidgetCallback);
|
||||
}
|
||||
|
||||
XPCWidget::~XPCWidget()
|
||||
{
|
||||
if (mOwnsWidget)
|
||||
XPDestroyWidget(mWidget, mOwnsChildren ? 1 : 0);
|
||||
}
|
||||
|
||||
void XPCWidget::SetOwnsWidget(
|
||||
bool inOwnsWidget)
|
||||
{
|
||||
mOwnsWidget = inOwnsWidget;
|
||||
}
|
||||
|
||||
void XPCWidget::SetOwnsChildren(
|
||||
bool inOwnsChildren)
|
||||
{
|
||||
mOwnsChildren = inOwnsChildren;
|
||||
}
|
||||
|
||||
XPCWidget::operator XPWidgetID () const
|
||||
{
|
||||
return mWidget;
|
||||
}
|
||||
|
||||
XPWidgetID XPCWidget::Get(void) const
|
||||
{
|
||||
return mWidget;
|
||||
}
|
||||
|
||||
void XPCWidget::AddAttachment(
|
||||
XPCWidgetAttachment * inAttachment,
|
||||
bool inOwnsAttachment,
|
||||
bool inPrefilter)
|
||||
{
|
||||
if (inPrefilter)
|
||||
{
|
||||
mAttachments.insert(mAttachments.begin(), AttachmentInfo(inAttachment, inOwnsAttachment));
|
||||
} else {
|
||||
mAttachments.push_back(AttachmentInfo(inAttachment, inOwnsAttachment));
|
||||
}
|
||||
}
|
||||
|
||||
void XPCWidget::RemoveAttachment(
|
||||
XPCWidgetAttachment * inAttachment)
|
||||
{
|
||||
for (AttachmentVector::iterator iter = mAttachments.begin();
|
||||
iter != mAttachments.end(); ++iter)
|
||||
{
|
||||
if (iter->first == inAttachment)
|
||||
{
|
||||
mAttachments.erase(iter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int XPCWidget::HandleWidgetMessage(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int XPCWidget::WidgetCallback(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
XPCWidget * me = reinterpret_cast<XPCWidget *>(XPGetWidgetProperty(inWidget, xpProperty_Object, NULL));
|
||||
if (me == NULL)
|
||||
return 0;
|
||||
|
||||
for (AttachmentVector::iterator iter = me->mAttachments.begin(); iter !=
|
||||
me->mAttachments.end(); ++iter)
|
||||
{
|
||||
int result = iter->first->HandleWidgetMessage(me, inMessage, inWidget, inParam1, inParam2);
|
||||
if (result != 0)
|
||||
return result;
|
||||
}
|
||||
|
||||
return me->HandleWidgetMessage(inMessage, inWidget, inParam1, inParam2);
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
#ifndef _XPCWidget_h_
|
||||
#define _XPCWidget_h_
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include "XPWidgets.h"
|
||||
|
||||
class XPCWidget;
|
||||
|
||||
class XPCWidgetAttachment {
|
||||
public:
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)=0;
|
||||
|
||||
};
|
||||
|
||||
class XPCWidget {
|
||||
public:
|
||||
|
||||
XPCWidget(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom,
|
||||
bool inVisible,
|
||||
const char * inDescriptor,
|
||||
bool inIsRoot,
|
||||
XPWidgetID inParent,
|
||||
XPWidgetClass inClass);
|
||||
XPCWidget(
|
||||
XPWidgetID inWidget,
|
||||
bool inOwnsWidget);
|
||||
virtual ~XPCWidget();
|
||||
|
||||
void SetOwnsWidget(
|
||||
bool inOwnsWidget);
|
||||
void SetOwnsChildren(
|
||||
bool inOwnsChildren);
|
||||
|
||||
operator XPWidgetID () const;
|
||||
|
||||
XPWidgetID Get(void) const;
|
||||
|
||||
void AddAttachment(
|
||||
XPCWidgetAttachment * inAttachment,
|
||||
bool inOwnsAttachment,
|
||||
bool inPrefilter);
|
||||
void RemoveAttachment(
|
||||
XPCWidgetAttachment * inAttachment);
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
|
||||
static int WidgetCallback(
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
typedef std::pair<XPCWidgetAttachment *, bool> AttachmentInfo;
|
||||
typedef std::vector<AttachmentInfo> AttachmentVector;
|
||||
|
||||
AttachmentVector mAttachments;
|
||||
XPWidgetID mWidget;
|
||||
bool mOwnsChildren;
|
||||
bool mOwnsWidget;
|
||||
|
||||
XPCWidget();
|
||||
XPCWidget(const XPCWidget&);
|
||||
XPCWidget& operator=(const XPCWidget&);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,267 @@
|
||||
#include "XPCWidgetAttachments.h"
|
||||
#include "XPStandardWidgets.h"
|
||||
#include "XPWidgetUtils.h"
|
||||
|
||||
static void XPCGetOrderedSubWidgets(
|
||||
XPWidgetID inWidget,
|
||||
std::vector<XPWidgetID>& outChildren);
|
||||
|
||||
XPCKeyFilterAttachment::XPCKeyFilterAttachment(
|
||||
const char * inValidKeys,
|
||||
const char * outValidKeys) :
|
||||
mInput(inValidKeys),
|
||||
mOutput(outValidKeys)
|
||||
{
|
||||
}
|
||||
|
||||
XPCKeyFilterAttachment::~XPCKeyFilterAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCKeyFilterAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if (inMessage == xpMsg_KeyPress)
|
||||
{
|
||||
char& theKey = KEY_CHAR(inParam1);
|
||||
std::string::size_type pos = mInput.find(theKey);
|
||||
if (pos == std::string::npos)
|
||||
return 1; // Not found; eat the key!
|
||||
else {
|
||||
theKey = mOutput[pos];
|
||||
return 0;
|
||||
} // Let it live.
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
XPCKeyMessageAttachment::XPCKeyMessageAttachment(
|
||||
char inKey,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
bool inConsume,
|
||||
bool inVkey,
|
||||
XPCListener * inListener) :
|
||||
mKey(inKey), mMsg(inMessage), mParam(inParam), mConsume(inConsume),
|
||||
mVkey(inVkey)
|
||||
{
|
||||
if (inListener != NULL)
|
||||
this->AddListener(inListener);
|
||||
}
|
||||
|
||||
XPCKeyMessageAttachment::~XPCKeyMessageAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCKeyMessageAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if (inMessage == xpMsg_KeyPress)
|
||||
{
|
||||
char theKey = mVkey ? KEY_VKEY(inParam1) : KEY_CHAR(inParam1);
|
||||
if (theKey != mKey)
|
||||
return 0;
|
||||
if (!(KEY_FLAGS(inParam1) & xplm_DownFlag))
|
||||
return 0;
|
||||
|
||||
BroadcastMessage(mMsg, mParam);
|
||||
return mConsume ? 1 : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
XPCPushButtonMessageAttachment::XPCPushButtonMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener) :
|
||||
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
|
||||
{
|
||||
if (inListener != NULL)
|
||||
this->AddListener(inListener);
|
||||
}
|
||||
|
||||
XPCPushButtonMessageAttachment::~XPCPushButtonMessageAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCPushButtonMessageAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if ((inMessage == xpMsg_PushButtonPressed) && ((XPWidgetID) inParam1 == mWidget))
|
||||
{
|
||||
BroadcastMessage(mMsg, mParam);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((inMessage == xpMsg_ButtonStateChanged) && ((XPWidgetID) inParam1 == mWidget))
|
||||
{
|
||||
BroadcastMessage(mMsg, mParam);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
XPCSliderMessageAttachment::XPCSliderMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener) :
|
||||
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
|
||||
{
|
||||
if (inListener != NULL)
|
||||
this->AddListener(inListener);
|
||||
}
|
||||
|
||||
XPCSliderMessageAttachment::~XPCSliderMessageAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCSliderMessageAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if ((inMessage == xpMsg_ScrollBarSliderPositionChanged) && ((XPWidgetID) inParam1 == mWidget))
|
||||
{
|
||||
BroadcastMessage(mMsg, mParam);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
XPCCloseButtonMessageAttachment::XPCCloseButtonMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener) :
|
||||
mMsg(inMessage), mParam(inParam), mWidget(inWidget)
|
||||
{
|
||||
if (inListener != NULL)
|
||||
this->AddListener(inListener);
|
||||
}
|
||||
|
||||
XPCCloseButtonMessageAttachment::~XPCCloseButtonMessageAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCCloseButtonMessageAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if ((inMessage == xpMessage_CloseButtonPushed) && ((XPWidgetID) inParam1 == mWidget))
|
||||
{
|
||||
BroadcastMessage(mMsg, mParam);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
XPCTabGroupAttachment::XPCTabGroupAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
XPCTabGroupAttachment::~XPCTabGroupAttachment()
|
||||
{
|
||||
}
|
||||
|
||||
int XPCTabGroupAttachment::HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2)
|
||||
{
|
||||
if ((inMessage == xpMsg_KeyPress) && (KEY_CHAR(inParam1) == XPLM_KEY_TAB) &&
|
||||
((KEY_FLAGS(inParam1) & xplm_UpFlag) == 0))
|
||||
{
|
||||
bool backwards = (KEY_FLAGS(inParam1) & xplm_ShiftFlag) != 0;
|
||||
std::vector<XPWidgetID> widgets;
|
||||
XPCGetOrderedSubWidgets(inWidget, widgets);
|
||||
int n, index = 0;
|
||||
XPWidgetID focusWidget = XPGetWidgetWithFocus();
|
||||
std::vector<XPWidgetID>::iterator iter = std::find(widgets.begin(), widgets.end(), focusWidget);
|
||||
if (iter != widgets.end())
|
||||
{
|
||||
index = std::distance(widgets.begin(), iter);
|
||||
if (backwards)
|
||||
index--;
|
||||
else
|
||||
index++;
|
||||
if (index < 0)
|
||||
index = widgets.size() - 1;
|
||||
if (index >= widgets.size())
|
||||
index = 0;
|
||||
}
|
||||
|
||||
if (backwards)
|
||||
{
|
||||
for (n = index; n >= 0; --n)
|
||||
{
|
||||
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
|
||||
if (XPSetKeyboardFocus(widgets[n]) != NULL)
|
||||
return 1;
|
||||
}
|
||||
for (n = widgets.size() - 1; n > index; --n)
|
||||
{
|
||||
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
|
||||
if (XPSetKeyboardFocus(widgets[n]) != NULL)
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
for (n = index; n < widgets.size(); ++n)
|
||||
{
|
||||
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
|
||||
if (XPSetKeyboardFocus(widgets[n]) != NULL)
|
||||
return 1;
|
||||
}
|
||||
for (n = 0; n < index; ++n)
|
||||
{
|
||||
if (XPGetWidgetProperty(widgets[n], xpProperty_Enabled, NULL))
|
||||
if (XPSetKeyboardFocus(widgets[n]) != NULL)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void XPCGetOrderedSubWidgets(
|
||||
XPWidgetID inWidget,
|
||||
std::vector<XPWidgetID>& outChildren)
|
||||
{
|
||||
outChildren.clear();
|
||||
int count = XPCountChildWidgets(inWidget);
|
||||
for (int n = 0; n < count; ++n)
|
||||
{
|
||||
XPWidgetID child = XPGetNthChildWidget(inWidget, n);
|
||||
outChildren.push_back(child);
|
||||
std::vector<XPWidgetID> grandChildren;
|
||||
XPCGetOrderedSubWidgets(child, grandChildren);
|
||||
|
||||
outChildren.insert(outChildren.end(), grandChildren.begin(), grandChildren.end());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
#ifndef _XPCWidgetAttachments_h_
|
||||
#define _XPCWidgetAttachments_h_
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "XPCWidget.h"
|
||||
#include "XPCBroadcaster.h"
|
||||
|
||||
class XPCKeyFilterAttachment : public XPCWidgetAttachment {
|
||||
public:
|
||||
|
||||
XPCKeyFilterAttachment(
|
||||
const char * inValidKeys,
|
||||
const char * outValidKeys);
|
||||
virtual ~XPCKeyFilterAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
|
||||
std::string mInput;
|
||||
std::string mOutput;
|
||||
|
||||
};
|
||||
|
||||
|
||||
class XPCKeyMessageAttachment : public XPCWidgetAttachment, public XPCBroadcaster {
|
||||
public:
|
||||
|
||||
XPCKeyMessageAttachment(
|
||||
char inKey,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
bool inConsume,
|
||||
bool inVkey,
|
||||
XPCListener * inListener);
|
||||
virtual ~XPCKeyMessageAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
|
||||
char mKey;
|
||||
bool mVkey;
|
||||
int mMsg;
|
||||
void * mParam;
|
||||
bool mConsume;
|
||||
|
||||
};
|
||||
|
||||
class XPCPushButtonMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
|
||||
public:
|
||||
|
||||
XPCPushButtonMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener);
|
||||
virtual ~XPCPushButtonMessageAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
XPWidgetID mWidget;
|
||||
int mMsg;
|
||||
void * mParam;
|
||||
};
|
||||
|
||||
class XPCSliderMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
|
||||
public:
|
||||
|
||||
XPCSliderMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener);
|
||||
virtual ~XPCSliderMessageAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
XPWidgetID mWidget;
|
||||
int mMsg;
|
||||
void * mParam;
|
||||
};
|
||||
|
||||
|
||||
class XPCCloseButtonMessageAttachment : public XPCWidgetAttachment, XPCBroadcaster {
|
||||
public:
|
||||
|
||||
XPCCloseButtonMessageAttachment(
|
||||
XPWidgetID inWidget,
|
||||
int inMessage,
|
||||
void * inParam,
|
||||
XPCListener * inListener);
|
||||
virtual ~XPCCloseButtonMessageAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
private:
|
||||
XPWidgetID mWidget;
|
||||
int mMsg;
|
||||
void * mParam;
|
||||
};
|
||||
|
||||
class XPCTabGroupAttachment : public XPCWidgetAttachment {
|
||||
public:
|
||||
|
||||
XPCTabGroupAttachment();
|
||||
virtual ~XPCTabGroupAttachment();
|
||||
|
||||
virtual int HandleWidgetMessage(
|
||||
XPCWidget * inObject,
|
||||
XPWidgetMessage inMessage,
|
||||
XPWidgetID inWidget,
|
||||
intptr_t inParam1,
|
||||
intptr_t inParam2);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,167 @@
|
||||
#ifndef _XPLMCamera_h_
|
||||
#define _XPLMCamera_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMCamera
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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. */
|
||||
xplm_ControlCameraForever = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMCameraControlDuration;
|
||||
|
||||
/*
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float pitch;
|
||||
float heading;
|
||||
float roll;
|
||||
float zoom;
|
||||
} 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.
|
||||
*
|
||||
* If X-Plane is taking camera control away from you, this function will be
|
||||
* called with inIsLosingControl set to 1 and ioCameraPosition NULL.
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMCameraControl_f)(
|
||||
XPLMCameraPosition_t * outCameraPosition, /* Can be NULL */
|
||||
int inIsLosingControl,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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 new view mode is set by the user).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMControlCamera(
|
||||
XPLMCameraControlDuration inHowLong,
|
||||
XPLMCameraControl_f inControlFunc,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* For maximum compatibility you should not use this routine unless you are in
|
||||
* posession of the camera.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDontControlCamera(void);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMIsCameraBeingControlled(
|
||||
XPLMCameraControlDuration * outCameraControlDuration); /* Can be NULL */
|
||||
|
||||
/*
|
||||
* XPLMReadCameraPosition
|
||||
*
|
||||
* This function reads the current camera position.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMReadCameraPosition(
|
||||
XPLMCameraPosition_t * outCameraPosition);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,716 @@
|
||||
#ifndef _XPLMDataAccess_h_
|
||||
#define _XPLMDataAccess_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMDataAccess
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The data access API gives you a generic, flexible, high performance way to
|
||||
* read and write data to and from X-Plane and other plug-ins. For example,
|
||||
* this API allows you to read and set the nav radios, get the plane location,
|
||||
* determine the current effective graphics frame rate, etc.
|
||||
*
|
||||
* The data access APIs are the way that you read and write data from the sim
|
||||
* as well as other plugins.
|
||||
*
|
||||
* The API works using opaque data references. A data reference is a source of
|
||||
* data; you do not know where it comes from, but once you have it you can
|
||||
* read the data quickly and possibly write it.
|
||||
*
|
||||
* Dataref Lookup
|
||||
* --------------
|
||||
*
|
||||
* Data references are identified by verbose, permanent string names; by
|
||||
* convention these names use path separates to form a hierarchy of datarefs,
|
||||
* e.g. (sim/cockpit/radios/nav1_freq_hz). The actual opaque numeric value of
|
||||
* the data reference, as returned by the XPLM API, is implementation defined
|
||||
* and changes each time X-Plane is launched; therefore you need to look up
|
||||
* the dataref by path every time your plugin runs.
|
||||
*
|
||||
* The task of looking up a data reference is relatively expensive; look up
|
||||
* your data references once based on the verbose path strings, and save the
|
||||
* opaque data reference value for the duration of your plugin's operation.
|
||||
* Reading and writing data references is relatively fast (the cost is
|
||||
* equivalent to two function calls through function pointers).
|
||||
*
|
||||
* X-Plane publishes over 4000 datarefs; a complete list may be found in the
|
||||
* reference section of the SDK online documentation (from the SDK home page,
|
||||
* choose Documentation).
|
||||
*
|
||||
* Dataref Types
|
||||
* -------------
|
||||
*
|
||||
* A note on typing: you must know the correct data type to read and write.
|
||||
* APIs are provided for reading and writing data in a number of ways. You can
|
||||
* also double check the data type for a data ref. Automatic type conversion
|
||||
* is not done for you.
|
||||
*
|
||||
* Dataref types are a set, e.g. a dataref can be more than one type. When
|
||||
* this happens, you can choose which API you want to use to read. For
|
||||
* example, it is not uncommon for a dataref to be of type float and double.
|
||||
* This means you can use either XPLMGetDatad or XPLMGetDataf to read it.
|
||||
*
|
||||
* Creating New Datarefs
|
||||
* ---------------------
|
||||
*
|
||||
* X-Plane provides datarefs that come with the sim, but plugins can also
|
||||
* create their own datarefs. A plugin creates a dataref by registering
|
||||
* function callbacks to read and write the dataref. The XPLM will call your
|
||||
* plugin each time some other plugin (or X-Plane) tries to read or write the
|
||||
* dataref. You must provide a read (and optional write) callback for each
|
||||
* data type you support.
|
||||
*
|
||||
* A note for plugins sharing data with other plugins: the load order of
|
||||
* plugins is not guaranteed. To make sure that every plugin publishing data
|
||||
* has published their data references before other plugins try to subscribe,
|
||||
* publish your data references in your start routine but resolve them the
|
||||
* first time your 'enable' routine is called, or the first time they are
|
||||
* needed in code.
|
||||
*
|
||||
* When a plugin that created a dataref is unloaded, it becomes "orphaned".
|
||||
* The dataref handle continues to be usable, but the dataref is not writable,
|
||||
* and reading it will always return 0 (or 0 items for arrays). If the plugin
|
||||
* is reloaded and re-registers the dataref, the handle becomes un-orphaned
|
||||
* and works again.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* READING AND WRITING DATA
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These routines allow you to access data from within X-Plane and sometimes
|
||||
* modify it.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMDataRef
|
||||
*
|
||||
* A data ref is an opaque handle to data provided by the simulator or another
|
||||
* plugin. It uniquely identifies one variable (or array of variables) over
|
||||
* the lifetime of your plugin. You never hard code these values; you always
|
||||
* get them from XPLMFindDataRef.
|
||||
*
|
||||
*/
|
||||
typedef void * XPLMDataRef;
|
||||
|
||||
/*
|
||||
* XPLMDataTypeID
|
||||
*
|
||||
* This is an enumeration that defines the type of the data behind a data
|
||||
* reference. This allows you to sanity check that the data type matches what
|
||||
* you expect. But for the most part, you will know the type of data you are
|
||||
* expecting from the online documentation.
|
||||
*
|
||||
* Data types each take a bit field; it is legal to have a single dataref be
|
||||
* more than one type of data. Whe this happens, you can pick any matching
|
||||
* get/set API.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* Data of a type the current XPLM doesn't do. */
|
||||
xplmType_Unknown = 0,
|
||||
|
||||
/* A single 4-byte integer, native endian. */
|
||||
xplmType_Int = 1,
|
||||
|
||||
/* A single 4-byte float, native endian. */
|
||||
xplmType_Float = 2,
|
||||
|
||||
/* A single 8-byte double, native endian. */
|
||||
xplmType_Double = 4,
|
||||
|
||||
/* An array of 4-byte floats, native endian. */
|
||||
xplmType_FloatArray = 8,
|
||||
|
||||
/* An array of 4-byte integers, native endian. */
|
||||
xplmType_IntArray = 16,
|
||||
|
||||
/* A variable block of data. */
|
||||
xplmType_Data = 32,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMDataTypeID;
|
||||
|
||||
/*
|
||||
* XPLMFindDataRef
|
||||
*
|
||||
* Given a c-style string that names the data ref, this routine looks up the
|
||||
* actual opaque XPLMDataRef that you use to read and write the data. The
|
||||
* string names for datarefs are published on the X-Plane SDK web site.
|
||||
*
|
||||
* This function returns NULL if the data ref cannot be found.
|
||||
*
|
||||
* NOTE: this function is relatively expensive; save the XPLMDataRef this
|
||||
* function returns for future use. Do not look up your data ref by string
|
||||
* every time you need to read or write it.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMDataRef XPLMFindDataRef(
|
||||
const char * inDataRefName);
|
||||
|
||||
/*
|
||||
* XPLMCanWriteDataRef
|
||||
*
|
||||
* Given a data ref, this routine returns true if you can successfully set the
|
||||
* data, false otherwise. Some datarefs are read-only.
|
||||
*
|
||||
* NOTE: even if a dataref is marked writable, it may not act writable. This
|
||||
* can happen for datarefs that X-Plane writes to on every frame of
|
||||
* simulation. In some cases, the dataref is writable but you have to set a
|
||||
* separate "override" dataref to 1 to stop X-Plane from writing it.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMCanWriteDataRef(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/*
|
||||
* XPLMIsDataRefGood
|
||||
*
|
||||
* This function returns true if the passed in handle is a valid dataref that
|
||||
* is not orphaned.
|
||||
*
|
||||
* Note: there is normally no need to call this function; datarefs returned by
|
||||
* XPLMFindDataRef remain valid (but possibly orphaned) unless there is a
|
||||
* complete plugin reload (in which case your plugin is reloaded anyway).
|
||||
* Orphaned datarefs can be safely read and return 0. Therefore you never need
|
||||
* to call XPLMIsDataRefGood to 'check' the safety of a dataref.
|
||||
* (XPLMIsDatarefGood performs some slow checking of the handle validity, so
|
||||
* it has a perormance cost.)
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMIsDataRefGood(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/*
|
||||
* XPLMGetDataRefTypes
|
||||
*
|
||||
* This routine returns the types of the data ref for accessor use. If a data
|
||||
* ref is available in multiple data types, the bit-wise OR of these types
|
||||
* will be returned.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMDataTypeID XPLMGetDataRefTypes(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/***************************************************************************
|
||||
* DATA ACCESSORS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These routines read and write the data references. For each supported data
|
||||
* type there is a reader and a writer.
|
||||
*
|
||||
* If the data ref is orphaned or the plugin that provides it is disabled or
|
||||
* there is a type mismatch, the functions that read data will return 0 as a
|
||||
* default value or not modify the passed in memory. The plugins that write
|
||||
* data will not write under these circumstances or if the data ref is
|
||||
* read-only.
|
||||
*
|
||||
* NOTE: to keep the overhead of reading datarefs low, these routines do not
|
||||
* do full validation of a dataref; passing a junk value for a dataref can
|
||||
* result in crashing the sim. The get/set APIs do check for NULL.
|
||||
*
|
||||
* For array-style datarefs, you specify the number of items to read/write and
|
||||
* the offset into the array; the actual number of items read or written is
|
||||
* returned. This may be less to prevent an array-out-of-bounds error.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMGetDatai
|
||||
*
|
||||
* Read an integer data ref and return its value. The return value is the
|
||||
* dataref value or 0 if the dataref is NULL or the plugin is disabled.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDatai(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/*
|
||||
* XPLMSetDatai
|
||||
*
|
||||
* Write a new value to an integer data ref. This routine is a no-op if the
|
||||
* plugin publishing the dataref is disabled, the dataref is NULL, or the
|
||||
* dataref is not writable.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDatai(
|
||||
XPLMDataRef inDataRef,
|
||||
int inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDataf
|
||||
*
|
||||
* Read a single precision floating point dataref and return its value. The
|
||||
* return value is the dataref value or 0.0 if the dataref is NULL or the
|
||||
* plugin is disabled.
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMGetDataf(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/*
|
||||
* XPLMSetDataf
|
||||
*
|
||||
* Write a new value to a single precision floating point data ref. This
|
||||
* routine is a no-op if the plugin publishing the dataref is disabled, the
|
||||
* dataref is NULL, or the dataref is not writable.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDataf(
|
||||
XPLMDataRef inDataRef,
|
||||
float inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDatad
|
||||
*
|
||||
* Read a double precision floating point dataref and return its value. The
|
||||
* return value is the dataref value or 0.0 if the dataref is NULL or the
|
||||
* plugin is disabled.
|
||||
*
|
||||
*/
|
||||
XPLM_API double XPLMGetDatad(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/*
|
||||
* XPLMSetDatad
|
||||
*
|
||||
* Write a new value to a double precision floating point data ref. This
|
||||
* routine is a no-op if the plugin publishing the dataref is disabled, the
|
||||
* dataref is NULL, or the dataref is not writable.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDatad(
|
||||
XPLMDataRef inDataRef,
|
||||
double inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDatavi
|
||||
*
|
||||
* Read a part of an integer array dataref. If you pass NULL for outValues,
|
||||
* the routine will return the size of the array, ignoring inOffset and inMax.
|
||||
*
|
||||
* If outValues is not NULL, then up to inMax values are copied from the
|
||||
* dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
* inOffset is larger than the size of the dataref, less than inMax values
|
||||
* will be copied. The number of values copied is returned.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDatavi(
|
||||
XPLMDataRef inDataRef,
|
||||
int * outValues, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMax);
|
||||
|
||||
/*
|
||||
* XPLMSetDatavi
|
||||
*
|
||||
* Write part or all of an integer array dataref. The values passed by
|
||||
* inValues are written into the dataref starting at inOffset. Up to inCount
|
||||
* values are written; however if the values would write "off the end" of the
|
||||
* dataref array, then fewer values are written.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDatavi(
|
||||
XPLMDataRef inDataRef,
|
||||
int * inValues,
|
||||
int inoffset,
|
||||
int inCount);
|
||||
|
||||
/*
|
||||
* XPLMGetDatavf
|
||||
*
|
||||
* Read a part of a single precision floating point array dataref. If you pass
|
||||
* NULL for outVaules, the routine will return the size of the array, ignoring
|
||||
* inOffset and inMax.
|
||||
*
|
||||
* If outValues is not NULL, then up to inMax values are copied from the
|
||||
* dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
* inOffset is larger than the size of the dataref, less than inMax values
|
||||
* will be copied. The number of values copied is returned.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDatavf(
|
||||
XPLMDataRef inDataRef,
|
||||
float * outValues, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMax);
|
||||
|
||||
/*
|
||||
* XPLMSetDatavf
|
||||
*
|
||||
* Write part or all of a single precision floating point array dataref. The
|
||||
* values passed by inValues are written into the dataref starting at
|
||||
* inOffset. Up to inCount values are written; however if the values would
|
||||
* write "off the end" of the dataref array, then fewer values are written.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDatavf(
|
||||
XPLMDataRef inDataRef,
|
||||
float * inValues,
|
||||
int inoffset,
|
||||
int inCount);
|
||||
|
||||
/*
|
||||
* XPLMGetDatab
|
||||
*
|
||||
* Read a part of a byte array dataref. If you pass NULL for outVaules, the
|
||||
* routine will return the size of the array, ignoring inOffset and inMax.
|
||||
*
|
||||
* If outValues is not NULL, then up to inMax values are copied from the
|
||||
* dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
* inOffset is larger than the size of the dataref, less than inMax values
|
||||
* will be copied. The number of values copied is returned.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDatab(
|
||||
XPLMDataRef inDataRef,
|
||||
void * outValue, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMaxBytes);
|
||||
|
||||
/*
|
||||
* XPLMSetDatab
|
||||
*
|
||||
* Write part or all of a byte array dataref. The values passed by inValues
|
||||
* are written into the dataref starting at inOffset. Up to inCount values are
|
||||
* written; however if the values would write "off the end" of the dataref
|
||||
* array, then fewer values are written.
|
||||
*
|
||||
* Note: the semantics of array datarefs are entirely implemented by the
|
||||
* plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
* above description is how these datarefs are intended to work, but a rogue
|
||||
* plugin may have different behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDatab(
|
||||
XPLMDataRef inDataRef,
|
||||
void * inValue,
|
||||
int inOffset,
|
||||
int inLength);
|
||||
|
||||
/***************************************************************************
|
||||
* PUBLISHING YOUR PLUGIN'S DATA
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These functions allow you to create data references that other plug-ins and
|
||||
* X-Plane can access via the above data access APIs. Data references
|
||||
* published by other plugins operate the same as ones published by X-Plane in
|
||||
* all manners except that your data reference will not be available to other
|
||||
* plugins if/when your plugin is disabled.
|
||||
*
|
||||
* You share data by registering data provider callback functions. When a
|
||||
* plug-in requests your data, these callbacks are then called. You provide
|
||||
* one callback to return the value when a plugin 'reads' it and another to
|
||||
* change the value when a plugin 'writes' it.
|
||||
*
|
||||
* Important: you must pick a prefix for your datarefs other than "sim/" -
|
||||
* this prefix is reserved for X-Plane. The X-Plane SDK website contains a
|
||||
* registry where authors can select a unique first word for dataref names, to
|
||||
* prevent dataref collisions between plugins.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMGetDatai_f
|
||||
*
|
||||
* Data provider function pointers.
|
||||
*
|
||||
* These define the function pointers you provide to get or set data. Note
|
||||
* that you are passed a generic pointer for each one. This is the same
|
||||
* pointer you pass in your register routine; you can use it to locate plugin
|
||||
* variables, etc.
|
||||
*
|
||||
* The semantics of your callbacks are the same as the dataref accessor above
|
||||
* - basically routines like XPLMGetDatai are just pass-throughs from a caller
|
||||
* to your plugin. Be particularly mindful in implementing array dataref
|
||||
* read-write accessors; you are responsible for avoiding overruns, supporting
|
||||
* offset read/writes, and handling a read with a NULL buffer.
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMGetDatai_f)(
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMSetDatai_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDatai_f)(
|
||||
void * inRefcon,
|
||||
int inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDataf_f
|
||||
*
|
||||
*/
|
||||
typedef float (* XPLMGetDataf_f)(
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMSetDataf_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDataf_f)(
|
||||
void * inRefcon,
|
||||
float inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDatad_f
|
||||
*
|
||||
*/
|
||||
typedef double (* XPLMGetDatad_f)(
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMSetDatad_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDatad_f)(
|
||||
void * inRefcon,
|
||||
double inValue);
|
||||
|
||||
/*
|
||||
* XPLMGetDatavi_f
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMGetDatavi_f)(
|
||||
void * inRefcon,
|
||||
int * outValues, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMax);
|
||||
|
||||
/*
|
||||
* XPLMSetDatavi_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDatavi_f)(
|
||||
void * inRefcon,
|
||||
int * inValues,
|
||||
int inOffset,
|
||||
int inCount);
|
||||
|
||||
/*
|
||||
* XPLMGetDatavf_f
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMGetDatavf_f)(
|
||||
void * inRefcon,
|
||||
float * outValues, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMax);
|
||||
|
||||
/*
|
||||
* XPLMSetDatavf_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDatavf_f)(
|
||||
void * inRefcon,
|
||||
float * inValues,
|
||||
int inOffset,
|
||||
int inCount);
|
||||
|
||||
/*
|
||||
* XPLMGetDatab_f
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMGetDatab_f)(
|
||||
void * inRefcon,
|
||||
void * outValue, /* Can be NULL */
|
||||
int inOffset,
|
||||
int inMaxLength);
|
||||
|
||||
/*
|
||||
* XPLMSetDatab_f
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMSetDatab_f)(
|
||||
void * inRefcon,
|
||||
void * inValue,
|
||||
int inOffset,
|
||||
int inLength);
|
||||
|
||||
/*
|
||||
* XPLMRegisterDataAccessor
|
||||
*
|
||||
* This routine creates a new item of data that can be read and written. Pass
|
||||
* in the data's full name for searching, the type(s) of the data for
|
||||
* accessing, and whether the data can be written to. For each data type you
|
||||
* support, pass in a read accessor function and a write accessor function if
|
||||
* necessary. Pass NULL for data types you do not support or write accessors
|
||||
* if you are read-only.
|
||||
*
|
||||
* You are returned a data ref for the new item of data created. You can use
|
||||
* this data ref to unregister your data later or read or write from it.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMDataRef XPLMRegisterDataAccessor(
|
||||
const char * inDataName,
|
||||
XPLMDataTypeID inDataType,
|
||||
int inIsWritable,
|
||||
XPLMGetDatai_f inReadInt,
|
||||
XPLMSetDatai_f inWriteInt,
|
||||
XPLMGetDataf_f inReadFloat,
|
||||
XPLMSetDataf_f inWriteFloat,
|
||||
XPLMGetDatad_f inReadDouble,
|
||||
XPLMSetDatad_f inWriteDouble,
|
||||
XPLMGetDatavi_f inReadIntArray,
|
||||
XPLMSetDatavi_f inWriteIntArray,
|
||||
XPLMGetDatavf_f inReadFloatArray,
|
||||
XPLMSetDatavf_f inWriteFloatArray,
|
||||
XPLMGetDatab_f inReadData,
|
||||
XPLMSetDatab_f inWriteData,
|
||||
void * inReadRefcon,
|
||||
void * inWriteRefcon);
|
||||
|
||||
/*
|
||||
* XPLMUnregisterDataAccessor
|
||||
*
|
||||
* Use this routine to unregister any data accessors you may have registered.
|
||||
* You unregister a data ref by the XPLMDataRef you get back from
|
||||
* registration. Once you unregister a data ref, your function pointer will
|
||||
* not be called anymore.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMUnregisterDataAccessor(
|
||||
XPLMDataRef inDataRef);
|
||||
|
||||
/***************************************************************************
|
||||
* SHARING DATA BETWEEN MULTIPLE PLUGINS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The data reference registration APIs from the previous section allow a
|
||||
* plugin to publish data in a one-owner manner; the plugin that publishes the
|
||||
* data reference owns the real memory that the data ref uses. This is
|
||||
* satisfactory for most cases, but there are also cases where plugnis need to
|
||||
* share actual data.
|
||||
*
|
||||
* With a shared data reference, no one plugin owns the actual memory for the
|
||||
* data reference; the plugin SDK allocates that for you. When the first
|
||||
* plugin asks to 'share' the data, the memory is allocated. When the data is
|
||||
* changed, every plugin that is sharing the data is notified.
|
||||
*
|
||||
* Shared data references differ from the 'owned' data references from the
|
||||
* previous section in a few ways:
|
||||
*
|
||||
* * With shared data references, any plugin can create the data reference;
|
||||
* with owned plugins one plugin must create the data reference and others
|
||||
* subscribe. (This can be a problem if you don't know which set of plugins
|
||||
* will be present).
|
||||
*
|
||||
* * With shared data references, every plugin that is sharing the data is
|
||||
* notified when the data is changed. With owned data references, only the
|
||||
* one owner is notified when the data is changed.
|
||||
*
|
||||
* * With shared data references, you cannot access the physical memory of the
|
||||
* data reference; you must use the XPLMGet... and XPLMSet... APIs. With an
|
||||
* owned data reference, the one owning data reference can manipulate the
|
||||
* data reference's memory in any way it sees fit.
|
||||
*
|
||||
* Shared data references solve two problems: if you need to have a data
|
||||
* reference used by several plugins but do not know which plugins will be
|
||||
* installed, or if all plugins sharing data need to be notified when that
|
||||
* data is changed, use shared data references.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMDataChanged_f
|
||||
*
|
||||
* An XPLMDataChanged_f is a callback that the XPLM calls whenever any other
|
||||
* plug-in modifies shared data. A refcon you provide is passed back to help
|
||||
* identify which data is being changed. In response, you may want to call one
|
||||
* of the XPLMGetDataxxx routines to find the new value of the data.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMDataChanged_f)(
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMShareData
|
||||
*
|
||||
* This routine connects a plug-in to shared data, creating the shared data if
|
||||
* necessary. inDataName is a standard path for the data ref, and inDataType
|
||||
* specifies the type. This function will create the data if it does not
|
||||
* exist. If the data already exists but the type does not match, an error is
|
||||
* returned, so it is important that plug-in authors collaborate to establish
|
||||
* public standards for shared data.
|
||||
*
|
||||
* If a notificationFunc is passed in and is not NULL, that notification
|
||||
* function will be called whenever the data is modified. The notification
|
||||
* refcon will be passed to it. This allows your plug-in to know which shared
|
||||
* data was changed if multiple shared data are handled by one callback, or if
|
||||
* the plug-in does not use global variables.
|
||||
*
|
||||
* A one is returned for successfully creating or finding the shared data; a
|
||||
* zero if the data already exists but is of the wrong type.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMShareData(
|
||||
const char * inDataName,
|
||||
XPLMDataTypeID inDataType,
|
||||
XPLMDataChanged_f inNotificationFunc,
|
||||
void * inNotificationRefcon);
|
||||
|
||||
/*
|
||||
* XPLMUnshareData
|
||||
*
|
||||
* This routine removes your notification function for shared data. Call it
|
||||
* when done with the data to stop receiving change notifications. Arguments
|
||||
* must match XPLMShareData. The actual memory will not necessarily be freed,
|
||||
* since other plug-ins could be using it.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMUnshareData(
|
||||
const char * inDataName,
|
||||
XPLMDataTypeID inDataType,
|
||||
XPLMDataChanged_f inNotificationFunc,
|
||||
void * inNotificationRefcon);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,514 @@
|
||||
#ifndef _XPLMDefs_h_
|
||||
#define _XPLMDefs_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMDefs
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if IBM
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
/***************************************************************************
|
||||
* DLL Definitions
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if APL
|
||||
#if __GNUC__ >= 4
|
||||
#define PLUGIN_API extern "C" __attribute__((visibility("default")))
|
||||
#elif __MACH__
|
||||
#define PLUGIN_API extern "C"
|
||||
#else
|
||||
#define PLUGIN_API extern "C" __declspec(dllexport)
|
||||
#endif
|
||||
#elif IBM
|
||||
#define PLUGIN_API extern "C" __declspec(dllexport)
|
||||
#elif LIN
|
||||
#if __GNUC__ >= 4
|
||||
#define PLUGIN_API extern "C" __attribute__((visibility("default")))
|
||||
#else
|
||||
#define PLUGIN_API extern "C"
|
||||
#endif
|
||||
#else
|
||||
#error "Platform not defined!"
|
||||
#endif
|
||||
#else
|
||||
#if APL
|
||||
#if __GNUC__ >= 4
|
||||
#define PLUGIN_API __attribute__((visibility("default")))
|
||||
#elif __MACH__
|
||||
#define PLUGIN_API
|
||||
#else
|
||||
#define PLUGIN_API __declspec(dllexport)
|
||||
#endif
|
||||
#elif IBM
|
||||
#define PLUGIN_API __declspec(dllexport)
|
||||
#elif LIN
|
||||
#if __GNUC__ >= 4
|
||||
#define PLUGIN_API __attribute__((visibility("default")))
|
||||
#else
|
||||
#define PLUGIN_API
|
||||
#endif
|
||||
#else
|
||||
#error "Platform not defined!"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if APL
|
||||
#if XPLM
|
||||
#if __GNUC__ >= 4
|
||||
#define XPLM_API __attribute__((visibility("default")))
|
||||
#elif __MACH__
|
||||
#define XPLM_API
|
||||
#else
|
||||
#define XPLM_API __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#define XPLM_API
|
||||
#endif
|
||||
#elif IBM
|
||||
#if XPLM
|
||||
#define XPLM_API __declspec(dllexport)
|
||||
#else
|
||||
#define XPLM_API __declspec(dllimport)
|
||||
#endif
|
||||
#elif LIN
|
||||
#if XPLM
|
||||
#if __GNUC__ >= 4
|
||||
#define XPLM_API __attribute__((visibility("default")))
|
||||
#else
|
||||
#define XPLM_API
|
||||
#endif
|
||||
#else
|
||||
#define XPLM_API
|
||||
#endif
|
||||
#else
|
||||
#error "Platform not defined!"
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* GLOBAL DEFINITIONS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These definitions are used in all parts of the SDK.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* 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. 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
|
||||
*
|
||||
* -1 indicates no plug-in.
|
||||
*
|
||||
*/
|
||||
typedef int XPLMPluginID;
|
||||
|
||||
/* No plugin. */
|
||||
#define XPLM_NO_PLUGIN_ID (-1)
|
||||
|
||||
/* X-Plane itself */
|
||||
#define XPLM_PLUGIN_XPLANE (0)
|
||||
|
||||
/* The current XPLM revision is 4.00 (400). */
|
||||
#define 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The shift key is down */
|
||||
xplm_ShiftFlag = 1,
|
||||
|
||||
/* The option or alt key is down */
|
||||
xplm_OptionAltFlag = 2,
|
||||
|
||||
/* The control key is down* */
|
||||
xplm_ControlFlag = 4,
|
||||
|
||||
/* The key is being pressed down */
|
||||
xplm_DownFlag = 8,
|
||||
|
||||
/* The key is being released */
|
||||
xplm_UpFlag = 16,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMKeyFlags;
|
||||
|
||||
/***************************************************************************
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define XPLM_KEY_RETURN 13
|
||||
|
||||
#define XPLM_KEY_ESCAPE 27
|
||||
|
||||
#define XPLM_KEY_TAB 9
|
||||
|
||||
#define XPLM_KEY_DELETE 8
|
||||
|
||||
#define XPLM_KEY_LEFT 28
|
||||
|
||||
#define XPLM_KEY_RIGHT 29
|
||||
|
||||
#define XPLM_KEY_UP 30
|
||||
|
||||
#define XPLM_KEY_DOWN 31
|
||||
|
||||
#define XPLM_KEY_0 48
|
||||
|
||||
#define XPLM_KEY_1 49
|
||||
|
||||
#define XPLM_KEY_2 50
|
||||
|
||||
#define XPLM_KEY_3 51
|
||||
|
||||
#define XPLM_KEY_4 52
|
||||
|
||||
#define XPLM_KEY_5 53
|
||||
|
||||
#define XPLM_KEY_6 54
|
||||
|
||||
#define XPLM_KEY_7 55
|
||||
|
||||
#define XPLM_KEY_8 56
|
||||
|
||||
#define XPLM_KEY_9 57
|
||||
|
||||
#define XPLM_KEY_DECIMAL 46
|
||||
|
||||
/***************************************************************************
|
||||
* 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).
|
||||
*
|
||||
* 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:
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define XPLM_VK_BACK 0x08
|
||||
|
||||
#define XPLM_VK_TAB 0x09
|
||||
|
||||
#define XPLM_VK_CLEAR 0x0C
|
||||
|
||||
#define XPLM_VK_RETURN 0x0D
|
||||
|
||||
#define XPLM_VK_ESCAPE 0x1B
|
||||
|
||||
#define XPLM_VK_SPACE 0x20
|
||||
|
||||
#define XPLM_VK_PRIOR 0x21
|
||||
|
||||
#define XPLM_VK_NEXT 0x22
|
||||
|
||||
#define XPLM_VK_END 0x23
|
||||
|
||||
#define XPLM_VK_HOME 0x24
|
||||
|
||||
#define XPLM_VK_LEFT 0x25
|
||||
|
||||
#define XPLM_VK_UP 0x26
|
||||
|
||||
#define XPLM_VK_RIGHT 0x27
|
||||
|
||||
#define XPLM_VK_DOWN 0x28
|
||||
|
||||
#define XPLM_VK_SELECT 0x29
|
||||
|
||||
#define XPLM_VK_PRINT 0x2A
|
||||
|
||||
#define XPLM_VK_EXECUTE 0x2B
|
||||
|
||||
#define XPLM_VK_SNAPSHOT 0x2C
|
||||
|
||||
#define XPLM_VK_INSERT 0x2D
|
||||
|
||||
#define XPLM_VK_DELETE 0x2E
|
||||
|
||||
#define XPLM_VK_HELP 0x2F
|
||||
|
||||
/* XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
|
||||
#define XPLM_VK_0 0x30
|
||||
|
||||
#define XPLM_VK_1 0x31
|
||||
|
||||
#define XPLM_VK_2 0x32
|
||||
|
||||
#define XPLM_VK_3 0x33
|
||||
|
||||
#define XPLM_VK_4 0x34
|
||||
|
||||
#define XPLM_VK_5 0x35
|
||||
|
||||
#define XPLM_VK_6 0x36
|
||||
|
||||
#define XPLM_VK_7 0x37
|
||||
|
||||
#define XPLM_VK_8 0x38
|
||||
|
||||
#define XPLM_VK_9 0x39
|
||||
|
||||
/* XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
|
||||
#define XPLM_VK_A 0x41
|
||||
|
||||
#define XPLM_VK_B 0x42
|
||||
|
||||
#define XPLM_VK_C 0x43
|
||||
|
||||
#define XPLM_VK_D 0x44
|
||||
|
||||
#define XPLM_VK_E 0x45
|
||||
|
||||
#define XPLM_VK_F 0x46
|
||||
|
||||
#define XPLM_VK_G 0x47
|
||||
|
||||
#define XPLM_VK_H 0x48
|
||||
|
||||
#define XPLM_VK_I 0x49
|
||||
|
||||
#define XPLM_VK_J 0x4A
|
||||
|
||||
#define XPLM_VK_K 0x4B
|
||||
|
||||
#define XPLM_VK_L 0x4C
|
||||
|
||||
#define XPLM_VK_M 0x4D
|
||||
|
||||
#define XPLM_VK_N 0x4E
|
||||
|
||||
#define XPLM_VK_O 0x4F
|
||||
|
||||
#define XPLM_VK_P 0x50
|
||||
|
||||
#define XPLM_VK_Q 0x51
|
||||
|
||||
#define XPLM_VK_R 0x52
|
||||
|
||||
#define XPLM_VK_S 0x53
|
||||
|
||||
#define XPLM_VK_T 0x54
|
||||
|
||||
#define XPLM_VK_U 0x55
|
||||
|
||||
#define XPLM_VK_V 0x56
|
||||
|
||||
#define XPLM_VK_W 0x57
|
||||
|
||||
#define XPLM_VK_X 0x58
|
||||
|
||||
#define XPLM_VK_Y 0x59
|
||||
|
||||
#define XPLM_VK_Z 0x5A
|
||||
|
||||
#define XPLM_VK_NUMPAD0 0x60
|
||||
|
||||
#define XPLM_VK_NUMPAD1 0x61
|
||||
|
||||
#define XPLM_VK_NUMPAD2 0x62
|
||||
|
||||
#define XPLM_VK_NUMPAD3 0x63
|
||||
|
||||
#define XPLM_VK_NUMPAD4 0x64
|
||||
|
||||
#define XPLM_VK_NUMPAD5 0x65
|
||||
|
||||
#define XPLM_VK_NUMPAD6 0x66
|
||||
|
||||
#define XPLM_VK_NUMPAD7 0x67
|
||||
|
||||
#define XPLM_VK_NUMPAD8 0x68
|
||||
|
||||
#define XPLM_VK_NUMPAD9 0x69
|
||||
|
||||
#define XPLM_VK_MULTIPLY 0x6A
|
||||
|
||||
#define XPLM_VK_ADD 0x6B
|
||||
|
||||
#define XPLM_VK_SEPARATOR 0x6C
|
||||
|
||||
#define XPLM_VK_SUBTRACT 0x6D
|
||||
|
||||
#define XPLM_VK_DECIMAL 0x6E
|
||||
|
||||
#define XPLM_VK_DIVIDE 0x6F
|
||||
|
||||
#define XPLM_VK_F1 0x70
|
||||
|
||||
#define XPLM_VK_F2 0x71
|
||||
|
||||
#define XPLM_VK_F3 0x72
|
||||
|
||||
#define XPLM_VK_F4 0x73
|
||||
|
||||
#define XPLM_VK_F5 0x74
|
||||
|
||||
#define XPLM_VK_F6 0x75
|
||||
|
||||
#define XPLM_VK_F7 0x76
|
||||
|
||||
#define XPLM_VK_F8 0x77
|
||||
|
||||
#define XPLM_VK_F9 0x78
|
||||
|
||||
#define XPLM_VK_F10 0x79
|
||||
|
||||
#define XPLM_VK_F11 0x7A
|
||||
|
||||
#define XPLM_VK_F12 0x7B
|
||||
|
||||
#define XPLM_VK_F13 0x7C
|
||||
|
||||
#define XPLM_VK_F14 0x7D
|
||||
|
||||
#define XPLM_VK_F15 0x7E
|
||||
|
||||
#define XPLM_VK_F16 0x7F
|
||||
|
||||
#define XPLM_VK_F17 0x80
|
||||
|
||||
#define XPLM_VK_F18 0x81
|
||||
|
||||
#define XPLM_VK_F19 0x82
|
||||
|
||||
#define XPLM_VK_F20 0x83
|
||||
|
||||
#define XPLM_VK_F21 0x84
|
||||
|
||||
#define XPLM_VK_F22 0x85
|
||||
|
||||
#define XPLM_VK_F23 0x86
|
||||
|
||||
#define XPLM_VK_F24 0x87
|
||||
|
||||
/* The following definitions are extended and are not based on the Microsoft *
|
||||
* key set. */
|
||||
#define XPLM_VK_EQUAL 0xB0
|
||||
|
||||
#define XPLM_VK_MINUS 0xB1
|
||||
|
||||
#define XPLM_VK_RBRACE 0xB2
|
||||
|
||||
#define XPLM_VK_LBRACE 0xB3
|
||||
|
||||
#define XPLM_VK_QUOTE 0xB4
|
||||
|
||||
#define XPLM_VK_SEMICOLON 0xB5
|
||||
|
||||
#define XPLM_VK_BACKSLASH 0xB6
|
||||
|
||||
#define XPLM_VK_COMMA 0xB7
|
||||
|
||||
#define XPLM_VK_SLASH 0xB8
|
||||
|
||||
#define XPLM_VK_PERIOD 0xB9
|
||||
|
||||
#define XPLM_VK_BACKQUOTE 0xBA
|
||||
|
||||
#define XPLM_VK_ENTER 0xBB
|
||||
|
||||
#define XPLM_VK_NUMPAD_ENT 0xBC
|
||||
|
||||
#define XPLM_VK_NUMPAD_EQ 0xBD
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,437 @@
|
||||
#ifndef _XPLMGraphics_h_
|
||||
#define _XPLMGraphics_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMGraphics
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* X-PLANE GRAPHICS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* *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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The bitmap that contains window outlines, button outlines, fonts, etc. */
|
||||
xplm_Tex_GeneralInterface = 0,
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* The exterior paint for the user's aircraft (daytime). */
|
||||
xplm_Tex_AircraftPaint = 1,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* The exterior light map for the user's aircraft. */
|
||||
xplm_Tex_AircraftLiteMap = 2,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
};
|
||||
typedef int XPLMTextureID;
|
||||
|
||||
/*
|
||||
* XPLMSetGraphicsState
|
||||
*
|
||||
* 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);
|
||||
* - 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);
|
||||
*
|
||||
* 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 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetGraphicsState(
|
||||
int inEnableFog,
|
||||
int inNumberTexUnits,
|
||||
int inEnableLighting,
|
||||
int inEnableAlphaTesting,
|
||||
int inEnableAlphaBlending,
|
||||
int inEnableDepthTesting,
|
||||
int inEnableDepthWriting);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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, ....);
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMBindTexture2d(
|
||||
int inTextureNum,
|
||||
int inTextureUnit);
|
||||
|
||||
/*
|
||||
* XPLMGenerateTextureNumbers
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGenerateTextureNumbers(
|
||||
int * outTextureIDs,
|
||||
int inCount);
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/*
|
||||
* XPLMGetTexture
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetTexture(
|
||||
XPLMTextureID inTexture);
|
||||
#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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMWorldToLocal(
|
||||
double inLatitude,
|
||||
double inLongitude,
|
||||
double inAltitude,
|
||||
double * outX,
|
||||
double * outY,
|
||||
double * outZ);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* NOTE: world coordinates are less precise than local coordinates; you should
|
||||
* try to avoid round tripping from local to world and back.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMLocalToWorld(
|
||||
double inX,
|
||||
double inY,
|
||||
double inZ,
|
||||
double * outLatitude,
|
||||
double * outLongitude,
|
||||
double * outAltitude);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawTranslucentDarkBox(
|
||||
int inLeft,
|
||||
int inTop,
|
||||
int inRight,
|
||||
int inBottom);
|
||||
|
||||
/***************************************************************************
|
||||
* X-PLANE TEXT
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPLMFontID
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* Mono-spaced font for user interface. Available in all versions of the SDK.*/
|
||||
xplmFont_Basic = 0,
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_Menus = 1,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_Metal = 2,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_Led = 3,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_LedWide = 4,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_PanelHUD = 5,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_PanelEFIS = 6,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_PanelGPS = 7,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosGA = 8,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosBC = 9,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosHM = 10,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosGANarrow = 11,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosBCNarrow = 12,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_RadiosHMNarrow = 13,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_Timer = 14,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_FullRound = 15,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_SmallRound = 16,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/* Deprecated, do not use. */
|
||||
xplmFont_Menus_Localized = 17,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM200)
|
||||
/* Proportional UI font. */
|
||||
xplmFont_Proportional = 18,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
|
||||
};
|
||||
typedef int XPLMFontID;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawString(
|
||||
float * inColorRGB,
|
||||
int inXOffset,
|
||||
int inYOffset,
|
||||
char * inChar,
|
||||
int * inWordWrapWidth, /* Can be NULL */
|
||||
XPLMFontID inFontID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawNumber(
|
||||
float * inColorRGB,
|
||||
int inXOffset,
|
||||
int inYOffset,
|
||||
double inValue,
|
||||
int inDigits,
|
||||
int inDecimals,
|
||||
int inShowSign,
|
||||
XPLMFontID inFontID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetFontDimensions(
|
||||
XPLMFontID inFontID,
|
||||
int * outCharWidth, /* Can be NULL */
|
||||
int * outCharHeight, /* Can be NULL */
|
||||
int * outDigitsOnly); /* Can be NULL */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMMeasureString(
|
||||
XPLMFontID inFontID,
|
||||
const char * inChar,
|
||||
int inNumChars);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,136 @@
|
||||
#ifndef _XPLMInstance_h_
|
||||
#define _XPLMInstance_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMInstance
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
#include "XPLMScenery.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* Instance Creation and Destruction
|
||||
***************************************************************************/
|
||||
/*
|
||||
* Registers and unregisters instances.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMInstanceRef
|
||||
*
|
||||
* An opaque handle to an instance.
|
||||
*
|
||||
*/
|
||||
typedef void * 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMInstanceRef XPLMCreateInstance(
|
||||
XPLMObjectRef obj,
|
||||
const char ** datarefs);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDestroyInstance(
|
||||
XPLMInstanceRef instance);
|
||||
|
||||
/***************************************************************************
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMInstanceSetPosition(
|
||||
XPLMInstanceRef instance,
|
||||
const XPLMDrawInfo_t * new_position,
|
||||
const float * data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,628 @@
|
||||
#ifndef _XPLMMap_h_
|
||||
#define _XPLMMap_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMMap
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void * 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.
|
||||
*
|
||||
*/
|
||||
typedef void * 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).
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_MapStyle_VFR_Sectional = 0,
|
||||
|
||||
xplm_MapStyle_IFR_LowEnroute = 1,
|
||||
|
||||
xplm_MapStyle_IFR_HighEnroute = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapDrawingCallback_f)(
|
||||
XPLMMapLayerID inLayer,
|
||||
const float * inMapBoundsLeftTopRightBottom,
|
||||
float zoomRatio,
|
||||
float mapUnitsPerUserInterfaceUnit,
|
||||
XPLMMapStyle mapStyle,
|
||||
XPLMMapProjectionID projection,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapIconDrawingCallback_f)(
|
||||
XPLMMapLayerID inLayer,
|
||||
const float * inMapBoundsLeftTopRightBottom,
|
||||
float zoomRatio,
|
||||
float mapUnitsPerUserInterfaceUnit,
|
||||
XPLMMapStyle mapStyle,
|
||||
XPLMMapProjectionID projection,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapLabelDrawingCallback_f)(
|
||||
XPLMMapLayerID inLayer,
|
||||
const float * inMapBoundsLeftTopRightBottom,
|
||||
float zoomRatio,
|
||||
float mapUnitsPerUserInterfaceUnit,
|
||||
XPLMMapStyle mapStyle,
|
||||
XPLMMapProjectionID projection,
|
||||
void * inRefcon);
|
||||
|
||||
#endif /* XPLM300 */
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapPrepareCacheCallback_f)(
|
||||
XPLMMapLayerID inLayer,
|
||||
const float * inTotalMapBoundsLeftTopRightBottom,
|
||||
XPLMMapProjectionID projection,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapWillBeDeletedCallback_f)(
|
||||
XPLMMapLayerID inLayer,
|
||||
void * inRefcon);
|
||||
|
||||
#endif /* XPLM300 */
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMMapLayerType;
|
||||
|
||||
/* Globally unique identifier for X-Plane's Map window, used as the *
|
||||
* mapToCreateLayerIn parameter in XPLMCreateMapLayer_t */
|
||||
#define 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 */
|
||||
#define 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.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
/* Used to inform XPLMCreateMapLayer() of the SDK version you compiled *
|
||||
* against; should always be set to sizeof(XPLMCreateMapLayer_t) */
|
||||
int structSize;
|
||||
/* 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 */
|
||||
const char * mapToCreateLayerIn;
|
||||
/* 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) */
|
||||
XPLMMapLayerType layerType;
|
||||
/* Optional callback to inform you this layer is being deleted (due to its *
|
||||
* owning map being destroyed) */
|
||||
XPLMMapWillBeDeletedCallback_f willBeDeletedCallback;
|
||||
/* 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) */
|
||||
XPLMMapPrepareCacheCallback_f prepCacheCallback;
|
||||
/* 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) */
|
||||
XPLMMapDrawingCallback_f drawCallback;
|
||||
/* 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) */
|
||||
XPLMMapIconDrawingCallback_f iconCallback;
|
||||
/* 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) */
|
||||
XPLMMapLabelDrawingCallback_f labelCallback;
|
||||
/* 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 */
|
||||
int showUiToggle;
|
||||
/* Short label to use for this layer in the user interface */
|
||||
const char * layerName;
|
||||
/* A reference to arbitrary data that will be passed to your callbacks */
|
||||
void * refcon;
|
||||
} 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMMapLayerID XPLMCreateMapLayer(
|
||||
XPLMCreateMapLayer_t * inParams);
|
||||
|
||||
/*
|
||||
* XPLMDestroyMapLayer
|
||||
*
|
||||
* Destroys a map layer you created (calling your
|
||||
* XPLMMapWillBeDeletedCallback_f if applicable). Returns true if a deletion
|
||||
* took place.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMDestroyMapLayer(
|
||||
XPLMMapLayerID inLayer);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMapCreatedCallback_f)(
|
||||
const char * mapIdentifier,
|
||||
void * refcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMRegisterMapCreationHook(
|
||||
XPLMMapCreatedCallback_f callback,
|
||||
void * refcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMMapExists(
|
||||
const char * mapIdentifier);
|
||||
|
||||
#endif /* XPLM300 */
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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,
|
||||
|
||||
|
||||
};
|
||||
typedef int 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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawMapIconFromSheet(
|
||||
XPLMMapLayerID layer,
|
||||
const char * inPngPath,
|
||||
int s,
|
||||
int t,
|
||||
int ds,
|
||||
int dt,
|
||||
float mapX,
|
||||
float mapY,
|
||||
XPLMMapOrientation orientation,
|
||||
float rotationDegrees,
|
||||
float mapWidth);
|
||||
|
||||
/*
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawMapLabel(
|
||||
XPLMMapLayerID layer,
|
||||
const char * inText,
|
||||
float mapX,
|
||||
float mapY,
|
||||
XPLMMapOrientation orientation,
|
||||
float rotationDegrees);
|
||||
|
||||
#endif /* XPLM300 */
|
||||
#if defined(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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMMapProject(
|
||||
XPLMMapProjectionID projection,
|
||||
double latitude,
|
||||
double longitude,
|
||||
float * outX,
|
||||
float * outY);
|
||||
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMMapUnproject(
|
||||
XPLMMapProjectionID projection,
|
||||
float mapX,
|
||||
float mapY,
|
||||
double * outLatitude,
|
||||
double * outLongitude);
|
||||
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMMapScaleMeter(
|
||||
XPLMMapProjectionID projection,
|
||||
float mapX,
|
||||
float mapY);
|
||||
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMMapGetNorthHeading(
|
||||
XPLMMapProjectionID projection,
|
||||
float mapX,
|
||||
float mapY);
|
||||
|
||||
#endif /* XPLM300 */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,290 @@
|
||||
#ifndef _XPLMMenus_h_
|
||||
#define _XPLMMenus_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMMenus
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
#include "XPLMUtilities.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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). */
|
||||
xplm_Menu_Unchecked = 1,
|
||||
|
||||
/* the menu has a mark next to it that is checked (lit). */
|
||||
xplm_Menu_Checked = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMMenuCheck;
|
||||
|
||||
/*
|
||||
* XPLMMenuID
|
||||
*
|
||||
* This is a unique ID for each menu you create.
|
||||
*
|
||||
*/
|
||||
typedef void * XPLMMenuID;
|
||||
|
||||
/*
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMMenuHandler_f)(
|
||||
void * inMenuRef,
|
||||
void * inItemRef);
|
||||
|
||||
/*
|
||||
* XPLMFindPluginsMenu
|
||||
*
|
||||
* This function returns the ID of the plug-ins menu, which is created for you
|
||||
* at startup.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMMenuID XPLMFindPluginsMenu(void);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMMenuID XPLMFindAircraftMenu(void);
|
||||
#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).
|
||||
*
|
||||
* Important: you must pass a valid, non-empty menu title even if the menu is
|
||||
* a submenu where the title is not visible.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMMenuID XPLMCreateMenu(
|
||||
const char * inName,
|
||||
XPLMMenuID inParentMenu,
|
||||
int inParentItem,
|
||||
XPLMMenuHandler_f inHandler,
|
||||
void * inMenuRef);
|
||||
|
||||
/*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDestroyMenu(
|
||||
XPLMMenuID inMenuID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMClearAllMenuItems(
|
||||
XPLMMenuID inMenuID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMAppendMenuItem(
|
||||
XPLMMenuID inMenu,
|
||||
const char * inItemName,
|
||||
void * inItemRef,
|
||||
int inDeprecatedAndIgnored);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMAppendMenuItemWithCommand(
|
||||
XPLMMenuID inMenu,
|
||||
const char * inItemName,
|
||||
XPLMCommandRef inCommandToExecute);
|
||||
#endif /* XPLM300 */
|
||||
|
||||
/*
|
||||
* XPLMAppendMenuSeparator
|
||||
*
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMAppendMenuSeparator(
|
||||
XPLMMenuID inMenu);
|
||||
|
||||
/*
|
||||
* XPLMSetMenuItemName
|
||||
*
|
||||
* This routine changes the name of an existing menu item. Pass in the menu
|
||||
* ID and the index of the menu item.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetMenuItemName(
|
||||
XPLMMenuID inMenu,
|
||||
int inIndex,
|
||||
const char * inItemName,
|
||||
int inDeprecatedAndIgnored);
|
||||
|
||||
/*
|
||||
* XPLMCheckMenuItem
|
||||
*
|
||||
* Set whether a menu item is checked. Pass in the menu ID and item index.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCheckMenuItem(
|
||||
XPLMMenuID inMenu,
|
||||
int index,
|
||||
XPLMMenuCheck inCheck);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCheckMenuItemState(
|
||||
XPLMMenuID inMenu,
|
||||
int index,
|
||||
XPLMMenuCheck * outCheck);
|
||||
|
||||
/*
|
||||
* XPLMEnableMenuItem
|
||||
*
|
||||
* Sets whether this menu item is enabled. Items start out enabled.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMEnableMenuItem(
|
||||
XPLMMenuID inMenu,
|
||||
int index,
|
||||
int enabled);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMRemoveMenuItem(
|
||||
XPLMMenuID inMenu,
|
||||
int inIndex);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,362 @@
|
||||
#ifndef _XPLMNavigation_h_
|
||||
#define _XPLMNavigation_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMNavigation
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_Nav_Unknown = 0,
|
||||
|
||||
xplm_Nav_Airport = 1,
|
||||
|
||||
xplm_Nav_NDB = 2,
|
||||
|
||||
xplm_Nav_VOR = 4,
|
||||
|
||||
xplm_Nav_ILS = 8,
|
||||
|
||||
xplm_Nav_Localizer = 16,
|
||||
|
||||
xplm_Nav_GlideSlope = 32,
|
||||
|
||||
xplm_Nav_OuterMarker = 64,
|
||||
|
||||
xplm_Nav_MiddleMarker = 128,
|
||||
|
||||
xplm_Nav_InnerMarker = 256,
|
||||
|
||||
xplm_Nav_Fix = 512,
|
||||
|
||||
xplm_Nav_DME = 1024,
|
||||
|
||||
xplm_Nav_LatLon = 2048,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMNavType;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef int XPLMNavRef;
|
||||
|
||||
#define XPLM_NAV_NOT_FOUND -1
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMGetFirstNavAid(void);
|
||||
|
||||
/*
|
||||
* XPLMGetNextNavAid
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMGetNextNavAid(
|
||||
XPLMNavRef inNavAidRef);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMFindFirstNavAidOfType(
|
||||
XPLMNavType inType);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMFindLastNavAidOfType(
|
||||
XPLMNavType inType);
|
||||
|
||||
/*
|
||||
* 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:
|
||||
*
|
||||
* * 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 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.
|
||||
*
|
||||
* 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".
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMFindNavAid(
|
||||
const char * inNameFragment, /* Can be NULL */
|
||||
const char * inIDFragment, /* Can be NULL */
|
||||
float * inLat, /* Can be NULL */
|
||||
float * inLon, /* Can be NULL */
|
||||
int * inFrequency, /* Can be NULL */
|
||||
XPLMNavType inType);
|
||||
|
||||
/*
|
||||
* XPLMGetNavAidInfo
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetNavAidInfo(
|
||||
XPLMNavRef inRef,
|
||||
XPLMNavType * outType, /* Can be NULL */
|
||||
float * outLatitude, /* Can be NULL */
|
||||
float * outLongitude, /* Can be NULL */
|
||||
float * outHeight, /* Can be NULL */
|
||||
int * outFrequency, /* Can be NULL */
|
||||
float * outHeading, /* Can be NULL */
|
||||
char * outID, /* Can be NULL */
|
||||
char * outName, /* Can be NULL */
|
||||
char * outReg); /* Can be NULL */
|
||||
|
||||
/***************************************************************************
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMCountFMSEntries(void);
|
||||
|
||||
/*
|
||||
* XPLMGetDisplayedFMSEntry
|
||||
*
|
||||
* This routine returns the index of the entry the pilot is viewing.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDisplayedFMSEntry(void);
|
||||
|
||||
/*
|
||||
* XPLMGetDestinationFMSEntry
|
||||
*
|
||||
* This routine returns the index of the entry the FMS is flying to.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDestinationFMSEntry(void);
|
||||
|
||||
/*
|
||||
* XPLMSetDisplayedFMSEntry
|
||||
*
|
||||
* This routine changes which entry the FMS is showing to the index specified.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDisplayedFMSEntry(
|
||||
int inIndex);
|
||||
|
||||
/*
|
||||
* XPLMSetDestinationFMSEntry
|
||||
*
|
||||
* This routine changes which entry the FMS is flying the aircraft toward.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetDestinationFMSEntry(
|
||||
int inIndex);
|
||||
|
||||
/*
|
||||
* XPLMGetFMSEntryInfo
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetFMSEntryInfo(
|
||||
int inIndex,
|
||||
XPLMNavType * outType, /* Can be NULL */
|
||||
char * outID, /* Can be NULL */
|
||||
XPLMNavRef * outRef, /* Can be NULL */
|
||||
int * outAltitude, /* Can be NULL */
|
||||
float * outLat, /* Can be NULL */
|
||||
float * outLon); /* Can be NULL */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetFMSEntryInfo(
|
||||
int inIndex,
|
||||
XPLMNavRef inRef,
|
||||
int inAltitude);
|
||||
|
||||
/*
|
||||
* XPLMSetFMSEntryLatLon
|
||||
*
|
||||
* This routine changes the entry in the FMS to a lat/lon entry with the given
|
||||
* coordinates.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetFMSEntryLatLon(
|
||||
int inIndex,
|
||||
float inLat,
|
||||
float inLon,
|
||||
int inAltitude);
|
||||
|
||||
/*
|
||||
* XPLMClearFMSEntry
|
||||
*
|
||||
* This routine clears the given entry, potentially shortening the flight
|
||||
* plan.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMClearFMSEntry(
|
||||
int inIndex);
|
||||
|
||||
/***************************************************************************
|
||||
* GPS RECEIVER
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavType XPLMGetGPSDestinationType(void);
|
||||
|
||||
/*
|
||||
* XPLMGetGPSDestination
|
||||
*
|
||||
* This routine returns the current GPS destination.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMNavRef XPLMGetGPSDestination(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,287 @@
|
||||
#ifndef _XPLMPlanes_h_
|
||||
#define _XPLMPlanes_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMPlanes
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetUsersAircraft(
|
||||
const char * inAircraftPath);
|
||||
/*
|
||||
* XPLMPlaceUserAtAirport
|
||||
*
|
||||
* This routine places the user at a given airport. Specify the airport by
|
||||
* its X-Plane airport ID (e.g. 'KBOS').
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMPlaceUserAtAirport(
|
||||
const char * inAirportCode);
|
||||
#if defined(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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMPlaceUserAtLocation(
|
||||
double latitudeDegrees,
|
||||
double longitudeDegrees,
|
||||
float elevationMetersMSL,
|
||||
float headingDegreesTrue,
|
||||
float speedMetersPerSecond);
|
||||
#endif /* XPLM300 */
|
||||
/***************************************************************************
|
||||
* GLOBAL AIRCRAFT ACCESS
|
||||
***************************************************************************/
|
||||
|
||||
/* The user's aircraft is always index 0. */
|
||||
#define XPLM_USER_AIRCRAFT 0
|
||||
#if defined(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).
|
||||
*
|
||||
* 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!
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
/* The size of the draw state struct. */
|
||||
int structSize;
|
||||
/* A ratio from [0..1] describing how far the landing gear is extended. */
|
||||
float gearPosition;
|
||||
/* Ratio of flap deployment, 0 = up, 1 = full deploy. */
|
||||
float flapRatio;
|
||||
/* Ratio of spoiler deployment, 0 = none, 1 = full deploy. */
|
||||
float spoilerRatio;
|
||||
/* Ratio of speed brake deployment, 0 = none, 1 = full deploy. */
|
||||
float speedBrakeRatio;
|
||||
/* Ratio of slat deployment, 0 = none, 1 = full deploy. */
|
||||
float slatRatio;
|
||||
/* Wing sweep ratio, 0 = forward, 1 = swept. */
|
||||
float wingSweep;
|
||||
/* Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. */
|
||||
float thrust;
|
||||
/* Total pitch input for this plane. */
|
||||
float yokePitch;
|
||||
/* Total Heading input for this plane. */
|
||||
float yokeHeading;
|
||||
/* Total Roll input for this plane. */
|
||||
float yokeRoll;
|
||||
} 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCountAircraft(
|
||||
int * outTotalAircraft,
|
||||
int * outActiveAircraft,
|
||||
XPLMPluginID * outController);
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetNthAircraftModel(
|
||||
int inIndex,
|
||||
char * outFileName,
|
||||
char * outPath);
|
||||
/***************************************************************************
|
||||
* EXCLUSIVE AIRCRAFT ACCESS
|
||||
***************************************************************************/
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMPlanesAvailable_f)(
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMAcquirePlanes(
|
||||
char ** inAircraft, /* Can be NULL */
|
||||
XPLMPlanesAvailable_f inCallback,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMReleasePlanes(void);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetActiveAircraftCount(
|
||||
int inCount);
|
||||
|
||||
/*
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetAircraftModel(
|
||||
int inIndex,
|
||||
const char * inAircraftPath);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDisableAIForPlane(
|
||||
int inPlaneIndex);
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/*
|
||||
* XPLMDrawAircraft
|
||||
*
|
||||
* 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.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawAircraft(
|
||||
int inPlaneIndex,
|
||||
float inX,
|
||||
float inY,
|
||||
float inZ,
|
||||
float inPitch,
|
||||
float inRoll,
|
||||
float inYaw,
|
||||
int inFullDraw,
|
||||
XPLMPlaneDrawState_t * inDrawStateInfo);
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/*
|
||||
* XPLMReinitUsersPlane
|
||||
*
|
||||
* WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or
|
||||
* XPLMPlaceUserAtLocation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMReinitUsersPlane(void);
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,422 @@
|
||||
#ifndef _XPLMPlugin_h_
|
||||
#define _XPLMPlugin_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMPlugin
|
||||
***************************************************************************/
|
||||
/*
|
||||
* These APIs provide facilities to find and work with other plugins and
|
||||
* manage other plugins.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMGetMyID
|
||||
*
|
||||
* This routine returns the plugin ID of the calling plug-in. Call this to
|
||||
* get your own ID.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMPluginID XPLMGetMyID(void);
|
||||
|
||||
/*
|
||||
* XPLMCountPlugins
|
||||
*
|
||||
* This routine returns the total number of plug-ins that are loaded, both
|
||||
* disabled and enabled.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMCountPlugins(void);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMPluginID XPLMGetNthPlugin(
|
||||
int inIndex);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMPluginID XPLMFindPluginByPath(
|
||||
const char * inPath);
|
||||
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMPluginID XPLMFindPluginBySignature(
|
||||
const char * inSignature);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetPluginInfo(
|
||||
XPLMPluginID inPlugin,
|
||||
char * outName, /* Can be NULL */
|
||||
char * outFilePath, /* Can be NULL */
|
||||
char * outSignature, /* Can be NULL */
|
||||
char * outDescription); /* Can be NULL */
|
||||
|
||||
/***************************************************************************
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMIsPluginEnabled
|
||||
*
|
||||
* Returns whether the specified plug-in is enabled for running.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMIsPluginEnabled(
|
||||
XPLMPluginID inPluginID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMEnablePlugin(
|
||||
XPLMPluginID inPluginID);
|
||||
|
||||
/*
|
||||
* XPLMDisablePlugin
|
||||
*
|
||||
* This routine disableds an enabled plug-in.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDisablePlugin(
|
||||
XPLMPluginID inPluginID);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMReloadPlugins(void);
|
||||
|
||||
/***************************************************************************
|
||||
* INTERPLUGIN MESSAGING
|
||||
***************************************************************************/
|
||||
/*
|
||||
* Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF
|
||||
* are reserved for X-Plane and the plugin SDK.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* This message is sent to your plugin whenever the user's plane crashes. The *
|
||||
* parameter is ignored. */
|
||||
#define XPLM_MSG_PLANE_CRASHED 101
|
||||
|
||||
/* 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. */
|
||||
#define XPLM_MSG_PLANE_LOADED 102
|
||||
|
||||
/* This messages is sent whenever the user's plane is positioned at a new *
|
||||
* airport. The parameter is ignored. */
|
||||
#define 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. The parameter is ignored.*/
|
||||
#define 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. The parameter*
|
||||
* is ignored. */
|
||||
#define XPLM_MSG_AIRPLANE_COUNT_CHANGED 105
|
||||
|
||||
#if defined(XPLM200)
|
||||
/* 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.) */
|
||||
#define XPLM_MSG_PLANE_UNLOADED 106
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(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. *
|
||||
* The parameter is ignored. */
|
||||
#define XPLM_MSG_WILL_WRITE_PREFS 107
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(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 contains the index number of the aircraft*
|
||||
* whose livery is changing. */
|
||||
#define XPLM_MSG_LIVERY_LOADED 108
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(XPLM301)
|
||||
/* 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. */
|
||||
#define XPLM_MSG_ENTERED_VR 109
|
||||
#endif /* XPLM301 */
|
||||
|
||||
#if defined(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. */
|
||||
#define XPLM_MSG_EXITING_VR 110
|
||||
#endif /* XPLM301 */
|
||||
|
||||
#if defined(XPLM303)
|
||||
/* 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. */
|
||||
#define 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSendMessageToPlugin(
|
||||
XPLMPluginID inPlugin,
|
||||
int inMessage,
|
||||
void * inParam);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMFeatureEnumerator_f)(
|
||||
const char * inFeature,
|
||||
void * inRef);
|
||||
|
||||
/*
|
||||
* XPLMHasFeature
|
||||
*
|
||||
* This returns 1 if the given installation of X-Plane supports a feature, or
|
||||
* 0 if it does not.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMHasFeature(
|
||||
const char * inFeature);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMIsFeatureEnabled(
|
||||
const char * inFeature);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMEnableFeature(
|
||||
const char * inFeature,
|
||||
int inEnable);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMEnumerateFeatures(
|
||||
XPLMFeatureEnumerator_f inEnumerator,
|
||||
void * inRef);
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,264 @@
|
||||
#ifndef _XPLMProcessing_h_
|
||||
#define _XPLMProcessing_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* 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-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.)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* FLIGHT LOOP CALLBACKS
|
||||
***************************************************************************/
|
||||
|
||||
#if defined(XPLM210)
|
||||
/*
|
||||
* XPLMFlightLoopPhaseType
|
||||
*
|
||||
* You can register a flight loop callback to run either before or after the
|
||||
* flight model is integrated by X-Plane.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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. */
|
||||
xplm_FlightLoop_Phase_AfterFlightModel = 1,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMFlightLoopPhaseType;
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(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;
|
||||
#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.
|
||||
*
|
||||
* 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 ptr constant from when you regitered yor callback.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef float (* XPLMFlightLoop_f)(
|
||||
float inElapsedSinceLastCall,
|
||||
float inElapsedTimeSinceLastFlightLoop,
|
||||
int inCounter,
|
||||
void * inRefcon);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
int structSize;
|
||||
XPLMFlightLoopPhaseType phase;
|
||||
XPLMFlightLoop_f callbackFunc;
|
||||
void * refcon;
|
||||
} XPLMCreateFlightLoop_t;
|
||||
#endif /* 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 XPLMGetElapsedTime(void);
|
||||
|
||||
/*
|
||||
* XPLMGetCycleNumber
|
||||
*
|
||||
* This routine returns a counter starting at zero for each sim cycle
|
||||
* computed/video frame rendered.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetCycleNumber(void);
|
||||
|
||||
/*
|
||||
* 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 legacy function only installs pre-flight-loop callbacks; use
|
||||
* XPLMCreateFlightLoop for more control.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMRegisterFlightLoopCallback(
|
||||
XPLMFlightLoop_f inFlightLoop,
|
||||
float inInterval,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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 XPLMUnregisterFlightLoopCallback(
|
||||
XPLMFlightLoop_f inFlightLoop,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* 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 XPLMSetFlightLoopCallbackInterval(
|
||||
XPLMFlightLoop_f inFlightLoop,
|
||||
float inInterval,
|
||||
int inRelativeToNow,
|
||||
void * inRefcon);
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMFlightLoopID XPLMCreateFlightLoop(
|
||||
XPLMCreateFlightLoop_t * inParams);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(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 XPLMDestroyFlightLoop(
|
||||
XPLMFlightLoopID inFlightLoopID);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(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, 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).
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMScheduleFlightLoop(
|
||||
XPLMFlightLoopID inFlightLoopID,
|
||||
float inInterval,
|
||||
int inRelativeToNow);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,450 @@
|
||||
#ifndef _XPLMScenery_h_
|
||||
#define _XPLMScenery_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMScenery
|
||||
***************************************************************************/
|
||||
/*
|
||||
* This package contains APIs to interact with X-Plane's scenery system.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(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-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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The Y probe gives you the location of the tallest physical scenery along *
|
||||
* the Y axis going through the queried point. */
|
||||
xplm_ProbeY = 0,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMProbeType;
|
||||
|
||||
/*
|
||||
* XPLMProbeResult
|
||||
*
|
||||
* Probe results - possible results from a probe query.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* 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. */
|
||||
xplm_ProbeError = 1,
|
||||
|
||||
/* The probe call succeeded but there is no terrain under this point (perhaps *
|
||||
* it is off the side of the planet?) */
|
||||
xplm_ProbeMissed = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMProbeResult;
|
||||
|
||||
/*
|
||||
* XPLMProbeRef
|
||||
*
|
||||
* An XPLMProbeRef is an opaque handle to a probe, used for querying the
|
||||
* terrain.
|
||||
*
|
||||
*/
|
||||
typedef void * XPLMProbeRef;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
/* Size of structure in bytes - always set this before calling the XPLM. */
|
||||
int structSize;
|
||||
/* Resulting X location of the terrain point we hit, in local OpenGL *
|
||||
* coordinates. */
|
||||
float locationX;
|
||||
/* Resulting Y location of the terrain point we hit, in local OpenGL *
|
||||
* coordinates. */
|
||||
float locationY;
|
||||
/* Resulting Z location of the terrain point we hit, in local OpenGL *
|
||||
* coordinates. */
|
||||
float locationZ;
|
||||
/* X component of the normal vector to the terrain we found. */
|
||||
float normalX;
|
||||
/* Y component of the normal vector to the terrain we found. */
|
||||
float normalY;
|
||||
/* Z component of the normal vector to the terrain we found. */
|
||||
float normalZ;
|
||||
/* X component of the velocity vector of the terrain we found. */
|
||||
float velocityX;
|
||||
/* Y component of the velocity vector of the terrain we found. */
|
||||
float velocityY;
|
||||
/* Z component of the velocity vector of the terrain we found. */
|
||||
float velocityZ;
|
||||
/* Tells if the surface we hit is water (otherwise it is land). */
|
||||
int is_wet;
|
||||
} XPLMProbeInfo_t;
|
||||
|
||||
/*
|
||||
* XPLMCreateProbe
|
||||
*
|
||||
* Creates a new probe object of a given type and returns.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMProbeRef XPLMCreateProbe(
|
||||
XPLMProbeType inProbeType);
|
||||
|
||||
/*
|
||||
* XPLMDestroyProbe
|
||||
*
|
||||
* Deallocates an existing probe object.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDestroyProbe(
|
||||
XPLMProbeRef inProbe);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMProbeResult XPLMProbeTerrainXYZ(
|
||||
XPLMProbeRef inProbe,
|
||||
float inX,
|
||||
float inY,
|
||||
float inZ,
|
||||
XPLMProbeInfo_t * outInfo);
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMGetMagneticVariation(
|
||||
double latitude,
|
||||
double longitude);
|
||||
|
||||
/*
|
||||
* XPLMDegTrueToDegMagnetic
|
||||
*
|
||||
* Converts a heading in degrees relative to true north into a value relative
|
||||
* to magnetic north at the user's current location.
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMDegTrueToDegMagnetic(
|
||||
float headingDegreesTrue);
|
||||
|
||||
/*
|
||||
* XPLMDegMagneticToDegTrue
|
||||
*
|
||||
* Converts a heading in degrees relative to magnetic north at the user's
|
||||
* current location into a value relative to true north.
|
||||
*
|
||||
*/
|
||||
XPLM_API float XPLMDegMagneticToDegTrue(
|
||||
float headingDegreesMagnetic);
|
||||
|
||||
#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!
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMObjectRef
|
||||
*
|
||||
* An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
|
||||
* into memory.
|
||||
*
|
||||
*/
|
||||
typedef void * XPLMObjectRef;
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
/* Set this to the size of this structure! */
|
||||
int structSize;
|
||||
/* X location of the object in local coordinates. */
|
||||
float x;
|
||||
/* Y location of the object in local coordinates. */
|
||||
float y;
|
||||
/* Z location of the object in local coordinates. */
|
||||
float z;
|
||||
/* Pitch in degres to rotate the object, positive is up. */
|
||||
float pitch;
|
||||
/* Heading in local coordinates to rotate the object, clockwise. */
|
||||
float heading;
|
||||
/* Roll to rotate the object. */
|
||||
float roll;
|
||||
} XPLMDrawInfo_t;
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMObjectLoaded_f)(
|
||||
XPLMObjectRef inObject,
|
||||
void * inRefcon);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMObjectRef XPLMLoadObject(
|
||||
const char * inPath);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMLoadObjectAsync(
|
||||
const char * inPath,
|
||||
XPLMObjectLoaded_f inCallback,
|
||||
void * inRefcon);
|
||||
#endif /* XPLM210 */
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/*
|
||||
* XPLMDrawObjects
|
||||
*
|
||||
* __Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating
|
||||
* instances, rather than these APIs from draw callbacks.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* X-Plane will attempt to cull the objects based on LOD and visibility, and
|
||||
* will pick the appropriate LOD.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDrawObjects(
|
||||
XPLMObjectRef inObject,
|
||||
int inCount,
|
||||
XPLMDrawInfo_t * inLocations,
|
||||
int lighting,
|
||||
int earth_relative);
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMUnloadObject(
|
||||
XPLMObjectRef inObject);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMLibraryEnumerator_f)(
|
||||
const char * inFilePath,
|
||||
void * inRef);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMLookupObjects(
|
||||
const char * inPath,
|
||||
float inLatitude,
|
||||
float inLongitude,
|
||||
XPLMLibraryEnumerator_f enumerator,
|
||||
void * ref);
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,970 @@
|
||||
#ifndef _XPLMUtilities_h_
|
||||
#define _XPLMUtilities_h_
|
||||
|
||||
/*
|
||||
* Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
* license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
*
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* XPLMUtilities
|
||||
***************************************************************************/
|
||||
|
||||
#include "XPLMDefs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
* FILE UTILITIES
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The XPLMUtilities file APIs provide some basic file and path functions for
|
||||
* use with X-Plane.
|
||||
*
|
||||
* Directory Separators
|
||||
* --------------------
|
||||
*
|
||||
* The XPLM has two modes it can work in:
|
||||
*
|
||||
* * X-Plane native paths: all paths are UTF8 strings, using the unix forward
|
||||
* slash (/) as the directory separating character. In native path mode,
|
||||
* you use the same path format for all three operating systems.
|
||||
*
|
||||
* * Legacy OS paths: the directroy separator is \ for Windows, : for OS X,
|
||||
* and / for Linux; OS paths are encoded in MacRoman for OS X using legacy
|
||||
* HFS conventions, use the application code page for multi-byte encoding
|
||||
* on Unix using DOS path conventions, and use UTF-8 for Linux.
|
||||
*
|
||||
* While legacy OS paths are the default, we strongly encourage you to opt in
|
||||
* to native paths using the XPLMEnableFeature API.
|
||||
*
|
||||
* * All OS X plugins should enable native paths all of the time; if you do
|
||||
* not do this, you will have to convert all paths back from HFS to Unix
|
||||
* (and deal with MacRoman) - code written using native paths and the C
|
||||
* file APIs "just works" on OS X.
|
||||
*
|
||||
* * For Linux plugins, there is no difference between the two encodings.
|
||||
*
|
||||
* * Windows plugins will need to convert the UTF8 file paths to UTF16 for
|
||||
* use with the "wide" APIs. While it might seem tempting to stick with
|
||||
* legacy OS paths (and just use the "ANSI" Windows APIs), X-Plane is fully
|
||||
* unicode-capable, and will often be installed in paths where the user's
|
||||
* directories have no ACP encoding.
|
||||
*
|
||||
* Full and Relative Paths
|
||||
* -----------------------
|
||||
*
|
||||
* Some of these APIs use full paths, but others use paths relative to the
|
||||
* user's X-Plane installation. This is documented on a per-API basis.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMDataFileType
|
||||
*
|
||||
* These enums define types of data files you can load or unload using the
|
||||
* SDK.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* A situation (.sit) file, which starts off a flight in a given *
|
||||
* configuration. */
|
||||
xplm_DataFile_Situation = 1,
|
||||
|
||||
/* A situation movie (.smo) file, which replays a past flight. */
|
||||
xplm_DataFile_ReplayMovie = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMDataFileType;
|
||||
#endif /* XPLM200 */
|
||||
|
||||
/*
|
||||
* XPLMGetSystemPath
|
||||
*
|
||||
* This function returns the full path to the X-System folder. Note that this
|
||||
* is a directory path, so it ends in a trailing : or /.
|
||||
*
|
||||
* The buffer you pass should be at least 512 characters long. The path is
|
||||
* returned using the current native or OS path conventions.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetSystemPath(
|
||||
char * outSystemPath);
|
||||
|
||||
/*
|
||||
* XPLMGetPrefsPath
|
||||
*
|
||||
* This routine returns a full path to a file that is within X-Plane's
|
||||
* preferences directory. (You should remove the file name back to the last
|
||||
* directory separator to get the preferences directory using
|
||||
* XPLMExtractFileAndPath.)
|
||||
*
|
||||
* The buffer you pass should be at least 512 characters long. The path is
|
||||
* returned using the current native or OS path conventions.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetPrefsPath(
|
||||
char * outPrefsPath);
|
||||
|
||||
/*
|
||||
* XPLMGetDirectorySeparator
|
||||
*
|
||||
* This routine returns a string with one char and a null terminator that is
|
||||
* the directory separator for the current platform. This allows you to write
|
||||
* code that concatinates directory paths without having to #ifdef for
|
||||
* platform. The character returned will reflect the current file path mode.
|
||||
*
|
||||
*/
|
||||
XPLM_API const char * XPLMGetDirectorySeparator(void);
|
||||
|
||||
/*
|
||||
* XPLMExtractFileAndPath
|
||||
*
|
||||
* Given a full path to a file, this routine separates the path from the file.
|
||||
* If the path is a partial directory (e.g. ends in : or \) the trailing
|
||||
* directory separator is removed. This routine works in-place; a pointer to
|
||||
* the file part of the buffer is returned; the original buffer still starts
|
||||
* with the path and is null terminated with no trailing separator.
|
||||
*
|
||||
*/
|
||||
XPLM_API char * XPLMExtractFileAndPath(
|
||||
char * inFullPath);
|
||||
|
||||
/*
|
||||
* XPLMGetDirectoryContents
|
||||
*
|
||||
* This routine returns a list of files in a directory (specified by a full
|
||||
* path, no trailing : or \). The output is returned as a list of NULL
|
||||
* terminated strings. An index array (if specified) is filled with pointers
|
||||
* into the strings. The last file is indicated by a zero-length string (and
|
||||
* NULL in the indices). This routine will return 1 if you had capacity for
|
||||
* all files or 0 if you did not. You can also skip a given number of files.
|
||||
*
|
||||
* * inDirectoryPath - a null terminated C string containing the full path to
|
||||
* the directory with no trailing directory char.
|
||||
*
|
||||
* * inFirstReturn - the zero-based index of the first file in the directory
|
||||
* to return. (Usually zero to fetch all in one pass.)
|
||||
*
|
||||
* * outFileNames - a buffer to receive a series of sequential null
|
||||
* terminated C-string file names. A zero-length C string will be appended
|
||||
* to the very end.
|
||||
*
|
||||
* * inFileNameBufSize - the size of the file name buffer in bytes.
|
||||
*
|
||||
* * outIndices - a pointer to an array of character pointers that will
|
||||
* become an index into the directory. The last file will be followed by a
|
||||
* NULL value. Pass NULL if you do not want indexing information.
|
||||
*
|
||||
* * inIndexCount - the max size of the index in entries.
|
||||
*
|
||||
* * outTotalFiles - if not NULL, this is filled in with the number of files
|
||||
* in the directory.
|
||||
*
|
||||
* * outReturnedFiles - if not NULL, the number of files returned by this
|
||||
* iteration.
|
||||
*
|
||||
* Return value: 1 if all info could be returned, 0 if there was a buffer
|
||||
* overrun.
|
||||
*
|
||||
* WARNING: Before X-Plane 7 this routine did not properly iterate through
|
||||
* directories. If X-Plane
|
||||
* 6 compatibility is needed, use your own code to iterate directories.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMGetDirectoryContents(
|
||||
const char * inDirectoryPath,
|
||||
int inFirstReturn,
|
||||
char * outFileNames,
|
||||
int inFileNameBufSize,
|
||||
char ** outIndices, /* Can be NULL */
|
||||
int inIndexCount,
|
||||
int * outTotalFiles, /* Can be NULL */
|
||||
int * outReturnedFiles); /* Can be NULL */
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMLoadDataFile
|
||||
*
|
||||
* Loads a data file of a given type. Paths must be relative to the X-System
|
||||
* folder. To clear the replay, pass a NULL file name (this is only valid with
|
||||
* replay movies, not sit files).
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMLoadDataFile(
|
||||
XPLMDataFileType inFileType,
|
||||
const char * inFilePath); /* Can be NULL */
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMSaveDataFile
|
||||
*
|
||||
* Saves the current situation or replay; paths are relative to the X-System
|
||||
* folder.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMSaveDataFile(
|
||||
XPLMDataFileType inFileType,
|
||||
const char * inFilePath);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
/***************************************************************************
|
||||
* X-PLANE MISC
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* XPLMHostApplicationID
|
||||
*
|
||||
* While the plug-in SDK is only accessible to plugins running inside X-Plane,
|
||||
* the original authors considered extending the API to other applications
|
||||
* that shared basic infrastructure with X-Plane. These enumerations are
|
||||
* hold-overs from that original roadmap; all values other than X-Plane are
|
||||
* deprecated. Your plugin should never need this enumeration.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_Host_Unknown = 0,
|
||||
|
||||
xplm_Host_XPlane = 1,
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_PlaneMaker = 2,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_WorldMaker = 3,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_Briefer = 4,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_PartMaker = 5,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_YoungsMod = 6,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
xplm_Host_XAuto = 7,
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
};
|
||||
typedef int XPLMHostApplicationID;
|
||||
|
||||
/*
|
||||
* XPLMLanguageCode
|
||||
*
|
||||
* These enums define what language the sim is running in. These enumerations
|
||||
* do not imply that the sim can or does run in all of these languages; they
|
||||
* simply provide a known encoding in the event that a given sim version is
|
||||
* localized to a certain language.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_Language_Unknown = 0,
|
||||
|
||||
xplm_Language_English = 1,
|
||||
|
||||
xplm_Language_French = 2,
|
||||
|
||||
xplm_Language_German = 3,
|
||||
|
||||
xplm_Language_Italian = 4,
|
||||
|
||||
xplm_Language_Spanish = 5,
|
||||
|
||||
xplm_Language_Korean = 6,
|
||||
|
||||
#if defined(XPLM200)
|
||||
xplm_Language_Russian = 7,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(XPLM200)
|
||||
xplm_Language_Greek = 8,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(XPLM200)
|
||||
xplm_Language_Japanese = 9,
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(XPLM300)
|
||||
xplm_Language_Chinese = 10,
|
||||
|
||||
#endif /* XPLM300 */
|
||||
|
||||
};
|
||||
typedef int XPLMLanguageCode;
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMError_f
|
||||
*
|
||||
* An XPLM error callback is a function that you provide to receive debugging
|
||||
* information from the plugin SDK. See XPLMSetErrorCallback for more
|
||||
* information. NOTE: for the sake of debugging, your error callback will be
|
||||
* called even if your plugin is not enabled, allowing you to receive debug
|
||||
* info in your XPluginStart and XPluginStop callbacks. To avoid causing logic
|
||||
* errors in the management code, do not call any other plugin routines from
|
||||
* your error callback - it is only meant for catching errors in the
|
||||
* debugging.
|
||||
*
|
||||
*/
|
||||
typedef void (* XPLMError_f)(
|
||||
const char * inMessage);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/*
|
||||
* XPLMInitialized
|
||||
*
|
||||
* Deprecated: This function returns 1 if X-Plane has properly initialized the
|
||||
* plug-in system. If this routine returns 0, many XPLM functions will not
|
||||
* work.
|
||||
*
|
||||
* NOTE: because plugins are always called from within the XPLM, there is no
|
||||
* need to check for initialization; it will always return 1. This routine is
|
||||
* deprecated - you do not need to check it before continuing within your
|
||||
* plugin.
|
||||
*
|
||||
*/
|
||||
XPLM_API int XPLMInitialized(void);
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
|
||||
/*
|
||||
* XPLMGetVersions
|
||||
*
|
||||
* This routine returns the revision of both X-Plane and the XPLM DLL. All
|
||||
* versions are three-digit decimal numbers (e.g. 606 for version 6.06 of
|
||||
* X-Plane); the current revision of the XPLM is 200 (2.00). This routine also
|
||||
* returns the host ID of the app running us.
|
||||
*
|
||||
* The most common use of this routine is to special-case around X-Plane
|
||||
* version-specific behavior.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMGetVersions(
|
||||
int * outXPlaneVersion,
|
||||
int * outXPLMVersion,
|
||||
XPLMHostApplicationID * outHostID);
|
||||
|
||||
/*
|
||||
* XPLMGetLanguage
|
||||
*
|
||||
* This routine returns the langauge the sim is running in.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMLanguageCode XPLMGetLanguage(void);
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMFindSymbol
|
||||
*
|
||||
* This routine will attempt to find the symbol passed in the inString
|
||||
* parameter. If the symbol is found a pointer the function is returned,
|
||||
* othewise the function will return NULL.
|
||||
*
|
||||
* You can use XPLMFindSymbol to utilize newer SDK API features without
|
||||
* requiring newer versions of the SDK (and X-Plane) as your minimum X-Plane
|
||||
* version as follows:
|
||||
*
|
||||
* * Define the XPLMnnn macro to the minimum required XPLM version you will
|
||||
* ship with (e.g. XPLM210 for X-Plane 10 compatibility).
|
||||
*
|
||||
* * Use XPLMGetVersions and XPLMFindSymbol to detect that the host sim is
|
||||
* new enough to use new functions and resolve function pointers.
|
||||
*
|
||||
* * Conditionally use the new functions if and only if XPLMFindSymbol only
|
||||
* returns a non- NULL pointer.
|
||||
*
|
||||
* Warning: you should always check the XPLM API version as well as the
|
||||
* results of XPLMFindSymbol to determine if funtionality is safe to use.
|
||||
*
|
||||
* To use functionality via XPLMFindSymbol you will need to copy your own
|
||||
* definitions of the X-Plane API prototypes and cast the returned pointer to
|
||||
* the correct type.
|
||||
*
|
||||
*/
|
||||
XPLM_API void * XPLMFindSymbol(
|
||||
const char * inString);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
#if defined(XPLM200)
|
||||
/*
|
||||
* XPLMSetErrorCallback
|
||||
*
|
||||
* XPLMSetErrorCallback installs an error-reporting callback for your plugin.
|
||||
* Normally the plugin system performs minimum diagnostics to maximize
|
||||
* performance. When you install an error callback, you will receive calls due
|
||||
* to certain plugin errors, such as passing bad parameters or incorrect data.
|
||||
*
|
||||
* Important: the error callback determines *programming* errors, e.g. bad API
|
||||
* parameters. Every error that is returned by the error callback represents a
|
||||
* mistake in your plugin that you should fix. Error callbacks are not used to
|
||||
* report expected run-time problems (e.g. disk I/O errors).
|
||||
*
|
||||
* The intention is for you to install the error callback during debug
|
||||
* sections and put a break-point inside your callback. This will cause you to
|
||||
* break into the debugger from within the SDK at the point in your plugin
|
||||
* where you made an illegal call.
|
||||
*
|
||||
* Installing an error callback may activate error checking code that would
|
||||
* not normally run, and this may adversely affect performance, so do not
|
||||
* leave error callbacks installed in shipping plugins. Since the only useful
|
||||
* response to an error is to change code, error callbacks are not useful "in
|
||||
* the field".
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSetErrorCallback(
|
||||
XPLMError_f inCallback);
|
||||
#endif /* XPLM200 */
|
||||
|
||||
/*
|
||||
* XPLMDebugString
|
||||
*
|
||||
* This routine outputs a C-style string to the Log.txt file. The file is
|
||||
* immediately flushed so you will not lose data. (This does cause a
|
||||
* performance penalty.)
|
||||
*
|
||||
* Please do *not* leave routine diagnostic logging enabled in your shipping
|
||||
* plugin. The X-Plane Log file is shared by X-Plane and every plugin in the
|
||||
* system, and plugins that (when functioning normally) print verbose log
|
||||
* output make it difficult for developers to find error conditions from other
|
||||
* parts of the system.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMDebugString(
|
||||
const char * inString);
|
||||
|
||||
/*
|
||||
* XPLMSpeakString
|
||||
*
|
||||
* This function displays the string in a translucent overlay over the current
|
||||
* display and also speaks the string if text-to-speech is enabled. The string
|
||||
* is spoken asynchronously, this function returns immediately. This function
|
||||
* may not speak or print depending on user preferences.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSpeakString(
|
||||
const char * inString);
|
||||
|
||||
/*
|
||||
* XPLMGetVirtualKeyDescription
|
||||
*
|
||||
* Given a virtual key code (as defined in XPLMDefs.h) this routine returns a
|
||||
* human-readable string describing the character. This routine is provided
|
||||
* for showing users what keyboard mappings they have set up. The string may
|
||||
* read 'unknown' or be a blank or NULL string if the virtual key is unknown.
|
||||
*
|
||||
*/
|
||||
XPLM_API const char * XPLMGetVirtualKeyDescription(
|
||||
char inVirtualKey);
|
||||
|
||||
/*
|
||||
* XPLMReloadScenery
|
||||
*
|
||||
* XPLMReloadScenery reloads the current set of scenery. You can use this
|
||||
* function in two typical ways: simply call it to reload the scenery, picking
|
||||
* up any new installed scenery, .env files, etc. from disk. Or, change the
|
||||
* lat/ref and lon/ref data refs and then call this function to shift the
|
||||
* scenery environment. This routine is equivalent to picking "reload
|
||||
* scenery" from the developer menu.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMReloadScenery(void);
|
||||
|
||||
#if defined(XPLM200)
|
||||
/***************************************************************************
|
||||
* X-PLANE COMMAND MANAGEMENT
|
||||
***************************************************************************/
|
||||
/*
|
||||
* The command management APIs let plugins interact with the command-system in
|
||||
* X-Plane, the abstraction behind keyboard presses and joystick buttons. This
|
||||
* API lets you create new commands and modify the behavior (or get
|
||||
* notification) of existing ones.
|
||||
*
|
||||
* X-Plane Command Phases
|
||||
* ----------------------
|
||||
*
|
||||
* X-Plane commands are not instantaneous; they operate over a duration.
|
||||
* (Think of a joystick button press - you can press, hold down, and then
|
||||
* release the joystick button; X-Plane commands model this entire process.)
|
||||
*
|
||||
* An X-Plane command consists of three phases: a beginning, continuous
|
||||
* repetition, and an ending. The command may be repeated zero times in its
|
||||
* duration, followed by one command ending. Command begin and end messges are
|
||||
* balanced, but a command may be bound to more than one event source (e.g. a
|
||||
* keyboard key and a joystick button), in which case you may receive a second
|
||||
* begin during before any end).
|
||||
*
|
||||
* When you issue commands in the plugin system, you *must* balance every call
|
||||
* to XPLMCommandBegin with a call to XPLMCommandEnd with the same command
|
||||
* reference.
|
||||
*
|
||||
* Command Behavior Modification
|
||||
* -----------------------------
|
||||
*
|
||||
* You can register a callback to handle a command either before or after
|
||||
* X-Plane does; if you receive the command before X-Plane you have the option
|
||||
* to either let X-Plane handle the command or hide the command from X-Plane.
|
||||
* This lets plugins both augment commands and replace them.
|
||||
*
|
||||
* If you register for an existing command, be sure that you are *consistent*
|
||||
* in letting X-Plane handle or not handle the command; you are responsible
|
||||
* for passing a *balanced* number of begin and end messages to X-Plane. (E.g.
|
||||
* it is not legal to pass all the begin messages to X-Plane but hide all the
|
||||
* end messages).
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMCommandPhase
|
||||
*
|
||||
* The phases of a command.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
/* The command is being started. */
|
||||
xplm_CommandBegin = 0,
|
||||
|
||||
/* The command is continuing to execute. */
|
||||
xplm_CommandContinue = 1,
|
||||
|
||||
/* The command has ended. */
|
||||
xplm_CommandEnd = 2,
|
||||
|
||||
|
||||
};
|
||||
typedef int XPLMCommandPhase;
|
||||
|
||||
/*
|
||||
* XPLMCommandRef
|
||||
*
|
||||
* A command ref is an opaque identifier for an X-Plane command. Command
|
||||
* references stay the same for the life of your plugin but not between
|
||||
* executions of X-Plane. Command refs are used to execute commands, create
|
||||
* commands, and create callbacks for particular commands.
|
||||
*
|
||||
* Note that a command is not "owned" by a particular plugin. Since many
|
||||
* plugins may participate in a command's execution, the command does not go
|
||||
* away if the plugin that created it is unloaded.
|
||||
*
|
||||
*/
|
||||
typedef void * XPLMCommandRef;
|
||||
|
||||
/*
|
||||
* XPLMCommandCallback_f
|
||||
*
|
||||
* A command callback is a function in your plugin that is called when a
|
||||
* command is pressed. Your callback receives the command reference for the
|
||||
* particular command, the phase of the command that is executing, and a
|
||||
* reference pointer that you specify when registering the callback.
|
||||
*
|
||||
* Your command handler should return 1 to let processing of the command
|
||||
* continue to other plugins and X-Plane, or 0 to halt processing, potentially
|
||||
* bypassing X-Plane code.
|
||||
*
|
||||
*/
|
||||
typedef int (* XPLMCommandCallback_f)(
|
||||
XPLMCommandRef inCommand,
|
||||
XPLMCommandPhase inPhase,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMFindCommand
|
||||
*
|
||||
* XPLMFindCommand looks up a command by name, and returns its command
|
||||
* reference or NULL if the command does not exist.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMCommandRef XPLMFindCommand(
|
||||
const char * inName);
|
||||
|
||||
/*
|
||||
* XPLMCommandBegin
|
||||
*
|
||||
* XPLMCommandBegin starts the execution of a command, specified by its
|
||||
* command reference. The command is "held down" until XPLMCommandEnd is
|
||||
* called. You must balance each XPLMCommandBegin call with an XPLMCommandEnd
|
||||
* call.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandBegin(
|
||||
XPLMCommandRef inCommand);
|
||||
|
||||
/*
|
||||
* XPLMCommandEnd
|
||||
*
|
||||
* XPLMCommandEnd ends the execution of a given command that was started with
|
||||
* XPLMCommandBegin. You must not issue XPLMCommandEnd for a command you did
|
||||
* not begin.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandEnd(
|
||||
XPLMCommandRef inCommand);
|
||||
|
||||
/*
|
||||
* XPLMCommandOnce
|
||||
*
|
||||
* This executes a given command momentarily, that is, the command begins and
|
||||
* ends immediately. This is the equivalent of calling XPLMCommandBegin() and
|
||||
* XPLMCommandEnd() back ot back.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandOnce(
|
||||
XPLMCommandRef inCommand);
|
||||
|
||||
/*
|
||||
* XPLMCreateCommand
|
||||
*
|
||||
* XPLMCreateCommand creates a new command for a given string. If the command
|
||||
* already exists, the existing command reference is returned. The description
|
||||
* may appear in user interface contexts, such as the joystick configuration
|
||||
* screen.
|
||||
*
|
||||
*/
|
||||
XPLM_API XPLMCommandRef XPLMCreateCommand(
|
||||
const char * inName,
|
||||
const char * inDescription);
|
||||
|
||||
/*
|
||||
* XPLMRegisterCommandHandler
|
||||
*
|
||||
* XPLMRegisterCommandHandler registers a callback to be called when a command
|
||||
* is executed. You provide a callback with a reference pointer.
|
||||
*
|
||||
* If inBefore is true, your command handler callback will be executed before
|
||||
* X-Plane executes the command, and returning 0 from your callback will
|
||||
* disable X-Plane's processing of the command. If inBefore is false, your
|
||||
* callback will run after X-Plane. (You can register a single callback both
|
||||
* before and after a command.)
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMRegisterCommandHandler(
|
||||
XPLMCommandRef inComand,
|
||||
XPLMCommandCallback_f inHandler,
|
||||
int inBefore,
|
||||
void * inRefcon);
|
||||
|
||||
/*
|
||||
* XPLMUnregisterCommandHandler
|
||||
*
|
||||
* XPLMUnregisterCommandHandler removes a command callback registered with
|
||||
* XPLMRegisterCommandHandler.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMUnregisterCommandHandler(
|
||||
XPLMCommandRef inComand,
|
||||
XPLMCommandCallback_f inHandler,
|
||||
int inBefore,
|
||||
void * inRefcon);
|
||||
|
||||
#endif /* XPLM200 */
|
||||
#if defined(XPLM_DEPRECATED)
|
||||
/***************************************************************************
|
||||
* X-PLANE USER INTERACTION
|
||||
***************************************************************************/
|
||||
/*
|
||||
* WARNING: The legacy user interaction API is deprecated; while it was the
|
||||
* only way to run commands in X-Plane 6,7 and 8, it is obsolete, and was
|
||||
* replaced by the command system API in X-Plane 9. You should not use this
|
||||
* API; replace any of the calls below with XPLMCommand invocations based on
|
||||
* persistent command strings. The documentation that follows is for historic
|
||||
* reference only.
|
||||
*
|
||||
* The legacy user interaction APIs let you simulate commands the user can do
|
||||
* with a joystick, keyboard etc. Note that it is generally safer for future
|
||||
* compatibility to use one of these commands than to manipulate the
|
||||
* underlying sim data.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* XPLMCommandKeyID
|
||||
*
|
||||
* These enums represent all the keystrokes available within X-Plane. They can
|
||||
* be sent to X-Plane directly. For example, you can reverse thrust using
|
||||
* these enumerations.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_key_pause=0,
|
||||
xplm_key_revthrust,
|
||||
xplm_key_jettison,
|
||||
xplm_key_brakesreg,
|
||||
xplm_key_brakesmax,
|
||||
xplm_key_gear,
|
||||
xplm_key_timedn,
|
||||
xplm_key_timeup,
|
||||
xplm_key_fadec,
|
||||
xplm_key_otto_dis,
|
||||
xplm_key_otto_atr,
|
||||
xplm_key_otto_asi,
|
||||
xplm_key_otto_hdg,
|
||||
xplm_key_otto_gps,
|
||||
xplm_key_otto_lev,
|
||||
xplm_key_otto_hnav,
|
||||
xplm_key_otto_alt,
|
||||
xplm_key_otto_vvi,
|
||||
xplm_key_otto_vnav,
|
||||
xplm_key_otto_nav1,
|
||||
xplm_key_otto_nav2,
|
||||
xplm_key_targ_dn,
|
||||
xplm_key_targ_up,
|
||||
xplm_key_hdgdn,
|
||||
xplm_key_hdgup,
|
||||
xplm_key_barodn,
|
||||
xplm_key_baroup,
|
||||
xplm_key_obs1dn,
|
||||
xplm_key_obs1up,
|
||||
xplm_key_obs2dn,
|
||||
xplm_key_obs2up,
|
||||
xplm_key_com1_1,
|
||||
xplm_key_com1_2,
|
||||
xplm_key_com1_3,
|
||||
xplm_key_com1_4,
|
||||
xplm_key_nav1_1,
|
||||
xplm_key_nav1_2,
|
||||
xplm_key_nav1_3,
|
||||
xplm_key_nav1_4,
|
||||
xplm_key_com2_1,
|
||||
xplm_key_com2_2,
|
||||
xplm_key_com2_3,
|
||||
xplm_key_com2_4,
|
||||
xplm_key_nav2_1,
|
||||
xplm_key_nav2_2,
|
||||
xplm_key_nav2_3,
|
||||
xplm_key_nav2_4,
|
||||
xplm_key_adf_1,
|
||||
xplm_key_adf_2,
|
||||
xplm_key_adf_3,
|
||||
xplm_key_adf_4,
|
||||
xplm_key_adf_5,
|
||||
xplm_key_adf_6,
|
||||
xplm_key_transpon_1,
|
||||
xplm_key_transpon_2,
|
||||
xplm_key_transpon_3,
|
||||
xplm_key_transpon_4,
|
||||
xplm_key_transpon_5,
|
||||
xplm_key_transpon_6,
|
||||
xplm_key_transpon_7,
|
||||
xplm_key_transpon_8,
|
||||
xplm_key_flapsup,
|
||||
xplm_key_flapsdn,
|
||||
xplm_key_cheatoff,
|
||||
xplm_key_cheaton,
|
||||
xplm_key_sbrkoff,
|
||||
xplm_key_sbrkon,
|
||||
xplm_key_ailtrimL,
|
||||
xplm_key_ailtrimR,
|
||||
xplm_key_rudtrimL,
|
||||
xplm_key_rudtrimR,
|
||||
xplm_key_elvtrimD,
|
||||
xplm_key_elvtrimU,
|
||||
xplm_key_forward,
|
||||
xplm_key_down,
|
||||
xplm_key_left,
|
||||
xplm_key_right,
|
||||
xplm_key_back,
|
||||
xplm_key_tower,
|
||||
xplm_key_runway,
|
||||
xplm_key_chase,
|
||||
xplm_key_free1,
|
||||
xplm_key_free2,
|
||||
xplm_key_spot,
|
||||
xplm_key_fullscrn1,
|
||||
xplm_key_fullscrn2,
|
||||
xplm_key_tanspan,
|
||||
xplm_key_smoke,
|
||||
xplm_key_map,
|
||||
xplm_key_zoomin,
|
||||
xplm_key_zoomout,
|
||||
xplm_key_cycledump,
|
||||
xplm_key_replay,
|
||||
xplm_key_tranID,
|
||||
xplm_key_max
|
||||
};
|
||||
typedef int XPLMCommandKeyID;
|
||||
|
||||
/*
|
||||
* XPLMCommandButtonID
|
||||
*
|
||||
* These are enumerations for all of the things you can do with a joystick
|
||||
* button in X-Plane. They currently match the buttons menu in the equipment
|
||||
* setup dialog, but these enums will be stable even if they change in
|
||||
* X-Plane.
|
||||
*
|
||||
*/
|
||||
enum {
|
||||
xplm_joy_nothing=0,
|
||||
xplm_joy_start_all,
|
||||
xplm_joy_start_0,
|
||||
xplm_joy_start_1,
|
||||
xplm_joy_start_2,
|
||||
xplm_joy_start_3,
|
||||
xplm_joy_start_4,
|
||||
xplm_joy_start_5,
|
||||
xplm_joy_start_6,
|
||||
xplm_joy_start_7,
|
||||
xplm_joy_throt_up,
|
||||
xplm_joy_throt_dn,
|
||||
xplm_joy_prop_up,
|
||||
xplm_joy_prop_dn,
|
||||
xplm_joy_mixt_up,
|
||||
xplm_joy_mixt_dn,
|
||||
xplm_joy_carb_tog,
|
||||
xplm_joy_carb_on,
|
||||
xplm_joy_carb_off,
|
||||
xplm_joy_trev,
|
||||
xplm_joy_trm_up,
|
||||
xplm_joy_trm_dn,
|
||||
xplm_joy_rot_trm_up,
|
||||
xplm_joy_rot_trm_dn,
|
||||
xplm_joy_rud_lft,
|
||||
xplm_joy_rud_cntr,
|
||||
xplm_joy_rud_rgt,
|
||||
xplm_joy_ail_lft,
|
||||
xplm_joy_ail_cntr,
|
||||
xplm_joy_ail_rgt,
|
||||
xplm_joy_B_rud_lft,
|
||||
xplm_joy_B_rud_rgt,
|
||||
xplm_joy_look_up,
|
||||
xplm_joy_look_dn,
|
||||
xplm_joy_look_lft,
|
||||
xplm_joy_look_rgt,
|
||||
xplm_joy_glance_l,
|
||||
xplm_joy_glance_r,
|
||||
xplm_joy_v_fnh,
|
||||
xplm_joy_v_fwh,
|
||||
xplm_joy_v_tra,
|
||||
xplm_joy_v_twr,
|
||||
xplm_joy_v_run,
|
||||
xplm_joy_v_cha,
|
||||
xplm_joy_v_fr1,
|
||||
xplm_joy_v_fr2,
|
||||
xplm_joy_v_spo,
|
||||
xplm_joy_flapsup,
|
||||
xplm_joy_flapsdn,
|
||||
xplm_joy_vctswpfwd,
|
||||
xplm_joy_vctswpaft,
|
||||
xplm_joy_gear_tog,
|
||||
xplm_joy_gear_up,
|
||||
xplm_joy_gear_down,
|
||||
xplm_joy_lft_brake,
|
||||
xplm_joy_rgt_brake,
|
||||
xplm_joy_brakesREG,
|
||||
xplm_joy_brakesMAX,
|
||||
xplm_joy_speedbrake,
|
||||
xplm_joy_ott_dis,
|
||||
xplm_joy_ott_atr,
|
||||
xplm_joy_ott_asi,
|
||||
xplm_joy_ott_hdg,
|
||||
xplm_joy_ott_alt,
|
||||
xplm_joy_ott_vvi,
|
||||
xplm_joy_tim_start,
|
||||
xplm_joy_tim_reset,
|
||||
xplm_joy_ecam_up,
|
||||
xplm_joy_ecam_dn,
|
||||
xplm_joy_fadec,
|
||||
xplm_joy_yaw_damp,
|
||||
xplm_joy_art_stab,
|
||||
xplm_joy_chute,
|
||||
xplm_joy_JATO,
|
||||
xplm_joy_arrest,
|
||||
xplm_joy_jettison,
|
||||
xplm_joy_fuel_dump,
|
||||
xplm_joy_puffsmoke,
|
||||
xplm_joy_prerotate,
|
||||
xplm_joy_UL_prerot,
|
||||
xplm_joy_UL_collec,
|
||||
xplm_joy_TOGA,
|
||||
xplm_joy_shutdown,
|
||||
xplm_joy_con_atc,
|
||||
xplm_joy_fail_now,
|
||||
xplm_joy_pause,
|
||||
xplm_joy_rock_up,
|
||||
xplm_joy_rock_dn,
|
||||
xplm_joy_rock_lft,
|
||||
xplm_joy_rock_rgt,
|
||||
xplm_joy_rock_for,
|
||||
xplm_joy_rock_aft,
|
||||
xplm_joy_idle_hilo,
|
||||
xplm_joy_lanlights,
|
||||
xplm_joy_max
|
||||
};
|
||||
typedef int XPLMCommandButtonID;
|
||||
|
||||
/*
|
||||
* XPLMSimulateKeyPress
|
||||
*
|
||||
* This function simulates a key being pressed for X-Plane. The keystroke goes
|
||||
* directly to X-Plane; it is never sent to any plug-ins. However, since this
|
||||
* is a raw key stroke it may be mapped by the keys file or enter text into a
|
||||
* field.
|
||||
*
|
||||
* Deprecated: use XPLMCommandOnce
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMSimulateKeyPress(
|
||||
int inKeyType,
|
||||
int inKey);
|
||||
|
||||
/*
|
||||
* XPLMCommandKeyStroke
|
||||
*
|
||||
* This routine simulates a command-key stroke. However, the keys are done by
|
||||
* function, not by actual letter, so this function works even if the user has
|
||||
* remapped their keyboard. Examples of things you might do with this include
|
||||
* pausing the simulator.
|
||||
*
|
||||
* Deprecated: use XPLMCommandOnce
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandKeyStroke(
|
||||
XPLMCommandKeyID inKey);
|
||||
|
||||
/*
|
||||
* XPLMCommandButtonPress
|
||||
*
|
||||
* This function simulates any of the actions that might be taken by pressing
|
||||
* a joystick button. However, this lets you call the command directly rather
|
||||
* than have to know which button is mapped where. Important: you must release
|
||||
* each button you press. The APIs are separate so that you can 'hold down' a
|
||||
* button for a fixed amount of time.
|
||||
*
|
||||
* Deprecated: use XPLMCommandBegin.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandButtonPress(
|
||||
XPLMCommandButtonID inButton);
|
||||
|
||||
/*
|
||||
* XPLMCommandButtonRelease
|
||||
*
|
||||
* This function simulates any of the actions that might be taken by pressing
|
||||
* a joystick button. See XPLMCommandButtonPress.
|
||||
*
|
||||
* Deprecated: use XPLMCommandEnd.
|
||||
*
|
||||
*/
|
||||
XPLM_API void XPLMCommandButtonRelease(
|
||||
XPLMCommandButtonID inButton);
|
||||
|
||||
#endif /* XPLM_DEPRECATED */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,470 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPStandardWidgets;
|
||||
INTERFACE
|
||||
{
|
||||
## THEORY OF OPERATION
|
||||
|
||||
The standard widgets are widgets built into the widgets library. While you
|
||||
can gain access to the widget function that drives them, you generally use
|
||||
them by calling XPCreateWidget and then listening for special messages,
|
||||
etc.
|
||||
|
||||
The standard widgets often send mesages to themselves when the user
|
||||
performs an event; these messages are sent up the widget hierarchy until
|
||||
they are handled. So you can add a widget proc directly to a push button
|
||||
(for example) to intercept the message when it is clicked, or you can put
|
||||
one widget proc on a window for all of the push buttons in the window. Most
|
||||
of these messages contain the original widget ID as a parameter so you can
|
||||
know which widget is messaging no matter who it is sent to.
|
||||
}
|
||||
|
||||
USES
|
||||
XPWidgetDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* MAIN WINDOW
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The main window widget class provides a "window" as the user knows it.
|
||||
These windows are dragable and can be selected. Use them to create floating
|
||||
windows and non-modal dialogs.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_MainWindow = 1;
|
||||
|
||||
{
|
||||
Main Window Type Values
|
||||
|
||||
These type values are used to control the appearance of a main window.
|
||||
}
|
||||
{ The standard main window; pin stripes on XP7, metal frame on XP 6. }
|
||||
xpMainWindowStyle_MainWindow = 0
|
||||
;
|
||||
{ A translucent dark gray window, like the one ATC messages appear in. }
|
||||
xpMainWindowStyle_Translucent = 1
|
||||
;
|
||||
|
||||
{
|
||||
Main Window Properties
|
||||
}
|
||||
{ This property specifies the type of window. Set to one of the main window }
|
||||
{ types above. }
|
||||
xpProperty_MainWindowType = 1100
|
||||
;
|
||||
{ This property specifies whether the main window has close boxes in its }
|
||||
{ corners. }
|
||||
xpProperty_MainWindowHasCloseBoxes = 1200
|
||||
;
|
||||
|
||||
{
|
||||
MainWindow Messages
|
||||
}
|
||||
{ This message is sent when the close buttons are pressed for your window. }
|
||||
xpMessage_CloseButtonPushed = 1200
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* SUB WINDOW
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
X-Plane dialogs are divided into separate areas; the sub window widgets
|
||||
allow you to make these areas. Create one main window and place several
|
||||
subwindows inside it. Then place your controls inside the subwindows.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_SubWindow = 2;
|
||||
|
||||
{
|
||||
SubWindow Type Values
|
||||
|
||||
These values control the appearance of the subwindow.
|
||||
}
|
||||
{ A panel that sits inside a main window. }
|
||||
xpSubWindowStyle_SubWindow = 0
|
||||
;
|
||||
{ A screen that sits inside a panel for showing text information. }
|
||||
xpSubWindowStyle_Screen = 2
|
||||
;
|
||||
{ A list view for scrolling lists. }
|
||||
xpSubWindowStyle_ListView = 3
|
||||
;
|
||||
|
||||
{
|
||||
SubWindow Properties
|
||||
}
|
||||
{ This property specifies the type of window. Set to one of the subwindow }
|
||||
{ types above. }
|
||||
xpProperty_SubWindowType = 1200
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* BUTTON
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The button class provides a number of different button styles and
|
||||
behaviors, including push buttons, radio buttons, check boxes, etc. The
|
||||
button label appears on or next to the button depending on the button's
|
||||
appearance, or type.
|
||||
|
||||
The button's behavior is a separate property that dictates who it hilights
|
||||
and what kinds of messages it sends. Since behavior and type are different,
|
||||
you can do strange things like make check boxes that act as push buttons or
|
||||
push buttons with radio button behavior.
|
||||
|
||||
In X-Plane 6 there were no check box graphics. The result is the following
|
||||
behavior: in X-Plane
|
||||
6 all check box and radio buttons are round (radio-button style) buttons;
|
||||
in X-Plane 7 they are all square (check-box style) buttons. In a future
|
||||
version of X-Plane, the xpButtonBehavior enums will provide the correct
|
||||
graphic (check box or radio button) giving the expected result.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_Button = 3;
|
||||
|
||||
{
|
||||
Button Types
|
||||
|
||||
These define the visual appearance of buttons but not how they respond to
|
||||
the mouse.
|
||||
}
|
||||
{ This is a standard push button, like an 'OK' or 'Cancel' button in a dialog}
|
||||
{ box. }
|
||||
xpPushButton = 0
|
||||
;
|
||||
{ A check box or radio button. Use this and the button behaviors below to }
|
||||
{ get the desired behavior. }
|
||||
xpRadioButton = 1
|
||||
;
|
||||
{ A window close box. }
|
||||
xpWindowCloseBox = 3
|
||||
;
|
||||
{ A small down arrow. }
|
||||
xpLittleDownArrow = 5
|
||||
;
|
||||
{ A small up arrow. }
|
||||
xpLittleUpArrow = 6
|
||||
;
|
||||
|
||||
{
|
||||
Button Behavior Values
|
||||
|
||||
These define how the button responds to mouse clicks.
|
||||
}
|
||||
{ Standard push button behavior. The button hilites while the mouse is }
|
||||
{ clicked over it and unhilites when the mouse is moved outside of it or }
|
||||
{ released. If the mouse is released over the button, the }
|
||||
{ xpMsg_PushButtonPressed message is sent. }
|
||||
xpButtonBehaviorPushButton = 0
|
||||
;
|
||||
{ Check box behavior. The button immediately toggles its value when the mouse}
|
||||
{ is clicked and sends out a xpMsg_ButtonStateChanged message. }
|
||||
xpButtonBehaviorCheckBox = 1
|
||||
;
|
||||
{ Radio button behavior. The button immediately sets its state to one and }
|
||||
{ sends out a xpMsg_ButtonStateChanged message if it was not already set to }
|
||||
{ one. You must turn off other radio buttons in a group in your code. }
|
||||
xpButtonBehaviorRadioButton = 2
|
||||
;
|
||||
|
||||
{
|
||||
Button Properties
|
||||
}
|
||||
{ This property sets the visual type of button. Use one of the button types }
|
||||
{ above. }
|
||||
xpProperty_ButtonType = 1300
|
||||
;
|
||||
{ This property sets the button's behavior. Use one of the button behaviors }
|
||||
{ above. }
|
||||
xpProperty_ButtonBehavior = 1301
|
||||
;
|
||||
{ This property tells whether a check box or radio button is "checked" or }
|
||||
{ not. Not used for push buttons. }
|
||||
xpProperty_ButtonState = 1302
|
||||
;
|
||||
|
||||
{
|
||||
Button Messages
|
||||
|
||||
These messages are sent by the button to itself and then up the widget
|
||||
chain when the button is clicked. (You may intercept them by providing a
|
||||
widget handler for the button itself or by providing a handler in a parent
|
||||
widget.)
|
||||
}
|
||||
{ This message is sent when the user completes a click and release in a }
|
||||
{ button with push button behavior. Parameter one of the message is the }
|
||||
{ widget ID of the button. This message is dispatched up the widget }
|
||||
{ hierarchy. }
|
||||
xpMsg_PushButtonPressed = 1300
|
||||
;
|
||||
{ This message is sent when a button is clicked that has radio button or }
|
||||
{ check box behavior and its value changes. (Note that if the value changes }
|
||||
{ by setting a property you do not receive this message!) Parameter one is }
|
||||
{ the widget ID of the button, parameter 2 is the new state value, either }
|
||||
{ zero or one. This message is dispatched up the widget hierarchy. }
|
||||
xpMsg_ButtonStateChanged = 1301
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* TEXT FIELD
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The text field widget provides an editable text field including mouse
|
||||
selection and keyboard navigation. The contents of the text field are its
|
||||
descriptor. (The descriptor changes as the user types.)
|
||||
|
||||
The text field can have a number of types, that effect the visual layout of
|
||||
the text field. The text field sends messages to itself so you may control
|
||||
its behavior.
|
||||
|
||||
If you need to filter keystrokes, add a new handler and intercept the key
|
||||
press message. Since key presses are passed by pointer, you can modify the
|
||||
keystroke and pass it through to the text field widget.
|
||||
|
||||
WARNING: in X-Plane before 7.10 (including 6.70) null characters could
|
||||
crash X-Plane. To prevent this, wrap this object with a filter function
|
||||
(more instructions can be found on the SDK website).
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_TextField = 4;
|
||||
|
||||
{
|
||||
Text Field Type Values
|
||||
|
||||
These control the look of the text field.
|
||||
}
|
||||
{ A field for text entry. }
|
||||
xpTextEntryField = 0
|
||||
;
|
||||
{ A transparent text field. The user can type and the text is drawn, but no }
|
||||
{ background is drawn. You can draw your own background by adding a widget }
|
||||
{ handler and prehandling the draw message. }
|
||||
xpTextTransparent = 3
|
||||
;
|
||||
{ A translucent edit field, dark gray. }
|
||||
xpTextTranslucent = 4
|
||||
;
|
||||
|
||||
{
|
||||
Text Field Properties
|
||||
}
|
||||
{ This is the character position the selection starts at, zero based. If it }
|
||||
{ is the same as the end insertion point, the insertion point is not a }
|
||||
{ selection. }
|
||||
xpProperty_EditFieldSelStart = 1400
|
||||
;
|
||||
{ This is the character position of the end of the selection. }
|
||||
xpProperty_EditFieldSelEnd = 1401
|
||||
;
|
||||
{ This is the character position a drag was started at if the user is }
|
||||
{ dragging to select text, or -1 if a drag is not in progress. }
|
||||
xpProperty_EditFieldSelDragStart = 1402
|
||||
;
|
||||
{ This is the type of text field to display, from the above list. }
|
||||
xpProperty_TextFieldType = 1403
|
||||
;
|
||||
{ Set this property to 1 to password protect the field. Characters will be }
|
||||
{ drawn as *s even though the descriptor will contain plain-text. }
|
||||
xpProperty_PasswordMode = 1404
|
||||
;
|
||||
{ The max number of characters you can enter, if limited. Zero means }
|
||||
{ unlimited. }
|
||||
xpProperty_MaxCharacters = 1405
|
||||
;
|
||||
{ The first visible character on the left. This effectively scrolls the text}
|
||||
{ field. }
|
||||
xpProperty_ScrollPosition = 1406
|
||||
;
|
||||
{ The font to draw the field's text with. (An XPLMFontID.) }
|
||||
xpProperty_Font = 1407
|
||||
;
|
||||
{ This is the active side of the insert selection. (Internal) }
|
||||
xpProperty_ActiveEditSide = 1408
|
||||
;
|
||||
|
||||
{
|
||||
Text Field Messages
|
||||
}
|
||||
{ The text field sends this message to itself when its text changes. It sends}
|
||||
{ the message up the call chain; param1 is the text field's widget ID. }
|
||||
xpMsg_TextFieldChanged = 1400
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* SCROLL BAR
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
A standard scroll bar or slider control. The scroll bar has a minimum,
|
||||
maximum and current value that is updated when the user drags it. The
|
||||
scroll bar sends continuous messages as it is dragged.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_ScrollBar = 5;
|
||||
|
||||
{
|
||||
Scroll Bar Type Values
|
||||
|
||||
This defines how the scroll bar looks.
|
||||
}
|
||||
{ A standard X-Plane scroll bar (with arrows on the ends). }
|
||||
xpScrollBarTypeScrollBar = 0
|
||||
;
|
||||
{ A slider, no arrows. }
|
||||
xpScrollBarTypeSlider = 1
|
||||
;
|
||||
|
||||
{
|
||||
Scroll Bar Properties
|
||||
}
|
||||
{ The current position of the thumb (in between the min and max, inclusive) }
|
||||
xpProperty_ScrollBarSliderPosition = 1500
|
||||
;
|
||||
{ The value the scroll bar has when the thumb is in the lowest position. }
|
||||
xpProperty_ScrollBarMin = 1501
|
||||
;
|
||||
{ The value the scroll bar has when the thumb is in the highest position. }
|
||||
xpProperty_ScrollBarMax = 1502
|
||||
;
|
||||
{ How many units to move the scroll bar when clicking next to the thumb. The }
|
||||
{ scroll bar always moves one unit when the arrows are clicked. }
|
||||
xpProperty_ScrollBarPageAmount = 1503
|
||||
;
|
||||
{ The type of scrollbar from the enums above. }
|
||||
xpProperty_ScrollBarType = 1504
|
||||
;
|
||||
{ Used internally. }
|
||||
xpProperty_ScrollBarSlop = 1505
|
||||
;
|
||||
|
||||
{
|
||||
Scroll Bar Messages
|
||||
}
|
||||
{ The scroll bar sends this message when the slider position changes. It }
|
||||
{ sends the message up the call chain; param1 is the Scroll Bar widget ID. }
|
||||
xpMsg_ScrollBarSliderPositionChanged = 1500
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* CAPTION
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
A caption is a simple widget that shows its descriptor as a string, useful
|
||||
for labeling parts of a window. It always shows its descriptor as its
|
||||
string and is otherwise transparent.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_Caption = 6;
|
||||
|
||||
{
|
||||
Caption Properties
|
||||
}
|
||||
{ This property specifies whether the caption is lit; use lit captions }
|
||||
{ against screens. }
|
||||
xpProperty_CaptionLit = 1600
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* GENERAL GRAPHICS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The general graphics widget can show one of many icons available from
|
||||
X-Plane.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
xpWidgetClass_GeneralGraphics = 7;
|
||||
|
||||
{
|
||||
General Graphics Types Values
|
||||
|
||||
These define the icon for the general graphics.
|
||||
}
|
||||
xpShip = 4
|
||||
;
|
||||
xpILSGlideScope = 5
|
||||
;
|
||||
xpMarkerLeft = 6
|
||||
;
|
||||
xp_Airport = 7
|
||||
;
|
||||
xpNDB = 8
|
||||
;
|
||||
xpVOR = 9
|
||||
;
|
||||
xpRadioTower = 10
|
||||
;
|
||||
xpAircraftCarrier = 11
|
||||
;
|
||||
xpFire = 12
|
||||
;
|
||||
xpMarkerRight = 13
|
||||
;
|
||||
xpCustomObject = 14
|
||||
;
|
||||
xpCoolingTower = 15
|
||||
;
|
||||
xpSmokeStack = 16
|
||||
;
|
||||
xpBuilding = 17
|
||||
;
|
||||
xpPowerLine = 18
|
||||
;
|
||||
xpVORWithCompassRose = 19
|
||||
;
|
||||
xpOilPlatform = 21
|
||||
;
|
||||
xpOilPlatformSmall = 22
|
||||
;
|
||||
xpWayPoint = 23
|
||||
;
|
||||
|
||||
{
|
||||
General Graphics Properties
|
||||
}
|
||||
{ This property controls the type of icon that is drawn. }
|
||||
xpProperty_GeneralGraphicsType = 1700
|
||||
;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* PROGRESS INDICATOR
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
This widget implements a progress indicator as seen when X-Plane starts up.
|
||||
}
|
||||
|
||||
CONST
|
||||
xpWidgetClass_Progress = 8;
|
||||
|
||||
{
|
||||
Progress Indicator Properties
|
||||
}
|
||||
{ This is the current value of the progress indicator. }
|
||||
xpProperty_ProgressPosition = 1800
|
||||
;
|
||||
{ This is the minimum value, equivalent to 0% filled. }
|
||||
xpProperty_ProgressMin = 1801
|
||||
;
|
||||
{ This is the maximum value, equivalent to 100% filled. }
|
||||
xpProperty_ProgressMax = 1802
|
||||
;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,342 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPUIGraphics;
|
||||
INTERFACE
|
||||
|
||||
USES
|
||||
XPWidgetDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* UI GRAPHICS
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPWindowStyle
|
||||
|
||||
There are a few built-in window styles in X-Plane that you can use.
|
||||
|
||||
Note that X-Plane 6 does not offer real shadow-compositing; you must make
|
||||
sure to put a window on top of another window of the right style to the
|
||||
shadows work, etc. This applies to elements with insets and shadows. The
|
||||
rules are:
|
||||
|
||||
Sub windows must go on top of main windows, and screens and list views on
|
||||
top of subwindows. Only help and main windows can be over the main screen.
|
||||
|
||||
With X-Plane 7 any window or element may be placed over any other element.
|
||||
|
||||
Some windows are scaled by stretching, some by repeating. The drawing
|
||||
routines know which scaling method to use. The list view cannot be rescaled
|
||||
in X-Plane 6 because it has both a repeating pattern and a gradient in one
|
||||
element. All other elements can be rescaled.
|
||||
}
|
||||
TYPE
|
||||
XPWindowStyle = (
|
||||
{ An LCD screen that shows help. }
|
||||
xpWindow_Help = 0
|
||||
|
||||
{ A dialog box window. }
|
||||
,xpWindow_MainWindow = 1
|
||||
|
||||
{ A panel or frame within a dialog box window. }
|
||||
,xpWindow_SubWindow = 2
|
||||
|
||||
{ An LCD screen within a panel to hold text displays. }
|
||||
,xpWindow_Screen = 4
|
||||
|
||||
{ A list view within a panel for scrolling file names, etc. }
|
||||
,xpWindow_ListView = 5
|
||||
|
||||
);
|
||||
PXPWindowStyle = ^XPWindowStyle;
|
||||
|
||||
{
|
||||
XPDrawWindow
|
||||
|
||||
This routine draws a window of the given dimensions at the given offset on
|
||||
the virtual screen in a given style. The window is automatically scaled as
|
||||
appropriate using a bitmap scaling technique (scaling or repeating) as
|
||||
appropriate to the style.
|
||||
}
|
||||
PROCEDURE XPDrawWindow(
|
||||
inX1 : Integer;
|
||||
inY1 : Integer;
|
||||
inX2 : Integer;
|
||||
inY2 : Integer;
|
||||
inStyle : XPWindowStyle);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWindowDefaultDimensions
|
||||
|
||||
This routine returns the default dimensions for a window. Output is either
|
||||
a minimum or fixed value depending on whether the window is scalable.
|
||||
}
|
||||
PROCEDURE XPGetWindowDefaultDimensions(
|
||||
inStyle : XPWindowStyle;
|
||||
outWidth : PInteger; { Can be nil }
|
||||
outHeight : PInteger); { Can be nil }
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPElementStyle
|
||||
|
||||
Elements are individually drawable UI things like push buttons, etc. The
|
||||
style defines what kind of element you are drawing. Elements can be
|
||||
stretched in one or two dimensions (depending on the element). Some
|
||||
elements can be lit.
|
||||
|
||||
In X-Plane 6 some elements must be drawn over metal. Some are scalable and
|
||||
some are not. Any element can be drawn anywhere in X-Plane 7.
|
||||
|
||||
Scalable Axis Required Background
|
||||
}
|
||||
TYPE
|
||||
XPElementStyle = (
|
||||
{ x metal }
|
||||
xpElement_TextField = 6
|
||||
|
||||
{ none metal }
|
||||
,xpElement_CheckBox = 9
|
||||
|
||||
{ none metal }
|
||||
,xpElement_CheckBoxLit = 10
|
||||
|
||||
{ none window header }
|
||||
,xpElement_WindowCloseBox = 14
|
||||
|
||||
{ none window header }
|
||||
,xpElement_WindowCloseBoxPressed = 15
|
||||
|
||||
{ x metal }
|
||||
,xpElement_PushButton = 16
|
||||
|
||||
{ x metal }
|
||||
,xpElement_PushButtonLit = 17
|
||||
|
||||
{ none any }
|
||||
,xpElement_OilPlatform = 24
|
||||
|
||||
{ none any }
|
||||
,xpElement_OilPlatformSmall = 25
|
||||
|
||||
{ none any }
|
||||
,xpElement_Ship = 26
|
||||
|
||||
{ none any }
|
||||
,xpElement_ILSGlideScope = 27
|
||||
|
||||
{ none any }
|
||||
,xpElement_MarkerLeft = 28
|
||||
|
||||
{ none any }
|
||||
,xpElement_Airport = 29
|
||||
|
||||
{ none any }
|
||||
,xpElement_Waypoint = 30
|
||||
|
||||
{ none any }
|
||||
,xpElement_NDB = 31
|
||||
|
||||
{ none any }
|
||||
,xpElement_VOR = 32
|
||||
|
||||
{ none any }
|
||||
,xpElement_RadioTower = 33
|
||||
|
||||
{ none any }
|
||||
,xpElement_AircraftCarrier = 34
|
||||
|
||||
{ none any }
|
||||
,xpElement_Fire = 35
|
||||
|
||||
{ none any }
|
||||
,xpElement_MarkerRight = 36
|
||||
|
||||
{ none any }
|
||||
,xpElement_CustomObject = 37
|
||||
|
||||
{ none any }
|
||||
,xpElement_CoolingTower = 38
|
||||
|
||||
{ none any }
|
||||
,xpElement_SmokeStack = 39
|
||||
|
||||
{ none any }
|
||||
,xpElement_Building = 40
|
||||
|
||||
{ none any }
|
||||
,xpElement_PowerLine = 41
|
||||
|
||||
{ none metal }
|
||||
,xpElement_CopyButtons = 45
|
||||
|
||||
{ none metal }
|
||||
,xpElement_CopyButtonsWithEditingGrid = 46
|
||||
|
||||
{ x, y metal }
|
||||
,xpElement_EditingGrid = 47
|
||||
|
||||
{ THIS CAN PROBABLY BE REMOVED }
|
||||
,xpElement_ScrollBar = 48
|
||||
|
||||
{ none any }
|
||||
,xpElement_VORWithCompassRose = 49
|
||||
|
||||
{ none metal }
|
||||
,xpElement_Zoomer = 51
|
||||
|
||||
{ x, y metal }
|
||||
,xpElement_TextFieldMiddle = 52
|
||||
|
||||
{ none metal }
|
||||
,xpElement_LittleDownArrow = 53
|
||||
|
||||
{ none metal }
|
||||
,xpElement_LittleUpArrow = 54
|
||||
|
||||
{ none metal }
|
||||
,xpElement_WindowDragBar = 61
|
||||
|
||||
{ none metal }
|
||||
,xpElement_WindowDragBarSmooth = 62
|
||||
|
||||
);
|
||||
PXPElementStyle = ^XPElementStyle;
|
||||
|
||||
{
|
||||
XPDrawElement
|
||||
|
||||
XPDrawElement draws a given element at an offset on the virtual screen in
|
||||
set dimensions.
|
||||
*Even* if the element is not scalable, it will be scaled if the width and
|
||||
height do not match the preferred dimensions; it'll just look ugly. Pass
|
||||
inLit to see the lit version of the element; if the element cannot be lit
|
||||
this is ignored.
|
||||
}
|
||||
PROCEDURE XPDrawElement(
|
||||
inX1 : Integer;
|
||||
inY1 : Integer;
|
||||
inX2 : Integer;
|
||||
inY2 : Integer;
|
||||
inStyle : XPElementStyle;
|
||||
inLit : Integer);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetElementDefaultDimensions
|
||||
|
||||
This routine returns the recommended or minimum dimensions of a given UI
|
||||
element. outCanBeLit tells whether the element has both a lit and unlit
|
||||
state. Pass `NULL` to not receive any of these parameters.
|
||||
}
|
||||
PROCEDURE XPGetElementDefaultDimensions(
|
||||
inStyle : XPElementStyle;
|
||||
outWidth : PInteger; { Can be nil }
|
||||
outHeight : PInteger; { Can be nil }
|
||||
outCanBeLit : PInteger); { Can be nil }
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPTrackStyle
|
||||
|
||||
A track is a UI element that displays a value vertically or horizontally.
|
||||
X-Plane has three kinds of tracks: scroll bars, sliders, and progress bars.
|
||||
Tracks can be displayed either horizontally or vertically; tracks will
|
||||
choose their own layout based on the larger dimension of their dimensions
|
||||
(e.g. they know if they are tall or wide). Sliders may be lit or unlit
|
||||
(showing the user manipulating them).
|
||||
|
||||
- ScrollBar: this is a standard scroll bar with arrows and a thumb to drag.
|
||||
- Slider: this is a simple track with a ball in the middle that can be
|
||||
slid.
|
||||
- Progress: this is a progress indicator showing how a long task is going.
|
||||
}
|
||||
TYPE
|
||||
XPTrackStyle = (
|
||||
{ not over metal can be lit can be rotated }
|
||||
xpTrack_ScrollBar = 0
|
||||
|
||||
{ over metal can be lit can be rotated }
|
||||
,xpTrack_Slider = 1
|
||||
|
||||
{ over metal cannot be lit cannot be rotated }
|
||||
,xpTrack_Progress = 2
|
||||
|
||||
);
|
||||
PXPTrackStyle = ^XPTrackStyle;
|
||||
|
||||
{
|
||||
XPDrawTrack
|
||||
|
||||
This routine draws a track. You pass in the track dimensions and size; the
|
||||
track picks the optimal orientation for these dimensions. Pass in the
|
||||
track's minimum current and maximum values; the indicator will be
|
||||
positioned appropriately. You can also specify whether the track is lit or
|
||||
not.
|
||||
}
|
||||
PROCEDURE XPDrawTrack(
|
||||
inX1 : Integer;
|
||||
inY1 : Integer;
|
||||
inX2 : Integer;
|
||||
inY2 : Integer;
|
||||
inMin : Integer;
|
||||
inMax : Integer;
|
||||
inValue : Integer;
|
||||
inTrackStyle : XPTrackStyle;
|
||||
inLit : Integer);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetTrackDefaultDimensions
|
||||
|
||||
This routine returns a track's default smaller dimension; all tracks are
|
||||
scalable in the larger dimension. It also returns whether a track can be
|
||||
lit.
|
||||
}
|
||||
PROCEDURE XPGetTrackDefaultDimensions(
|
||||
inStyle : XPTrackStyle;
|
||||
outWidth : PInteger;
|
||||
outCanBeLit : PInteger);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetTrackMetrics
|
||||
|
||||
This routine returns the metrics of a track. If you want to write UI code
|
||||
to manipulate a track, this routine helps you know where the mouse
|
||||
locations are. For most other elements, the rectangle the element is drawn
|
||||
in is enough information. However, the scrollbar drawing routine does some
|
||||
automatic placement; this routine lets you know where things ended up. You
|
||||
pass almost everything you would pass to the draw routine. You get out the
|
||||
orientation, and other useful stuff.
|
||||
|
||||
Besides orientation, you get five dimensions for the five parts of a
|
||||
scrollbar, which are the down button, down area (area before the thumb),
|
||||
the thumb, and the up area and button. For horizontal scrollers, the left
|
||||
button decreases; for vertical scrollers, the top button decreases.
|
||||
}
|
||||
PROCEDURE XPGetTrackMetrics(
|
||||
inX1 : Integer;
|
||||
inY1 : Integer;
|
||||
inX2 : Integer;
|
||||
inY2 : Integer;
|
||||
inMin : Integer;
|
||||
inMax : Integer;
|
||||
inValue : Integer;
|
||||
inTrackStyle : XPTrackStyle;
|
||||
outIsVertical : PInteger;
|
||||
outDownBtnSize : PInteger;
|
||||
outDownPageSize : PInteger;
|
||||
outThumbSize : PInteger;
|
||||
outUpPageSize : PInteger;
|
||||
outUpBtnSize : PInteger);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,427 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPWidgetDefs;
|
||||
INTERFACE
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* WIDGET DEFINITIONS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
A widget is a call-back driven screen entity like a push-button, window,
|
||||
text entry field, etc.
|
||||
|
||||
Use the widget API to create widgets of various classes. You can nest them
|
||||
into trees of widgets to create complex user interfaces.
|
||||
}
|
||||
|
||||
|
||||
TYPE
|
||||
{
|
||||
XPWidgetID
|
||||
|
||||
A Widget ID is an opaque unique non-zero handle identifying your widget.
|
||||
Use 0 to specify "no widget". This type is defined as wide enough to hold a
|
||||
pointer. You receive a widget ID when you create a new widget and then use
|
||||
that widget ID to further refer to the widget.
|
||||
}
|
||||
XPWidgetID = pointer;
|
||||
PXPWidgetID = ^XPWidgetID;
|
||||
|
||||
{
|
||||
XPWidgetPropertyID
|
||||
|
||||
Properties are values attached to instances of your widgets. A property is
|
||||
identified by a 32-bit ID and its value is the width of a pointer.
|
||||
|
||||
Each widget instance may have a property or not have it. When you set a
|
||||
property on a widget for the first time, the property is added to the
|
||||
widget; it then stays there for the life of the widget.
|
||||
|
||||
Some property IDs are predefined by the widget package; you can make up
|
||||
your own property IDs as well.
|
||||
}
|
||||
XPWidgetPropertyID = (
|
||||
{ A window's refcon is an opaque value used by client code to find other data}
|
||||
{ based on it. }
|
||||
xpProperty_Refcon = 0
|
||||
|
||||
{ These properties are used by the utlities to implement dragging. }
|
||||
,xpProperty_Dragging = 1
|
||||
|
||||
,xpProperty_DragXOff = 2
|
||||
|
||||
,xpProperty_DragYOff = 3
|
||||
|
||||
{ Is the widget hilited? (For widgets that support this kind of thing.) }
|
||||
,xpProperty_Hilited = 4
|
||||
|
||||
{ Is there a C++ object attached to this widget? }
|
||||
,xpProperty_Object = 5
|
||||
|
||||
{ If this property is 1, the widget package will use OpenGL to restrict }
|
||||
{ drawing to the Wiget's exposed rectangle. }
|
||||
,xpProperty_Clip = 6
|
||||
|
||||
{ Is this widget enabled (for those that have a disabled state too)? }
|
||||
,xpProperty_Enabled = 7
|
||||
|
||||
{ NOTE: Property IDs 1 - 999 are reserved for the widgets library. }
|
||||
{ }
|
||||
{ NOTE: Property IDs 1000 - 9999 are allocated to the standard widget classes}
|
||||
{ provided with the library. }
|
||||
{ }
|
||||
{ Properties 1000 - 1099 are for widget class 0, 1100 - 1199 for widget class}
|
||||
{ 1, etc. }
|
||||
,xpProperty_UserStart = 10000
|
||||
|
||||
);
|
||||
PXPWidgetPropertyID = ^XPWidgetPropertyID;
|
||||
|
||||
{
|
||||
XPMouseState_t
|
||||
|
||||
When the mouse is clicked or dragged, a pointer to this structure is passed
|
||||
to your widget function.
|
||||
}
|
||||
XPMouseState_t = RECORD
|
||||
x : Integer;
|
||||
y : Integer;
|
||||
{ Mouse Button number, left = 0 (right button not yet supported. }
|
||||
button : Integer;
|
||||
{$IFDEF XPLM200}
|
||||
{ Scroll wheel delta (button in this case would be the wheel axis number). }
|
||||
delta : Integer;
|
||||
{$ENDIF XPLM200}
|
||||
END;
|
||||
PXPMouseState_t = ^XPMouseState_t;
|
||||
|
||||
{
|
||||
XPKeyState_t
|
||||
|
||||
When a key is pressed, a pointer to this struct is passed to your widget
|
||||
function.
|
||||
}
|
||||
XPKeyState_t = RECORD
|
||||
{ The ASCII key that was pressed. WARNING: this may be 0 for some non-ASCII }
|
||||
{ key sequences. }
|
||||
key : XPLMChar;
|
||||
{ The flags. Make sure to check this if you only want key-downs! }
|
||||
flags : XPLMKeyFlags;
|
||||
{ The virtual key code for the key }
|
||||
vkey : XPLMChar;
|
||||
END;
|
||||
PXPKeyState_t = ^XPKeyState_t;
|
||||
|
||||
{
|
||||
XPWidgetGeometryChange_t
|
||||
|
||||
This structure contains the deltas for your widget's geometry when it
|
||||
changes.
|
||||
}
|
||||
XPWidgetGeometryChange_t = RECORD
|
||||
dx : Integer;
|
||||
{ +Y = the widget moved up }
|
||||
dy : Integer;
|
||||
dwidth : Integer;
|
||||
dheight : Integer;
|
||||
END;
|
||||
PXPWidgetGeometryChange_t = ^XPWidgetGeometryChange_t;
|
||||
|
||||
{
|
||||
XPDispatchMode
|
||||
|
||||
The dispatching modes describe how the widgets library sends out messages.
|
||||
Currently there are three modes:
|
||||
}
|
||||
XPDispatchMode = (
|
||||
{ The message will only be sent to the target widget. }
|
||||
xpMode_Direct = 0
|
||||
|
||||
{ The message is sent to the target widget, then up the chain of parents }
|
||||
{ until the message is handled or a parentless widget is reached. }
|
||||
,xpMode_UpChain = 1
|
||||
|
||||
{ The message is sent to the target widget and then all of its children }
|
||||
{ recursively depth-first. }
|
||||
,xpMode_Recursive = 2
|
||||
|
||||
{ The message is snet just to the target, but goes to every callback, even if}
|
||||
{ it is handled. }
|
||||
,xpMode_DirectAllCallbacks = 3
|
||||
|
||||
{ The message is only sent to the very first handler even if it is not }
|
||||
{ accepted. (This is really only useful for some internal widget library }
|
||||
{ functions.) }
|
||||
,xpMode_Once = 4
|
||||
|
||||
);
|
||||
PXPDispatchMode = ^XPDispatchMode;
|
||||
|
||||
{
|
||||
XPWidgetClass
|
||||
|
||||
Widget classes define predefined widget types. A widget class basically
|
||||
specifies from a library the widget function to be used for the widget.
|
||||
Most widgets can be made right from classes.
|
||||
}
|
||||
XPWidgetClass = Integer;
|
||||
PXPWidgetClass = ^XPWidgetClass;
|
||||
|
||||
CONST
|
||||
{ An unspecified widget class. Other widget classes are in }
|
||||
{ XPStandardWidgets.h }
|
||||
xpWidgetClass_None = 0;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* WIDGET MESSAGES
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPWidgetMessage
|
||||
|
||||
Widgets receive 32-bit messages indicating what action is to be taken or
|
||||
notifications of events. The list of messages may be expanded.
|
||||
}
|
||||
TYPE
|
||||
XPWidgetMessage = (
|
||||
{ No message, should not be sent. }
|
||||
xpMsg_None = 0
|
||||
|
||||
{ The create message is sent once per widget that is created with your widget}
|
||||
{ function and once for any widget that has your widget function attached. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: 1 if you are being added as a subclass, 0 if the widget is first }
|
||||
{ being created. }
|
||||
,xpMsg_Create = 1
|
||||
|
||||
{ The destroy message is sent once for each message that is destroyed that }
|
||||
{ has your widget function. }
|
||||
{ }
|
||||
{ Dispatching: Direct for all }
|
||||
{ }
|
||||
{ Param 1: 1 if being deleted by a recursive delete to the parent, 0 for }
|
||||
{ explicit deletion. }
|
||||
,xpMsg_Destroy = 2
|
||||
|
||||
{ The paint message is sent to your widget to draw itself. The paint message }
|
||||
{ is the bare-bones message; in response you must draw yourself, draw your }
|
||||
{ children, set up clipping and culling, check for visibility, etc. If you }
|
||||
{ don't want to do all of this, ignore the paint message and a draw message }
|
||||
{ (see below) will be sent to you. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
,xpMsg_Paint = 3
|
||||
|
||||
{ The draw message is sent to your widget when it is time to draw yourself. }
|
||||
{ OpenGL will be set up to draw in 2-d global screen coordinates, but you }
|
||||
{ should use the XPLM to set up OpenGL state. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
,xpMsg_Draw = 4
|
||||
|
||||
{ The key press message is sent once per key that is pressed. The first }
|
||||
{ parameter is the type of key code (integer or char) and the second is the }
|
||||
{ code itself. By handling this event, you consume the key stroke. }
|
||||
{ }
|
||||
{ Handling this message 'consumes' the keystroke; not handling it passes it }
|
||||
{ to your parent widget. }
|
||||
{ }
|
||||
{ Dispatching: Up Chain }
|
||||
{ }
|
||||
{ Param 1: A pointer to an XPKeyState_t structure with the keystroke. }
|
||||
,xpMsg_KeyPress = 5
|
||||
|
||||
{ Keyboard focus is being given to you. By handling this message you accept }
|
||||
{ keyboard focus. The first parameter will be one if a child of yours gave up}
|
||||
{ focus to you, 0 if someone set focus on you explicitly. }
|
||||
{ }
|
||||
{ Handling this message accepts focus; not handling refuses focus. }
|
||||
{ }
|
||||
{ Dispatching: direct }
|
||||
{ }
|
||||
{ Param 1: 1 if you are gaining focus because your child is giving it up, 0 }
|
||||
{ if someone is explicitly giving you focus. }
|
||||
,xpMsg_KeyTakeFocus = 6
|
||||
|
||||
{ Keyboard focus is being taken away from you. The first parameter will be }
|
||||
{ one if you are losing focus because another widget is taking it, or 0 if }
|
||||
{ someone called the API to make you lose focus explicitly. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: 1 if focus is being taken by another widget, 0 if code requested }
|
||||
{ to remove focus. }
|
||||
,xpMsg_KeyLoseFocus = 7
|
||||
|
||||
{ You receive one mousedown event per click with a mouse-state structure }
|
||||
{ pointed to by parameter 1, by accepting this you eat the click, otherwise }
|
||||
{ your parent gets it. You will not receive drag and mouse up messages if you}
|
||||
{ do not accept the down message. }
|
||||
{ }
|
||||
{ Handling this message consumes the mouse click, not handling it passes it }
|
||||
{ to the next widget. You can act 'transparent' as a window by never handling}
|
||||
{ moues clicks to certain areas. }
|
||||
{ }
|
||||
{ Dispatching: Up chain NOTE: Technically this is direct dispatched, but the }
|
||||
{ widgets library will shop it to each widget until one consumes the click, }
|
||||
{ making it effectively "up chain". }
|
||||
{ }
|
||||
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
|
||||
,xpMsg_MouseDown = 8
|
||||
|
||||
{ You receive a series of mouse drag messages (typically one per frame in the}
|
||||
{ sim) as the mouse is moved once you have accepted a mouse down message. }
|
||||
{ Parameter one points to a mouse-state structure describing the mouse }
|
||||
{ location. You will continue to receive these until the mouse button is }
|
||||
{ released. You may receive multiple mouse state messages with the same mouse}
|
||||
{ position. You will receive mouse drag events even if the mouse is dragged }
|
||||
{ out of your current or original bounds at the time of the mouse down. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
|
||||
,xpMsg_MouseDrag = 9
|
||||
|
||||
{ The mouseup event is sent once when the mouse button is released after a }
|
||||
{ drag or click. You only receive this message if you accept the mouseDown }
|
||||
{ message. Parameter one points to a mouse state structure. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
|
||||
,xpMsg_MouseUp = 10
|
||||
|
||||
{ Your geometry or a child's geometry is being changed. }
|
||||
{ }
|
||||
{ Dispatching: Up chain }
|
||||
{ }
|
||||
{ Param 1: The widget ID of the original reshaped target. }
|
||||
{ }
|
||||
{ Param 2: A pointer to a XPWidgetGeometryChange_t struct describing the }
|
||||
{ change. }
|
||||
,xpMsg_Reshape = 11
|
||||
|
||||
{ Your exposed area has changed. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
,xpMsg_ExposedChanged = 12
|
||||
|
||||
{ A child has been added to you. The child's ID is passed in parameter one. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: The Widget ID of the child being added. }
|
||||
,xpMsg_AcceptChild = 13
|
||||
|
||||
{ A child has been removed from to you. The child's ID is passed in parameter}
|
||||
{ one. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: The Widget ID of the child being removed. }
|
||||
,xpMsg_LoseChild = 14
|
||||
|
||||
{ You now have a new parent, or have no parent. The parent's ID is passed in,}
|
||||
{ or 0 for no parent. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: The Widget ID of your parent }
|
||||
,xpMsg_AcceptParent = 15
|
||||
|
||||
{ You or a child has been shown. Note that this does not include you being }
|
||||
{ shown because your parent was shown, you were put in a new parent, your }
|
||||
{ root was shown, etc. }
|
||||
{ }
|
||||
{ Dispatching: Up chain }
|
||||
{ }
|
||||
{ Param 1: The widget ID of the shown widget. }
|
||||
,xpMsg_Shown = 16
|
||||
|
||||
{ You have been hidden. See limitations above. }
|
||||
{ }
|
||||
{ Dispatching: Up chain }
|
||||
{ }
|
||||
{ Param 1: The widget ID of the hidden widget. }
|
||||
,xpMsg_Hidden = 17
|
||||
|
||||
{ Your descriptor has changed. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
,xpMsg_DescriptorChanged = 18
|
||||
|
||||
{ A property has changed. Param 1 contains the property ID. }
|
||||
{ }
|
||||
{ Dispatching: Direct }
|
||||
{ }
|
||||
{ Param 1: The Property ID being changed. }
|
||||
{ }
|
||||
{ Param 2: The new property value }
|
||||
,xpMsg_PropertyChanged = 19
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{ The mouse wheel has moved. }
|
||||
{ }
|
||||
{ Return 1 to consume the mouse wheel move, or 0 to pass the message to a }
|
||||
{ parent. Dispatching: Up chain }
|
||||
{ }
|
||||
{ Param 1: A pointer to an XPMouseState_t containing the mouse status. }
|
||||
,xpMsg_MouseWheel = 20
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{ The cursor is over your widget. If you consume this message, change the }
|
||||
{ XPLMCursorStatus value to indicate the desired result, with the same rules }
|
||||
{ as in XPLMDisplay.h. }
|
||||
{ }
|
||||
{ Return 1 to consume this message, 0 to pass it on. }
|
||||
{ }
|
||||
{ Dispatching: Up chain Param 1: A pointer to an XPMouseState_t struct }
|
||||
{ containing the mouse status. }
|
||||
{ }
|
||||
{ Param 2: A pointer to a XPLMCursorStatus - set this to the cursor result }
|
||||
{ you desire. }
|
||||
,xpMsg_CursorAdjust = 21
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{ NOTE: Message IDs 1000 - 9999 are allocated to the standard widget classes }
|
||||
{ provided with the library with 1000 - 1099 for widget class 0, 1100 - 1199 }
|
||||
{ for widget class 1, etc. Message IDs 10,000 and beyond are for plugin use. }
|
||||
,xpMsg_UserStart = 10000
|
||||
|
||||
);
|
||||
PXPWidgetMessage = ^XPWidgetMessage;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* WIDGET CALLBACK FUNCTION
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPWidgetFunc_t
|
||||
|
||||
This function defines your custom widget's behavior. It will be called by
|
||||
the widgets library to send messages to your widget. The message and widget
|
||||
ID are passed in, as well as two ptr-width signed parameters whose meaning
|
||||
varies with the message. Return 1 to indicate that you have processed the
|
||||
message, 0 to indicate that you have not. For any message that is not
|
||||
understood, return 0.
|
||||
}
|
||||
TYPE
|
||||
XPWidgetFunc_t = FUNCTION(
|
||||
inMessage : XPWidgetMessage;
|
||||
inWidget : XPWidgetID;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t) : Integer; cdecl;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,197 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPWidgetUtils;
|
||||
INTERFACE
|
||||
{
|
||||
## USAGE NOTES
|
||||
|
||||
The XPWidgetUtils library contains useful functions that make writing and
|
||||
using widgets less of a pain.
|
||||
|
||||
One set of functions are the widget behavior functions. These functions
|
||||
each add specific useful behaviors to widgets. They can be used in two
|
||||
manners:
|
||||
|
||||
1. You can add a widget behavior function to a widget as a callback proc
|
||||
using the XPAddWidgetCallback function. The widget will gain that
|
||||
behavior. Remember that the last function you add has highest priority.
|
||||
You can use this to change or augment the behavior of an existing
|
||||
finished widget.
|
||||
2. You can call a widget function from inside your own widget function.
|
||||
This allows you to include useful behaviors in custom-built widgets. A
|
||||
number of the standard widgets get their behavior from this library. To
|
||||
do this, call the behavior function from your function first. If it
|
||||
returns 1, that means it handled the event and you don't need to; simply
|
||||
return 1.
|
||||
}
|
||||
|
||||
USES
|
||||
XPWidgetDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* GENERAL UTILITIES
|
||||
___________________________________________________________________________}
|
||||
|
||||
|
||||
{
|
||||
XPWidgetCreate_t
|
||||
|
||||
This structure contains all of the parameters needed to create a wiget. It
|
||||
is used with XPUCreateWidgets to create widgets in bulk from an array. All
|
||||
parameters correspond to those of XPCreateWidget except for the container
|
||||
index.
|
||||
|
||||
If the container index is equal to the index of a widget in the array, the
|
||||
widget in the array passed to XPUCreateWidgets is used as the parent of
|
||||
this widget. Note that if you pass an index greater than your own position
|
||||
in the array, the parent you are requesting will not exist yet.
|
||||
|
||||
If the container index is NO_PARENT, the parent widget is specified as
|
||||
NULL. If the container index is PARAM_PARENT, the widget passed into
|
||||
XPUCreateWidgets is used.
|
||||
}
|
||||
TYPE
|
||||
XPWidgetCreate_t = RECORD
|
||||
left : Integer;
|
||||
top : Integer;
|
||||
right : Integer;
|
||||
bottom : Integer;
|
||||
visible : Integer;
|
||||
descriptor : XPLMString;
|
||||
{ Whether ethis widget is a root wiget }
|
||||
isRoot : Integer;
|
||||
{ The index of the widget to contain within, or a constant }
|
||||
containerIndex : Integer;
|
||||
widgetClass : XPWidgetClass;
|
||||
END;
|
||||
PXPWidgetCreate_t = ^XPWidgetCreate_t;
|
||||
|
||||
CONST
|
||||
NO_PARENT = -1;
|
||||
|
||||
PARAM_PARENT = -2;
|
||||
|
||||
|
||||
{
|
||||
XPUCreateWidgets
|
||||
|
||||
This function creates a series of widgets from a table (see
|
||||
XPCreateWidget_t above). Pass in an array of widget creation structures and
|
||||
an array of widget IDs that will receive each widget.
|
||||
|
||||
Widget parents are specified by index into the created widget table,
|
||||
allowing you to create nested widget structures. You can create multiple
|
||||
widget trees in one table. Generally you should create widget trees from
|
||||
the top down.
|
||||
|
||||
You can also pass in a widget ID that will be used when the widget's parent
|
||||
is listed as PARAM_PARENT; this allows you to embed widgets created with
|
||||
XPUCreateWidgets in a widget created previously.
|
||||
}
|
||||
PROCEDURE XPUCreateWidgets(
|
||||
inWidgetDefs : PXPWidgetCreate_t;
|
||||
inCount : Integer;
|
||||
inParamParent : XPWidgetID;
|
||||
ioWidgets : PXPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPUMoveWidgetBy
|
||||
|
||||
Simply moves a widget by an amount, +x = right, +y=up, without resizing the
|
||||
widget.
|
||||
}
|
||||
PROCEDURE XPUMoveWidgetBy(
|
||||
inWidget : XPWidgetID;
|
||||
inDeltaX : Integer;
|
||||
inDeltaY : Integer);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* LAYOUT MANAGERS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The layout managers are widget behavior functions for handling where
|
||||
widgets move. Layout managers can be called from a widget function or
|
||||
attached to a widget later.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPUFixedLayout
|
||||
|
||||
This function causes the widget to maintain its children in fixed position
|
||||
relative to itself as it is resized. Use this on the top level 'window'
|
||||
widget for your window.
|
||||
}
|
||||
FUNCTION XPUFixedLayout(
|
||||
inMessage : XPWidgetMessage;
|
||||
inWidget : XPWidgetID;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* WIDGET PROC BEHAVIORS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These widget behavior functions add other useful behaviors to widgets.
|
||||
These functions cannot be attached to a widget; they must be called from
|
||||
your widget function.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPUSelectIfNeeded
|
||||
|
||||
This causes the widget to bring its window to the foreground if it is not
|
||||
already. inEatClick specifies whether clicks in the background should be
|
||||
consumed by bringin the window to the foreground.
|
||||
}
|
||||
FUNCTION XPUSelectIfNeeded(
|
||||
inMessage : XPWidgetMessage;
|
||||
inWidget : XPWidgetID;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t;
|
||||
inEatClick : Integer) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPUDefocusKeyboard
|
||||
|
||||
This causes a click in the widget to send keyboard focus back to X-Plane.
|
||||
This stops editing of any text fields, etc.
|
||||
}
|
||||
FUNCTION XPUDefocusKeyboard(
|
||||
inMessage : XPWidgetMessage;
|
||||
inWidget : XPWidgetID;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t;
|
||||
inEatClick : Integer) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPUDragWidget
|
||||
|
||||
XPUDragWidget drags the widget in response to mouse clicks. Pass in not
|
||||
only the event, but the global coordinates of the drag region, which might
|
||||
be a sub-region of your widget (for example, a title bar).
|
||||
}
|
||||
FUNCTION XPUDragWidget(
|
||||
inMessage : XPWidgetMessage;
|
||||
inWidget : XPWidgetID;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t;
|
||||
inLeft : Integer;
|
||||
inTop : Integer;
|
||||
inRight : Integer;
|
||||
inBottom : Integer) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,527 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPWidgets;
|
||||
INTERFACE
|
||||
{
|
||||
## THEORY OF OPERATION AND NOTES
|
||||
|
||||
Widgets are persistent view 'objects' for X-Plane. A widget is an object
|
||||
referenced by its opaque handle (widget ID) and the APIs in this file. You
|
||||
cannot access the widget's guts directly. Every Widget has the following
|
||||
intrinsic data:
|
||||
|
||||
- A bounding box defined in global screen coordinates with 0,0 in the
|
||||
bottom left and +y = up, +x = right.
|
||||
- A visible box, which is the intersection of the bounding box with the
|
||||
widget's parents visible box.
|
||||
- Zero or one parent widgets. (Always zero if the widget is a root widget.
|
||||
- Zero or more child widgets.
|
||||
- Whether the widget is a root. Root widgets are the top level plugin
|
||||
windows.
|
||||
- Whether the widget is visible.
|
||||
- A text string descriptor, whose meaning varies from widget to widget.
|
||||
- An arbitrary set of 32 bit integral properties defined by 32-bit integral
|
||||
keys. This is how specific widgets store specific data.
|
||||
- A list of widget callbacks proc that implements the widgets behaviors.
|
||||
|
||||
The Widgets library sends messages to widgets to request specific behaviors
|
||||
or notify the widget of things.
|
||||
|
||||
Widgets may have more than one callback function, in which case messages
|
||||
are sent to the most recently added callback function until the message is
|
||||
handled. Messages may also be sent to parents or children; see the
|
||||
XPWidgetDefs.h header file for the different widget message dispatching
|
||||
functions. By adding a callback function to a window you can 'subclass' its
|
||||
behavior.
|
||||
|
||||
A set of standard widgets are provided that serve common UI purposes. You
|
||||
can also customize or implement entirely custom widgets.
|
||||
|
||||
Widgets are different than other view hierarchies (most notably Win32,
|
||||
which they bear a striking resemblance to) in the following ways:
|
||||
|
||||
- Not all behavior can be patched. State that is managed by the XPWidgets
|
||||
DLL and not by individual widgets cannot be customized.
|
||||
- All coordinates are in global screen coordinates. Coordinates are not
|
||||
relative to an enclosing widget, nor are they relative to a display
|
||||
window.
|
||||
- Widget messages are always dispatched synchronously, and there is no
|
||||
concept of scheduling an update or a dirty region. Messages originate
|
||||
from X-Plane as the sim cycle goes by. Since X-Plane is constantly
|
||||
redrawing, so are widgets; there is no need to mark a part of a widget as
|
||||
'needing redrawing' because redrawing happens frequently whether the
|
||||
widget needs it or not.
|
||||
- Any widget may be a 'root' widget, causing it to be drawn; there is no
|
||||
relationship between widget class and rootness. Root widgets are
|
||||
imlemented as XPLMDisply windows.
|
||||
}
|
||||
|
||||
USES
|
||||
XPWidgetDefs, XPLMDisplay;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* WIDGET CREATION AND MANAGEMENT
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPCreateWidget
|
||||
|
||||
This function creates a new widget and returns the new widget's ID to you.
|
||||
If the widget creation fails for some reason, it returns NULL. Widget
|
||||
creation will fail either if you pass a bad class ID or if there is not
|
||||
adequate memory.
|
||||
|
||||
Input Parameters:
|
||||
|
||||
- Top, left, bottom, and right in global screen coordinates defining the
|
||||
widget's location on the screen.
|
||||
- inVisible is 1 if the widget should be drawn, 0 to start the widget as
|
||||
hidden.
|
||||
- inDescriptor is a null terminated string that will become the widget's
|
||||
descriptor.
|
||||
- inIsRoot is 1 if this is going to be a root widget, 0 if it will not be.
|
||||
- inContainer is the ID of this widget's container. It must be 0 for a root
|
||||
widget. for a non-root widget, pass the widget ID of the widget to place
|
||||
this widget within. If this widget is not going to start inside another
|
||||
widget, pass 0; this new widget will then just be floating off in space
|
||||
(and will not be drawn until it is placed in a widget.
|
||||
- inClass is the class of the widget to draw. Use one of the predefined
|
||||
class-IDs to create a standard widget.
|
||||
|
||||
A note on widget embedding: a widget is only called (and will be drawn,
|
||||
etc.) if it is placed within a widget that will be called. Root widgets are
|
||||
always called. So it is possible to have whole chains of widgets that are
|
||||
simply not called. You can preconstruct widget trees and then place them
|
||||
into root widgets later to activate them if you wish.
|
||||
}
|
||||
FUNCTION XPCreateWidget(
|
||||
inLeft : Integer;
|
||||
inTop : Integer;
|
||||
inRight : Integer;
|
||||
inBottom : Integer;
|
||||
inVisible : Integer;
|
||||
inDescriptor : XPLMString;
|
||||
inIsRoot : Integer;
|
||||
inContainer : XPWidgetID;
|
||||
inClass : XPWidgetClass) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPCreateCustomWidget
|
||||
|
||||
This function is the same as XPCreateWidget except that instead of passing
|
||||
a class ID, you pass your widget callback function pointer defining the
|
||||
widget. Use this function to define a custom widget. All parameters are the
|
||||
same as XPCreateWidget, except that the widget class has been replaced with
|
||||
the widget function.
|
||||
}
|
||||
FUNCTION XPCreateCustomWidget(
|
||||
inLeft : Integer;
|
||||
inTop : Integer;
|
||||
inRight : Integer;
|
||||
inBottom : Integer;
|
||||
inVisible : Integer;
|
||||
inDescriptor : XPLMString;
|
||||
inIsRoot : Integer;
|
||||
inContainer : XPWidgetID;
|
||||
inCallback : XPWidgetFunc_t) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPDestroyWidget
|
||||
|
||||
This class destroys a widget. Pass in the ID of the widget to kill. If you
|
||||
pass 1 for inDestroyChilren, the widget's children will be destroyed first,
|
||||
then this widget will be destroyed. (Furthermore, the widget's children
|
||||
will be destroyed with the inDestroyChildren flag set to 1, so the
|
||||
destruction will recurse down the widget tree.) If you pass 0 for this
|
||||
flag, the child widgets will simply end up with their parent set to 0.
|
||||
}
|
||||
PROCEDURE XPDestroyWidget(
|
||||
inWidget : XPWidgetID;
|
||||
inDestroyChildren : Integer);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPSendMessageToWidget
|
||||
|
||||
This sends any message to a widget. You should probably not go around
|
||||
simulating the predefined messages that the widgets library defines for
|
||||
you. You may however define custom messages for your widgets and send them
|
||||
with this method.
|
||||
|
||||
This method supports several dispatching patterns; see XPDispatchMode for
|
||||
more info. The function returns 1 if the message was handled, 0 if it was
|
||||
not.
|
||||
|
||||
For each widget that receives the message (see the dispatching modes), each
|
||||
widget function from the most recently installed to the oldest one receives
|
||||
the message in order until it is handled.
|
||||
}
|
||||
FUNCTION XPSendMessageToWidget(
|
||||
inWidget : XPWidgetID;
|
||||
inMessage : XPWidgetMessage;
|
||||
inMode : XPDispatchMode;
|
||||
inParam1 : intptr_t;
|
||||
inParam2 : intptr_t) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* WIDGET POSITIONING AND VISIBILITY
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPPlaceWidgetWithin
|
||||
|
||||
This function changes which container a widget resides in. You may NOT use
|
||||
this function on a root widget! inSubWidget is the widget that will be
|
||||
moved. Pass a widget ID in inContainer to make inSubWidget be a child of
|
||||
inContainer. It will become the last/closest widget in the container. Pass
|
||||
0 to remove the widget from any container. Any call to this other than
|
||||
passing the widget ID of the old parent of the affected widget will cause
|
||||
the widget to be removed from its old parent. Placing a widget within its
|
||||
own parent simply makes it the last widget.
|
||||
|
||||
NOTE: this routine does not reposition the sub widget in global
|
||||
coordinates. If the container has layout management code, it will
|
||||
reposition the subwidget for you, otherwise you must do it with
|
||||
SetWidgetGeometry.
|
||||
}
|
||||
PROCEDURE XPPlaceWidgetWithin(
|
||||
inSubWidget : XPWidgetID;
|
||||
inContainer : XPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPCountChildWidgets
|
||||
|
||||
This routine returns the number of widgets another widget contains.
|
||||
}
|
||||
FUNCTION XPCountChildWidgets(
|
||||
inWidget : XPWidgetID) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetNthChildWidget
|
||||
|
||||
This routine returns the widget ID of a child widget by index. Indexes are
|
||||
0 based, from 0 to one minus the number of widgets in the parent,
|
||||
inclusive. If the index is invalid, 0 is returned.
|
||||
}
|
||||
FUNCTION XPGetNthChildWidget(
|
||||
inWidget : XPWidgetID;
|
||||
inIndex : Integer) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetParentWidget
|
||||
|
||||
Returns the parent of a widget, or 0 if the widget has no parent. Root
|
||||
widgets never have parents and therefore always return 0.
|
||||
}
|
||||
FUNCTION XPGetParentWidget(
|
||||
inWidget : XPWidgetID) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPShowWidget
|
||||
|
||||
This routine makes a widget visible if it is not already. Note that if a
|
||||
widget is not in a rooted widget hierarchy or one of its parents is not
|
||||
visible, it will still not be visible to the user.
|
||||
}
|
||||
PROCEDURE XPShowWidget(
|
||||
inWidget : XPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPHideWidget
|
||||
|
||||
Makes a widget invisible. See XPShowWidget for considerations of when a
|
||||
widget might not be visible despite its own visibility state.
|
||||
}
|
||||
PROCEDURE XPHideWidget(
|
||||
inWidget : XPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPIsWidgetVisible
|
||||
|
||||
This returns 1 if a widget is visible, 0 if it is not. Note that this
|
||||
routine takes into consideration whether a parent is invisible. Use this
|
||||
routine to tell if the user can see the widget.
|
||||
}
|
||||
FUNCTION XPIsWidgetVisible(
|
||||
inWidget : XPWidgetID) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPFindRootWidget
|
||||
|
||||
Returns the Widget ID of the root widget that contains the passed in widget
|
||||
or NULL if the passed in widget is not in a rooted hierarchy.
|
||||
}
|
||||
FUNCTION XPFindRootWidget(
|
||||
inWidget : XPWidgetID) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPBringRootWidgetToFront
|
||||
|
||||
This routine makes the specified widget be in the front most widget
|
||||
hierarchy. If this widget is a root widget, its widget hierarchy comes to
|
||||
front, otherwise the widget's root is brought to the front. If this widget
|
||||
is not in an active widget hiearchy (e.g. there is no root widget at the
|
||||
top of the tree), this routine does nothing.
|
||||
}
|
||||
PROCEDURE XPBringRootWidgetToFront(
|
||||
inWidget : XPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPIsWidgetInFront
|
||||
|
||||
This routine returns true if this widget's hierarchy is the front most
|
||||
hierarchy. It returns false if the widget's hierarchy is not in front, or
|
||||
if the widget is not in a rooted hierarchy.
|
||||
}
|
||||
FUNCTION XPIsWidgetInFront(
|
||||
inWidget : XPWidgetID) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetGeometry
|
||||
|
||||
This routine returns the bounding box of a widget in global coordinates.
|
||||
Pass NULL for any parameter you are not interested in.
|
||||
}
|
||||
PROCEDURE XPGetWidgetGeometry(
|
||||
inWidget : XPWidgetID;
|
||||
outLeft : PInteger; { Can be nil }
|
||||
outTop : PInteger; { Can be nil }
|
||||
outRight : PInteger; { Can be nil }
|
||||
outBottom : PInteger); { Can be nil }
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPSetWidgetGeometry
|
||||
|
||||
This function changes the bounding box of a widget.
|
||||
}
|
||||
PROCEDURE XPSetWidgetGeometry(
|
||||
inWidget : XPWidgetID;
|
||||
inLeft : Integer;
|
||||
inTop : Integer;
|
||||
inRight : Integer;
|
||||
inBottom : Integer);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetForLocation
|
||||
|
||||
Given a widget and a location, this routine returns the widget ID of the
|
||||
child of that widget that owns that location. If inRecursive is true then
|
||||
this will return a child of a child of a widget as it tries to find the
|
||||
deepest widget at that location. If inVisibleOnly is true, then only
|
||||
visible widgets are considered, otherwise all widgets are considered. The
|
||||
widget ID passed for inContainer will be returned if the location is in
|
||||
that widget but not in a child widget. 0 is returned if the location is not
|
||||
in the container.
|
||||
|
||||
NOTE: if a widget's geometry extends outside its parents geometry, it will
|
||||
not be returned by this call for mouse locations outside the parent
|
||||
geometry. The parent geometry limits the child's eligibility for mouse
|
||||
location.
|
||||
}
|
||||
FUNCTION XPGetWidgetForLocation(
|
||||
inContainer : XPWidgetID;
|
||||
inXOffset : Integer;
|
||||
inYOffset : Integer;
|
||||
inRecursive : Integer;
|
||||
inVisibleOnly : Integer) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetExposedGeometry
|
||||
|
||||
This routine returns the bounds of the area of a widget that is completely
|
||||
within its parent widgets. Since a widget's bounding box can be outside its
|
||||
parent, part of its area will not be elligible for mouse clicks and should
|
||||
not draw. Use XPGetWidgetGeometry to find out what area defines your
|
||||
widget's shape, but use this routine to find out what area to actually draw
|
||||
into. Note that the widget library does not use OpenGL clipping to keep
|
||||
frame rates up, although you could use it internally.
|
||||
}
|
||||
PROCEDURE XPGetWidgetExposedGeometry(
|
||||
inWidgetID : XPWidgetID;
|
||||
outLeft : PInteger; { Can be nil }
|
||||
outTop : PInteger; { Can be nil }
|
||||
outRight : PInteger; { Can be nil }
|
||||
outBottom : PInteger); { Can be nil }
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* ACCESSING WIDGET DATA
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPSetWidgetDescriptor
|
||||
|
||||
Every widget has a descriptor, which is a text string. What the text string
|
||||
is used for varies from widget to widget; for example, a push button's text
|
||||
is its descriptor, a caption shows its descriptor, and a text field's
|
||||
descriptor is the text being edited. In other words, the usage for the text
|
||||
varies from widget to widget, but this API provides a universal and
|
||||
convenient way to get at it. While not all UI widgets need their
|
||||
descriptor, many do.
|
||||
}
|
||||
PROCEDURE XPSetWidgetDescriptor(
|
||||
inWidget : XPWidgetID;
|
||||
inDescriptor : XPLMString);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetDescriptor
|
||||
|
||||
This routine returns the widget's descriptor. Pass in the length of the
|
||||
buffer you are going to receive the descriptor in. The descriptor will be
|
||||
null terminated for you. This routine returns the length of the actual
|
||||
descriptor; if you pass NULL for outDescriptor, you can get the
|
||||
descriptor's length without getting its text. If the length of the
|
||||
descriptor exceeds your buffer length, the buffer will not be null
|
||||
terminated (this routine has 'strncpy' semantics).
|
||||
}
|
||||
FUNCTION XPGetWidgetDescriptor(
|
||||
inWidget : XPWidgetID;
|
||||
outDescriptor : XPLMString;
|
||||
inMaxDescLength : Integer) : Integer;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetUnderlyingWindow
|
||||
|
||||
Returns the window (from the XPLMDisplay API) that backs your widget
|
||||
window. If you have opted in to modern windows, via a call to
|
||||
XPLMEnableFeature("XPLM_USE_NATIVE_WIDGET_WINDOWS", 1), you can use the
|
||||
returned window ID for display APIs like XPLMSetWindowPositioningMode(),
|
||||
allowing you to pop the widget window out into a real OS window, or move it
|
||||
into VR.
|
||||
}
|
||||
FUNCTION XPGetWidgetUnderlyingWindow(
|
||||
inWidget : XPWidgetID) : XPLMWindowID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPSetWidgetProperty
|
||||
|
||||
This function sets a widget's property. Properties are arbitrary values
|
||||
associated by a widget by ID.
|
||||
}
|
||||
PROCEDURE XPSetWidgetProperty(
|
||||
inWidget : XPWidgetID;
|
||||
inProperty : XPWidgetPropertyID;
|
||||
inValue : intptr_t);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetProperty
|
||||
|
||||
This routine returns the value of a widget's property, or 0 if the property
|
||||
is not defined. If you need to know whether the property is defined, pass a
|
||||
pointer to an int for inExists; the existence of that property will be
|
||||
returned in the int. Pass NULL for inExists if you do not need this
|
||||
information.
|
||||
}
|
||||
FUNCTION XPGetWidgetProperty(
|
||||
inWidget : XPWidgetID;
|
||||
inProperty : XPWidgetPropertyID;
|
||||
inExists : PInteger) : intptr_t; { Can be nil }
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* KEYBOARD MANAGEMENT
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPSetKeyboardFocus
|
||||
|
||||
Controls which widget will receive keystrokes. Pass the widget ID of the
|
||||
widget to get the keys. Note that if the widget does not care about
|
||||
keystrokes, they will go to the parent widget, and if no widget cares about
|
||||
them, they go to X-Plane.
|
||||
|
||||
If you set the keyboard focus to widget ID 0, X-Plane gets keyboard focus.
|
||||
|
||||
This routine returns the widget ID that ended up with keyboard focus, or 0
|
||||
for X-Plane.
|
||||
|
||||
Keyboard focus is not changed if the new widget will not accept it. For
|
||||
setting to X-Plane, keyboard focus is always accepted.
|
||||
}
|
||||
FUNCTION XPSetKeyboardFocus(
|
||||
inWidget : XPWidgetID) : XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPLoseKeyboardFocus
|
||||
|
||||
This causes the specified widget to lose focus; focus is passed to its
|
||||
parent, or the next parent that will accept it. This routine does nothing
|
||||
if this widget does not have focus.
|
||||
}
|
||||
PROCEDURE XPLoseKeyboardFocus(
|
||||
inWidget : XPWidgetID);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetWithFocus
|
||||
|
||||
This routine returns the widget that has keyboard focus, or 0 if X-Plane
|
||||
has keyboard focus or some other plugin window that does not have widgets
|
||||
has focus.
|
||||
}
|
||||
FUNCTION XPGetWidgetWithFocus: XPWidgetID;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* CREATING CUSTOM WIDGETS
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPAddWidgetCallback
|
||||
|
||||
This function adds a new widget callback to a widget. This widget callback
|
||||
supercedes any existing ones and will receive messages first; if it does
|
||||
not handle messages they will go on to be handled by pre-existing widgets.
|
||||
|
||||
The widget function will remain on the widget for the life of the widget.
|
||||
The creation message will be sent to the new callback immediately with the
|
||||
widget ID, and the destruction message will be sent before the other widget
|
||||
function receives a destruction message.
|
||||
|
||||
This provides a way to 'subclass' an existing widget. By providing a second
|
||||
hook that only handles certain widget messages, you can customize or extend
|
||||
widget behavior.
|
||||
}
|
||||
PROCEDURE XPAddWidgetCallback(
|
||||
inWidget : XPWidgetID;
|
||||
inNewCallback : XPWidgetFunc_t);
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
{
|
||||
XPGetWidgetClassFunc
|
||||
|
||||
Given a widget class, this function returns the callbacks that power that
|
||||
widget class.
|
||||
}
|
||||
FUNCTION XPGetWidgetClassFunc(
|
||||
inWidgetClass : XPWidgetClass) : XPWidgetFunc_t;
|
||||
cdecl; external XPWIDGETS.DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,155 @@
|
||||
{
|
||||
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
|
||||
{
|
||||
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 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.
|
||||
|
||||
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.
|
||||
|
||||
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;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
TYPE
|
||||
XPLMCameraControlDuration = (
|
||||
{ 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. }
|
||||
,xplm_ControlCameraForever = 2
|
||||
|
||||
);
|
||||
PXPLMCameraControlDuration = ^XPLMCameraControlDuration;
|
||||
|
||||
{
|
||||
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).
|
||||
}
|
||||
XPLMCameraPosition_t = RECORD
|
||||
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.
|
||||
|
||||
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;
|
||||
|
||||
{
|
||||
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 new view mode is set by the user).
|
||||
}
|
||||
PROCEDURE XPLMControlCamera(
|
||||
inHowLong : XPLMCameraControlDuration;
|
||||
inControlFunc : XPLMCameraControl_f;
|
||||
inRefcon : pointer);
|
||||
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.
|
||||
|
||||
For maximum compatibility you should not use this routine unless you are in
|
||||
posession of the camera.
|
||||
}
|
||||
PROCEDURE XPLMDontControlCamera;
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMIsCameraBeingControlled(
|
||||
outCameraControlDuration: PXPLMCameraControlDuration) : Integer; { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMReadCameraPosition
|
||||
|
||||
This function reads the current camera position.
|
||||
}
|
||||
PROCEDURE XPLMReadCameraPosition(
|
||||
outCameraPosition : PXPLMCameraPosition_t);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,690 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMDataAccess;
|
||||
INTERFACE
|
||||
{
|
||||
The data access API gives you a generic, flexible, high performance way to
|
||||
read and write data to and from X-Plane and other plug-ins. For example,
|
||||
this API allows you to read and set the nav radios, get the plane location,
|
||||
determine the current effective graphics frame rate, etc.
|
||||
|
||||
The data access APIs are the way that you read and write data from the sim
|
||||
as well as other plugins.
|
||||
|
||||
The API works using opaque data references. A data reference is a source of
|
||||
data; you do not know where it comes from, but once you have it you can
|
||||
read the data quickly and possibly write it.
|
||||
|
||||
Dataref Lookup
|
||||
--------------
|
||||
|
||||
Data references are identified by verbose, permanent string names; by
|
||||
convention these names use path separates to form a hierarchy of datarefs,
|
||||
e.g. (sim/cockpit/radios/nav1_freq_hz). The actual opaque numeric value of
|
||||
the data reference, as returned by the XPLM API, is implementation defined
|
||||
and changes each time X-Plane is launched; therefore you need to look up
|
||||
the dataref by path every time your plugin runs.
|
||||
|
||||
The task of looking up a data reference is relatively expensive; look up
|
||||
your data references once based on the verbose path strings, and save the
|
||||
opaque data reference value for the duration of your plugin's operation.
|
||||
Reading and writing data references is relatively fast (the cost is
|
||||
equivalent to two function calls through function pointers).
|
||||
|
||||
X-Plane publishes over 4000 datarefs; a complete list may be found in the
|
||||
reference section of the SDK online documentation (from the SDK home page,
|
||||
choose Documentation).
|
||||
|
||||
Dataref Types
|
||||
-------------
|
||||
|
||||
A note on typing: you must know the correct data type to read and write.
|
||||
APIs are provided for reading and writing data in a number of ways. You can
|
||||
also double check the data type for a data ref. Automatic type conversion
|
||||
is not done for you.
|
||||
|
||||
Dataref types are a set, e.g. a dataref can be more than one type. When
|
||||
this happens, you can choose which API you want to use to read. For
|
||||
example, it is not uncommon for a dataref to be of type float and double.
|
||||
This means you can use either XPLMGetDatad or XPLMGetDataf to read it.
|
||||
|
||||
Creating New Datarefs
|
||||
---------------------
|
||||
|
||||
X-Plane provides datarefs that come with the sim, but plugins can also
|
||||
create their own datarefs. A plugin creates a dataref by registering
|
||||
function callbacks to read and write the dataref. The XPLM will call your
|
||||
plugin each time some other plugin (or X-Plane) tries to read or write the
|
||||
dataref. You must provide a read (and optional write) callback for each
|
||||
data type you support.
|
||||
|
||||
A note for plugins sharing data with other plugins: the load order of
|
||||
plugins is not guaranteed. To make sure that every plugin publishing data
|
||||
has published their data references before other plugins try to subscribe,
|
||||
publish your data references in your start routine but resolve them the
|
||||
first time your 'enable' routine is called, or the first time they are
|
||||
needed in code.
|
||||
|
||||
When a plugin that created a dataref is unloaded, it becomes "orphaned".
|
||||
The dataref handle continues to be usable, but the dataref is not writable,
|
||||
and reading it will always return 0 (or 0 items for arrays). If the plugin
|
||||
is reloaded and re-registers the dataref, the handle becomes un-orphaned
|
||||
and works again.
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* READING AND WRITING DATA
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These routines allow you to access data from within X-Plane and sometimes
|
||||
modify it.
|
||||
}
|
||||
|
||||
|
||||
TYPE
|
||||
{
|
||||
XPLMDataRef
|
||||
|
||||
A data ref is an opaque handle to data provided by the simulator or another
|
||||
plugin. It uniquely identifies one variable (or array of variables) over
|
||||
the lifetime of your plugin. You never hard code these values; you always
|
||||
get them from XPLMFindDataRef.
|
||||
}
|
||||
XPLMDataRef = pointer;
|
||||
PXPLMDataRef = ^XPLMDataRef;
|
||||
|
||||
{
|
||||
XPLMDataTypeID
|
||||
|
||||
This is an enumeration that defines the type of the data behind a data
|
||||
reference. This allows you to sanity check that the data type matches what
|
||||
you expect. But for the most part, you will know the type of data you are
|
||||
expecting from the online documentation.
|
||||
|
||||
Data types each take a bit field; it is legal to have a single dataref be
|
||||
more than one type of data. Whe this happens, you can pick any matching
|
||||
get/set API.
|
||||
}
|
||||
XPLMDataTypeID = (
|
||||
{ Data of a type the current XPLM doesn't do. }
|
||||
xplmType_Unknown = 0
|
||||
|
||||
{ A single 4-byte integer, native endian. }
|
||||
,xplmType_Int = 1
|
||||
|
||||
{ A single 4-byte float, native endian. }
|
||||
,xplmType_Float = 2
|
||||
|
||||
{ A single 8-byte double, native endian. }
|
||||
,xplmType_Double = 4
|
||||
|
||||
{ An array of 4-byte floats, native endian. }
|
||||
,xplmType_FloatArray = 8
|
||||
|
||||
{ An array of 4-byte integers, native endian. }
|
||||
,xplmType_IntArray = 16
|
||||
|
||||
{ A variable block of data. }
|
||||
,xplmType_Data = 32
|
||||
|
||||
);
|
||||
PXPLMDataTypeID = ^XPLMDataTypeID;
|
||||
|
||||
{
|
||||
XPLMFindDataRef
|
||||
|
||||
Given a c-style string that names the data ref, this routine looks up the
|
||||
actual opaque XPLMDataRef that you use to read and write the data. The
|
||||
string names for datarefs are published on the X-Plane SDK web site.
|
||||
|
||||
This function returns NULL if the data ref cannot be found.
|
||||
|
||||
NOTE: this function is relatively expensive; save the XPLMDataRef this
|
||||
function returns for future use. Do not look up your data ref by string
|
||||
every time you need to read or write it.
|
||||
}
|
||||
FUNCTION XPLMFindDataRef(
|
||||
inDataRefName : XPLMString) : XPLMDataRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCanWriteDataRef
|
||||
|
||||
Given a data ref, this routine returns true if you can successfully set the
|
||||
data, false otherwise. Some datarefs are read-only.
|
||||
|
||||
NOTE: even if a dataref is marked writable, it may not act writable. This
|
||||
can happen for datarefs that X-Plane writes to on every frame of
|
||||
simulation. In some cases, the dataref is writable but you have to set a
|
||||
separate "override" dataref to 1 to stop X-Plane from writing it.
|
||||
}
|
||||
FUNCTION XPLMCanWriteDataRef(
|
||||
inDataRef : XPLMDataRef) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMIsDataRefGood
|
||||
|
||||
This function returns true if the passed in handle is a valid dataref that
|
||||
is not orphaned.
|
||||
|
||||
Note: there is normally no need to call this function; datarefs returned by
|
||||
XPLMFindDataRef remain valid (but possibly orphaned) unless there is a
|
||||
complete plugin reload (in which case your plugin is reloaded anyway).
|
||||
Orphaned datarefs can be safely read and return 0. Therefore you never need
|
||||
to call XPLMIsDataRefGood to 'check' the safety of a dataref.
|
||||
(XPLMIsDatarefGood performs some slow checking of the handle validity, so
|
||||
it has a perormance cost.)
|
||||
}
|
||||
FUNCTION XPLMIsDataRefGood(
|
||||
inDataRef : XPLMDataRef) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDataRefTypes
|
||||
|
||||
This routine returns the types of the data ref for accessor use. If a data
|
||||
ref is available in multiple data types, the bit-wise OR of these types
|
||||
will be returned.
|
||||
}
|
||||
FUNCTION XPLMGetDataRefTypes(
|
||||
inDataRef : XPLMDataRef) : XPLMDataTypeID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* DATA ACCESSORS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These routines read and write the data references. For each supported data
|
||||
type there is a reader and a writer.
|
||||
|
||||
If the data ref is orphaned or the plugin that provides it is disabled or
|
||||
there is a type mismatch, the functions that read data will return 0 as a
|
||||
default value or not modify the passed in memory. The plugins that write
|
||||
data will not write under these circumstances or if the data ref is
|
||||
read-only.
|
||||
|
||||
NOTE: to keep the overhead of reading datarefs low, these routines do not
|
||||
do full validation of a dataref; passing a junk value for a dataref can
|
||||
result in crashing the sim. The get/set APIs do check for NULL.
|
||||
|
||||
For array-style datarefs, you specify the number of items to read/write and
|
||||
the offset into the array; the actual number of items read or written is
|
||||
returned. This may be less to prevent an array-out-of-bounds error.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMGetDatai
|
||||
|
||||
Read an integer data ref and return its value. The return value is the
|
||||
dataref value or 0 if the dataref is NULL or the plugin is disabled.
|
||||
}
|
||||
FUNCTION XPLMGetDatai(
|
||||
inDataRef : XPLMDataRef) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDatai
|
||||
|
||||
Write a new value to an integer data ref. This routine is a no-op if the
|
||||
plugin publishing the dataref is disabled, the dataref is NULL, or the
|
||||
dataref is not writable.
|
||||
}
|
||||
PROCEDURE XPLMSetDatai(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValue : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDataf
|
||||
|
||||
Read a single precision floating point dataref and return its value. The
|
||||
return value is the dataref value or 0.0 if the dataref is NULL or the
|
||||
plugin is disabled.
|
||||
}
|
||||
FUNCTION XPLMGetDataf(
|
||||
inDataRef : XPLMDataRef) : Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDataf
|
||||
|
||||
Write a new value to a single precision floating point data ref. This
|
||||
routine is a no-op if the plugin publishing the dataref is disabled, the
|
||||
dataref is NULL, or the dataref is not writable.
|
||||
}
|
||||
PROCEDURE XPLMSetDataf(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValue : Single);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDatad
|
||||
|
||||
Read a double precision floating point dataref and return its value. The
|
||||
return value is the dataref value or 0.0 if the dataref is NULL or the
|
||||
plugin is disabled.
|
||||
}
|
||||
FUNCTION XPLMGetDatad(
|
||||
inDataRef : XPLMDataRef) : Real;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDatad
|
||||
|
||||
Write a new value to a double precision floating point data ref. This
|
||||
routine is a no-op if the plugin publishing the dataref is disabled, the
|
||||
dataref is NULL, or the dataref is not writable.
|
||||
}
|
||||
PROCEDURE XPLMSetDatad(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValue : Real);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDatavi
|
||||
|
||||
Read a part of an integer array dataref. If you pass NULL for outValues,
|
||||
the routine will return the size of the array, ignoring inOffset and inMax.
|
||||
|
||||
If outValues is not NULL, then up to inMax values are copied from the
|
||||
dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
inOffset is larger than the size of the dataref, less than inMax values
|
||||
will be copied. The number of values copied is returned.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
FUNCTION XPLMGetDatavi(
|
||||
inDataRef : XPLMDataRef;
|
||||
outValues : PInteger; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMax : Integer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDatavi
|
||||
|
||||
Write part or all of an integer array dataref. The values passed by
|
||||
inValues are written into the dataref starting at inOffset. Up to inCount
|
||||
values are written; however if the values would write "off the end" of the
|
||||
dataref array, then fewer values are written.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
PROCEDURE XPLMSetDatavi(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValues : PInteger;
|
||||
inoffset : Integer;
|
||||
inCount : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDatavf
|
||||
|
||||
Read a part of a single precision floating point array dataref. If you pass
|
||||
NULL for outVaules, the routine will return the size of the array, ignoring
|
||||
inOffset and inMax.
|
||||
|
||||
If outValues is not NULL, then up to inMax values are copied from the
|
||||
dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
inOffset is larger than the size of the dataref, less than inMax values
|
||||
will be copied. The number of values copied is returned.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
FUNCTION XPLMGetDatavf(
|
||||
inDataRef : XPLMDataRef;
|
||||
outValues : PSingle; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMax : Integer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDatavf
|
||||
|
||||
Write part or all of a single precision floating point array dataref. The
|
||||
values passed by inValues are written into the dataref starting at
|
||||
inOffset. Up to inCount values are written; however if the values would
|
||||
write "off the end" of the dataref array, then fewer values are written.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
PROCEDURE XPLMSetDatavf(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValues : PSingle;
|
||||
inoffset : Integer;
|
||||
inCount : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDatab
|
||||
|
||||
Read a part of a byte array dataref. If you pass NULL for outVaules, the
|
||||
routine will return the size of the array, ignoring inOffset and inMax.
|
||||
|
||||
If outValues is not NULL, then up to inMax values are copied from the
|
||||
dataref into outValues, starting at inOffset in the dataref. If inMax +
|
||||
inOffset is larger than the size of the dataref, less than inMax values
|
||||
will be copied. The number of values copied is returned.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
FUNCTION XPLMGetDatab(
|
||||
inDataRef : XPLMDataRef;
|
||||
outValue : pointer; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMaxBytes : Integer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDatab
|
||||
|
||||
Write part or all of a byte array dataref. The values passed by inValues
|
||||
are written into the dataref starting at inOffset. Up to inCount values are
|
||||
written; however if the values would write "off the end" of the dataref
|
||||
array, then fewer values are written.
|
||||
|
||||
Note: the semantics of array datarefs are entirely implemented by the
|
||||
plugin (or X-Plane) that provides the dataref, not the SDK itself; the
|
||||
above description is how these datarefs are intended to work, but a rogue
|
||||
plugin may have different behavior.
|
||||
}
|
||||
PROCEDURE XPLMSetDatab(
|
||||
inDataRef : XPLMDataRef;
|
||||
inValue : pointer;
|
||||
inOffset : Integer;
|
||||
inLength : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* PUBLISHING YOUR PLUGIN'S DATA
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
These functions allow you to create data references that other plug-ins and
|
||||
X-Plane can access via the above data access APIs. Data references
|
||||
published by other plugins operate the same as ones published by X-Plane in
|
||||
all manners except that your data reference will not be available to other
|
||||
plugins if/when your plugin is disabled.
|
||||
|
||||
You share data by registering data provider callback functions. When a
|
||||
plug-in requests your data, these callbacks are then called. You provide
|
||||
one callback to return the value when a plugin 'reads' it and another to
|
||||
change the value when a plugin 'writes' it.
|
||||
|
||||
Important: you must pick a prefix for your datarefs other than "sim/" -
|
||||
this prefix is reserved for X-Plane. The X-Plane SDK website contains a
|
||||
registry where authors can select a unique first word for dataref names, to
|
||||
prevent dataref collisions between plugins.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMGetDatai_f
|
||||
|
||||
Data provider function pointers.
|
||||
|
||||
These define the function pointers you provide to get or set data. Note
|
||||
that you are passed a generic pointer for each one. This is the same
|
||||
pointer you pass in your register routine; you can use it to locate plugin
|
||||
variables, etc.
|
||||
|
||||
The semantics of your callbacks are the same as the dataref accessor above
|
||||
- basically routines like XPLMGetDatai are just pass-throughs from a caller
|
||||
to your plugin. Be particularly mindful in implementing array dataref
|
||||
read-write accessors; you are responsible for avoiding overruns, supporting
|
||||
offset read/writes, and handling a read with a NULL buffer.
|
||||
}
|
||||
TYPE
|
||||
XPLMGetDatai_f = FUNCTION(
|
||||
inRefcon : pointer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDatai_f
|
||||
}
|
||||
XPLMSetDatai_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValue : Integer); cdecl;
|
||||
|
||||
{
|
||||
XPLMGetDataf_f
|
||||
}
|
||||
XPLMGetDataf_f = FUNCTION(
|
||||
inRefcon : pointer) : Single; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDataf_f
|
||||
}
|
||||
XPLMSetDataf_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValue : Single); cdecl;
|
||||
|
||||
{
|
||||
XPLMGetDatad_f
|
||||
}
|
||||
XPLMGetDatad_f = FUNCTION(
|
||||
inRefcon : pointer) : Real; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDatad_f
|
||||
}
|
||||
XPLMSetDatad_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValue : Real); cdecl;
|
||||
|
||||
{
|
||||
XPLMGetDatavi_f
|
||||
}
|
||||
XPLMGetDatavi_f = FUNCTION(
|
||||
inRefcon : pointer;
|
||||
outValues : PInteger; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMax : Integer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDatavi_f
|
||||
}
|
||||
XPLMSetDatavi_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValues : PInteger;
|
||||
inOffset : Integer;
|
||||
inCount : Integer); cdecl;
|
||||
|
||||
{
|
||||
XPLMGetDatavf_f
|
||||
}
|
||||
XPLMGetDatavf_f = FUNCTION(
|
||||
inRefcon : pointer;
|
||||
outValues : PSingle; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMax : Integer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDatavf_f
|
||||
}
|
||||
XPLMSetDatavf_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValues : PSingle;
|
||||
inOffset : Integer;
|
||||
inCount : Integer); cdecl;
|
||||
|
||||
{
|
||||
XPLMGetDatab_f
|
||||
}
|
||||
XPLMGetDatab_f = FUNCTION(
|
||||
inRefcon : pointer;
|
||||
outValue : pointer; { Can be nil }
|
||||
inOffset : Integer;
|
||||
inMaxLength : Integer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMSetDatab_f
|
||||
}
|
||||
XPLMSetDatab_f = PROCEDURE(
|
||||
inRefcon : pointer;
|
||||
inValue : pointer;
|
||||
inOffset : Integer;
|
||||
inLength : Integer); cdecl;
|
||||
|
||||
{
|
||||
XPLMRegisterDataAccessor
|
||||
|
||||
This routine creates a new item of data that can be read and written. Pass
|
||||
in the data's full name for searching, the type(s) of the data for
|
||||
accessing, and whether the data can be written to. For each data type you
|
||||
support, pass in a read accessor function and a write accessor function if
|
||||
necessary. Pass NULL for data types you do not support or write accessors
|
||||
if you are read-only.
|
||||
|
||||
You are returned a data ref for the new item of data created. You can use
|
||||
this data ref to unregister your data later or read or write from it.
|
||||
}
|
||||
FUNCTION XPLMRegisterDataAccessor(
|
||||
inDataName : XPLMString;
|
||||
inDataType : XPLMDataTypeID;
|
||||
inIsWritable : Integer;
|
||||
inReadInt : XPLMGetDatai_f;
|
||||
inWriteInt : XPLMSetDatai_f;
|
||||
inReadFloat : XPLMGetDataf_f;
|
||||
inWriteFloat : XPLMSetDataf_f;
|
||||
inReadDouble : XPLMGetDatad_f;
|
||||
inWriteDouble : XPLMSetDatad_f;
|
||||
inReadIntArray : XPLMGetDatavi_f;
|
||||
inWriteIntArray : XPLMSetDatavi_f;
|
||||
inReadFloatArray : XPLMGetDatavf_f;
|
||||
inWriteFloatArray : XPLMSetDatavf_f;
|
||||
inReadData : XPLMGetDatab_f;
|
||||
inWriteData : XPLMSetDatab_f;
|
||||
inReadRefcon : pointer;
|
||||
inWriteRefcon : pointer) : XPLMDataRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMUnregisterDataAccessor
|
||||
|
||||
Use this routine to unregister any data accessors you may have registered.
|
||||
You unregister a data ref by the XPLMDataRef you get back from
|
||||
registration. Once you unregister a data ref, your function pointer will
|
||||
not be called anymore.
|
||||
}
|
||||
PROCEDURE XPLMUnregisterDataAccessor(
|
||||
inDataRef : XPLMDataRef);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* SHARING DATA BETWEEN MULTIPLE PLUGINS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The data reference registration APIs from the previous section allow a
|
||||
plugin to publish data in a one-owner manner; the plugin that publishes the
|
||||
data reference owns the real memory that the data ref uses. This is
|
||||
satisfactory for most cases, but there are also cases where plugnis need to
|
||||
share actual data.
|
||||
|
||||
With a shared data reference, no one plugin owns the actual memory for the
|
||||
data reference; the plugin SDK allocates that for you. When the first
|
||||
plugin asks to 'share' the data, the memory is allocated. When the data is
|
||||
changed, every plugin that is sharing the data is notified.
|
||||
|
||||
Shared data references differ from the 'owned' data references from the
|
||||
previous section in a few ways:
|
||||
|
||||
* With shared data references, any plugin can create the data reference;
|
||||
with owned plugins one plugin must create the data reference and others
|
||||
subscribe. (This can be a problem if you don't know which set of plugins
|
||||
will be present).
|
||||
|
||||
* With shared data references, every plugin that is sharing the data is
|
||||
notified when the data is changed. With owned data references, only the
|
||||
one owner is notified when the data is changed.
|
||||
|
||||
* With shared data references, you cannot access the physical memory of the
|
||||
data reference; you must use the XPLMGet... and XPLMSet... APIs. With an
|
||||
owned data reference, the one owning data reference can manipulate the
|
||||
data reference's memory in any way it sees fit.
|
||||
|
||||
Shared data references solve two problems: if you need to have a data
|
||||
reference used by several plugins but do not know which plugins will be
|
||||
installed, or if all plugins sharing data need to be notified when that
|
||||
data is changed, use shared data references.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMDataChanged_f
|
||||
|
||||
An XPLMDataChanged_f is a callback that the XPLM calls whenever any other
|
||||
plug-in modifies shared data. A refcon you provide is passed back to help
|
||||
identify which data is being changed. In response, you may want to call one
|
||||
of the XPLMGetDataxxx routines to find the new value of the data.
|
||||
}
|
||||
TYPE
|
||||
XPLMDataChanged_f = PROCEDURE(
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMShareData
|
||||
|
||||
This routine connects a plug-in to shared data, creating the shared data if
|
||||
necessary. inDataName is a standard path for the data ref, and inDataType
|
||||
specifies the type. This function will create the data if it does not
|
||||
exist. If the data already exists but the type does not match, an error is
|
||||
returned, so it is important that plug-in authors collaborate to establish
|
||||
public standards for shared data.
|
||||
|
||||
If a notificationFunc is passed in and is not NULL, that notification
|
||||
function will be called whenever the data is modified. The notification
|
||||
refcon will be passed to it. This allows your plug-in to know which shared
|
||||
data was changed if multiple shared data are handled by one callback, or if
|
||||
the plug-in does not use global variables.
|
||||
|
||||
A one is returned for successfully creating or finding the shared data; a
|
||||
zero if the data already exists but is of the wrong type.
|
||||
}
|
||||
FUNCTION XPLMShareData(
|
||||
inDataName : XPLMString;
|
||||
inDataType : XPLMDataTypeID;
|
||||
inNotificationFunc : XPLMDataChanged_f;
|
||||
inNotificationRefcon: pointer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMUnshareData
|
||||
|
||||
This routine removes your notification function for shared data. Call it
|
||||
when done with the data to stop receiving change notifications. Arguments
|
||||
must match XPLMShareData. The actual memory will not necessarily be freed,
|
||||
since other plug-ins could be using it.
|
||||
}
|
||||
FUNCTION XPLMUnshareData(
|
||||
inDataName : XPLMString;
|
||||
inDataType : XPLMDataTypeID;
|
||||
inNotificationFunc : XPLMDataChanged_f;
|
||||
inNotificationRefcon: pointer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,438 @@
|
||||
{
|
||||
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.
|
||||
|
||||
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 LINUX}
|
||||
{$DEFINE KYLIX}
|
||||
{$ENDIF}
|
||||
TYPE
|
||||
{$IFNDEF DELPHI}
|
||||
{$IFNDEF KYLIX}
|
||||
Pchar = ^char;
|
||||
Ppchar = ^Pchar;
|
||||
Psingle = ^single;
|
||||
Pinteger = ^integer;
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
Preal = ^real;
|
||||
Plongint = ^longint;
|
||||
{___________________________________________________________________________
|
||||
* DLL Definitions
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
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.)
|
||||
}
|
||||
|
||||
|
||||
|
||||
{___________________________________________________________________________
|
||||
* GLOBAL DEFINITIONS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
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. 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
|
||||
|
||||
-1 indicates no plug-in.
|
||||
}
|
||||
XPLMPluginID = Integer;
|
||||
PXPLMPluginID = ^XPLMPluginID;
|
||||
|
||||
CONST
|
||||
{ No plugin. }
|
||||
XPLM_NO_PLUGIN_ID = (-1);
|
||||
|
||||
{ X-Plane itself }
|
||||
XPLM_PLUGIN_XPLANE = (0);
|
||||
|
||||
{ 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.
|
||||
|
||||
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 }
|
||||
xplm_ShiftFlag = 1
|
||||
|
||||
{ The option or alt key is down }
|
||||
,xplm_OptionAltFlag = 2
|
||||
|
||||
{ The control key is down* }
|
||||
,xplm_ControlFlag = 4
|
||||
|
||||
{ The key is being pressed down }
|
||||
,xplm_DownFlag = 8
|
||||
|
||||
{ The key is being released }
|
||||
,xplm_UpFlag = 16
|
||||
|
||||
);
|
||||
PXPLMKeyFlags = ^XPLMKeyFlags;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
|
||||
|
||||
CONST
|
||||
XPLM_KEY_RETURN = 13;
|
||||
|
||||
XPLM_KEY_ESCAPE = 27;
|
||||
|
||||
XPLM_KEY_TAB = 9;
|
||||
|
||||
XPLM_KEY_DELETE = 8;
|
||||
|
||||
XPLM_KEY_LEFT = 28;
|
||||
|
||||
XPLM_KEY_RIGHT = 29;
|
||||
|
||||
XPLM_KEY_UP = 30;
|
||||
|
||||
XPLM_KEY_DOWN = 31;
|
||||
|
||||
XPLM_KEY_0 = 48;
|
||||
|
||||
XPLM_KEY_1 = 49;
|
||||
|
||||
XPLM_KEY_2 = 50;
|
||||
|
||||
XPLM_KEY_3 = 51;
|
||||
|
||||
XPLM_KEY_4 = 52;
|
||||
|
||||
XPLM_KEY_5 = 53;
|
||||
|
||||
XPLM_KEY_6 = 54;
|
||||
|
||||
XPLM_KEY_7 = 55;
|
||||
|
||||
XPLM_KEY_8 = 56;
|
||||
|
||||
XPLM_KEY_9 = 57;
|
||||
|
||||
XPLM_KEY_DECIMAL = 46;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* 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).
|
||||
|
||||
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:
|
||||
|
||||
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;
|
||||
|
||||
XPLM_VK_TAB = $09;
|
||||
|
||||
XPLM_VK_CLEAR = $0C;
|
||||
|
||||
XPLM_VK_RETURN = $0D;
|
||||
|
||||
XPLM_VK_ESCAPE = $1B;
|
||||
|
||||
XPLM_VK_SPACE = $20;
|
||||
|
||||
XPLM_VK_PRIOR = $21;
|
||||
|
||||
XPLM_VK_NEXT = $22;
|
||||
|
||||
XPLM_VK_END = $23;
|
||||
|
||||
XPLM_VK_HOME = $24;
|
||||
|
||||
XPLM_VK_LEFT = $25;
|
||||
|
||||
XPLM_VK_UP = $26;
|
||||
|
||||
XPLM_VK_RIGHT = $27;
|
||||
|
||||
XPLM_VK_DOWN = $28;
|
||||
|
||||
XPLM_VK_SELECT = $29;
|
||||
|
||||
XPLM_VK_PRINT = $2A;
|
||||
|
||||
XPLM_VK_EXECUTE = $2B;
|
||||
|
||||
XPLM_VK_SNAPSHOT = $2C;
|
||||
|
||||
XPLM_VK_INSERT = $2D;
|
||||
|
||||
XPLM_VK_DELETE = $2E;
|
||||
|
||||
XPLM_VK_HELP = $2F;
|
||||
|
||||
{ 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;
|
||||
|
||||
XPLM_VK_2 = $32;
|
||||
|
||||
XPLM_VK_3 = $33;
|
||||
|
||||
XPLM_VK_4 = $34;
|
||||
|
||||
XPLM_VK_5 = $35;
|
||||
|
||||
XPLM_VK_6 = $36;
|
||||
|
||||
XPLM_VK_7 = $37;
|
||||
|
||||
XPLM_VK_8 = $38;
|
||||
|
||||
XPLM_VK_9 = $39;
|
||||
|
||||
{ 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;
|
||||
|
||||
XPLM_VK_C = $43;
|
||||
|
||||
XPLM_VK_D = $44;
|
||||
|
||||
XPLM_VK_E = $45;
|
||||
|
||||
XPLM_VK_F = $46;
|
||||
|
||||
XPLM_VK_G = $47;
|
||||
|
||||
XPLM_VK_H = $48;
|
||||
|
||||
XPLM_VK_I = $49;
|
||||
|
||||
XPLM_VK_J = $4A;
|
||||
|
||||
XPLM_VK_K = $4B;
|
||||
|
||||
XPLM_VK_L = $4C;
|
||||
|
||||
XPLM_VK_M = $4D;
|
||||
|
||||
XPLM_VK_N = $4E;
|
||||
|
||||
XPLM_VK_O = $4F;
|
||||
|
||||
XPLM_VK_P = $50;
|
||||
|
||||
XPLM_VK_Q = $51;
|
||||
|
||||
XPLM_VK_R = $52;
|
||||
|
||||
XPLM_VK_S = $53;
|
||||
|
||||
XPLM_VK_T = $54;
|
||||
|
||||
XPLM_VK_U = $55;
|
||||
|
||||
XPLM_VK_V = $56;
|
||||
|
||||
XPLM_VK_W = $57;
|
||||
|
||||
XPLM_VK_X = $58;
|
||||
|
||||
XPLM_VK_Y = $59;
|
||||
|
||||
XPLM_VK_Z = $5A;
|
||||
|
||||
XPLM_VK_NUMPAD0 = $60;
|
||||
|
||||
XPLM_VK_NUMPAD1 = $61;
|
||||
|
||||
XPLM_VK_NUMPAD2 = $62;
|
||||
|
||||
XPLM_VK_NUMPAD3 = $63;
|
||||
|
||||
XPLM_VK_NUMPAD4 = $64;
|
||||
|
||||
XPLM_VK_NUMPAD5 = $65;
|
||||
|
||||
XPLM_VK_NUMPAD6 = $66;
|
||||
|
||||
XPLM_VK_NUMPAD7 = $67;
|
||||
|
||||
XPLM_VK_NUMPAD8 = $68;
|
||||
|
||||
XPLM_VK_NUMPAD9 = $69;
|
||||
|
||||
XPLM_VK_MULTIPLY = $6A;
|
||||
|
||||
XPLM_VK_ADD = $6B;
|
||||
|
||||
XPLM_VK_SEPARATOR = $6C;
|
||||
|
||||
XPLM_VK_SUBTRACT = $6D;
|
||||
|
||||
XPLM_VK_DECIMAL = $6E;
|
||||
|
||||
XPLM_VK_DIVIDE = $6F;
|
||||
|
||||
XPLM_VK_F1 = $70;
|
||||
|
||||
XPLM_VK_F2 = $71;
|
||||
|
||||
XPLM_VK_F3 = $72;
|
||||
|
||||
XPLM_VK_F4 = $73;
|
||||
|
||||
XPLM_VK_F5 = $74;
|
||||
|
||||
XPLM_VK_F6 = $75;
|
||||
|
||||
XPLM_VK_F7 = $76;
|
||||
|
||||
XPLM_VK_F8 = $77;
|
||||
|
||||
XPLM_VK_F9 = $78;
|
||||
|
||||
XPLM_VK_F10 = $79;
|
||||
|
||||
XPLM_VK_F11 = $7A;
|
||||
|
||||
XPLM_VK_F12 = $7B;
|
||||
|
||||
XPLM_VK_F13 = $7C;
|
||||
|
||||
XPLM_VK_F14 = $7D;
|
||||
|
||||
XPLM_VK_F15 = $7E;
|
||||
|
||||
XPLM_VK_F16 = $7F;
|
||||
|
||||
XPLM_VK_F17 = $80;
|
||||
|
||||
XPLM_VK_F18 = $81;
|
||||
|
||||
XPLM_VK_F19 = $82;
|
||||
|
||||
XPLM_VK_F20 = $83;
|
||||
|
||||
XPLM_VK_F21 = $84;
|
||||
|
||||
XPLM_VK_F22 = $85;
|
||||
|
||||
XPLM_VK_F23 = $86;
|
||||
|
||||
XPLM_VK_F24 = $87;
|
||||
|
||||
{ The following definitions are extended and are not based on the Microsoft }
|
||||
{ key set. }
|
||||
XPLM_VK_EQUAL = $B0;
|
||||
|
||||
XPLM_VK_MINUS = $B1;
|
||||
|
||||
XPLM_VK_RBRACE = $B2;
|
||||
|
||||
XPLM_VK_LBRACE = $B3;
|
||||
|
||||
XPLM_VK_QUOTE = $B4;
|
||||
|
||||
XPLM_VK_SEMICOLON = $B5;
|
||||
|
||||
XPLM_VK_BACKSLASH = $B6;
|
||||
|
||||
XPLM_VK_COMMA = $B7;
|
||||
|
||||
XPLM_VK_SLASH = $B8;
|
||||
|
||||
XPLM_VK_PERIOD = $B9;
|
||||
|
||||
XPLM_VK_BACKQUOTE = $BA;
|
||||
|
||||
XPLM_VK_ENTER = $BB;
|
||||
|
||||
XPLM_VK_NUMPAD_ENT = $BC;
|
||||
|
||||
XPLM_VK_NUMPAD_EQ = $BD;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,424 @@
|
||||
{
|
||||
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
|
||||
{
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE GRAPHICS
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
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.
|
||||
|
||||
*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. }
|
||||
xplm_Tex_GeneralInterface = 0
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ The exterior paint for the user's aircraft (daytime). }
|
||||
,xplm_Tex_AircraftPaint = 1
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ The exterior light map for the user's aircraft. }
|
||||
,xplm_Tex_AircraftLiteMap = 2
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
);
|
||||
PXPLMTextureID = ^XPLMTextureID;
|
||||
|
||||
{
|
||||
XPLMSetGraphicsState
|
||||
|
||||
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);
|
||||
- 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);
|
||||
|
||||
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 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.
|
||||
|
||||
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);
|
||||
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.
|
||||
|
||||
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, ....);
|
||||
}
|
||||
PROCEDURE XPLMBindTexture2d(
|
||||
inTextureNum : Integer;
|
||||
inTextureUnit : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGenerateTextureNumbers
|
||||
|
||||
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);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMGetTexture
|
||||
|
||||
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;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMWorldToLocal(
|
||||
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.
|
||||
|
||||
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);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMDrawTranslucentDarkBox(
|
||||
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.
|
||||
|
||||
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.
|
||||
}
|
||||
TYPE
|
||||
XPLMFontID = (
|
||||
{ Mono-spaced font for user interface. Available in all versions of the SDK.}
|
||||
xplmFont_Basic = 0
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Menus = 1
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Metal = 2
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Led = 3
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_LedWide = 4
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelHUD = 5
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelEFIS = 6
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_PanelGPS = 7
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosGA = 8
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosBC = 9
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosHM = 10
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosGANarrow = 11
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosBCNarrow = 12
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_RadiosHMNarrow = 13
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Timer = 14
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_FullRound = 15
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_SmallRound = 16
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{ Deprecated, do not use. }
|
||||
,xplmFont_Menus_Localized = 17
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{ Proportional UI font. }
|
||||
,xplmFont_Proportional = 18
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
);
|
||||
PXPLMFontID = ^XPLMFontID;
|
||||
|
||||
{
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMDrawString(
|
||||
inColorRGB : PSingle;
|
||||
inXOffset : Integer;
|
||||
inYOffset : Integer;
|
||||
inChar : XPLMString;
|
||||
inWordWrapWidth : PInteger; { Can be nil }
|
||||
inFontID : XPLMFontID);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMDrawNumber(
|
||||
inColorRGB : PSingle;
|
||||
inXOffset : Integer;
|
||||
inYOffset : Integer;
|
||||
inValue : Real;
|
||||
inDigits : Integer;
|
||||
inDecimals : Integer;
|
||||
inShowSign : Integer;
|
||||
inFontID : XPLMFontID);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMGetFontDimensions(
|
||||
inFontID : XPLMFontID;
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMMeasureString(
|
||||
inFontID : XPLMFontID;
|
||||
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.
|
||||
@@ -0,0 +1,277 @@
|
||||
{
|
||||
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
|
||||
{
|
||||
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.
|
||||
|
||||
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, XPLMUtilities;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
TYPE
|
||||
XPLMMenuCheck = (
|
||||
{ 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). }
|
||||
,xplm_Menu_Unchecked = 1
|
||||
|
||||
{ the menu has a mark next to it that is checked (lit). }
|
||||
,xplm_Menu_Checked = 2
|
||||
|
||||
);
|
||||
PXPLMMenuCheck = ^XPLMMenuCheck;
|
||||
|
||||
{
|
||||
XPLMMenuID
|
||||
|
||||
This is a unique ID for each menu you create.
|
||||
}
|
||||
XPLMMenuID = pointer;
|
||||
PXPLMMenuID = ^XPLMMenuID;
|
||||
|
||||
{
|
||||
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).
|
||||
}
|
||||
XPLMMenuHandler_f = PROCEDURE(
|
||||
inMenuRef : pointer;
|
||||
inItemRef : pointer); cdecl;
|
||||
|
||||
{
|
||||
XPLMFindPluginsMenu
|
||||
|
||||
This function returns the ID of the plug-ins menu, which is created for you
|
||||
at startup.
|
||||
}
|
||||
FUNCTION XPLMFindPluginsMenu: XPLMMenuID;
|
||||
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).
|
||||
|
||||
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 : XPLMString;
|
||||
inParentMenu : XPLMMenuID;
|
||||
inParentItem : Integer;
|
||||
inHandler : XPLMMenuHandler_f;
|
||||
inMenuRef : pointer) : XPLMMenuID;
|
||||
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.)
|
||||
}
|
||||
PROCEDURE XPLMDestroyMenu(
|
||||
inMenuID : XPLMMenuID);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMClearAllMenuItems(
|
||||
inMenuID : XPLMMenuID);
|
||||
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.
|
||||
|
||||
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 : XPLMString;
|
||||
inItemRef : pointer;
|
||||
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 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);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMSetMenuItemName(
|
||||
inMenu : XPLMMenuID;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMCheckMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
index : Integer;
|
||||
inCheck : XPLMMenuCheck);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMCheckMenuItemState(
|
||||
inMenu : XPLMMenuID;
|
||||
index : Integer;
|
||||
outCheck : PXPLMMenuCheck);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMEnableMenuItem
|
||||
|
||||
Sets whether this menu item is enabled. Items start out enabled.
|
||||
}
|
||||
PROCEDURE XPLMEnableMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMRemoveMenuItem(
|
||||
inMenu : XPLMMenuID;
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,350 @@
|
||||
{
|
||||
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
|
||||
{
|
||||
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.
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
|
||||
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 = (
|
||||
xplm_Nav_Unknown = 0
|
||||
|
||||
,xplm_Nav_Airport = 1
|
||||
|
||||
,xplm_Nav_NDB = 2
|
||||
|
||||
,xplm_Nav_VOR = 4
|
||||
|
||||
,xplm_Nav_ILS = 8
|
||||
|
||||
,xplm_Nav_Localizer = 16
|
||||
|
||||
,xplm_Nav_GlideSlope = 32
|
||||
|
||||
,xplm_Nav_OuterMarker = 64
|
||||
|
||||
,xplm_Nav_MiddleMarker = 128
|
||||
|
||||
,xplm_Nav_InnerMarker = 256
|
||||
|
||||
,xplm_Nav_Fix = 512
|
||||
|
||||
,xplm_Nav_DME = 1024
|
||||
|
||||
,xplm_Nav_LatLon = 2048
|
||||
|
||||
);
|
||||
PXPLMNavType = ^XPLMNavType;
|
||||
|
||||
{
|
||||
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.
|
||||
|
||||
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.
|
||||
}
|
||||
XPLMNavRef = Integer;
|
||||
PXPLMNavRef = ^XPLMNavRef;
|
||||
|
||||
CONST
|
||||
XPLM_NAV_NOT_FOUND = -1;
|
||||
|
||||
{
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMGetFirstNavAid: XPLMNavRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetNextNavAid
|
||||
|
||||
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;
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMFindFirstNavAidOfType(
|
||||
inType : XPLMNavType) : XPLMNavRef;
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMFindLastNavAidOfType(
|
||||
inType : XPLMNavType) : XPLMNavRef;
|
||||
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:
|
||||
|
||||
* 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 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.
|
||||
|
||||
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 : 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;
|
||||
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.
|
||||
|
||||
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 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 : 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.
|
||||
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMCountFMSEntries: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDisplayedFMSEntry
|
||||
|
||||
This routine returns the index of the entry the pilot is viewing.
|
||||
}
|
||||
FUNCTION XPLMGetDisplayedFMSEntry: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDestinationFMSEntry
|
||||
|
||||
This routine returns the index of the entry the FMS is flying to.
|
||||
}
|
||||
FUNCTION XPLMGetDestinationFMSEntry: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDisplayedFMSEntry
|
||||
|
||||
This routine changes which entry the FMS is showing to the index specified.
|
||||
}
|
||||
PROCEDURE XPLMSetDisplayedFMSEntry(
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetDestinationFMSEntry
|
||||
|
||||
This routine changes which entry the FMS is flying the aircraft toward.
|
||||
}
|
||||
PROCEDURE XPLMSetDestinationFMSEntry(
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetFMSEntryInfo
|
||||
|
||||
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;
|
||||
outType : PXPLMNavType; { 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 }
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMSetFMSEntryInfo(
|
||||
inIndex : Integer;
|
||||
inRef : XPLMNavRef;
|
||||
inAltitude : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSetFMSEntryLatLon
|
||||
|
||||
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);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMClearFMSEntry
|
||||
|
||||
This routine clears the given entry, potentially shortening the flight
|
||||
plan.
|
||||
}
|
||||
PROCEDURE XPLMClearFMSEntry(
|
||||
inIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{___________________________________________________________________________
|
||||
* GPS RECEIVER
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMGetGPSDestinationType: XPLMNavType;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetGPSDestination
|
||||
|
||||
This routine returns the current GPS destination.
|
||||
}
|
||||
FUNCTION XPLMGetGPSDestination: XPLMNavRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,278 @@
|
||||
{
|
||||
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.
|
||||
|
||||
*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;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
PROCEDURE XPLMSetUsersAircraft(
|
||||
inAircraftPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
{
|
||||
XPLMPlaceUserAtAirport
|
||||
|
||||
This routine places the user at a given airport. Specify the airport by
|
||||
its X-Plane airport ID (e.g. 'KBOS').
|
||||
}
|
||||
PROCEDURE XPLMPlaceUserAtAirport(
|
||||
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. }
|
||||
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).
|
||||
|
||||
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;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMCountAircraft(
|
||||
outTotalAircraft : PInteger;
|
||||
outActiveAircraft : PInteger;
|
||||
outController : PXPLMPluginID);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMGetNthAircraftModel(
|
||||
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.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
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.
|
||||
}
|
||||
TYPE
|
||||
XPLMPlanesAvailable_f = PROCEDURE(
|
||||
inRefcon : pointer); cdecl;
|
||||
|
||||
{
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMAcquirePlanes(
|
||||
inAircraft : PXPLMString; { Can be nil }
|
||||
inCallback : XPLMPlanesAvailable_f;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMReleasePlanes;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMSetActiveAircraftCount(
|
||||
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).
|
||||
}
|
||||
PROCEDURE XPLMSetAircraftModel(
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMDisableAIForPlane(
|
||||
inPlaneIndex : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMDrawAircraft
|
||||
|
||||
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;
|
||||
inDrawStateInfo : PXPLMPlaneDrawState_t);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMReinitUsersPlane
|
||||
|
||||
WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or
|
||||
XPLMPlaceUserAtLocation.
|
||||
|
||||
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;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +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
|
||||
}
|
||||
|
||||
UNIT XPLMPlugin;
|
||||
INTERFACE
|
||||
{
|
||||
These APIs provide facilities to find and work with other plugins and
|
||||
manage other plugins.
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMGetMyID
|
||||
|
||||
This routine returns the plugin ID of the calling plug-in. Call this to
|
||||
get your own ID.
|
||||
}
|
||||
FUNCTION XPLMGetMyID: XPLMPluginID;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCountPlugins
|
||||
|
||||
This routine returns the total number of plug-ins that are loaded, both
|
||||
disabled and enabled.
|
||||
}
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMGetNthPlugin(
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMFindPluginByPath(
|
||||
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
|
||||
}
|
||||
FUNCTION XPLMFindPluginBySignature(
|
||||
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.
|
||||
|
||||
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 : 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.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMIsPluginEnabled
|
||||
|
||||
Returns whether the specified plug-in is enabled for running.
|
||||
}
|
||||
FUNCTION XPLMIsPluginEnabled(
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMEnablePlugin(
|
||||
inPluginID : XPLMPluginID) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDisablePlugin
|
||||
|
||||
This routine disableds an enabled plug-in.
|
||||
}
|
||||
PROCEDURE XPLMDisablePlugin(
|
||||
inPluginID : XPLMPluginID);
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMReloadPlugins;
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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. The }
|
||||
{ parameter is ignored. }
|
||||
XPLM_MSG_PLANE_CRASHED = 101;
|
||||
|
||||
{ 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 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. 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. The parameter}
|
||||
{ is ignored. }
|
||||
XPLM_MSG_AIRPLANE_COUNT_CHANGED = 105;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
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 XPLM200}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
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 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 contains the index number of the aircraft}
|
||||
{ whose livery is changing. }
|
||||
XPLM_MSG_LIVERY_LOADED = 108;
|
||||
{$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.
|
||||
}
|
||||
PROCEDURE XPLMSendMessageToPlugin(
|
||||
inPlugin : XPLMPluginID;
|
||||
inMessage : Integer;
|
||||
inParam : pointer);
|
||||
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.
|
||||
|
||||
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.
|
||||
}
|
||||
TYPE
|
||||
XPLMFeatureEnumerator_f = PROCEDURE(
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMHasFeature(
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMIsFeatureEnabled(
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMEnableFeature(
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMEnumerateFeatures(
|
||||
inEnumerator : XPLMFeatureEnumerator_f;
|
||||
inRef : pointer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +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
|
||||
}
|
||||
|
||||
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.
|
||||
|
||||
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;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* 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.
|
||||
}
|
||||
TYPE
|
||||
XPLMFlightLoopPhaseType = (
|
||||
{ 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. }
|
||||
,xplm_FlightLoop_Phase_AfterFlightModel = 1
|
||||
|
||||
);
|
||||
PXPLMFlightLoopPhaseType = ^XPLMFlightLoopPhaseType;
|
||||
{$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.
|
||||
}
|
||||
XPLMFlightLoopID = pointer;
|
||||
PXPLMFlightLoopID = ^XPLMFlightLoopID;
|
||||
{$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.
|
||||
|
||||
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 ptr constant from when you regitered yor callback.
|
||||
|
||||
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;
|
||||
|
||||
{$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.
|
||||
}
|
||||
TYPE
|
||||
XPLMCreateFlightLoop_t = RECORD
|
||||
structSize : Integer;
|
||||
phase : XPLMFlightLoopPhaseType;
|
||||
callbackFunc : XPLMFlightLoop_f;
|
||||
refcon : pointer;
|
||||
END;
|
||||
PXPLMCreateFlightLoop_t = ^XPLMCreateFlightLoop_t;
|
||||
{$ENDIF 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.
|
||||
}
|
||||
FUNCTION XPLMGetElapsedTime: Single;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetCycleNumber
|
||||
|
||||
This routine returns a counter starting at zero for each sim cycle
|
||||
computed/video frame rendered.
|
||||
}
|
||||
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 legacy function only installs pre-flight-loop callbacks; use
|
||||
XPLMCreateFlightLoop for more control.)
|
||||
}
|
||||
PROCEDURE XPLMRegisterFlightLoopCallback(
|
||||
inFlightLoop : XPLMFlightLoop_f;
|
||||
inInterval : Single;
|
||||
inRefcon : pointer);
|
||||
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.
|
||||
|
||||
Only use this on flight loops registered via
|
||||
XPLMRegisterFlightLoopCallback.
|
||||
}
|
||||
PROCEDURE XPLMUnregisterFlightLoopCallback(
|
||||
inFlightLoop : XPLMFlightLoop_f;
|
||||
inRefcon : pointer);
|
||||
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.
|
||||
|
||||
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;
|
||||
inRefcon : pointer);
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMCreateFlightLoop(
|
||||
inParams : PXPLMCreateFlightLoop_t) : XPLMFlightLoopID;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM210}
|
||||
{
|
||||
XPLMDestroyFlightLoop
|
||||
|
||||
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);
|
||||
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.
|
||||
|
||||
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);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,434 @@
|
||||
{
|
||||
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.
|
||||
}
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{$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-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.
|
||||
|
||||
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.
|
||||
}
|
||||
TYPE
|
||||
XPLMProbeType = (
|
||||
{ The Y probe gives you the location of the tallest physical scenery along }
|
||||
{ the Y axis going through the queried point. }
|
||||
xplm_ProbeY = 0
|
||||
|
||||
);
|
||||
PXPLMProbeType = ^XPLMProbeType;
|
||||
|
||||
{
|
||||
XPLMProbeResult
|
||||
|
||||
Probe results - possible results from a probe query.
|
||||
}
|
||||
XPLMProbeResult = (
|
||||
{ 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. }
|
||||
,xplm_ProbeError = 1
|
||||
|
||||
{ The probe call succeeded but there is no terrain under this point (perhaps }
|
||||
{ it is off the side of the planet?) }
|
||||
,xplm_ProbeMissed = 2
|
||||
|
||||
);
|
||||
PXPLMProbeResult = ^XPLMProbeResult;
|
||||
|
||||
{
|
||||
XPLMProbeRef
|
||||
|
||||
An XPLMProbeRef is an opaque handle to a probe, used for querying the
|
||||
terrain.
|
||||
}
|
||||
XPLMProbeRef = pointer;
|
||||
PXPLMProbeRef = ^XPLMProbeRef;
|
||||
|
||||
{
|
||||
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 = 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;
|
||||
END;
|
||||
PXPLMProbeInfo_t = ^XPLMProbeInfo_t;
|
||||
|
||||
{
|
||||
XPLMCreateProbe
|
||||
|
||||
Creates a new probe object of a given type and returns.
|
||||
}
|
||||
FUNCTION XPLMCreateProbe(
|
||||
inProbeType : XPLMProbeType) : XPLMProbeRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMDestroyProbe
|
||||
|
||||
Deallocates an existing probe object.
|
||||
}
|
||||
PROCEDURE XPLMDestroyProbe(
|
||||
inProbe : XPLMProbeRef);
|
||||
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.
|
||||
}
|
||||
FUNCTION XPLMProbeTerrainXYZ(
|
||||
inProbe : XPLMProbeRef;
|
||||
inX : Single;
|
||||
inY : Single;
|
||||
inZ : Single;
|
||||
outInfo : PXPLMProbeInfo_t) : XPLMProbeResult;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$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!
|
||||
}
|
||||
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
TYPE
|
||||
{
|
||||
XPLMObjectRef
|
||||
|
||||
An XPLMObjectRef is a opaque handle to an .obj file that has been loaded
|
||||
into memory.
|
||||
}
|
||||
XPLMObjectRef = pointer;
|
||||
PXPLMObjectRef = ^XPLMObjectRef;
|
||||
{$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.
|
||||
}
|
||||
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;
|
||||
END;
|
||||
PXPLMDrawInfo_t = ^XPLMDrawInfo_t;
|
||||
{$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.
|
||||
|
||||
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 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.
|
||||
|
||||
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.
|
||||
|
||||
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 : 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.
|
||||
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMLoadObjectAsync(
|
||||
inPath : XPLMString;
|
||||
inCallback : XPLMObjectLoaded_f;
|
||||
inRefcon : pointer);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM210}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMDrawObjects
|
||||
|
||||
__Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating
|
||||
instances, rather than these APIs from draw callbacks.
|
||||
|
||||
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.
|
||||
|
||||
X-Plane will attempt to cull the objects based on LOD and visibility, and
|
||||
will pick the appropriate LOD.
|
||||
|
||||
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;
|
||||
inLocations : PXPLMDrawInfo_t;
|
||||
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.
|
||||
}
|
||||
PROCEDURE XPLMUnloadObject(
|
||||
inObject : XPLMObjectRef);
|
||||
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.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
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.
|
||||
}
|
||||
TYPE
|
||||
XPLMLibraryEnumerator_f = PROCEDURE(
|
||||
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.
|
||||
|
||||
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 : XPLMString;
|
||||
inLatitude : Single;
|
||||
inLongitude : Single;
|
||||
enumerator : XPLMLibraryEnumerator_f;
|
||||
ref : pointer) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,951 @@
|
||||
{
|
||||
Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See
|
||||
license.txt for usage. X-Plane SDK Version: 2.1.1
|
||||
}
|
||||
|
||||
UNIT XPLMUtilities;
|
||||
INTERFACE
|
||||
|
||||
USES
|
||||
XPLMDefs;
|
||||
{$A4}
|
||||
{___________________________________________________________________________
|
||||
* FILE UTILITIES
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The XPLMUtilities file APIs provide some basic file and path functions for
|
||||
use with X-Plane.
|
||||
|
||||
Directory Separators
|
||||
--------------------
|
||||
|
||||
The XPLM has two modes it can work in:
|
||||
|
||||
* X-Plane native paths: all paths are UTF8 strings, using the unix forward
|
||||
slash (/) as the directory separating character. In native path mode,
|
||||
you use the same path format for all three operating systems.
|
||||
|
||||
* Legacy OS paths: the directroy separator is \ for Windows, : for OS X,
|
||||
and / for Linux; OS paths are encoded in MacRoman for OS X using legacy
|
||||
HFS conventions, use the application code page for multi-byte encoding
|
||||
on Unix using DOS path conventions, and use UTF-8 for Linux.
|
||||
|
||||
While legacy OS paths are the default, we strongly encourage you to opt in
|
||||
to native paths using the XPLMEnableFeature API.
|
||||
|
||||
* All OS X plugins should enable native paths all of the time; if you do
|
||||
not do this, you will have to convert all paths back from HFS to Unix
|
||||
(and deal with MacRoman) - code written using native paths and the C
|
||||
file APIs "just works" on OS X.
|
||||
|
||||
* For Linux plugins, there is no difference between the two encodings.
|
||||
|
||||
* Windows plugins will need to convert the UTF8 file paths to UTF16 for
|
||||
use with the "wide" APIs. While it might seem tempting to stick with
|
||||
legacy OS paths (and just use the "ANSI" Windows APIs), X-Plane is fully
|
||||
unicode-capable, and will often be installed in paths where the user's
|
||||
directories have no ACP encoding.
|
||||
|
||||
Full and Relative Paths
|
||||
-----------------------
|
||||
|
||||
Some of these APIs use full paths, but others use paths relative to the
|
||||
user's X-Plane installation. This is documented on a per-API basis.
|
||||
}
|
||||
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMDataFileType
|
||||
|
||||
These enums define types of data files you can load or unload using the
|
||||
SDK.
|
||||
}
|
||||
TYPE
|
||||
XPLMDataFileType = (
|
||||
{ A situation (.sit) file, which starts off a flight in a given }
|
||||
{ configuration. }
|
||||
xplm_DataFile_Situation = 1
|
||||
|
||||
{ A situation movie (.smo) file, which replays a past flight. }
|
||||
,xplm_DataFile_ReplayMovie = 2
|
||||
|
||||
);
|
||||
PXPLMDataFileType = ^XPLMDataFileType;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{
|
||||
XPLMGetSystemPath
|
||||
|
||||
This function returns the full path to the X-System folder. Note that this
|
||||
is a directory path, so it ends in a trailing : or /.
|
||||
|
||||
The buffer you pass should be at least 512 characters long. The path is
|
||||
returned using the current native or OS path conventions.
|
||||
}
|
||||
PROCEDURE XPLMGetSystemPath(
|
||||
outSystemPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetPrefsPath
|
||||
|
||||
This routine returns a full path to a file that is within X-Plane's
|
||||
preferences directory. (You should remove the file name back to the last
|
||||
directory separator to get the preferences directory using
|
||||
XPLMExtractFileAndPath.)
|
||||
|
||||
The buffer you pass should be at least 512 characters long. The path is
|
||||
returned using the current native or OS path conventions.
|
||||
}
|
||||
PROCEDURE XPLMGetPrefsPath(
|
||||
outPrefsPath : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDirectorySeparator
|
||||
|
||||
This routine returns a string with one char and a null terminator that is
|
||||
the directory separator for the current platform. This allows you to write
|
||||
code that concatinates directory paths without having to #ifdef for
|
||||
platform. The character returned will reflect the current file path mode.
|
||||
}
|
||||
FUNCTION XPLMGetDirectorySeparator: XPLMString;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMExtractFileAndPath
|
||||
|
||||
Given a full path to a file, this routine separates the path from the file.
|
||||
If the path is a partial directory (e.g. ends in : or \) the trailing
|
||||
directory separator is removed. This routine works in-place; a pointer to
|
||||
the file part of the buffer is returned; the original buffer still starts
|
||||
with the path and is null terminated with no trailing separator.
|
||||
}
|
||||
FUNCTION XPLMExtractFileAndPath(
|
||||
inFullPath : XPLMString) : XPLMString;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetDirectoryContents
|
||||
|
||||
This routine returns a list of files in a directory (specified by a full
|
||||
path, no trailing : or \). The output is returned as a list of NULL
|
||||
terminated strings. An index array (if specified) is filled with pointers
|
||||
into the strings. The last file is indicated by a zero-length string (and
|
||||
NULL in the indices). This routine will return 1 if you had capacity for
|
||||
all files or 0 if you did not. You can also skip a given number of files.
|
||||
|
||||
* inDirectoryPath - a null terminated C string containing the full path to
|
||||
the directory with no trailing directory char.
|
||||
|
||||
* inFirstReturn - the zero-based index of the first file in the directory
|
||||
to return. (Usually zero to fetch all in one pass.)
|
||||
|
||||
* outFileNames - a buffer to receive a series of sequential null
|
||||
terminated C-string file names. A zero-length C string will be appended
|
||||
to the very end.
|
||||
|
||||
* inFileNameBufSize - the size of the file name buffer in bytes.
|
||||
|
||||
* outIndices - a pointer to an array of character pointers that will
|
||||
become an index into the directory. The last file will be followed by a
|
||||
NULL value. Pass NULL if you do not want indexing information.
|
||||
|
||||
* inIndexCount - the max size of the index in entries.
|
||||
|
||||
* outTotalFiles - if not NULL, this is filled in with the number of files
|
||||
in the directory.
|
||||
|
||||
* outReturnedFiles - if not NULL, the number of files returned by this
|
||||
iteration.
|
||||
|
||||
Return value: 1 if all info could be returned, 0 if there was a buffer
|
||||
overrun.
|
||||
|
||||
WARNING: Before X-Plane 7 this routine did not properly iterate through
|
||||
directories. If X-Plane
|
||||
6 compatibility is needed, use your own code to iterate directories.
|
||||
}
|
||||
FUNCTION XPLMGetDirectoryContents(
|
||||
inDirectoryPath : XPLMString;
|
||||
inFirstReturn : Integer;
|
||||
outFileNames : XPLMString;
|
||||
inFileNameBufSize : Integer;
|
||||
outIndices : PXPLMString; { Can be nil }
|
||||
inIndexCount : Integer;
|
||||
outTotalFiles : PInteger; { Can be nil }
|
||||
outReturnedFiles : PInteger) : Integer; { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMLoadDataFile
|
||||
|
||||
Loads a data file of a given type. Paths must be relative to the X-System
|
||||
folder. To clear the replay, pass a NULL file name (this is only valid with
|
||||
replay movies, not sit files).
|
||||
}
|
||||
FUNCTION XPLMLoadDataFile(
|
||||
inFileType : XPLMDataFileType;
|
||||
inFilePath : XPLMString) : Integer; { Can be nil }
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMSaveDataFile
|
||||
|
||||
Saves the current situation or replay; paths are relative to the X-System
|
||||
folder.
|
||||
}
|
||||
FUNCTION XPLMSaveDataFile(
|
||||
inFileType : XPLMDataFileType;
|
||||
inFilePath : XPLMString) : Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE MISC
|
||||
___________________________________________________________________________}
|
||||
|
||||
{
|
||||
XPLMHostApplicationID
|
||||
|
||||
While the plug-in SDK is only accessible to plugins running inside X-Plane,
|
||||
the original authors considered extending the API to other applications
|
||||
that shared basic infrastructure with X-Plane. These enumerations are
|
||||
hold-overs from that original roadmap; all values other than X-Plane are
|
||||
deprecated. Your plugin should never need this enumeration.
|
||||
}
|
||||
TYPE
|
||||
XPLMHostApplicationID = (
|
||||
xplm_Host_Unknown = 0
|
||||
|
||||
,xplm_Host_XPlane = 1
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_PlaneMaker = 2
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_WorldMaker = 3
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_Briefer = 4
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_PartMaker = 5
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_YoungsMod = 6
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
,xplm_Host_XAuto = 7
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
);
|
||||
PXPLMHostApplicationID = ^XPLMHostApplicationID;
|
||||
|
||||
{
|
||||
XPLMLanguageCode
|
||||
|
||||
These enums define what language the sim is running in. These enumerations
|
||||
do not imply that the sim can or does run in all of these languages; they
|
||||
simply provide a known encoding in the event that a given sim version is
|
||||
localized to a certain language.
|
||||
}
|
||||
XPLMLanguageCode = (
|
||||
xplm_Language_Unknown = 0
|
||||
|
||||
,xplm_Language_English = 1
|
||||
|
||||
,xplm_Language_French = 2
|
||||
|
||||
,xplm_Language_German = 3
|
||||
|
||||
,xplm_Language_Italian = 4
|
||||
|
||||
,xplm_Language_Spanish = 5
|
||||
|
||||
,xplm_Language_Korean = 6
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
,xplm_Language_Russian = 7
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
,xplm_Language_Greek = 8
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
,xplm_Language_Japanese = 9
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM300}
|
||||
,xplm_Language_Chinese = 10
|
||||
{$ENDIF XPLM300}
|
||||
|
||||
);
|
||||
PXPLMLanguageCode = ^XPLMLanguageCode;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMError_f
|
||||
|
||||
An XPLM error callback is a function that you provide to receive debugging
|
||||
information from the plugin SDK. See XPLMSetErrorCallback for more
|
||||
information. NOTE: for the sake of debugging, your error callback will be
|
||||
called even if your plugin is not enabled, allowing you to receive debug
|
||||
info in your XPluginStart and XPluginStop callbacks. To avoid causing logic
|
||||
errors in the management code, do not call any other plugin routines from
|
||||
your error callback - it is only meant for catching errors in the
|
||||
debugging.
|
||||
}
|
||||
TYPE
|
||||
XPLMError_f = PROCEDURE(
|
||||
inMessage : XPLMString); cdecl;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{
|
||||
XPLMInitialized
|
||||
|
||||
Deprecated: This function returns 1 if X-Plane has properly initialized the
|
||||
plug-in system. If this routine returns 0, many XPLM functions will not
|
||||
work.
|
||||
|
||||
NOTE: because plugins are always called from within the XPLM, there is no
|
||||
need to check for initialization; it will always return 1. This routine is
|
||||
deprecated - you do not need to check it before continuing within your
|
||||
plugin.
|
||||
}
|
||||
FUNCTION XPLMInitialized: Integer;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
{
|
||||
XPLMGetVersions
|
||||
|
||||
This routine returns the revision of both X-Plane and the XPLM DLL. All
|
||||
versions are three-digit decimal numbers (e.g. 606 for version 6.06 of
|
||||
X-Plane); the current revision of the XPLM is 200 (2.00). This routine also
|
||||
returns the host ID of the app running us.
|
||||
|
||||
The most common use of this routine is to special-case around X-Plane
|
||||
version-specific behavior.
|
||||
}
|
||||
PROCEDURE XPLMGetVersions(
|
||||
outXPlaneVersion : PInteger;
|
||||
outXPLMVersion : PInteger;
|
||||
outHostID : PXPLMHostApplicationID);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetLanguage
|
||||
|
||||
This routine returns the langauge the sim is running in.
|
||||
}
|
||||
FUNCTION XPLMGetLanguage: XPLMLanguageCode;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMFindSymbol
|
||||
|
||||
This routine will attempt to find the symbol passed in the inString
|
||||
parameter. If the symbol is found a pointer the function is returned,
|
||||
othewise the function will return NULL.
|
||||
|
||||
You can use XPLMFindSymbol to utilize newer SDK API features without
|
||||
requiring newer versions of the SDK (and X-Plane) as your minimum X-Plane
|
||||
version as follows:
|
||||
|
||||
* Define the XPLMnnn macro to the minimum required XPLM version you will
|
||||
ship with (e.g. XPLM210 for X-Plane 10 compatibility).
|
||||
|
||||
* Use XPLMGetVersions and XPLMFindSymbol to detect that the host sim is
|
||||
new enough to use new functions and resolve function pointers.
|
||||
|
||||
* Conditionally use the new functions if and only if XPLMFindSymbol only
|
||||
returns a non- NULL pointer.
|
||||
|
||||
Warning: you should always check the XPLM API version as well as the
|
||||
results of XPLMFindSymbol to determine if funtionality is safe to use.
|
||||
|
||||
To use functionality via XPLMFindSymbol you will need to copy your own
|
||||
definitions of the X-Plane API prototypes and cast the returned pointer to
|
||||
the correct type.
|
||||
}
|
||||
FUNCTION XPLMFindSymbol(
|
||||
inString : XPLMString) : pointer;
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{
|
||||
XPLMSetErrorCallback
|
||||
|
||||
XPLMSetErrorCallback installs an error-reporting callback for your plugin.
|
||||
Normally the plugin system performs minimum diagnostics to maximize
|
||||
performance. When you install an error callback, you will receive calls due
|
||||
to certain plugin errors, such as passing bad parameters or incorrect data.
|
||||
|
||||
Important: the error callback determines *programming* errors, e.g. bad API
|
||||
parameters. Every error that is returned by the error callback represents a
|
||||
mistake in your plugin that you should fix. Error callbacks are not used to
|
||||
report expected run-time problems (e.g. disk I/O errors).
|
||||
|
||||
The intention is for you to install the error callback during debug
|
||||
sections and put a break-point inside your callback. This will cause you to
|
||||
break into the debugger from within the SDK at the point in your plugin
|
||||
where you made an illegal call.
|
||||
|
||||
Installing an error callback may activate error checking code that would
|
||||
not normally run, and this may adversely affect performance, so do not
|
||||
leave error callbacks installed in shipping plugins. Since the only useful
|
||||
response to an error is to change code, error callbacks are not useful "in
|
||||
the field".
|
||||
}
|
||||
PROCEDURE XPLMSetErrorCallback(
|
||||
inCallback : XPLMError_f);
|
||||
cdecl; external XPLM_DLL;
|
||||
{$ENDIF XPLM200}
|
||||
|
||||
{
|
||||
XPLMDebugString
|
||||
|
||||
This routine outputs a C-style string to the Log.txt file. The file is
|
||||
immediately flushed so you will not lose data. (This does cause a
|
||||
performance penalty.)
|
||||
|
||||
Please do *not* leave routine diagnostic logging enabled in your shipping
|
||||
plugin. The X-Plane Log file is shared by X-Plane and every plugin in the
|
||||
system, and plugins that (when functioning normally) print verbose log
|
||||
output make it difficult for developers to find error conditions from other
|
||||
parts of the system.
|
||||
}
|
||||
PROCEDURE XPLMDebugString(
|
||||
inString : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMSpeakString
|
||||
|
||||
This function displays the string in a translucent overlay over the current
|
||||
display and also speaks the string if text-to-speech is enabled. The string
|
||||
is spoken asynchronously, this function returns immediately. This function
|
||||
may not speak or print depending on user preferences.
|
||||
}
|
||||
PROCEDURE XPLMSpeakString(
|
||||
inString : XPLMString);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMGetVirtualKeyDescription
|
||||
|
||||
Given a virtual key code (as defined in XPLMDefs.h) this routine returns a
|
||||
human-readable string describing the character. This routine is provided
|
||||
for showing users what keyboard mappings they have set up. The string may
|
||||
read 'unknown' or be a blank or NULL string if the virtual key is unknown.
|
||||
}
|
||||
FUNCTION XPLMGetVirtualKeyDescription(
|
||||
inVirtualKey : XPLMChar) : XPLMString;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMReloadScenery
|
||||
|
||||
XPLMReloadScenery reloads the current set of scenery. You can use this
|
||||
function in two typical ways: simply call it to reload the scenery, picking
|
||||
up any new installed scenery, .env files, etc. from disk. Or, change the
|
||||
lat/ref and lon/ref data refs and then call this function to shift the
|
||||
scenery environment. This routine is equivalent to picking "reload
|
||||
scenery" from the developer menu.
|
||||
}
|
||||
PROCEDURE XPLMReloadScenery;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$IFDEF XPLM200}
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE COMMAND MANAGEMENT
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
The command management APIs let plugins interact with the command-system in
|
||||
X-Plane, the abstraction behind keyboard presses and joystick buttons. This
|
||||
API lets you create new commands and modify the behavior (or get
|
||||
notification) of existing ones.
|
||||
|
||||
X-Plane Command Phases
|
||||
----------------------
|
||||
|
||||
X-Plane commands are not instantaneous; they operate over a duration.
|
||||
(Think of a joystick button press - you can press, hold down, and then
|
||||
release the joystick button; X-Plane commands model this entire process.)
|
||||
|
||||
An X-Plane command consists of three phases: a beginning, continuous
|
||||
repetition, and an ending. The command may be repeated zero times in its
|
||||
duration, followed by one command ending. Command begin and end messges are
|
||||
balanced, but a command may be bound to more than one event source (e.g. a
|
||||
keyboard key and a joystick button), in which case you may receive a second
|
||||
begin during before any end).
|
||||
|
||||
When you issue commands in the plugin system, you *must* balance every call
|
||||
to XPLMCommandBegin with a call to XPLMCommandEnd with the same command
|
||||
reference.
|
||||
|
||||
Command Behavior Modification
|
||||
-----------------------------
|
||||
|
||||
You can register a callback to handle a command either before or after
|
||||
X-Plane does; if you receive the command before X-Plane you have the option
|
||||
to either let X-Plane handle the command or hide the command from X-Plane.
|
||||
This lets plugins both augment commands and replace them.
|
||||
|
||||
If you register for an existing command, be sure that you are *consistent*
|
||||
in letting X-Plane handle or not handle the command; you are responsible
|
||||
for passing a *balanced* number of begin and end messages to X-Plane. (E.g.
|
||||
it is not legal to pass all the begin messages to X-Plane but hide all the
|
||||
end messages).
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMCommandPhase
|
||||
|
||||
The phases of a command.
|
||||
}
|
||||
TYPE
|
||||
XPLMCommandPhase = (
|
||||
{ The command is being started. }
|
||||
xplm_CommandBegin = 0
|
||||
|
||||
{ The command is continuing to execute. }
|
||||
,xplm_CommandContinue = 1
|
||||
|
||||
{ The command has ended. }
|
||||
,xplm_CommandEnd = 2
|
||||
|
||||
);
|
||||
PXPLMCommandPhase = ^XPLMCommandPhase;
|
||||
|
||||
{
|
||||
XPLMCommandRef
|
||||
|
||||
A command ref is an opaque identifier for an X-Plane command. Command
|
||||
references stay the same for the life of your plugin but not between
|
||||
executions of X-Plane. Command refs are used to execute commands, create
|
||||
commands, and create callbacks for particular commands.
|
||||
|
||||
Note that a command is not "owned" by a particular plugin. Since many
|
||||
plugins may participate in a command's execution, the command does not go
|
||||
away if the plugin that created it is unloaded.
|
||||
}
|
||||
XPLMCommandRef = pointer;
|
||||
PXPLMCommandRef = ^XPLMCommandRef;
|
||||
|
||||
{
|
||||
XPLMCommandCallback_f
|
||||
|
||||
A command callback is a function in your plugin that is called when a
|
||||
command is pressed. Your callback receives the command reference for the
|
||||
particular command, the phase of the command that is executing, and a
|
||||
reference pointer that you specify when registering the callback.
|
||||
|
||||
Your command handler should return 1 to let processing of the command
|
||||
continue to other plugins and X-Plane, or 0 to halt processing, potentially
|
||||
bypassing X-Plane code.
|
||||
}
|
||||
XPLMCommandCallback_f = FUNCTION(
|
||||
inCommand : XPLMCommandRef;
|
||||
inPhase : XPLMCommandPhase;
|
||||
inRefcon : pointer) : Integer; cdecl;
|
||||
|
||||
{
|
||||
XPLMFindCommand
|
||||
|
||||
XPLMFindCommand looks up a command by name, and returns its command
|
||||
reference or NULL if the command does not exist.
|
||||
}
|
||||
FUNCTION XPLMFindCommand(
|
||||
inName : XPLMString) : XPLMCommandRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandBegin
|
||||
|
||||
XPLMCommandBegin starts the execution of a command, specified by its
|
||||
command reference. The command is "held down" until XPLMCommandEnd is
|
||||
called. You must balance each XPLMCommandBegin call with an XPLMCommandEnd
|
||||
call.
|
||||
}
|
||||
PROCEDURE XPLMCommandBegin(
|
||||
inCommand : XPLMCommandRef);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandEnd
|
||||
|
||||
XPLMCommandEnd ends the execution of a given command that was started with
|
||||
XPLMCommandBegin. You must not issue XPLMCommandEnd for a command you did
|
||||
not begin.
|
||||
}
|
||||
PROCEDURE XPLMCommandEnd(
|
||||
inCommand : XPLMCommandRef);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandOnce
|
||||
|
||||
This executes a given command momentarily, that is, the command begins and
|
||||
ends immediately. This is the equivalent of calling XPLMCommandBegin() and
|
||||
XPLMCommandEnd() back ot back.
|
||||
}
|
||||
PROCEDURE XPLMCommandOnce(
|
||||
inCommand : XPLMCommandRef);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCreateCommand
|
||||
|
||||
XPLMCreateCommand creates a new command for a given string. If the command
|
||||
already exists, the existing command reference is returned. The description
|
||||
may appear in user interface contexts, such as the joystick configuration
|
||||
screen.
|
||||
}
|
||||
FUNCTION XPLMCreateCommand(
|
||||
inName : XPLMString;
|
||||
inDescription : XPLMString) : XPLMCommandRef;
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMRegisterCommandHandler
|
||||
|
||||
XPLMRegisterCommandHandler registers a callback to be called when a command
|
||||
is executed. You provide a callback with a reference pointer.
|
||||
|
||||
If inBefore is true, your command handler callback will be executed before
|
||||
X-Plane executes the command, and returning 0 from your callback will
|
||||
disable X-Plane's processing of the command. If inBefore is false, your
|
||||
callback will run after X-Plane. (You can register a single callback both
|
||||
before and after a command.)
|
||||
}
|
||||
PROCEDURE XPLMRegisterCommandHandler(
|
||||
inComand : XPLMCommandRef;
|
||||
inHandler : XPLMCommandCallback_f;
|
||||
inBefore : Integer;
|
||||
inRefcon : pointer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMUnregisterCommandHandler
|
||||
|
||||
XPLMUnregisterCommandHandler removes a command callback registered with
|
||||
XPLMRegisterCommandHandler.
|
||||
}
|
||||
PROCEDURE XPLMUnregisterCommandHandler(
|
||||
inComand : XPLMCommandRef;
|
||||
inHandler : XPLMCommandCallback_f;
|
||||
inBefore : Integer;
|
||||
inRefcon : pointer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM200}
|
||||
{$IFDEF XPLM_DEPRECATED}
|
||||
{___________________________________________________________________________
|
||||
* X-PLANE USER INTERACTION
|
||||
___________________________________________________________________________}
|
||||
{
|
||||
WARNING: The legacy user interaction API is deprecated; while it was the
|
||||
only way to run commands in X-Plane 6,7 and 8, it is obsolete, and was
|
||||
replaced by the command system API in X-Plane 9. You should not use this
|
||||
API; replace any of the calls below with XPLMCommand invocations based on
|
||||
persistent command strings. The documentation that follows is for historic
|
||||
reference only.
|
||||
|
||||
The legacy user interaction APIs let you simulate commands the user can do
|
||||
with a joystick, keyboard etc. Note that it is generally safer for future
|
||||
compatibility to use one of these commands than to manipulate the
|
||||
underlying sim data.
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
XPLMCommandKeyID
|
||||
|
||||
These enums represent all the keystrokes available within X-Plane. They can
|
||||
be sent to X-Plane directly. For example, you can reverse thrust using
|
||||
these enumerations.
|
||||
}
|
||||
TYPE
|
||||
XPLMCommandKeyID = (
|
||||
xplm_key_pause=0,
|
||||
xplm_key_revthrust,
|
||||
xplm_key_jettison,
|
||||
xplm_key_brakesreg,
|
||||
xplm_key_brakesmax,
|
||||
xplm_key_gear,
|
||||
xplm_key_timedn,
|
||||
xplm_key_timeup,
|
||||
xplm_key_fadec,
|
||||
xplm_key_otto_dis,
|
||||
xplm_key_otto_atr,
|
||||
xplm_key_otto_asi,
|
||||
xplm_key_otto_hdg,
|
||||
xplm_key_otto_gps,
|
||||
xplm_key_otto_lev,
|
||||
xplm_key_otto_hnav,
|
||||
xplm_key_otto_alt,
|
||||
xplm_key_otto_vvi,
|
||||
xplm_key_otto_vnav,
|
||||
xplm_key_otto_nav1,
|
||||
xplm_key_otto_nav2,
|
||||
xplm_key_targ_dn,
|
||||
xplm_key_targ_up,
|
||||
xplm_key_hdgdn,
|
||||
xplm_key_hdgup,
|
||||
xplm_key_barodn,
|
||||
xplm_key_baroup,
|
||||
xplm_key_obs1dn,
|
||||
xplm_key_obs1up,
|
||||
xplm_key_obs2dn,
|
||||
xplm_key_obs2up,
|
||||
xplm_key_com1_1,
|
||||
xplm_key_com1_2,
|
||||
xplm_key_com1_3,
|
||||
xplm_key_com1_4,
|
||||
xplm_key_nav1_1,
|
||||
xplm_key_nav1_2,
|
||||
xplm_key_nav1_3,
|
||||
xplm_key_nav1_4,
|
||||
xplm_key_com2_1,
|
||||
xplm_key_com2_2,
|
||||
xplm_key_com2_3,
|
||||
xplm_key_com2_4,
|
||||
xplm_key_nav2_1,
|
||||
xplm_key_nav2_2,
|
||||
xplm_key_nav2_3,
|
||||
xplm_key_nav2_4,
|
||||
xplm_key_adf_1,
|
||||
xplm_key_adf_2,
|
||||
xplm_key_adf_3,
|
||||
xplm_key_adf_4,
|
||||
xplm_key_adf_5,
|
||||
xplm_key_adf_6,
|
||||
xplm_key_transpon_1,
|
||||
xplm_key_transpon_2,
|
||||
xplm_key_transpon_3,
|
||||
xplm_key_transpon_4,
|
||||
xplm_key_transpon_5,
|
||||
xplm_key_transpon_6,
|
||||
xplm_key_transpon_7,
|
||||
xplm_key_transpon_8,
|
||||
xplm_key_flapsup,
|
||||
xplm_key_flapsdn,
|
||||
xplm_key_cheatoff,
|
||||
xplm_key_cheaton,
|
||||
xplm_key_sbrkoff,
|
||||
xplm_key_sbrkon,
|
||||
xplm_key_ailtrimL,
|
||||
xplm_key_ailtrimR,
|
||||
xplm_key_rudtrimL,
|
||||
xplm_key_rudtrimR,
|
||||
xplm_key_elvtrimD,
|
||||
xplm_key_elvtrimU,
|
||||
xplm_key_forward,
|
||||
xplm_key_down,
|
||||
xplm_key_left,
|
||||
xplm_key_right,
|
||||
xplm_key_back,
|
||||
xplm_key_tower,
|
||||
xplm_key_runway,
|
||||
xplm_key_chase,
|
||||
xplm_key_free1,
|
||||
xplm_key_free2,
|
||||
xplm_key_spot,
|
||||
xplm_key_fullscrn1,
|
||||
xplm_key_fullscrn2,
|
||||
xplm_key_tanspan,
|
||||
xplm_key_smoke,
|
||||
xplm_key_map,
|
||||
xplm_key_zoomin,
|
||||
xplm_key_zoomout,
|
||||
xplm_key_cycledump,
|
||||
xplm_key_replay,
|
||||
xplm_key_tranID,
|
||||
xplm_key_max
|
||||
);
|
||||
PXPLMCommandKeyID = ^XPLMCommandKeyID;
|
||||
|
||||
{
|
||||
XPLMCommandButtonID
|
||||
|
||||
These are enumerations for all of the things you can do with a joystick
|
||||
button in X-Plane. They currently match the buttons menu in the equipment
|
||||
setup dialog, but these enums will be stable even if they change in
|
||||
X-Plane.
|
||||
}
|
||||
XPLMCommandButtonID = (
|
||||
xplm_joy_nothing=0,
|
||||
xplm_joy_start_all,
|
||||
xplm_joy_start_0,
|
||||
xplm_joy_start_1,
|
||||
xplm_joy_start_2,
|
||||
xplm_joy_start_3,
|
||||
xplm_joy_start_4,
|
||||
xplm_joy_start_5,
|
||||
xplm_joy_start_6,
|
||||
xplm_joy_start_7,
|
||||
xplm_joy_throt_up,
|
||||
xplm_joy_throt_dn,
|
||||
xplm_joy_prop_up,
|
||||
xplm_joy_prop_dn,
|
||||
xplm_joy_mixt_up,
|
||||
xplm_joy_mixt_dn,
|
||||
xplm_joy_carb_tog,
|
||||
xplm_joy_carb_on,
|
||||
xplm_joy_carb_off,
|
||||
xplm_joy_trev,
|
||||
xplm_joy_trm_up,
|
||||
xplm_joy_trm_dn,
|
||||
xplm_joy_rot_trm_up,
|
||||
xplm_joy_rot_trm_dn,
|
||||
xplm_joy_rud_lft,
|
||||
xplm_joy_rud_cntr,
|
||||
xplm_joy_rud_rgt,
|
||||
xplm_joy_ail_lft,
|
||||
xplm_joy_ail_cntr,
|
||||
xplm_joy_ail_rgt,
|
||||
xplm_joy_B_rud_lft,
|
||||
xplm_joy_B_rud_rgt,
|
||||
xplm_joy_look_up,
|
||||
xplm_joy_look_dn,
|
||||
xplm_joy_look_lft,
|
||||
xplm_joy_look_rgt,
|
||||
xplm_joy_glance_l,
|
||||
xplm_joy_glance_r,
|
||||
xplm_joy_v_fnh,
|
||||
xplm_joy_v_fwh,
|
||||
xplm_joy_v_tra,
|
||||
xplm_joy_v_twr,
|
||||
xplm_joy_v_run,
|
||||
xplm_joy_v_cha,
|
||||
xplm_joy_v_fr1,
|
||||
xplm_joy_v_fr2,
|
||||
xplm_joy_v_spo,
|
||||
xplm_joy_flapsup,
|
||||
xplm_joy_flapsdn,
|
||||
xplm_joy_vctswpfwd,
|
||||
xplm_joy_vctswpaft,
|
||||
xplm_joy_gear_tog,
|
||||
xplm_joy_gear_up,
|
||||
xplm_joy_gear_down,
|
||||
xplm_joy_lft_brake,
|
||||
xplm_joy_rgt_brake,
|
||||
xplm_joy_brakesREG,
|
||||
xplm_joy_brakesMAX,
|
||||
xplm_joy_speedbrake,
|
||||
xplm_joy_ott_dis,
|
||||
xplm_joy_ott_atr,
|
||||
xplm_joy_ott_asi,
|
||||
xplm_joy_ott_hdg,
|
||||
xplm_joy_ott_alt,
|
||||
xplm_joy_ott_vvi,
|
||||
xplm_joy_tim_start,
|
||||
xplm_joy_tim_reset,
|
||||
xplm_joy_ecam_up,
|
||||
xplm_joy_ecam_dn,
|
||||
xplm_joy_fadec,
|
||||
xplm_joy_yaw_damp,
|
||||
xplm_joy_art_stab,
|
||||
xplm_joy_chute,
|
||||
xplm_joy_JATO,
|
||||
xplm_joy_arrest,
|
||||
xplm_joy_jettison,
|
||||
xplm_joy_fuel_dump,
|
||||
xplm_joy_puffsmoke,
|
||||
xplm_joy_prerotate,
|
||||
xplm_joy_UL_prerot,
|
||||
xplm_joy_UL_collec,
|
||||
xplm_joy_TOGA,
|
||||
xplm_joy_shutdown,
|
||||
xplm_joy_con_atc,
|
||||
xplm_joy_fail_now,
|
||||
xplm_joy_pause,
|
||||
xplm_joy_rock_up,
|
||||
xplm_joy_rock_dn,
|
||||
xplm_joy_rock_lft,
|
||||
xplm_joy_rock_rgt,
|
||||
xplm_joy_rock_for,
|
||||
xplm_joy_rock_aft,
|
||||
xplm_joy_idle_hilo,
|
||||
xplm_joy_lanlights,
|
||||
xplm_joy_max
|
||||
);
|
||||
PXPLMCommandButtonID = ^XPLMCommandButtonID;
|
||||
|
||||
{
|
||||
XPLMSimulateKeyPress
|
||||
|
||||
This function simulates a key being pressed for X-Plane. The keystroke goes
|
||||
directly to X-Plane; it is never sent to any plug-ins. However, since this
|
||||
is a raw key stroke it may be mapped by the keys file or enter text into a
|
||||
field.
|
||||
|
||||
Deprecated: use XPLMCommandOnce
|
||||
}
|
||||
PROCEDURE XPLMSimulateKeyPress(
|
||||
inKeyType : Integer;
|
||||
inKey : Integer);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandKeyStroke
|
||||
|
||||
This routine simulates a command-key stroke. However, the keys are done by
|
||||
function, not by actual letter, so this function works even if the user has
|
||||
remapped their keyboard. Examples of things you might do with this include
|
||||
pausing the simulator.
|
||||
|
||||
Deprecated: use XPLMCommandOnce
|
||||
}
|
||||
PROCEDURE XPLMCommandKeyStroke(
|
||||
inKey : XPLMCommandKeyID);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandButtonPress
|
||||
|
||||
This function simulates any of the actions that might be taken by pressing
|
||||
a joystick button. However, this lets you call the command directly rather
|
||||
than have to know which button is mapped where. Important: you must release
|
||||
each button you press. The APIs are separate so that you can 'hold down' a
|
||||
button for a fixed amount of time.
|
||||
|
||||
Deprecated: use XPLMCommandBegin.
|
||||
}
|
||||
PROCEDURE XPLMCommandButtonPress(
|
||||
inButton : XPLMCommandButtonID);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{
|
||||
XPLMCommandButtonRelease
|
||||
|
||||
This function simulates any of the actions that might be taken by pressing
|
||||
a joystick button. See XPLMCommandButtonPress.
|
||||
|
||||
Deprecated: use XPLMCommandEnd.
|
||||
}
|
||||
PROCEDURE XPLMCommandButtonRelease(
|
||||
inButton : XPLMCommandButtonID);
|
||||
cdecl; external XPLM_DLL;
|
||||
|
||||
{$ENDIF XPLM_DEPRECATED}
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
END.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,222 @@
|
||||
-------------------------------------------------------------------------------
|
||||
THE X-PLANE PLUGIN SDK
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This download contains the files necessary to build plugins for X-Plane. The
|
||||
X-Plane plugin website is:
|
||||
|
||||
http://https://developer.x-plane.com/sdk/
|
||||
|
||||
The website contains full documentation on the SDK including tech notes, sample
|
||||
plugins, sample code, contact information, and links to the latest versions of
|
||||
this SDK.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
SDK FILES
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
license.txt Copyright information for this download.
|
||||
README.txt This document
|
||||
CHeaders Header files for compiling C/C++ plugins
|
||||
Delphi Interfaces for compiling Pascal plugins
|
||||
Libraries Import libraries for linking on Windows
|
||||
and frameworks for linking on Mac.
|
||||
|
||||
Note: there are no import/link-time libraries for Linux; on Linux, plugins
|
||||
simply leave SDK symbols undefined and they are discovered at runtime. The
|
||||
SDK website explains this process in more detail.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
RELEASE NOTES
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This section contains per-release notes for the history of the X-Plane SDK.
|
||||
|
||||
X-PLane SDK Release 4.0.0 beta 1 9/18/2022
|
||||
|
||||
The 4.0.0 SDK adds support for ARM64 Macs. The 4.0 SDK is supported by X-Plane
|
||||
12. The new SDK adds support for drawing hooks that draw directly to the G1000
|
||||
and other avionic cockpit devices.
|
||||
|
||||
X-Plane SDK Release 3.0.2 4/29/2020
|
||||
|
||||
The SDK 3.0.2 adds the modern 3-d drawing callback for interoperability with
|
||||
Metal and Vulkan, and deprecates most older drawing callbacks.
|
||||
|
||||
X-Plane SDK Release 3.0.1 3/5/2018
|
||||
|
||||
The SDK 3.0.1 API adds new messages and APIs to support VR.
|
||||
|
||||
X-Plane SDK Release 3.0.0 11/2/7/2017
|
||||
|
||||
The SDK 3.0 API supports new features and new packaging for plugins. The 3.0
|
||||
SDK requires X-Plane 11.0 or newer. New features include:
|
||||
|
||||
- Display APIs to match X-Plane 11's UI.
|
||||
- New map APIs. Legacy 2-d map draw callbacks are deprecated.
|
||||
- Aircraft-plugins get their own menu
|
||||
- Aircraft placement by lat-lon-elevation.
|
||||
- Magnetic variation queries
|
||||
- Chinese language support
|
||||
- New instancing API
|
||||
|
||||
The 3.0 SDK supports a new plugin packaging schema:
|
||||
|
||||
<plugin name>/<ABI>/<plugin name>.xpl
|
||||
|
||||
where ABI is one of mac_x64, win_x64 or lin_x64. The new schema is preferred,
|
||||
so you can pack a version of your plugin that requires 3.0 with this scheme
|
||||
and include a legacy 2.x plugin using hte old scheme for X-Plane 10
|
||||
compatibility.
|
||||
|
||||
Please use the new scheme where possible - having a unique file name for each
|
||||
DLL makes crash reports easier to read and triage.
|
||||
|
||||
The 3.0 SDK drops support for 32-bit plugins; if you need to ship a 32-bit
|
||||
plugin for 32-bit X-Plane 10, shipping using two schemes and two binaries may
|
||||
be the best option.
|
||||
|
||||
X-Plane SDK Release 2.1.3 11/14/13
|
||||
|
||||
Fixed XPC Wrappers to use int and intptr_t instead of long. This fixes
|
||||
crashes for plugins on 64-bit Windows.
|
||||
|
||||
X-Plane SDK Release 2.1.2 RC2 1/15/13
|
||||
|
||||
Removed headers from frameworks, as they don't work; updated README.
|
||||
|
||||
X-Plane SDK Release 2.1.2 RC1 1/12/13
|
||||
|
||||
The 2.1.2 SDK adds frameworks for the XPLM and XPWidgets; Mac developers
|
||||
can link directly against these frameworks and avoid unresolved symbols
|
||||
and flat namespace problems. The frameworks produce plugins that will
|
||||
work on X-Plane 8, 9, and 10 depending on the plugin CPU architecture,
|
||||
minimum system SDK, and XPLM API revision number.
|
||||
|
||||
X-Plane SDK Release 2.1.1 RC1 10/29/12
|
||||
|
||||
The 2.1.1 update to the SDK provides 64-bit build materials.
|
||||
|
||||
X-Plane SDK Release 2.1.0 RC1 3/31/12
|
||||
|
||||
This is the first release of the version 2.1 X-Plane SDK. This version of the
|
||||
SDK exposes new APIs.
|
||||
|
||||
This API also replaces all references to "long" with int or intptr_t,
|
||||
depending on whether the integer needs to be wide enough to hold coerced
|
||||
pointers. Most of the time, int is used; the notable exception is the widgets
|
||||
library where params and properties can contain pointers to user data.
|
||||
|
||||
This change is not an ABI change - compiled plugins will work unmodified.
|
||||
However for some compilers, you may need to replace long with int or intptr_t
|
||||
in your code.
|
||||
|
||||
X-Plane SDK Release 2.0.1 RC1 7/21/10
|
||||
|
||||
This release adds symbol visibility macros for GCC 4 on Linux and corrects a few
|
||||
function documentation comments.
|
||||
|
||||
X-Plane SDK Release 2.0 RC1 7/11/08
|
||||
|
||||
This release includes a corrected XPLM.lib for windows with exports for some of
|
||||
the new 2.0 APIs.
|
||||
|
||||
X-Plane SDK Release 2.0 Beta 2 4/23/08
|
||||
|
||||
This release includes new APIs for reading and writing data files and drawing
|
||||
hooks for the local map screen, as well as some minor tweaks:
|
||||
|
||||
- Sim version is 2.0 in the headers.
|
||||
- unload plane msg marked as 2.0 only.
|
||||
- New enumerations for additional languages.
|
||||
- Function level docs improved.
|
||||
|
||||
X-Plane SDK Release 2.0 Beta 1 1/19/08
|
||||
|
||||
This is the first release of the version 2.0 X-Plane SDK. CFM support has
|
||||
been removed, and the license has been simplified, reflecting that it only has
|
||||
to cover the SDK include/import lib files and not the sample code or examples.
|
||||
|
||||
X-Plane SDK Release 1.0.2 1/5/05
|
||||
|
||||
The headers of the SDK are modified to support Kylix. No changes for Mac,
|
||||
Windows, or C users. Headers now have SDK version numbers.
|
||||
|
||||
X-Plane SDK Release 1.0.1 12/29/04
|
||||
|
||||
The headers of this SDK are modified to support Linux complication. No changes
|
||||
for Mac and Windows users.
|
||||
|
||||
X-Plane SDK Release Candidate 1
|
||||
|
||||
Only one slight change in the enums: the enum xpProperty_SubWindowHasCloseBoxes
|
||||
in XPStandardWidgets.h has been changed to xpProperty_MainWindowHasCloseBoxes.
|
||||
Its value has not been changed, so you will need to search-and-replace your code
|
||||
when using this version of the SDK, but already-compiled plugins will experience
|
||||
no different operation.
|
||||
|
||||
The documentation has been revised for all headers to revise changes made to the
|
||||
SDK over the course of beta.
|
||||
|
||||
X-Plane SDK Beta 5
|
||||
|
||||
This version of the SDK features a number of enumeration changes to reflect the
|
||||
X-Plane interface more correctly. This became crucial when X-Plane 7's new user
|
||||
interface was released. With X-Plane in release candidates hopefully beta 5 of
|
||||
the SDK could be the last one. Please see:
|
||||
|
||||
www.xsquawkbox.net/xpsdk/newui.html
|
||||
|
||||
For a comprehensive description of all the enumeration changes. For most
|
||||
plugins (no developers reported using the deprecated enumerations), a simple
|
||||
search and replace should suffice. Plugins compiled against the beta 4 SDK that
|
||||
do not use now-unsupported graphics will continue to work correctly.
|
||||
|
||||
X-Plane SDK Beta 4
|
||||
|
||||
This release corrects two problems with the Pascal headers: function pointer
|
||||
types are now declared cdecl (since this is how the SDK calls them), and the
|
||||
import library for the widget callbacks is now XPWIDGETS.DLL as it should be.
|
||||
|
||||
X-Plane SDK Beta 3
|
||||
|
||||
This release finally features full documentation and a stable widgets API, as
|
||||
well as a few other minor bug fixes.
|
||||
|
||||
Starting with beta 3, the DLLs necessary to run plugins ship with X-Plane 660.
|
||||
The SDK will work with X-Plane 660 RC3 and later. The XPWidgets DLL now lives
|
||||
in the Resources/plugins folder.
|
||||
|
||||
Starting with beta 3, extra plugins, documentation, sample code, and sample
|
||||
projects are now featured directly on the web in the new X-Plane SDK library.
|
||||
They are not included in the SDK zip file; the zip file only contains headers
|
||||
and lib files for the SDK.
|
||||
|
||||
X-Plane SDK Beta 2
|
||||
|
||||
You must recompile your plugin for the beta 2 plugin SDK! Plugins compiled
|
||||
against the beta 1 SDK will not work with X-Plane 660 or the new XPLM.DLL.
|
||||
|
||||
A huge number of data refs have been added. Unfortunately the documentation
|
||||
is thin. Use the data ref tester plugin to view the data refs in real time
|
||||
and find what you need.
|
||||
|
||||
The data ref APIs have also changed to allow for arrays of integers as well
|
||||
as floats. Some sim variables are now arrays that were previously many
|
||||
individual items.
|
||||
|
||||
A new drawing phase is available for replacing aircraft graphics. The
|
||||
texturing APIs in XPLMGraphics have been revised. The most notable change is
|
||||
that you cannot use the SDK to load your textures. (This functionality was
|
||||
broken and never worked in beta 1.) See the x-plane-dev list for sample code
|
||||
on how to load your own bitmaps.
|
||||
|
||||
X-Plane can reload plugins on the fly. Use the Plugin Enabler plugin to reload
|
||||
your plugin. On the Mac you can throw the old DLL in the trash and put a new
|
||||
one in its place to reload a new version of the plugin. On the PC, an alert
|
||||
comes up; while this alert is up you can swap your plugins' DLL. This allows
|
||||
you to recompile your plugin without rebooting the sim.
|
||||
|
||||
Delphi Pascal interfaces and sample code are in the SDK. Thanks to Billy
|
||||
Verreynne for his hard work on this.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
Copyright (c) 2008, Sandy Barbour and Ben Supnik
|
||||
All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Neither the names of the authors nor that of X-Plane or Laminar Research
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission from the authors or
|
||||
Laminar Research, respectively.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
|
||||
mkdir -p build
|
||||
cd build
|
||||
mkdir -p X-Plane/GAConnector/64
|
||||
mkdir -p X-Plane/GAConnector/recordings
|
||||
mkdir -p ESP/32/GAConnector
|
||||
mkdir -p ESP/32/GAConnector/recordings
|
||||
mkdir -p ESP/64/GAConnector
|
||||
mkdir -p ESP/64/GAConnector/recordings
|
||||
rm -f CMakeCache.txt
|
||||
|
||||
case $1 in
|
||||
"mac")
|
||||
cmake -DXP=ON -DDEBUG=$DEBUG -DCMAKE_TOOLCHAIN_FILE=../toolchain-mac.cmake ..
|
||||
;;
|
||||
"lin")
|
||||
cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-lin.cmake ..
|
||||
;;
|
||||
"win64")
|
||||
cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake ..
|
||||
\cp -rf ../openSSL/win64/*.dll X-Plane/GAConnector/64/
|
||||
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll X-Plane/GAConnector/64
|
||||
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll X-Plane/GAConnector/64
|
||||
;;
|
||||
"win64-ESP")
|
||||
cmake -DDEBUG=$DEBUG -DBIT=64 -DMSFS=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake ..
|
||||
\cp -rf ../openSSL/win64/*.dll ESP/64/GAConnector/
|
||||
\cp -rf ../SimConnect/64/*.dll ESP/64/GAConnector/
|
||||
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll ESP/64/GAConnector/
|
||||
\cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll ESP/64/GAConnector/
|
||||
;;
|
||||
"win32")
|
||||
cmake -DDEBUG=$DEBUG -DBIT=32 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-32.cmake ..
|
||||
\cp -rf ../openSSL/win32/*.dll ESP/32/GAConnector/
|
||||
\cp -rf ../SimConnect/32/*.msi ESP/32/GAConnector/
|
||||
\cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libc++.dll ESP/32/GAConnector/
|
||||
\cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libunwind.dll ESP/32/GAConnector/
|
||||
;;
|
||||
*)
|
||||
echo "Unknown platform, choose one of mac, lin, win64, win64-ESP, win32"
|
||||
exit 22
|
||||
;;
|
||||
esac
|
||||
|
||||
make -j
|
||||
code=$?
|
||||
if [ "$code" -ne 0 ]
|
||||
then
|
||||
exit $code
|
||||
fi
|
||||
|
||||
if [ "$1" = "mac" ] && [ "$DEBUG" = "1" ]
|
||||
then
|
||||
echo "Building dSYM"
|
||||
/opt/osxcross/target/bin/osxcross-llvm-dsymutil X-Plane/GAConnector/mac.xpl
|
||||
/opt/osxcross/target/bin/osxcross-llvm-dsymutil X-Plane/GAConnector/libixwebsocket.dylib
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
file(GLOB socket CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/websocket/*.cpp)
|
||||
|
||||
enable_language(RC)
|
||||
|
||||
# Add WIN32 to hide console window
|
||||
add_executable(germanairlinesva_esp WIN32
|
||||
${socket}
|
||||
resources/resources-${BIT}.rc
|
||||
simconnect.cpp
|
||||
main.cpp
|
||||
)
|
||||
|
||||
target_include_directories(germanairlinesva_esp PRIVATE
|
||||
${CMAKE_SOURCE_DIR}/file/include
|
||||
${CMAKE_SOURCE_DIR}/simdata/include
|
||||
${CMAKE_SOURCE_DIR}/websocket/include
|
||||
${CMAKE_SOURCE_DIR}/utilities/include
|
||||
${CMAKE_SOURCE_DIR}/ixwebsocket/include
|
||||
${CMAKE_SOURCE_DIR}/nlohmann/include
|
||||
${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/include
|
||||
)
|
||||
|
||||
target_compile_definitions(germanairlinesva_esp PRIVATE
|
||||
BIT="${BIT}"
|
||||
IBM
|
||||
)
|
||||
if (MSFS)
|
||||
target_compile_definitions(germanairlinesva_esp PRIVATE
|
||||
MSFS
|
||||
)
|
||||
endif()
|
||||
|
||||
target_compile_options(germanairlinesva_esp PRIVATE
|
||||
-Wall
|
||||
-Wextra
|
||||
-pedantic
|
||||
-fvisibility=hidden
|
||||
)
|
||||
if(DEBUG)
|
||||
target_compile_options(germanairlinesva_esp PRIVATE
|
||||
-g
|
||||
)
|
||||
target_link_options(germanairlinesva_esp PRIVATE
|
||||
-g
|
||||
)
|
||||
else()
|
||||
target_compile_options(germanairlinesva_esp PRIVATE
|
||||
-O2
|
||||
)
|
||||
endif()
|
||||
|
||||
message("Building for Windows ${BIT} into ${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}")
|
||||
|
||||
set_target_properties(germanairlinesva_esp PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}"
|
||||
OUTPUT_NAME "GA Connector"
|
||||
)
|
||||
|
||||
if(DEBUG)
|
||||
target_compile_options(germanairlinesva_esp PRIVATE
|
||||
-gcodeview
|
||||
)
|
||||
target_link_options(germanairlinesva_esp PRIVATE
|
||||
-Wl,-pdb=
|
||||
)
|
||||
endif()
|
||||
|
||||
target_link_libraries(germanairlinesva_esp PRIVATE
|
||||
user32
|
||||
shell32
|
||||
version
|
||||
ixwebsocket
|
||||
pthread
|
||||
${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/SimConnect.lib
|
||||
)
|
||||
@@ -0,0 +1,125 @@
|
||||
#ifndef GERMANAIRLINESVA_GACONNECTOR_ESP_SIMCONNECT_H
|
||||
#define GERMANAIRLINESVA_GACONNECTOR_ESP_SIMCONNECT_H
|
||||
|
||||
#include <cmath>
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#include "websocket.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "SimConnect.h"
|
||||
|
||||
#include "config/config.hpp"
|
||||
#include "constants.h"
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(1)
|
||||
|
||||
struct data {
|
||||
double parkingBrake; // BRAKE PARKING INDICATOR
|
||||
double onGround; // SIM ON GROUND
|
||||
|
||||
double emptyWeight; // EMPTY WEIGHT
|
||||
double currentWeight; // TOTAL WEIGHT
|
||||
|
||||
double fuel; // FUEL TOTAL QUANTITY WEIGHT
|
||||
|
||||
double headingTrue; // PLANE HEADING DEGREES TRUE
|
||||
double headingMagnetic; // PLANE HEADING DEGREES Magnetic
|
||||
|
||||
double groundSpeed; // GROUND VELOCITY
|
||||
double indicatedAirspeed; // AIRSPEED INDICATED
|
||||
double barberPoleSpeed; // AIRSPEED BARBER POLE
|
||||
|
||||
double verticalVelocity; // VELOCITY WORLD Y
|
||||
double verticalSpeed; // VERTICAL SPEED
|
||||
double altitude; // PLANE ALTITUDE
|
||||
double altitudeAGL; // PLANE ALT ABOVE GROUND
|
||||
|
||||
double latitude; // PLANE LATITUDE
|
||||
double longitude; // PLANE LONGITUDE
|
||||
|
||||
double elapsedTime; // ABSOLUTE TIME
|
||||
|
||||
double fuelFlowEng1; // ENG FUEL FLOW PPH:1
|
||||
double fuelFlowEng2; // ENG FUEL FLOW PPH:2
|
||||
double fuelFlowEng3; // ENG FUEL FLOW PPH:3
|
||||
double fuelFlowEng4; // ENG FUEL FLOW PPH:4
|
||||
|
||||
int brakePos;
|
||||
int brakeParkPos;
|
||||
int brakeLeftPos;
|
||||
|
||||
double timeZulu; // ZULU TIME IN SECONDS
|
||||
|
||||
double gForce; // G FORCE IN G
|
||||
};
|
||||
|
||||
struct Port {
|
||||
double headingTrue; // PLANE HEADING DEGREES TRUE
|
||||
double latitude; // PLANE LATITUDE
|
||||
double longitude; // PLANE LONGITUDE
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
enum DEFINITIONS {
|
||||
D_DATA,
|
||||
D_PORT,
|
||||
};
|
||||
|
||||
enum REQUESTS {
|
||||
R_DATA,
|
||||
R_ACFT,
|
||||
R_DIALOG,
|
||||
R_PORT,
|
||||
};
|
||||
|
||||
enum EVENTS {
|
||||
E_PAUSE,
|
||||
E_STATUS,
|
||||
E_TEXT,
|
||||
E_TIMEMIN,
|
||||
E_TIMEHRS,
|
||||
E_TIMESEC,
|
||||
};
|
||||
|
||||
enum GROUPS {
|
||||
G_TIME,
|
||||
};
|
||||
|
||||
class SimConnect
|
||||
{
|
||||
private:
|
||||
HANDLE simConnect;
|
||||
bool connectedToSim;
|
||||
char version;
|
||||
std::string aircraftPath;
|
||||
bool pausedMenu;
|
||||
bool paused;
|
||||
std::mutex mutex;
|
||||
struct germanairlinesva::gaconnector::websocket::data simData;
|
||||
std::shared_ptr<germanairlinesva::file::config::Config> configuration;
|
||||
std::function<void(const std::string)> toLog;
|
||||
|
||||
void handleOpen(SIMCONNECT_RECV_OPEN *data);
|
||||
void handleSystemEvent(SIMCONNECT_RECV_SYSTEM_STATE *state);
|
||||
void handleEvent(SIMCONNECT_RECV_EVENT *event);
|
||||
void handleData(SIMCONNECT_RECV_SIMOBJECT_DATA *data);
|
||||
|
||||
public:
|
||||
SimConnect(
|
||||
HWND hWnd,
|
||||
std::function<void(const std::string)> toLog,
|
||||
std::shared_ptr<germanairlinesva::file::config::Config> &configuration);
|
||||
~SimConnect();
|
||||
bool isConnected() const;
|
||||
const std::string getVersion() const;
|
||||
void getData(struct germanairlinesva::gaconnector::websocket::data *data);
|
||||
void getStates() const;
|
||||
void handleMessage();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H
|
||||
#define GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H
|
||||
|
||||
#include <atomic>
|
||||
#include <ctime>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <queue>
|
||||
#include <string>
|
||||
|
||||
#include "websocket.h"
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "_simconnect.h"
|
||||
#include "config/config.hpp"
|
||||
#include "constants.h"
|
||||
#include "logbook/logbook.hpp"
|
||||
#include "recording/recording.hpp"
|
||||
#include "simdata/simDatabase.hpp"
|
||||
|
||||
WINBOOL addNotifyIcon(HWND hWnd);
|
||||
WINBOOL removeNotifyIcon(HWND hWnd);
|
||||
WINBOOL createMenu(HWND hWnd);
|
||||
void end(HWND hwnd);
|
||||
void serverWorker();
|
||||
void recordingWorker();
|
||||
void toLog(const std::string &message);
|
||||
|
||||
#endif
|
||||
+402
@@ -0,0 +1,402 @@
|
||||
#include "include/main.h"
|
||||
|
||||
std::mutex mutex;
|
||||
std::queue<std::function<void()>> &messageQueue()
|
||||
{
|
||||
static std::queue<std::function<void()>> _messageQueue;
|
||||
return _messageQueue;
|
||||
}
|
||||
std::thread serverThread;
|
||||
std::thread recordingThread;
|
||||
std::atomic<bool> wantsExit;
|
||||
|
||||
std::shared_ptr<germanairlinesva::file::config::Config> configuration;
|
||||
std::unique_ptr<germanairlinesva::file::simdata::SimDatabase> database;
|
||||
std::unique_ptr<germanairlinesva::gaconnector::websocket::Websocket> connector;
|
||||
std::unique_ptr<SimConnect> simConnect;
|
||||
|
||||
struct germanairlinesva::gaconnector::websocket::data toSend;
|
||||
germanairlinesva::file::recording::Recording p;
|
||||
|
||||
// The Window Procedure
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static UINT s_uTaskbarRestart;
|
||||
|
||||
switch (msg) {
|
||||
case WM_CREATE: {
|
||||
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
|
||||
break;
|
||||
}
|
||||
case WM_CLOSE: {
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
}
|
||||
case WM_DESTROY: {
|
||||
end(hWnd);
|
||||
break;
|
||||
}
|
||||
case TRAY_MESSAGE: {
|
||||
switch (lParam) {
|
||||
case WM_RBUTTONUP:
|
||||
case WM_CONTEXTMENU: {
|
||||
createMenu(hWnd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIMCONNECT_MESSAGE: {
|
||||
if (simConnect != nullptr && simConnect->isConnected()) {
|
||||
simConnect->handleMessage();
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
if (msg == s_uTaskbarRestart) {
|
||||
addNotifyIcon(hWnd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunused-parameter"
|
||||
int WINAPI WinMain(HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
ZeroMemory(&wc, sizeof(WNDCLASS));
|
||||
HWND hWnd;
|
||||
MSG msg;
|
||||
|
||||
wantsExit.store(false);
|
||||
|
||||
// Exit if already running
|
||||
hWnd = FindWindow(WINDOW_CLASS, WINDOW_CLASS);
|
||||
if (hWnd != NULL) {
|
||||
toLog("Exiting duplicate");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Clear log
|
||||
std::ofstream clearLog(BASE_DIRECTORY "log.txt");
|
||||
clearLog.close();
|
||||
|
||||
// Registering the Window Class
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.hInstance = hInstance;
|
||||
wc.lpszClassName = WINDOW_CLASS;
|
||||
|
||||
if (!RegisterClass(&wc)) {
|
||||
toLog("Error window register: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Creating the Window
|
||||
hWnd = CreateWindow(WINDOW_CLASS,
|
||||
WINDOW_CLASS,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
240,
|
||||
120,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
NULL);
|
||||
|
||||
if (hWnd == NULL) {
|
||||
toLog("Error window create: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Add Notify Icon
|
||||
if (!addNotifyIcon(hWnd)) {
|
||||
toLog("Error notifyIcon: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Never show window
|
||||
// ShowWindow(hWnd, SHOW_OPENWINDOW);
|
||||
|
||||
configuration = std::make_unique<germanairlinesva::file::config::Config>();
|
||||
toLog("Config loaded");
|
||||
|
||||
connector =
|
||||
std::make_unique<germanairlinesva::gaconnector::websocket::Websocket>(
|
||||
"wss://ws.hofmannnet.myhome-server.de:8000",
|
||||
configuration->getUser(),
|
||||
toLog);
|
||||
toLog("WebSocket started");
|
||||
|
||||
#ifndef MSFS
|
||||
PWSTR folder;
|
||||
HRESULT result = SHGetKnownFolderPath(FOLDERID_RoamingAppData,
|
||||
KF_FLAG_DEFAULT,
|
||||
NULL,
|
||||
&folder);
|
||||
if (SUCCEEDED(result)) {
|
||||
size_t origsize = wcslen(folder) + 1;
|
||||
size_t convertedChars = 0;
|
||||
char *nstring = new char[origsize * 2];
|
||||
wcstombs_s(&convertedChars, nstring, origsize * 2, folder, _TRUNCATE);
|
||||
|
||||
std::string path(nstring);
|
||||
path.append("\\Microsoft\\FSX\\scenery.cfg");
|
||||
toLog(path);
|
||||
|
||||
delete[] nstring;
|
||||
CoTaskMemFree(folder);
|
||||
|
||||
char hash[2 * MD5LEN + 1] = "";
|
||||
if (germanairlinesva::utilities::generateMD5(path.c_str(), hash, toLog) ==
|
||||
0) {
|
||||
database = std::make_unique<germanairlinesva::file::simdata::SimDatabase>(
|
||||
FSX_VERSION,
|
||||
hash,
|
||||
configuration,
|
||||
toLog);
|
||||
}
|
||||
|
||||
toLog("Readback test of sim database using EDDF");
|
||||
auto ap = (*database)["EDDF"];
|
||||
for (const auto &it : ap.first) {
|
||||
toLog(" " + it.to_string());
|
||||
}
|
||||
for (const auto &it : ap.second) {
|
||||
toLog(" " + it.to_string());
|
||||
}
|
||||
toLog("Readback test of sim database using XXXX");
|
||||
auto ap2 = (*database)["XXXX"];
|
||||
ap2.first.size() == 0 ? toLog(" SUCCESS") : toLog(" ERROR");
|
||||
}
|
||||
#endif
|
||||
|
||||
toLog("Logbook Test");
|
||||
germanairlinesva::file::logbook::Logbook logbook;
|
||||
logbook.addEntry("08.09.2022",
|
||||
"F",
|
||||
"1000",
|
||||
"L049",
|
||||
"D-ALFA",
|
||||
"John F. Kennedy International Aiport / EDDF",
|
||||
"A1",
|
||||
"14L",
|
||||
"Gander International Airport / CYQX",
|
||||
"10",
|
||||
"03",
|
||||
"10:00",
|
||||
"10:20",
|
||||
"13:20",
|
||||
"13:30",
|
||||
210.5,
|
||||
20.1,
|
||||
5012.4156,
|
||||
8.87,
|
||||
5041.3856,
|
||||
7.1,
|
||||
971.14,
|
||||
2.41,
|
||||
980.65,
|
||||
-165.23,
|
||||
1,
|
||||
1.2012,
|
||||
"2022-09-08_VGA1000",
|
||||
5.5,
|
||||
1);
|
||||
logbook.toFile();
|
||||
|
||||
// Open SimConnect
|
||||
simConnect = std::make_unique<SimConnect>(hWnd, toLog, configuration);
|
||||
|
||||
// Thread for sending data to websocket
|
||||
serverThread = std::thread(&serverWorker);
|
||||
recordingThread = std::thread(&recordingWorker);
|
||||
toLog("Workers started");
|
||||
|
||||
// The Message Loop
|
||||
while (GetMessage(&msg, NULL, 0, 0) > 0) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
// Exit
|
||||
toLog("Connector stopped");
|
||||
return msg.wParam;
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
WINBOOL addNotifyIcon(HWND hWnd)
|
||||
{
|
||||
HICON icon;
|
||||
NOTIFYICONDATA niData;
|
||||
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
|
||||
|
||||
icon = (HICON)LoadImage(GetModuleHandle(NULL),
|
||||
MAKEINTRESOURCE(APP_ICON),
|
||||
IMAGE_ICON,
|
||||
GetSystemMetrics(SM_CXSMICON),
|
||||
GetSystemMetrics(SM_CYSMICON),
|
||||
LR_SHARED);
|
||||
if (icon == NULL) {
|
||||
toLog("error icon " + std::to_string(GetLastError()));
|
||||
}
|
||||
niData.cbSize = sizeof(NOTIFYICONDATA);
|
||||
niData.uVersion = NOTIFYICON_VERSION_4;
|
||||
niData.uID = TRAY_ICON_ID;
|
||||
niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
||||
strcpy(niData.szTip, "GA Connector");
|
||||
niData.hIcon = icon;
|
||||
niData.hWnd = hWnd;
|
||||
niData.uCallbackMessage = TRAY_MESSAGE;
|
||||
|
||||
WINBOOL retVal = Shell_NotifyIcon(NIM_ADD, &niData);
|
||||
// DestroyIcon(niData.hIcon);
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
WINBOOL removeNotifyIcon(HWND hWnd)
|
||||
{
|
||||
NOTIFYICONDATA niData;
|
||||
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
|
||||
|
||||
niData.cbSize = sizeof(NOTIFYICONDATA);
|
||||
niData.uID = TRAY_ICON_ID;
|
||||
niData.hWnd = hWnd;
|
||||
return Shell_NotifyIcon(NIM_DELETE, &niData);
|
||||
}
|
||||
|
||||
WINBOOL createMenu(HWND hWnd)
|
||||
{
|
||||
const int IDM_EXIT = 100;
|
||||
POINT pt;
|
||||
GetCursorPos(&pt);
|
||||
|
||||
HMENU hMenu = CreatePopupMenu();
|
||||
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Version: " BIT " Bit");
|
||||
if (simConnect->isConnected()) {
|
||||
std::string version("Connected to Sim: ");
|
||||
version.append(simConnect->getVersion());
|
||||
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, version.c_str());
|
||||
}
|
||||
AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL);
|
||||
AppendMenu(hMenu, MF_STRING, IDM_EXIT, "Exit");
|
||||
|
||||
SetForegroundWindow(hWnd);
|
||||
|
||||
WINBOOL cmd = TrackPopupMenu(hMenu,
|
||||
TPM_LEFTALIGN | TPM_LEFTBUTTON |
|
||||
TPM_BOTTOMALIGN | TPM_RETURNCMD,
|
||||
pt.x,
|
||||
pt.y,
|
||||
0,
|
||||
hWnd,
|
||||
NULL);
|
||||
|
||||
if (cmd == IDM_EXIT) {
|
||||
PostMessage(hWnd, WM_CLOSE, 0, NULL);
|
||||
}
|
||||
|
||||
return DestroyMenu(hMenu);
|
||||
}
|
||||
|
||||
void end(HWND hWnd)
|
||||
{
|
||||
removeNotifyIcon(hWnd);
|
||||
UnregisterClass(WINDOW_CLASS, GetModuleHandle(NULL));
|
||||
|
||||
/* End threads */
|
||||
wantsExit = true;
|
||||
serverThread.join();
|
||||
recordingThread.join();
|
||||
|
||||
p.toFile("flight.rec");
|
||||
|
||||
// End SimConnect
|
||||
delete simConnect.release();
|
||||
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
||||
void serverWorker()
|
||||
{
|
||||
germanairlinesva::utilities::setThreadName("GAServerWorker");
|
||||
|
||||
while (!wantsExit) {
|
||||
simConnect->getStates();
|
||||
|
||||
struct germanairlinesva::gaconnector::websocket::data *copy =
|
||||
new germanairlinesva::gaconnector::websocket::data();
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
simConnect->getData(copy);
|
||||
}
|
||||
|
||||
connector->sendData(*copy);
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(250));
|
||||
}
|
||||
|
||||
toLog("Server thread stopped");
|
||||
}
|
||||
|
||||
void recordingWorker()
|
||||
{
|
||||
germanairlinesva::utilities::setThreadName("GARecordingWorker");
|
||||
|
||||
germanairlinesva::file::recording::RecordingEntry lastPath;
|
||||
std::uint32_t segment = 0;
|
||||
|
||||
auto ap = (*database)["EDDF"];
|
||||
auto rwys = ap.second;
|
||||
|
||||
while (!wantsExit) {
|
||||
struct germanairlinesva::gaconnector::websocket::data *copy =
|
||||
new germanairlinesva::gaconnector::websocket::data();
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
simConnect->getData(copy);
|
||||
}
|
||||
|
||||
germanairlinesva::file::recording::RecordingEntry currentPath(
|
||||
segment,
|
||||
static_cast<std::uint16_t>(copy->alt),
|
||||
static_cast<std::uint16_t>(copy->gs),
|
||||
{copy->lat, copy->lon});
|
||||
|
||||
if (strcmp(copy->path, "") != 0 && !copy->pause &&
|
||||
lastPath != currentPath) {
|
||||
p.addEntry(currentPath);
|
||||
lastPath = currentPath;
|
||||
|
||||
for (const auto &it : rwys) {
|
||||
if (it.containsPoint({copy->lat, copy->lon})) {
|
||||
toLog("On Runway: " + it.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
segment++;
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
}
|
||||
|
||||
toLog("Recording thread stopped");
|
||||
}
|
||||
|
||||
void toLog(const std::string &message)
|
||||
{
|
||||
std::time_t utc = std::time(nullptr);
|
||||
std::tm *time = std::gmtime(&utc);
|
||||
std::ofstream msg(BASE_DIRECTORY "log.txt", std::ofstream::app);
|
||||
msg << std::put_time(time, "%Y-%m-%d %H:%M:%S UTC ")
|
||||
<< "German Airlines VA: " << message << std::endl;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 47 KiB |
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity type="win32"
|
||||
name="germanairlinesva.gaconnector"
|
||||
version="1.0.0.14"
|
||||
processorArchitecture='x86'
|
||||
/>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity type='win32'
|
||||
name='Microsoft.FlightSimulator.SimConnect'
|
||||
version='10.0.61259.0'
|
||||
processorArchitecture='x86'
|
||||
publicKeyToken='67c7c14424d61b5b' />
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity type="win32"
|
||||
name="germanairlinesva.gaconnector"
|
||||
version="1.0.0.14"
|
||||
processorArchitecture='amd64'
|
||||
/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
@@ -0,0 +1,39 @@
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
#include "winres.h"
|
||||
#include "winuser.h"
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
APP_ICON ICON "gatoolv2_icon.ico"
|
||||
|
||||
1 RT_MANIFEST "manifest-32.xml"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VER_FILEVERSION
|
||||
PRODUCTVERSION VER_PRODUCTVERSION
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
FILEFLAGS VER_DEBUG
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "CompanyName", VER_COMPANY_NAME
|
||||
VALUE "FileDescription", VER_FILE_DESCRIPTION
|
||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||
VALUE "InternalName", VER_INTERNAL_NAME
|
||||
VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT
|
||||
VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME
|
||||
VALUE "ProductName", VER_PRODUCT_NAME " 32"
|
||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
END
|
||||
@@ -0,0 +1,39 @@
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
#include "winres.h"
|
||||
#include "winuser.h"
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
APP_ICON ICON "gatoolv2_icon.ico"
|
||||
|
||||
1 RT_MANIFEST "manifest-64.xml"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VER_FILEVERSION
|
||||
PRODUCTVERSION VER_PRODUCTVERSION
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
FILEFLAGS VER_DEBUG
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "CompanyName", VER_COMPANY_NAME
|
||||
VALUE "FileDescription", VER_FILE_DESCRIPTION
|
||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||
VALUE "InternalName", VER_INTERNAL_NAME
|
||||
VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT
|
||||
VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME
|
||||
VALUE "ProductName", VER_PRODUCT_NAME " 64"
|
||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
END
|
||||
@@ -0,0 +1,460 @@
|
||||
#include "include/_simconnect.h"
|
||||
|
||||
SimConnect::SimConnect(
|
||||
HWND hWnd,
|
||||
std::function<void(const std::string)> toLog,
|
||||
std::shared_ptr<germanairlinesva::file::config::Config> &configuration)
|
||||
: configuration(configuration), toLog(std::move(toLog))
|
||||
{
|
||||
HRESULT hr = SimConnect_Open(&this->simConnect,
|
||||
"GAConnector",
|
||||
hWnd,
|
||||
SIMCONNECT_MESSAGE,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!SUCCEEDED(hr)) {
|
||||
this->toLog("SimConnect_Open: Failed");
|
||||
} else {
|
||||
this->connectedToSim = true;
|
||||
this->toLog("SimConnect_Close: Connection opened");
|
||||
|
||||
// Setup SimConnect
|
||||
SimConnect_SubscribeToSystemEvent(simConnect, EVENTS::E_PAUSE, "Pause");
|
||||
SimConnect_SubscribeToSystemEvent(simConnect, EVENTS::E_STATUS, "Sim");
|
||||
|
||||
SimConnect_MapClientEventToSimEvent(simConnect,
|
||||
EVENTS::E_TIMESEC,
|
||||
"CLOCK_SECONDS_ZERO");
|
||||
SimConnect_AddClientEventToNotificationGroup(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
EVENTS::E_TIMESEC,
|
||||
false);
|
||||
SimConnect_SetNotificationGroupPriority(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
|
||||
SimConnect_MapClientEventToSimEvent(simConnect,
|
||||
EVENTS::E_TIMEMIN,
|
||||
"ZULU_MINUTES_SET");
|
||||
SimConnect_AddClientEventToNotificationGroup(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
EVENTS::E_TIMEMIN,
|
||||
false);
|
||||
SimConnect_SetNotificationGroupPriority(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
|
||||
SimConnect_MapClientEventToSimEvent(simConnect,
|
||||
EVENTS::E_TIMEHRS,
|
||||
"ZULU_HOURS_SET");
|
||||
SimConnect_AddClientEventToNotificationGroup(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
EVENTS::E_TIMEHRS,
|
||||
false);
|
||||
SimConnect_SetNotificationGroupPriority(simConnect,
|
||||
GROUPS::G_TIME,
|
||||
SIMCONNECT_GROUP_PRIORITY_HIGHEST);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"BRAKE PARKING INDICATOR",
|
||||
"BOOL",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"SIM ON GROUND",
|
||||
"BOOL",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"EMPTY WEIGHT",
|
||||
"KILOGRAMS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"TOTAL WEIGHT",
|
||||
"KILOGRAMS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"FUEL TOTAL QUANTITY WEIGHT",
|
||||
"KILOGRAMS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE HEADING DEGREES TRUE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE HEADING DEGREES MAGNETIC",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"GROUND VELOCITY",
|
||||
"KNOTS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"AIRSPEED INDICATED",
|
||||
"KNOTS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"AIRSPEED BARBER POLE",
|
||||
"KNOTS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"VELOCITY WORLD Y",
|
||||
"FEET/MINUTE",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"VERTICAL SPEED",
|
||||
"FEET/MINUTE",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE ALTITUDE",
|
||||
"FEET",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE ALT ABOVE GROUND",
|
||||
"FEET",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE LATITUDE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"PLANE LONGITUDE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ABSOLUTE TIME",
|
||||
"SECONDS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ENG FUEL FLOW PPH:1",
|
||||
"KILOGRAMS PER SECOND",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ENG FUEL FLOW PPH:2",
|
||||
"KILOGRAMS PER SECOND",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ENG FUEL FLOW PPH:3",
|
||||
"KILOGRAMS PER SECOND",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ENG FUEL FLOW PPH:4",
|
||||
"KILOGRAMS PER SECOND",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"BRAKE INDICATOR",
|
||||
"POSITION",
|
||||
SIMCONNECT_DATATYPE_INT32,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"BRAKE PARKING POSITION",
|
||||
"POSITION",
|
||||
SIMCONNECT_DATATYPE_INT32,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"BRAKE LEFT POSITION",
|
||||
"POSITION",
|
||||
SIMCONNECT_DATATYPE_INT32,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"ZULU TIME",
|
||||
"SECONDS",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_DATA,
|
||||
"G FORCE",
|
||||
"GForce",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_PORT,
|
||||
"PLANE HEADING DEGREES TRUE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_PORT,
|
||||
"PLANE LATITUDE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
SimConnect_AddToDataDefinition(simConnect,
|
||||
DEFINITIONS::D_PORT,
|
||||
"PLANE LONGITUDE",
|
||||
"DEGREES",
|
||||
SIMCONNECT_DATATYPE_FLOAT64,
|
||||
0,
|
||||
SIMCONNECT_UNUSED);
|
||||
|
||||
SimConnect_RequestDataOnSimObject(simConnect,
|
||||
REQUESTS::R_DATA,
|
||||
DEFINITIONS::D_DATA,
|
||||
SIMCONNECT_OBJECT_ID_USER,
|
||||
SIMCONNECT_PERIOD_SIM_FRAME,
|
||||
SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
SimConnect::~SimConnect()
|
||||
{
|
||||
if (this->connectedToSim) {
|
||||
HRESULT hr = SimConnect_Close(this->simConnect);
|
||||
if (!SUCCEEDED(hr)) {
|
||||
this->toLog("SimConnect_Close: Failed");
|
||||
} else {
|
||||
this->connectedToSim = true;
|
||||
this->toLog("SimConnect_Close: Connection closed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::getStates() const
|
||||
{
|
||||
SimConnect_RequestSystemState(this->simConnect,
|
||||
REQUESTS::R_ACFT,
|
||||
"AircraftLoaded");
|
||||
SimConnect_RequestSystemState(this->simConnect, REQUESTS::R_DIALOG, "DIALOG");
|
||||
}
|
||||
|
||||
bool SimConnect::isConnected() const { return this->connectedToSim; }
|
||||
|
||||
const std::string SimConnect::getVersion() const
|
||||
{
|
||||
switch (this->version) {
|
||||
case MSFS_VERSION:
|
||||
return "MSFS";
|
||||
case FSX_VERSION:
|
||||
return "FSX";
|
||||
case P3D5_VERSION:
|
||||
return "P3D5";
|
||||
case P3D4_VERSION:
|
||||
return "P3D4";
|
||||
break;
|
||||
case P3D3_VERSION:
|
||||
return "P3D3";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::getData(
|
||||
struct germanairlinesva::gaconnector::websocket::data *data)
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(this->mutex);
|
||||
memcpy(data, &this->simData, sizeof(this->simData));
|
||||
}
|
||||
|
||||
void SimConnect::handleMessage()
|
||||
{
|
||||
SIMCONNECT_RECV *pData;
|
||||
DWORD cbData;
|
||||
|
||||
HRESULT hr = SimConnect_GetNextDispatch(this->simConnect, &pData, &cbData);
|
||||
if (SUCCEEDED(hr)) {
|
||||
switch (pData->dwID) {
|
||||
case SIMCONNECT_RECV_ID_OPEN: {
|
||||
this->handleOpen((SIMCONNECT_RECV_OPEN *)pData);
|
||||
break;
|
||||
}
|
||||
case SIMCONNECT_RECV_ID_EVENT: {
|
||||
this->handleEvent((SIMCONNECT_RECV_EVENT *)pData);
|
||||
break;
|
||||
}
|
||||
case SIMCONNECT_RECV_ID_SYSTEM_STATE: {
|
||||
this->handleSystemEvent((SIMCONNECT_RECV_SYSTEM_STATE *)pData);
|
||||
break;
|
||||
}
|
||||
case SIMCONNECT_RECV_ID_SIMOBJECT_DATA: {
|
||||
this->handleData((SIMCONNECT_RECV_SIMOBJECT_DATA *)pData);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::handleOpen(SIMCONNECT_RECV_OPEN *data)
|
||||
{
|
||||
switch (data->dwSimConnectVersionMajor) {
|
||||
case MSFS_VERSION:
|
||||
this->version = MSFS_VERSION;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case FSX_VERSION:
|
||||
switch (data->dwSimConnectBuildMajor) {
|
||||
case FSXRTM_SUBVERSION:
|
||||
case FSSXSP1_SUBVERRSION:
|
||||
break;
|
||||
case FSXSP2_SUBVERSION:
|
||||
case FSXACC_SUBVERSION:
|
||||
case FSXGOLD_SUBVERSION:
|
||||
this->version = FSX_VERSION;
|
||||
break;
|
||||
case FSXSE_SUBVERSION:
|
||||
if (configuration->getFSXSEPath().length() > 0) {
|
||||
this->version = FSXSE_VERSION;
|
||||
} else {
|
||||
this->version = FSX_VERSION;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case P3D5_VERSION:
|
||||
this->version = P3D5_VERSION;
|
||||
break;
|
||||
case P3D4_VERSION:
|
||||
this->version = P3D4_VERSION;
|
||||
break;
|
||||
case P3D3_VERSION:
|
||||
this->version = P3D3_VERSION;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::handleSystemEvent(SIMCONNECT_RECV_SYSTEM_STATE *state)
|
||||
{
|
||||
switch (state->dwRequestID) {
|
||||
case REQUESTS::R_ACFT:
|
||||
this->aircraftPath = state->szString;
|
||||
break;
|
||||
case REQUESTS::R_DIALOG:
|
||||
this->pausedMenu = state->dwInteger != 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::handleEvent(SIMCONNECT_RECV_EVENT *event)
|
||||
{
|
||||
switch (event->uEventID) {
|
||||
case EVENTS::E_PAUSE:
|
||||
this->paused = event->dwData != 0;
|
||||
break;
|
||||
case EVENTS::E_STATUS:
|
||||
this->toLog("SimConnect Status " + std::to_string(event->dwData));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SimConnect::handleData(SIMCONNECT_RECV_SIMOBJECT_DATA *data)
|
||||
{
|
||||
switch (data->dwRequestID) {
|
||||
case REQUESTS::R_DATA: {
|
||||
const std::lock_guard<std::mutex> lock(this->mutex);
|
||||
|
||||
struct data *_data = (struct data *)&data->dwData;
|
||||
this->simData.pause = this->paused || this->pausedMenu;
|
||||
this->simData.pBrake = _data->parkingBrake != 0 || _data->brakePos;
|
||||
this->simData.onGrnd = _data->onGround != 0;
|
||||
this->simData.totFuelKg = _data->fuel;
|
||||
this->simData.truHdg = _data->headingTrue;
|
||||
this->simData.alt = _data->altitude;
|
||||
this->simData.gs = _data->groundSpeed;
|
||||
this->simData.ias = _data->indicatedAirspeed;
|
||||
this->simData.vs =
|
||||
abs(_data->verticalVelocity - _data->verticalSpeed) > 200
|
||||
? _data->verticalSpeed
|
||||
: _data->verticalVelocity;
|
||||
this->simData.lat = _data->latitude;
|
||||
this->simData.lon = _data->longitude;
|
||||
this->simData.ff[0] = _data->fuelFlowEng1;
|
||||
this->simData.ff[1] = _data->fuelFlowEng2;
|
||||
this->simData.ff[2] = _data->fuelFlowEng3;
|
||||
this->simData.ff[3] = _data->fuelFlowEng4;
|
||||
this->simData.maxSpd = _data->barberPoleSpeed;
|
||||
strcpy(this->simData.path, this->aircraftPath.c_str());
|
||||
this->simData.uptime = _data->elapsedTime;
|
||||
this->simData.magHeading = _data->headingMagnetic;
|
||||
this->simData.payloadKg =
|
||||
_data->currentWeight - _data->emptyWeight - _data->fuel;
|
||||
this->simData.totalWeightKg = _data->currentWeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_CONFIG_CONFIG_H
|
||||
#define GERMANAIRLINESVA_FILE_CONFIG_CONFIG_H
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "constants.h"
|
||||
#include "util.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace config
|
||||
{
|
||||
class Config
|
||||
{
|
||||
private:
|
||||
std::string user;
|
||||
std::string scenery;
|
||||
std::string token;
|
||||
std::string FSXPath;
|
||||
std::string FSXSEPath;
|
||||
std::string P3D3Path;
|
||||
std::string P3D4Path;
|
||||
std::string P3D5Path;
|
||||
std::string MSFSPath;
|
||||
|
||||
inline void writeFile() const
|
||||
{
|
||||
std::ofstream out(BASE_DIRECTORY CONFIG);
|
||||
out << "scenery=" << this->scenery << "\n";
|
||||
out << "user=" << this->user << "\n";
|
||||
out << "token=" << this->token << "\n";
|
||||
out << "fsxPath=" << this->FSXPath << "\n";
|
||||
out << "fsxSEPath=" << this->FSXSEPath << "\n";
|
||||
out << "p3d3Path=" << this->P3D3Path << "\n";
|
||||
out << "p3d4Path=" << this->P3D4Path << "\n";
|
||||
out << "p3d5Path=" << this->P3D5Path << "\n";
|
||||
out << "msfsPath=" << this->MSFSPath << "\n";
|
||||
out.close();
|
||||
}
|
||||
|
||||
public:
|
||||
inline Config()
|
||||
{
|
||||
std::ifstream in(BASE_DIRECTORY CONFIG);
|
||||
std::string line;
|
||||
while (std::getline(in, line)) {
|
||||
std::vector<std::string> fields = utilities::split(line, '=');
|
||||
if (fields.size() >= 2) {
|
||||
utilities::trim(fields[0]);
|
||||
utilities::trim(fields[1]);
|
||||
if (fields[0] == "scenery") {
|
||||
this->scenery = fields[1];
|
||||
} else if (fields[0] == "user") {
|
||||
this->user = fields[1];
|
||||
} else if (fields[0] == "token") {
|
||||
this->token = fields[1];
|
||||
} else if (fields[0] == "fsxPath") {
|
||||
this->FSXPath = fields[1];
|
||||
} else if (fields[0] == "fsxSEPath") {
|
||||
this->FSXSEPath = fields[1];
|
||||
} else if (fields[0] == "p3d3Path") {
|
||||
this->P3D3Path = fields[1];
|
||||
} else if (fields[0] == "p3d4Paht") {
|
||||
this->P3D4Path = fields[1];
|
||||
} else if (fields[0] == "p3d5Path") {
|
||||
this->P3D5Path = fields[1];
|
||||
} else if (fields[0] == "msfsPath") {
|
||||
this->MSFSPath = fields[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
in.close();
|
||||
}
|
||||
|
||||
inline void updateScenery(std::string scenery)
|
||||
{
|
||||
this->scenery = scenery;
|
||||
|
||||
this->writeFile();
|
||||
}
|
||||
|
||||
inline const std::string getUser() const { return this->user; }
|
||||
inline const std::string getScenery() const { return this->scenery; }
|
||||
inline const std::string getToken() const { return this->token; }
|
||||
inline const std::string getFSXPath() const { return this->FSXPath; }
|
||||
inline const std::string getFSXSEPath() const
|
||||
{
|
||||
return this->FSXSEPath;
|
||||
}
|
||||
inline const std::string getP3D3Path() const { return this->P3D3Path; }
|
||||
inline const std::string getP3D4Path() const { return this->P3D4Path; }
|
||||
inline const std::string getP3D5Path() const { return this->P3D5Path; }
|
||||
inline const std::string getMSFSPath() const { return this->MSFSPath; }
|
||||
};
|
||||
} // namespace config
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,57 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_HELPERS_H
|
||||
#define GERMANAIRLINESVA_FILE_HELPERS_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
static inline const std::string readString(std::ifstream &in,
|
||||
std::uint8_t length)
|
||||
{
|
||||
std::vector<char> value(length + 1);
|
||||
in.read(value.data(), length);
|
||||
return std::string(std::move(value.data()));
|
||||
}
|
||||
|
||||
static inline const std::string readString(std::ifstream &in)
|
||||
{
|
||||
std::uint8_t length;
|
||||
in.read(reinterpret_cast<char *>(&length), 1);
|
||||
std::vector<char> value(length + 1);
|
||||
in.read(value.data(), length);
|
||||
return std::string(std::move(value.data()));
|
||||
}
|
||||
|
||||
template <typename T> static inline const T read(std::ifstream &in)
|
||||
{
|
||||
T value;
|
||||
in.read(reinterpret_cast<char *>(&value), sizeof(value));
|
||||
return value;
|
||||
}
|
||||
|
||||
static inline void writeString(std::ofstream &out, std::string value)
|
||||
{
|
||||
std::uint8_t length = value.length();
|
||||
out.write(reinterpret_cast<char *>(&length), sizeof(length));
|
||||
out.write(value.data(), length);
|
||||
}
|
||||
|
||||
static inline void
|
||||
writeString(std::ofstream &out, std::string value, std::uint8_t length)
|
||||
{
|
||||
out.write(value.data(), length);
|
||||
}
|
||||
|
||||
template <typename T> static inline void write(std::ofstream &out, T value)
|
||||
{
|
||||
out.write(reinterpret_cast<char *>(&value), sizeof(value));
|
||||
}
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,144 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOK_H
|
||||
#define GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOK_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "constants.h"
|
||||
#include "helpers.hpp"
|
||||
#include "logbookEntry.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace logbook
|
||||
{
|
||||
/*
|
||||
* Logbook Header (6)
|
||||
* CHAR[5] | UINT8
|
||||
* --------+--------
|
||||
* VGAL | VERSION
|
||||
*
|
||||
* Logbook Entries (n)
|
||||
* LOGBOOKENTRY[]
|
||||
*/
|
||||
class Logbook
|
||||
{
|
||||
private:
|
||||
std::vector<LogbookEntry> entries;
|
||||
|
||||
inline void readVersion1(std::ifstream &in)
|
||||
{
|
||||
std::string date = readString(in, 10);
|
||||
std::string flightType = readString(in, 1);
|
||||
std::string flightNumber = readString(in, 4);
|
||||
std::string aircraftType = readString(in, 4);
|
||||
std::string aircraftRegistration = readString(in, 6);
|
||||
std::string departureAirport = readString(in);
|
||||
std::string departureGate = readString(in);
|
||||
std::string departureRunway = readString(in);
|
||||
std::string arrivalAirport = readString(in);
|
||||
std::string arrivalGate = readString(in);
|
||||
std::string arrivalRunway = readString(in);
|
||||
std::string offBlockTime = readString(in, 5);
|
||||
std::string outTime = readString(in, 5);
|
||||
std::string inTime = readString(in, 5);
|
||||
std::string onBlockTime = readString(in, 5);
|
||||
float totalFlightTime = read<float>(in);
|
||||
float taxiOutFuel = read<float>(in);
|
||||
float inFlightFuel = read<float>(in);
|
||||
float taxiInFuel = read<float>(in);
|
||||
float totalFuel = read<float>(in);
|
||||
float taxiOutDistance = read<float>(in);
|
||||
float inFlightDistance = read<float>(in);
|
||||
float taxiInDistance = read<float>(in);
|
||||
float totalDistance = read<float>(in);
|
||||
float maxLandingRate = read<float>(in);
|
||||
std::uint8_t touchdowns = read<std::uint8_t>(in);
|
||||
float maxLandingGees = read<float>(in);
|
||||
std::string recordingFilename = readString(in);
|
||||
float points = read<float>(in);
|
||||
std::uint8_t flags = read<std::uint8_t>(in);
|
||||
|
||||
this->addEntry(date,
|
||||
flightType,
|
||||
flightNumber,
|
||||
aircraftType,
|
||||
aircraftRegistration,
|
||||
departureAirport,
|
||||
departureGate,
|
||||
departureRunway,
|
||||
arrivalAirport,
|
||||
arrivalGate,
|
||||
arrivalRunway,
|
||||
offBlockTime,
|
||||
outTime,
|
||||
inTime,
|
||||
onBlockTime,
|
||||
totalFlightTime,
|
||||
taxiOutFuel,
|
||||
inFlightFuel,
|
||||
taxiInFuel,
|
||||
totalFuel,
|
||||
taxiOutDistance,
|
||||
inFlightDistance,
|
||||
taxiInDistance,
|
||||
totalDistance,
|
||||
maxLandingRate,
|
||||
touchdowns,
|
||||
maxLandingGees,
|
||||
recordingFilename,
|
||||
points,
|
||||
flags);
|
||||
}
|
||||
|
||||
inline void fromFile()
|
||||
{
|
||||
std::ifstream in(BASE_DIRECTORY LOGBOOK, std::ifstream::binary);
|
||||
|
||||
std::string ident = readString(in, 4);
|
||||
if (ident.compare(LOGBOOK_HEADER) != 0) {
|
||||
throw std::invalid_argument("Wrong file");
|
||||
}
|
||||
std::uint8_t version = read<std::uint8_t>(in);
|
||||
|
||||
if (version == 1) {
|
||||
while (in.peek() != EOF) {
|
||||
this->readVersion1(in);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
inline Logbook()
|
||||
{
|
||||
if (utilities::fileExists(BASE_DIRECTORY LOGBOOK)) {
|
||||
this->fromFile();
|
||||
}
|
||||
}
|
||||
|
||||
template <class... Args> inline void addEntry(Args &&...args)
|
||||
{
|
||||
this->entries.emplace_back(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
inline void toFile() const
|
||||
{
|
||||
std::ofstream out(BASE_DIRECTORY LOGBOOK, std::fstream::binary);
|
||||
out.write(LOGBOOK_HEADER, 4);
|
||||
out.write("\1", 1);
|
||||
for (const LogbookEntry &entry : this->entries) {
|
||||
entry.toFile(out);
|
||||
}
|
||||
out.close();
|
||||
}
|
||||
};
|
||||
} // namespace logbook
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
#endif
|
||||
@@ -0,0 +1,210 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOKENTRY_H
|
||||
#define GERMANAIRLINESVA_FILE_LOGBOOK_LOGBOOKENTRY_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "helpers.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace logbook
|
||||
{
|
||||
/*
|
||||
* Preamble (25)
|
||||
* CHAR[10] | CHAR[1] | CHAR[4] | CHAR[4] | CHAR[6]
|
||||
* ---------+-------------+---------------+----------+-------------
|
||||
* DATE | FLIGHT TYPE | FLIGHT NUMBER | AIRCRAFT | REGISTRATION
|
||||
|
||||
* Departure Airport Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Departure Gate Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Departure Runway Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Arrival Airport Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Arrival Gate Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Arrival Runway Name (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Times (24)
|
||||
* CHAR[5] | CHAR[5] | CHAR[5] | CHAR[5] | FLOAT
|
||||
* ----------+---------------+--------------+---------------+------
|
||||
* OFF BLOCK | TAKEOFF (OUT) | LANDING (ON) | ON BLOCK (IN) | TOTAL
|
||||
|
||||
* Fuels (16)
|
||||
* FLOAT | FLOAT | FLOAT | FLOAT
|
||||
* ---------+-----------+---------+------
|
||||
* TAXI OUT | IN FLIGHT | TAXI IN | TOTAL
|
||||
|
||||
* Distances (16)
|
||||
* FLOAT | FLOAT | FLOAT |FLOAT
|
||||
* ---------+-----------+---------+-----
|
||||
* TAXI OUT | IN FLIGHT | TAXI IN |TOTAL
|
||||
|
||||
* Landing (9)
|
||||
* FLOAT | CHAR | FLOAT
|
||||
* ---------+---------- +------------
|
||||
* MAX RATE | TOUCHDOWNS | MAX G-FORCE
|
||||
|
||||
* Recording Filename (1...257)
|
||||
* UINT8 | CHAR[]
|
||||
* -------+-------
|
||||
* STRLEN | STRING
|
||||
|
||||
* Postamble (5)
|
||||
* FLOAT | BITFIELD
|
||||
* -------+---------
|
||||
* POINTS | FLAGS
|
||||
|
||||
* Flags Bitfield
|
||||
* 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
|
||||
* ----+-----+-----+-----+------+------+--------+------
|
||||
* NIL | NIL | NIL | NIL | SYNC | IVAO | VATSIM | FILED
|
||||
*/
|
||||
class LogbookEntry
|
||||
{
|
||||
private:
|
||||
std::string date;
|
||||
std::string flightType;
|
||||
std::string flightNumber;
|
||||
std::string aircraftType;
|
||||
std::string aircraftRegistration;
|
||||
std::string departureAirport;
|
||||
std::string departureGate;
|
||||
std::string departureRunway;
|
||||
std::string arrivalAirport;
|
||||
std::string arrivalGate;
|
||||
std::string arrivalRunway;
|
||||
std::string offBlockTime;
|
||||
std::string outTime;
|
||||
std::string onTime;
|
||||
std::string onBlockTime;
|
||||
float totalFlightTime;
|
||||
float taxiOutFuel;
|
||||
float inFlightFuel;
|
||||
float taxiInFuel;
|
||||
float totalFuel;
|
||||
float taxiOutDistance;
|
||||
float inFlightDistance;
|
||||
float taxiInDistance;
|
||||
float totalDistance;
|
||||
float maxLandingRate;
|
||||
std::uint8_t touchdowns;
|
||||
float maxLandingGees;
|
||||
std::string recordingFilename;
|
||||
float points;
|
||||
std::uint8_t flags;
|
||||
|
||||
public:
|
||||
inline LogbookEntry(std::string date,
|
||||
std::string flightType,
|
||||
std::string flightNumber,
|
||||
std::string aircraftType,
|
||||
std::string aircraftRegistration,
|
||||
std::string departureAirport,
|
||||
std::string departureGate,
|
||||
std::string departureRunway,
|
||||
std::string arrivalAirport,
|
||||
std::string arrivalGate,
|
||||
std::string arrivalRunway,
|
||||
std::string offBlockTime,
|
||||
std::string outTime,
|
||||
std::string onTime,
|
||||
std::string onBlockTime,
|
||||
float totalFlightTime,
|
||||
float taxiOutFuel,
|
||||
float inFlightFuel,
|
||||
float taxiInFuel,
|
||||
float totalFuel,
|
||||
float taxiOutDistance,
|
||||
float inFlightDistance,
|
||||
float taxiInDistance,
|
||||
float totalDistance,
|
||||
float maxLandingRate,
|
||||
std::uint8_t touchdowns,
|
||||
float maxLandingGees,
|
||||
std::string recordingFilename,
|
||||
float points,
|
||||
std::uint8_t flags)
|
||||
: date(date), flightType(flightType), flightNumber(flightNumber),
|
||||
aircraftType(aircraftType),
|
||||
aircraftRegistration(aircraftRegistration),
|
||||
departureAirport(departureAirport), departureGate(departureGate),
|
||||
departureRunway(departureRunway), arrivalAirport(arrivalAirport),
|
||||
arrivalGate(arrivalGate), arrivalRunway(arrivalRunway),
|
||||
offBlockTime(offBlockTime), outTime(outTime), onTime(onTime),
|
||||
onBlockTime(onBlockTime), totalFlightTime(totalFlightTime),
|
||||
taxiOutFuel(taxiOutFuel), inFlightFuel(inFlightFuel),
|
||||
taxiInFuel(taxiInFuel), totalFuel(totalFuel),
|
||||
taxiOutDistance(taxiOutDistance),
|
||||
inFlightDistance(inFlightDistance),
|
||||
taxiInDistance(taxiInDistance), totalDistance(totalDistance),
|
||||
maxLandingRate(maxLandingRate), touchdowns(touchdowns),
|
||||
maxLandingGees(maxLandingGees),
|
||||
recordingFilename(recordingFilename), points(points), flags(flags)
|
||||
{
|
||||
}
|
||||
|
||||
inline void toFile(std::ofstream &out) const
|
||||
{
|
||||
writeString(out, this->date, 10);
|
||||
writeString(out, this->flightType, 1);
|
||||
writeString(out, this->flightNumber, 4);
|
||||
writeString(out, this->aircraftType, 4);
|
||||
writeString(out, this->aircraftRegistration, 6);
|
||||
writeString(out, this->departureAirport);
|
||||
writeString(out, this->departureGate);
|
||||
writeString(out, this->departureRunway);
|
||||
writeString(out, this->arrivalAirport);
|
||||
writeString(out, this->arrivalGate);
|
||||
writeString(out, this->arrivalRunway);
|
||||
writeString(out, this->offBlockTime, 5);
|
||||
writeString(out, this->outTime, 5);
|
||||
writeString(out, this->onTime, 5);
|
||||
writeString(out, this->onBlockTime, 5);
|
||||
write<decltype(this->totalFlightTime)>(out, this->totalFlightTime);
|
||||
write<decltype(this->taxiOutFuel)>(out, this->taxiOutFuel);
|
||||
write<decltype(this->inFlightFuel)>(out, this->inFlightFuel);
|
||||
write<decltype(this->taxiInFuel)>(out, this->taxiInFuel);
|
||||
write<decltype(this->totalFuel)>(out, this->totalFuel);
|
||||
write<decltype(this->taxiOutDistance)>(out, this->taxiOutDistance);
|
||||
write<decltype(this->inFlightDistance)>(out, this->inFlightDistance);
|
||||
write<decltype(this->taxiInDistance)>(out, this->taxiInDistance);
|
||||
write<decltype(this->totalDistance)>(out, this->totalDistance);
|
||||
write<decltype(this->maxLandingRate)>(out, this->maxLandingRate);
|
||||
write<decltype(this->touchdowns)>(out, this->touchdowns);
|
||||
write<decltype(this->maxLandingGees)>(out, this->maxLandingGees);
|
||||
writeString(out, this->recordingFilename);
|
||||
write<decltype(this->points)>(out, this->points);
|
||||
write<decltype(this->flags)>(out, this->flags);
|
||||
}
|
||||
};
|
||||
} // namespace logbook
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_RECORDING_RECORDING_H
|
||||
#define GERMANAIRLINESVA_FILE_RECORDING_RECORDING_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
|
||||
#include "constants.h"
|
||||
#include "recordingEntry.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace recording
|
||||
{
|
||||
/*
|
||||
* Path Recording (6 + n * 24)
|
||||
* HEADER | SEGMENTS
|
||||
|
||||
* Header (6)
|
||||
* CHAR[5] | UINT8
|
||||
* --------+--------
|
||||
* VGAR | VERSION
|
||||
|
||||
* Path Segments (n)
|
||||
* PATHSEGMENT[]
|
||||
*/
|
||||
class Recording
|
||||
{
|
||||
private:
|
||||
std::vector<RecordingEntry> entries;
|
||||
|
||||
public:
|
||||
template <class... Args> inline void addEntry(Args &&...args)
|
||||
{
|
||||
this->entries.emplace_back(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
inline void toFile(std::string fileName) const
|
||||
{
|
||||
std::ofstream out(BASE_DIRECTORY RECORDING_DIRECTORY + fileName,
|
||||
std::fstream::binary);
|
||||
out.write(RECORDING_HEADER, 4);
|
||||
out.write("\1", 1);
|
||||
for (const RecordingEntry &entry : this->entries) {
|
||||
entry.toFile(out);
|
||||
}
|
||||
out.close();
|
||||
}
|
||||
};
|
||||
} // namespace recording
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,68 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_RECORDING_RECORDINGENTRY_H
|
||||
#define GERMANAIRLINESVA_FILE_RECORDING_RECORDINGENTRY_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
|
||||
#include "geodata.hpp"
|
||||
#include "helpers.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace recording
|
||||
{
|
||||
/*
|
||||
* Path Segment (24)
|
||||
* UINT32 | UINT16 | UINT16 | POINT
|
||||
* -------+----------+-------------+------------
|
||||
* TIME | ALTITUDE | GROUNDSPEED | COORDINATES
|
||||
*/
|
||||
class RecordingEntry
|
||||
{
|
||||
private:
|
||||
std::uint32_t time;
|
||||
std::uint16_t altitude = 0;
|
||||
std::uint16_t groundSpeed = 0;
|
||||
struct utilities::geodata::point coordinates = {NAN, NAN};
|
||||
|
||||
public:
|
||||
inline RecordingEntry() = default;
|
||||
inline RecordingEntry(std::uint32_t time,
|
||||
std::uint16_t altitude,
|
||||
std::uint16_t groundSpeed,
|
||||
struct utilities::geodata::point coordinates)
|
||||
: time(time), altitude(altitude), groundSpeed(groundSpeed),
|
||||
coordinates(coordinates)
|
||||
{
|
||||
}
|
||||
|
||||
inline void toFile(std::ofstream &out) const
|
||||
{
|
||||
write<decltype(this->time)>(out, this->time);
|
||||
write<decltype(this->altitude)>(out, this->altitude);
|
||||
write<decltype(this->groundSpeed)>(out, this->groundSpeed);
|
||||
write<decltype(this->coordinates)>(out, this->coordinates);
|
||||
}
|
||||
|
||||
friend inline bool operator==(const RecordingEntry &lhs,
|
||||
const RecordingEntry &rhs)
|
||||
{
|
||||
return lhs.altitude == rhs.altitude &&
|
||||
lhs.groundSpeed == rhs.groundSpeed &&
|
||||
lhs.coordinates.latitude == rhs.coordinates.latitude &&
|
||||
lhs.coordinates.longitude == rhs.coordinates.longitude;
|
||||
}
|
||||
friend inline bool operator!=(const RecordingEntry &lhs,
|
||||
const RecordingEntry &rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
};
|
||||
} // namespace recording
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,83 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_GATE_H
|
||||
#define GERMANAIRLINESVA_FILE_SIMDATA_GATE_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <streambuf>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "geodata.hpp"
|
||||
#include "helpers.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace simdata
|
||||
{
|
||||
/*
|
||||
* Representation of gate
|
||||
* Center in lat/lon degrees
|
||||
* Radius in metres
|
||||
*
|
||||
* UINT8 | CHAR[] | POINT | UINT8
|
||||
* -------+------------+--------+-------
|
||||
* STRLEN | DESIGNATOR | CENTER | RADIUS
|
||||
*/
|
||||
class Gate
|
||||
{
|
||||
private:
|
||||
std::string designator;
|
||||
struct utilities::geodata::point center;
|
||||
std::uint8_t radius;
|
||||
|
||||
public:
|
||||
// From X-Plane or MakeRwys
|
||||
inline Gate(std::string designator,
|
||||
double latitude,
|
||||
double longitude,
|
||||
std::uint8_t radius)
|
||||
: designator(designator), center({latitude, longitude}),
|
||||
radius(radius){};
|
||||
// From Database
|
||||
inline Gate(std::string designator,
|
||||
struct utilities::geodata::point center,
|
||||
std::uint8_t radius)
|
||||
: designator(designator), center(center), radius(radius){};
|
||||
|
||||
inline void toFile(std::ofstream &out) const
|
||||
{
|
||||
writeString(out, this->designator);
|
||||
write<decltype(this->center)>(out, this->center);
|
||||
write<decltype(this->radius)>(out, this->radius);
|
||||
}
|
||||
|
||||
inline bool contains(utilities::geodata::point coordinates) const
|
||||
{
|
||||
return utilities::geodata::distanceEarthP(this->center, coordinates);
|
||||
}
|
||||
|
||||
inline const std::string to_string() const
|
||||
{
|
||||
std::ostringstream str;
|
||||
str << "Gate " << this->designator << " at " << this->center.latitude
|
||||
<< "N " << this->center.longitude << "E, Radius "
|
||||
<< (int)this->radius << "m";
|
||||
return str.str();
|
||||
}
|
||||
|
||||
friend inline std::ostream &operator<<(std::ostream &os,
|
||||
const Gate &gate)
|
||||
{
|
||||
return os << gate.to_string();
|
||||
}
|
||||
};
|
||||
} // namespace simdata
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,163 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_RUNWAY_H
|
||||
#define GERMANAIRLINESVA_FILE_SIMDATA_RUNWAY_H
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <regex>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "geodata.hpp"
|
||||
#include "helpers.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace simdata
|
||||
{
|
||||
/*
|
||||
* Representation of one runway with supplementary information
|
||||
* Heading in degrees true
|
||||
* Threshold center in lat/lon degrees
|
||||
* Width and length in metres
|
||||
*
|
||||
* UINT8 | CHAR[] | BOX | UINT8 | UINT16 | DOUBLE
|
||||
* -------+------------+--------+-------+--------+-------
|
||||
* STRLEN | DESIGNATOR | BOUNDS | WIDTH | LENGTH | TRUHDG
|
||||
*/
|
||||
class Runway
|
||||
{
|
||||
private:
|
||||
std::string designator;
|
||||
struct utilities::geodata::box bounds;
|
||||
std::uint8_t width;
|
||||
std::uint16_t length;
|
||||
double trueHeading;
|
||||
|
||||
public:
|
||||
// From X-Plane
|
||||
inline Runway(std::string designator,
|
||||
double latitudeStart,
|
||||
double longitudeStart,
|
||||
double latitudeEnd,
|
||||
double longitudeEnd,
|
||||
double width)
|
||||
: designator(designator), width(width)
|
||||
{
|
||||
this->length = utilities::geodata::distanceEarthD(latitudeStart,
|
||||
longitudeStart,
|
||||
latitudeEnd,
|
||||
longitudeEnd);
|
||||
this->trueHeading = utilities::geodata::bearingDD(latitudeStart,
|
||||
longitudeStart,
|
||||
latitudeEnd,
|
||||
longitudeEnd);
|
||||
this->bounds = utilities::geodata::calculateBoxDD(
|
||||
{latitudeStart, longitudeStart},
|
||||
{latitudeEnd, longitudeEnd},
|
||||
this->trueHeading,
|
||||
this->width);
|
||||
};
|
||||
// From MakeRwys
|
||||
inline Runway(std::string designator,
|
||||
struct utilities::geodata::point start,
|
||||
double width,
|
||||
double length,
|
||||
double trueHeading)
|
||||
: designator(designator), width(width), length(length),
|
||||
trueHeading(trueHeading)
|
||||
{
|
||||
utilities::geodata::point end =
|
||||
utilities::geodata::calculatePointDD(start, trueHeading, length);
|
||||
|
||||
this->bounds = utilities::geodata::calculateBoxDD(start,
|
||||
end,
|
||||
trueHeading,
|
||||
width);
|
||||
};
|
||||
// From database
|
||||
inline Runway(std::string designator,
|
||||
struct utilities::geodata::box bounds,
|
||||
std::uint8_t width,
|
||||
std::uint16_t length,
|
||||
double trueHeading)
|
||||
: designator(designator), bounds(bounds), width(width),
|
||||
length(length), trueHeading(trueHeading){};
|
||||
|
||||
inline bool containsPoint(const utilities::geodata::point point) const
|
||||
{
|
||||
size_t j = 3;
|
||||
bool c = false;
|
||||
std::vector<utilities::geodata::point> poly{this->bounds.topLeft,
|
||||
this->bounds.topRight,
|
||||
this->bounds.bottomRight,
|
||||
this->bounds.bottomLeft};
|
||||
|
||||
for (size_t i = 0; i < poly.size(); i++) {
|
||||
if ((point.latitude == poly[i].latitude) &&
|
||||
(point.longitude == poly[i].longitude)) {
|
||||
// point is a corner
|
||||
return true;
|
||||
}
|
||||
if (((poly[i].longitude > point.longitude) !=
|
||||
(poly[j].longitude > point.longitude))) {
|
||||
double slope = (point.latitude - poly[i].latitude) *
|
||||
(poly[j].longitude - poly[i].longitude) -
|
||||
(poly[j].latitude - poly[i].latitude) *
|
||||
(point.longitude - poly[i].longitude);
|
||||
if (slope == 0) {
|
||||
// point is on boundary
|
||||
return true;
|
||||
}
|
||||
if ((slope < 0) != (poly[j].longitude < poly[i].longitude)) {
|
||||
c = !c;
|
||||
}
|
||||
}
|
||||
j = i;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
inline void toFile(std::ofstream &out) const
|
||||
{
|
||||
writeString(out, this->designator);
|
||||
write<decltype(this->bounds)>(out, this->bounds);
|
||||
write<decltype(this->width)>(out, this->width);
|
||||
write<decltype(this->length)>(out, this->length);
|
||||
write<decltype(this->trueHeading)>(out, this->trueHeading);
|
||||
}
|
||||
|
||||
inline const std::string to_string() const
|
||||
{
|
||||
std::ostringstream str;
|
||||
str << "Runway " << this->designator << " with bounds "
|
||||
<< this->bounds.topLeft.latitude << "N "
|
||||
<< this->bounds.topLeft.longitude << "E, "
|
||||
<< this->bounds.topRight.latitude << "N "
|
||||
<< this->bounds.topRight.longitude << "E, "
|
||||
<< this->bounds.bottomRight.latitude << "N "
|
||||
<< this->bounds.bottomRight.longitude << "E, "
|
||||
<< this->bounds.bottomLeft.latitude << "N "
|
||||
<< this->bounds.bottomLeft.longitude << "E, "
|
||||
<< "Width " << (int)this->width << "m, Length " << this->length
|
||||
<< "m, True Heading " << this->trueHeading << "°";
|
||||
return str.str();
|
||||
}
|
||||
|
||||
friend inline std::ostream &operator<<(std::ostream &os,
|
||||
const Runway &runway)
|
||||
{
|
||||
return os << runway.to_string();
|
||||
}
|
||||
};
|
||||
} // namespace simdata
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,236 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATABASE_H
|
||||
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATABASE_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "config/config.hpp"
|
||||
#include "constants.h"
|
||||
#include "simdata/gate.hpp"
|
||||
#include "simdata/runway.hpp"
|
||||
#ifdef XP
|
||||
#include "simdata/simdataXP.hpp"
|
||||
#endif
|
||||
#if not defined(XP) && not defined(MSFS)
|
||||
#include "simdata/simdataESP.hpp"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Header
|
||||
*
|
||||
* CHAR[5] | UINT8
|
||||
* --------+--------
|
||||
* VGAS | VERSION
|
||||
*/
|
||||
/*
|
||||
* Airport
|
||||
*
|
||||
* UINT8 | CHAR[] | UINT16 | GATE[] | UINT8 | RUNWAY[]
|
||||
* --------+--------+----------+--------+---------+---------
|
||||
* STRLEN | ICAO | NUMGATES | GATES | NUMRWYS | RUNWAYS
|
||||
*/
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace simdata
|
||||
{
|
||||
class SimDatabase
|
||||
{
|
||||
private:
|
||||
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
|
||||
airports;
|
||||
|
||||
inline void readVersion1(std::ifstream &in)
|
||||
{
|
||||
std::uint16_t numAirports = read<std::uint16_t>(in);
|
||||
|
||||
for (int i = 0; i < numAirports; i++) {
|
||||
// ICAO
|
||||
std::string icao = readString(in);
|
||||
// Gates
|
||||
std::uint16_t numGates = read<std::uint16_t>(in);
|
||||
for (int j = 0; j < numGates; j++) {
|
||||
std::string designator = readString(in);
|
||||
struct utilities::geodata::point center =
|
||||
read<struct utilities::geodata::point>(in);
|
||||
std::uint8_t radius = read<std::uint8_t>(in);
|
||||
|
||||
this->airports[icao].first.emplace_back(designator,
|
||||
center,
|
||||
radius);
|
||||
}
|
||||
// Runways
|
||||
std::uint8_t numRunways = read<std::uint8_t>(in);
|
||||
for (int j = 0; j < numRunways; j++) {
|
||||
std::string designator = readString(in);
|
||||
// Center
|
||||
struct utilities::geodata::box bounds =
|
||||
read<struct utilities::geodata::box>(in);
|
||||
std::uint8_t width = read<std::uint8_t>(in);
|
||||
std::uint16_t length = read<std::uint16_t>(in);
|
||||
double trueHeading = read<double>(in);
|
||||
|
||||
this->airports[icao].second.emplace_back(designator,
|
||||
bounds,
|
||||
width,
|
||||
length,
|
||||
trueHeading);
|
||||
}
|
||||
}
|
||||
|
||||
in.close();
|
||||
}
|
||||
|
||||
inline void fromFile(const char *file)
|
||||
{
|
||||
std::string path(BASE_DIRECTORY);
|
||||
path.append(file);
|
||||
std::ifstream in(path, std::ifstream::binary);
|
||||
|
||||
std::string ident = readString(in, 4);
|
||||
if (ident.compare(SIMDATABASE_HEADER) != 0) {
|
||||
throw std::invalid_argument("Wrong file");
|
||||
}
|
||||
std::uint8_t version = read<std::uint8_t>(in);
|
||||
|
||||
if (version == 1) {
|
||||
this->readVersion1(in);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
inline SimDatabase(int simVersion,
|
||||
const char *hash,
|
||||
std::shared_ptr<config::Config> &configuration,
|
||||
std::function<void(const std::string)> toLog)
|
||||
{
|
||||
if (strcmp(configuration->getScenery().c_str(), hash) != 0 ||
|
||||
!utilities::fileExists(BASE_DIRECTORY SIMDATABASE)) {
|
||||
#ifdef XP
|
||||
scan(simVersion < 12000 ? XPLANE11_BASE_SCENERY
|
||||
: XPLANE12_BASE_SCENERY,
|
||||
XPLANE_CUSTOM_SCENERY,
|
||||
BASE_DIRECTORY "log.txt",
|
||||
airports);
|
||||
#endif
|
||||
#ifndef MSFS
|
||||
scan(BASE_DIRECTORY MAKERWYS_R5,
|
||||
BASE_DIRECTORY MAKERWYS_G5,
|
||||
BASE_DIRECTORY "db_log.txt",
|
||||
airports);
|
||||
#endif
|
||||
configuration->updateScenery(hash);
|
||||
#ifdef XP
|
||||
this->toFile(SIMDATABASE);
|
||||
#endif
|
||||
#ifndef MSFS
|
||||
switch (simVersion) {
|
||||
case FSX_VERSION:
|
||||
this->toFile(FSX_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case FSXSE_VERSION:
|
||||
this->toFile(FSXSE_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D3_VERSION:
|
||||
this->toFile(P3D3_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D4_VERSION:
|
||||
this->toFile(P3D4_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D5_VERSION:
|
||||
this->toFile(P3D5_PREFIX SIMDATABASE);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
toLog("Sim Database updated");
|
||||
} else {
|
||||
#ifdef XP
|
||||
this->fromFile(SIMDATABASE);
|
||||
#endif
|
||||
#ifndef MSFS
|
||||
switch (simVersion) {
|
||||
case FSX_VERSION:
|
||||
this->fromFile(FSX_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case FSXSE_VERSION:
|
||||
this->fromFile(FSXSE_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D3_VERSION:
|
||||
this->fromFile(P3D3_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D4_VERSION:
|
||||
this->fromFile(P3D4_PREFIX SIMDATABASE);
|
||||
break;
|
||||
case P3D5_VERSION:
|
||||
this->fromFile(P3D5_PREFIX SIMDATABASE);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
toLog("Sim Database loaded");
|
||||
}
|
||||
}
|
||||
|
||||
inline void toFile(const char *file) const
|
||||
{
|
||||
std::string path(BASE_DIRECTORY);
|
||||
path.append(file);
|
||||
std::ofstream out(path, std::fstream::binary);
|
||||
|
||||
// File Header
|
||||
out.write(SIMDATABASE_HEADER, 4);
|
||||
out.write("\1", 1);
|
||||
// Num Airports
|
||||
write<std::uint16_t>(out, airports.size());
|
||||
// Airport
|
||||
for (const std::pair<
|
||||
const std::string,
|
||||
std::pair<std::vector<Gate>, std::vector<Runway>>> &airport :
|
||||
airports) {
|
||||
std::string icao = airport.first;
|
||||
const std::vector<Gate> gates = airport.second.first;
|
||||
const std::vector<Runway> runways = airport.second.second;
|
||||
// ICAO
|
||||
writeString(out, icao);
|
||||
// Gates
|
||||
write<std::uint16_t>(out, gates.size());
|
||||
for (const Gate &gate : gates) {
|
||||
gate.toFile(out);
|
||||
}
|
||||
// Runways
|
||||
write<std::uint8_t>(out, runways.size());
|
||||
for (const Runway &runway : runways) {
|
||||
runway.toFile(out);
|
||||
}
|
||||
}
|
||||
out.close();
|
||||
}
|
||||
|
||||
inline std::size_t getCount() const { return this->airports.size(); }
|
||||
|
||||
inline const std::pair<const std::vector<Gate>,
|
||||
const std::vector<Runway>>
|
||||
operator[](std::string key)
|
||||
{
|
||||
auto it = this->airports.find(key);
|
||||
if (it != this->airports.end()) {
|
||||
return this->airports[key];
|
||||
} else {
|
||||
return std::pair<std::vector<Gate>, std::vector<Runway>>();
|
||||
}
|
||||
}
|
||||
};
|
||||
} // namespace simdata
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,142 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H
|
||||
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "geodata.hpp"
|
||||
#include "simdata/gate.hpp"
|
||||
#include "simdata/runway.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace simdata
|
||||
{
|
||||
inline int scan(
|
||||
const std::string runwaysFile,
|
||||
const std::string gatesFile,
|
||||
const std::string logFile,
|
||||
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
|
||||
&airports)
|
||||
{
|
||||
std::ifstream runways(runwaysFile);
|
||||
if (!runways.good()) {
|
||||
return 1;
|
||||
}
|
||||
std::ifstream gates(gatesFile);
|
||||
if (!gates.good()) {
|
||||
runways.close();
|
||||
return 2;
|
||||
}
|
||||
std::ofstream log(logFile, std::fstream::trunc);
|
||||
if (!log.good()) {
|
||||
runways.close();
|
||||
gates.close();
|
||||
return 3;
|
||||
}
|
||||
|
||||
std::string line;
|
||||
std::string *currentIcao = nullptr;
|
||||
std::map<std::string, std::vector<Gate>> tmpAirportGates;
|
||||
std::map<std::string, std::vector<Runway>> tmpAirportRunways;
|
||||
std::vector<Gate> tmpGates;
|
||||
std::vector<Runway> tmpRunways;
|
||||
|
||||
int apCount = 0;
|
||||
int validCount = 0;
|
||||
|
||||
log << "<FILE> " << runwaysFile << std::endl;
|
||||
|
||||
while (std::getline(runways, line)) {
|
||||
std::vector<std::string> fields = utilities::split(line, ',');
|
||||
// New ICAO
|
||||
if (currentIcao != nullptr && *currentIcao != fields[0]) {
|
||||
tmpAirportRunways[*currentIcao] = tmpRunways;
|
||||
tmpRunways = std::vector<Runway>();
|
||||
apCount++;
|
||||
}
|
||||
|
||||
currentIcao = new std::string(fields[0]);
|
||||
|
||||
int desig = std::stoi(fields[1]);
|
||||
std::string designator;
|
||||
switch (desig % 10) {
|
||||
case 0:
|
||||
designator = std::to_string(desig / 10);
|
||||
break;
|
||||
case 1:
|
||||
designator = std::to_string(desig / 10) + " L";
|
||||
break;
|
||||
case 2:
|
||||
designator = std::to_string(desig / 10) + " R";
|
||||
break;
|
||||
case 3:
|
||||
designator = std::to_string(desig / 10) + " C";
|
||||
break;
|
||||
}
|
||||
if (desig < 100) {
|
||||
designator = "0" + designator;
|
||||
}
|
||||
|
||||
struct utilities::geodata::point start = {std::stod(fields[2]),
|
||||
std::stod(fields[3])};
|
||||
tmpRunways.emplace_back(
|
||||
designator,
|
||||
start,
|
||||
utilities::geodata::toMetre(std::stod(fields[8])),
|
||||
utilities::geodata::toMetre(std::stod(fields[6])),
|
||||
std::stod(fields[5]) + std::stod(fields[9]));
|
||||
|
||||
log << "\t<RUNWAY> " << line << std::endl;
|
||||
}
|
||||
|
||||
currentIcao = nullptr;
|
||||
while (std::getline(gates, line)) {
|
||||
std::vector<std::string> fields = utilities::split(line, ',');
|
||||
// New ICAO
|
||||
if (currentIcao != nullptr && *currentIcao != fields[0]) {
|
||||
tmpAirportGates[*currentIcao] = tmpGates;
|
||||
tmpGates = std::vector<Gate>();
|
||||
}
|
||||
|
||||
currentIcao = new std::string(fields[0]);
|
||||
|
||||
double width = std::stod(fields[5]);
|
||||
tmpGates.emplace_back(fields[1] + fields[2],
|
||||
std::stod(fields[3]),
|
||||
std::stod(fields[4]),
|
||||
width > 0 ? width : 20);
|
||||
|
||||
log << "\t<GATE> " << line << std::endl;
|
||||
}
|
||||
|
||||
for (const auto &pair : tmpAirportRunways) {
|
||||
std::string icao = pair.first;
|
||||
|
||||
if (!tmpAirportGates[icao].empty() && !pair.second.empty()) {
|
||||
airports[icao] = {tmpAirportGates[icao], pair.second};
|
||||
log << "\t<STATUS> " << icao << " committed" << std::endl;
|
||||
validCount++;
|
||||
} else {
|
||||
log << "\t<STATUS> " << icao << " had no gates or runways"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
log << "<STATUS> " << apCount << " airports found, of which "
|
||||
<< validCount << " are valid" << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
} // namespace simdata
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,208 @@
|
||||
#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAXP_H
|
||||
#define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAXP_H
|
||||
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include "simdata/gate.hpp"
|
||||
#include "simdata/runway.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
namespace germanairlinesva
|
||||
{
|
||||
namespace file
|
||||
{
|
||||
namespace simdata
|
||||
{
|
||||
inline void makeGate15(std::vector<Gate> &gates,
|
||||
const std::vector<std::string> &fields)
|
||||
{
|
||||
std::string gateName;
|
||||
for (size_t j = 4; j < fields.size() - 1; j++) {
|
||||
gateName += fields[j] + " ";
|
||||
}
|
||||
gateName += fields.back();
|
||||
gateName = std::regex_replace(gateName, std::regex{","}, "0");
|
||||
gates.emplace_back(gateName,
|
||||
std::stod(fields[1]),
|
||||
std::stod(fields[2]),
|
||||
40);
|
||||
}
|
||||
|
||||
inline void makeRunway(std::vector<Runway> &runways,
|
||||
const std::vector<std::string> &fields)
|
||||
{
|
||||
runways.emplace_back(fields[8],
|
||||
std::stod(fields[9]),
|
||||
std::stod(fields[10]),
|
||||
std::stod(fields[18]),
|
||||
std::stod(fields[19]),
|
||||
std::stod(fields[1]));
|
||||
runways.emplace_back(fields[17],
|
||||
std::stod(fields[18]),
|
||||
std::stod(fields[19]),
|
||||
std::stod(fields[9]),
|
||||
std::stod(fields[10]),
|
||||
std::stod(fields[1]));
|
||||
}
|
||||
|
||||
inline void makeGate1300(std::vector<Gate> &gates,
|
||||
const std::vector<std::string> &fields)
|
||||
{
|
||||
std::string gateName;
|
||||
for (size_t j = 6; j < fields.size() - 1; j++) {
|
||||
gateName += fields[j] + " ";
|
||||
}
|
||||
gateName += fields.back();
|
||||
gateName = std::regex_replace(gateName, std::regex{","}, "0");
|
||||
|
||||
gates.emplace_back(gateName,
|
||||
std::stod(fields[1]),
|
||||
std::stod(fields[2]),
|
||||
20);
|
||||
}
|
||||
|
||||
inline void makeAirport(
|
||||
const std::string &kind,
|
||||
std::ifstream &infile,
|
||||
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
|
||||
&airports,
|
||||
std::ofstream &logfile)
|
||||
{
|
||||
std::string line;
|
||||
std::string *currentIcao = nullptr;
|
||||
std::vector<Gate> tmpGates;
|
||||
std::vector<Runway> tmpRunways;
|
||||
|
||||
int apCount = 0;
|
||||
int validCount = 0;
|
||||
|
||||
while (std::getline(infile, line)) {
|
||||
std::vector<std::string> fields = utilities::split(line, ' ');
|
||||
fields =
|
||||
utilities::select_T<std::string>(fields, [](const std::string &s) {
|
||||
return s.length() > 0;
|
||||
});
|
||||
|
||||
if (fields.empty())
|
||||
continue;
|
||||
if (fields[0] == "1") {
|
||||
// Write to file if ICAO is valid, and we have gates and runways
|
||||
if (currentIcao != nullptr && !tmpRunways.empty() &&
|
||||
!tmpGates.empty()) {
|
||||
airports[*currentIcao] = {tmpGates, tmpRunways};
|
||||
validCount += 1;
|
||||
logfile << "\t<STATUS> " << *currentIcao << " committed"
|
||||
<< std::endl;
|
||||
} else if (currentIcao != nullptr) {
|
||||
logfile << "\t<STATUS> " << *currentIcao
|
||||
<< " had no gates or runways" << std::endl;
|
||||
}
|
||||
tmpGates = std::vector<Gate>();
|
||||
tmpRunways = std::vector<Runway>();
|
||||
currentIcao = new std::string(fields[4]);
|
||||
apCount += 1;
|
||||
logfile << "\t<" << kind << "> " << line << std::endl;
|
||||
} else if (currentIcao != nullptr && fields[0] == "15") {
|
||||
makeGate15(tmpGates, fields);
|
||||
logfile << "\t\t<GATE OLD> " << line << std::endl;
|
||||
} else if (fields[0] == "16" || fields[0] == "17") {
|
||||
// Write to file if ICAO is valid, and we have gates and runways
|
||||
if (currentIcao != nullptr && !tmpRunways.empty() &&
|
||||
!tmpGates.empty()) {
|
||||
airports[*currentIcao] = {tmpGates, tmpRunways};
|
||||
validCount += 1;
|
||||
logfile << "\t<STATUS> " << *currentIcao << " committed"
|
||||
<< std::endl;
|
||||
} else if (currentIcao != nullptr) {
|
||||
logfile << "\t<STATUS> " << *currentIcao
|
||||
<< " had no gates or runways" << std::endl;
|
||||
}
|
||||
tmpGates = std::vector<Gate>();
|
||||
tmpRunways = std::vector<Runway>();
|
||||
currentIcao = nullptr;
|
||||
logfile << "\t<" << kind << " SKIPPED> " << line << std::endl;
|
||||
} else if (currentIcao != nullptr && fields[0] == "100") {
|
||||
makeRunway(tmpRunways, fields);
|
||||
logfile << "\t\t<RUNWAY> " << line << std::endl;
|
||||
} else if (currentIcao != nullptr && fields[0] == "1300") {
|
||||
makeGate1300(tmpGates, fields);
|
||||
logfile << "\t\t<GATE> " << line << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentIcao != nullptr && !tmpRunways.empty() && !tmpGates.empty()) {
|
||||
airports[*currentIcao] = {tmpGates, tmpRunways};
|
||||
validCount += 1;
|
||||
logfile << "\t<STATUS> " << *currentIcao << " committed" << std::endl;
|
||||
}
|
||||
logfile << "<STATUS> " << apCount << " airports found, of which "
|
||||
<< validCount << " are valid" << std::endl;
|
||||
}
|
||||
|
||||
inline int scan(
|
||||
const std::string defaultFile,
|
||||
const std::string sceneryPack,
|
||||
const std::string logFile,
|
||||
std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
|
||||
&airports)
|
||||
{
|
||||
std::ifstream base(defaultFile);
|
||||
if (!base.good()) {
|
||||
return 1;
|
||||
}
|
||||
std::ifstream custom(sceneryPack);
|
||||
if (!custom.good()) {
|
||||
base.close();
|
||||
return 2;
|
||||
}
|
||||
std::ofstream logfile(logFile, std::fstream::trunc);
|
||||
if (!logfile.good()) {
|
||||
base.close();
|
||||
custom.close();
|
||||
return 3;
|
||||
}
|
||||
|
||||
// Default
|
||||
logfile << "<FILE> " << defaultFile << std::endl;
|
||||
makeAirport("DEFAULT", base, airports, logfile);
|
||||
base.close();
|
||||
|
||||
std::string line;
|
||||
size_t pos;
|
||||
std::vector<std::string> packs;
|
||||
while (std::getline(custom, line)) {
|
||||
if ((pos = line.find("SCENERY_PACK")) != std::string::npos) {
|
||||
std::string path = utilities::rtrim_copy(line.substr(pos + 13)) +
|
||||
"Earth nav data/apt.dat";
|
||||
packs.emplace_back(path);
|
||||
}
|
||||
}
|
||||
std::reverse(packs.begin(), packs.end());
|
||||
|
||||
for (std::string const &path : packs) {
|
||||
std::ifstream pack(path);
|
||||
if (pack.good()) {
|
||||
logfile << "<FILE> " << path << std::endl;
|
||||
makeAirport("CUSTOM", pack, airports, logfile);
|
||||
pack.close();
|
||||
} else {
|
||||
pack.close();
|
||||
logfile << "<STATUS>"
|
||||
<< "Could not find " << path << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
logfile << std::endl
|
||||
<< "<STATUS> Total airports: " << airports.size() << std::endl;
|
||||
|
||||
custom.close();
|
||||
logfile.close();
|
||||
return 0;
|
||||
}
|
||||
} // namespace simdata
|
||||
} // namespace file
|
||||
} // namespace germanairlinesva
|
||||
|
||||
#endif
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [{
|
||||
"name": "Launch currently open script",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"cwd": "${fileDirname}",
|
||||
"port": 0,
|
||||
"runtimeArgs": [
|
||||
"-dxdebug.start_with_request=yes"
|
||||
],
|
||||
"env": {
|
||||
"XDEBUG_MODE": "debug,develop",
|
||||
"XDEBUG_CONFIG": "client_port=${port}"
|
||||
}
|
||||
}]
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
namespace germanairlinesva\file\logbook;
|
||||
|
||||
require_once "Recording.php";
|
||||
|
||||
class Logbook
|
||||
{
|
||||
private const file_name = "/logbook.bin";
|
||||
private const recordings_directory = "/recordings/";
|
||||
private const ident = "VGAL";
|
||||
private const header_unpack = "a4ident/Cversion";
|
||||
private const variable_string_size_unpack = "Clength";
|
||||
private const flight_start_unpack = "a10date/a1flightType/a4flightNumber/a4aircraftType/a6aircraftRegistration";
|
||||
private const flight_middle_unpack = "a5offBlockTime/a5outTime/a5inTime/a5onBlockTime/gtotalFlightTime/" .
|
||||
"gtaxiOutFuel/ginFlightFuel/gtaxiInFuel/gtotalFuel/gtaxiOutDistance/ginFlightDistance/gtaxiInDistance/" .
|
||||
"gtotalDistance/gmaxLandingRate/Ctouchdowns/gmaxLandingGees";
|
||||
private const flight_end_unpack = "gpoints/Cflags";
|
||||
|
||||
private string $directory_name = "";
|
||||
|
||||
private array $flights = [];
|
||||
private int $total_flights = 0;
|
||||
private float $total_points = 0;
|
||||
private float $total_distance = 0;
|
||||
private float $total_fuel = 0;
|
||||
private array $landing_rates = [];
|
||||
|
||||
public function __construct(string $directory)
|
||||
{
|
||||
$this->directory_name = $directory;
|
||||
|
||||
$this->read();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a json string representation
|
||||
*
|
||||
* @return string Json string representation
|
||||
*/
|
||||
public function to_json(): string
|
||||
{
|
||||
$retVal = [
|
||||
"flights" => $this->flights,
|
||||
"aggregates" => $this->get_aggregates(),
|
||||
];
|
||||
|
||||
return json_encode($retVal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a json string representation of one flight
|
||||
*
|
||||
* @return string Json string representation of one flight
|
||||
*/
|
||||
public function get_flight_json($id): string
|
||||
{
|
||||
return json_encode($this->get_flight($id));
|
||||
}
|
||||
|
||||
private function get_aggregates(): array
|
||||
{
|
||||
$retVal = [
|
||||
"totalFlights" => $this->total_flights,
|
||||
"totalPoints" => number_format(doubleval($this->total_points), 2, '.', ','),
|
||||
"totalDistance" => number_format(doubleval($this->total_distance), 0, '.', ','),
|
||||
"totalFuel" => number_format(doubleval($this->total_fuel), 1, '.', ','),
|
||||
];
|
||||
|
||||
if (count($this->landing_rates) > 0) {
|
||||
$rate = 0;
|
||||
$lastIndex = count($this->landing_rates) - 1;
|
||||
if ($lastIndex % 2 == 0) {
|
||||
// Two elements
|
||||
$lowerIndex = floor($lastIndex / 2);
|
||||
$upperIndex = ceil($lastIndex / 2);
|
||||
$lowerRate = $this->landing_rates[$lowerIndex];
|
||||
$upperRate = $this->landing_rates[$upperIndex];
|
||||
$rate = ($lowerRate + $upperRate) / 2;
|
||||
} else {
|
||||
// One Element
|
||||
$lowerIndex = floor($lastIndex / 2);
|
||||
$lowerRate = $this->landing_rates[$lowerIndex];
|
||||
$rate = $lowerRate;
|
||||
}
|
||||
$retVal["landingRate"] = number_format(doubleval($rate), 0, '.', ',');
|
||||
} else {
|
||||
$retVal["landingRate"] = "N/A";
|
||||
}
|
||||
|
||||
return $retVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific flight
|
||||
*
|
||||
* @return array The flight
|
||||
*/
|
||||
private function get_flight(int $id): array
|
||||
{
|
||||
$flight = $this->flights[$id];
|
||||
try {
|
||||
$rec = new \germanairlinesva\file\recording\Recording($this->directory_name .
|
||||
Logbook::recordings_directory . $flight["recordingFilename"] . ".rec");
|
||||
$flight["recording"] = $rec->to_json();
|
||||
} catch (\InvalidArgumentException) {
|
||||
}
|
||||
|
||||
return $flight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads logbook
|
||||
*/
|
||||
private function read()
|
||||
{
|
||||
$file = fopen($this->directory_name . Logbook::file_name, "rb");
|
||||
flock($file, LOCK_SH);
|
||||
|
||||
$version = $this->read_header($file);
|
||||
|
||||
if ($version == 1) {
|
||||
while ($this->read_flight_1($file) != false);
|
||||
}
|
||||
rsort($this->landing_rates);
|
||||
|
||||
flock($file, LOCK_UN);
|
||||
fclose($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads one flight entry
|
||||
*
|
||||
* @param resource $file File handle
|
||||
*
|
||||
* @return true If not EOF
|
||||
* @return false If EOF
|
||||
*
|
||||
* @throws InvalidArgumentException If file is not a resource
|
||||
*/
|
||||
private function read_flight_1($file): bool
|
||||
{
|
||||
if (false === is_resource($file)) {
|
||||
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
|
||||
}
|
||||
|
||||
$retVal = [];
|
||||
$data = fread($file, 25);
|
||||
if ($data) {
|
||||
$retVal = array_merge($retVal, unpack(Logbook::flight_start_unpack, $data));
|
||||
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["departureAirport"] = fread($file, $size);
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["departureGate"] = fread($file, $size);
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["departureRunway"] = fread($file, $size);
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["arrivalAirport"] = fread($file, $size);
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["arrivalGate"] = fread($file, $size);
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["arrivalRunway"] = fread($file, $size);
|
||||
|
||||
$retVal = array_merge($retVal, unpack(Logbook::flight_middle_unpack, fread($file, 65)));
|
||||
|
||||
$size = unpack(Logbook::variable_string_size_unpack, fread($file, 1))["length"];
|
||||
$retVal["recordingFilename"] = fread($file, $size);
|
||||
|
||||
$retVal = array_merge($retVal, unpack(Logbook::flight_end_unpack, fread($file, 5)));
|
||||
|
||||
array_push($this->flights, $retVal);
|
||||
$this->total_flights++;
|
||||
$this->total_points += $retVal["points"];
|
||||
$this->total_distance += $retVal["totalDistance"];
|
||||
$this->total_fuel += $retVal["totalFuel"];
|
||||
array_push($this->landing_rates, $retVal["maxLandingRate"]);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the file header
|
||||
*
|
||||
* @param resource $file File handle
|
||||
*
|
||||
* @return string File version
|
||||
*
|
||||
* @throws InvalidArgumentException If file is not a resource
|
||||
* @throws UnexpectedValueException If ident mismatches
|
||||
*/
|
||||
private function read_header($file): string
|
||||
{
|
||||
if (false === is_resource($file)) {
|
||||
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
|
||||
}
|
||||
|
||||
$header = unpack(Logbook::header_unpack, fread($file, 5));
|
||||
|
||||
if ($header["ident"] !== Logbook::ident) {
|
||||
throw
|
||||
new \UnexpectedValueException(sprintf("Ident mismatch. Got %s, expected %s", $header["ident"], Logbook::ident));
|
||||
}
|
||||
|
||||
return $header["version"];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
namespace germanairlinesva\file\recording;
|
||||
|
||||
class Recording
|
||||
{
|
||||
private const ident = "VGAR";
|
||||
private const header_unpack = "a4ident/Cversion";
|
||||
private const segment_unpack = "Vtime/Saltitude/Sgroundspeed/elatitude/elongitude";
|
||||
|
||||
private string $file_path = "";
|
||||
|
||||
private array $segments = [];
|
||||
|
||||
public function __construct(string $path)
|
||||
{
|
||||
$this->file_path = $path;
|
||||
|
||||
$this->read();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a json representation
|
||||
*
|
||||
* @return array Json representation with path as geoJSON and profile as array
|
||||
*/
|
||||
public function to_json(): array
|
||||
{
|
||||
$path = [
|
||||
"type" => "FeatureCollection",
|
||||
"features" => [
|
||||
0 => [
|
||||
"type" => "Feature",
|
||||
"properties" => [
|
||||
"stroke" => "#ff0000",
|
||||
"stroke-width" => 2,
|
||||
"stroke-opacity" => 1
|
||||
],
|
||||
"geometry" => [
|
||||
"type" => "LineString",
|
||||
"coordinates" => []
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
$path["features"][0]["geometry"]["coordinates"] = array_map(function ($segment) {
|
||||
return array($segment["longitude"], $segment["latitude"]);
|
||||
}, $this->segments);
|
||||
|
||||
$profile = array_map(function ($segment) {
|
||||
return array("altitude" => $segment["altitude"], "groundspeed" => $segment["groundspeed"]);
|
||||
}, $this->segments);
|
||||
|
||||
return ["path" => $path, "profile" => $profile];
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a json string representation
|
||||
*
|
||||
* @return string Json string representation with path as geoJSON and profile as array
|
||||
*/
|
||||
public function to_json_string(): string
|
||||
{
|
||||
return json_encode($this->to_json());
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads recording
|
||||
*/
|
||||
private function read()
|
||||
{
|
||||
if (!file_exists($this->file_path)) {
|
||||
throw new \InvalidArgumentException("File not found");
|
||||
}
|
||||
|
||||
$file = fopen($this->file_path, "rb");
|
||||
if ($file) {
|
||||
flock($file, LOCK_SH);
|
||||
|
||||
$version = $this->read_header($file);
|
||||
|
||||
if ($version == 1) {
|
||||
while ($this->read_segment_1($file) != false);
|
||||
}
|
||||
|
||||
flock($file, LOCK_UN);
|
||||
fclose($file);
|
||||
} else {
|
||||
throw new \Exception("fopen Error");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads one segment entry
|
||||
*
|
||||
* @param resource $file File handle
|
||||
*
|
||||
* @return true If not EOF
|
||||
* @return false If EOF
|
||||
*
|
||||
* @throws InvalidArgumentException If file is not a resource
|
||||
*/
|
||||
private function read_segment_1($file): bool
|
||||
{
|
||||
if (false === is_resource($file)) {
|
||||
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
|
||||
}
|
||||
$data = fread($file, 24);
|
||||
if ($data) {
|
||||
array_push($this->segments, unpack(Recording::segment_unpack, $data));
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the file header
|
||||
*
|
||||
* @param resource $file File handle
|
||||
*
|
||||
* @return string File version
|
||||
*
|
||||
* @throws InvalidArgumentException If file is not a resource
|
||||
* @throws UnexpectedValueException If ident mismatches
|
||||
*/
|
||||
private function read_header($file): string
|
||||
{
|
||||
if (false === is_resource($file)) {
|
||||
throw new \InvalidArgumentException(sprintf('Argument must be a valid resource type. %s given.', gettype($file)));
|
||||
}
|
||||
|
||||
$header = unpack(Recording::header_unpack, fread($file, 5));
|
||||
|
||||
if ($header["ident"] !== Recording::ident) {
|
||||
throw
|
||||
new \UnexpectedValueException(sprintf("Ident mismatch. Got %s, expected %s", $header["ident"], Recording::ident));
|
||||
}
|
||||
|
||||
return $header["version"];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
require "Logbook.php";
|
||||
|
||||
$r = new \germanairlinesva\file\logbook\Logbook("/mnt/f/X-Plane 11/Resources/plugins/GAConnector/");
|
||||
echo "Object\n";
|
||||
print_r($r);
|
||||
echo "\nJSON\n";
|
||||
print_r($r->to_json());
|
||||
echo "\n\nJSON Fliht 0\n";
|
||||
print_r($r->get_flight_json(0));
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
require "Recording.php";
|
||||
|
||||
$r = new \germanairlinesva\file\recording\Recording("/mnt/f/X-Plane 11/Resources/plugins/GAConnector/recordings/flight.rec");
|
||||
print_r($r);
|
||||
print_r($r->to_json_string());
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
shopt -s globstar
|
||||
|
||||
GLOBIGNORE='**/XPLM/**:XPLM/**:**/XPLM:**/ixwebsocket/**:ixwebsocket/**:**/ixwebsocket:**/nlohmann/**:nlohmann/**:**/nlohmann:**/XPSDK/**:XPSDK/**:**/XPSDK:**/build*/**:build*/**:**/build*:**/openSSL/**:openSSL/**:**/openSSL:**/SimConnect/**:SimConnect/**:**/SimConnect'
|
||||
|
||||
clang-format -verbose -i **/*.cpp
|
||||
clang-format -verbose -i **/*.h
|
||||
clang-format -verbose -i **/*.hpp
|
||||
Loaded 100 of 424 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user