├── .clang-format
├── .gitattributes
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ └── question.md
└── workflows
│ └── msbuild.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── Pimax-OpenXR.sln
├── README.md
├── THIRD_PARTY
├── companion
├── App.config
├── ExperimentalSettings.Designer.cs
├── ExperimentalSettings.cs
├── ExperimentalSettings.resx
├── MainForm.Designer.cs
├── MainForm.cs
├── MainForm.resx
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── companion.csproj
├── icon.ico
└── logo.bmp
├── external
├── OpenGL
│ ├── GL
│ │ ├── glext.h
│ │ └── wglext.h
│ └── KHR
│ │ └── khrplatform.h
└── aSeeVRClient
│ ├── bin
│ └── aSeeVRClient.dll
│ ├── include
│ ├── aSeeVRClient.h
│ ├── aSeeVRTypes.h
│ └── aSeeVRUtility.h
│ └── lib
│ └── aSeeVRClient.lib
├── installer
├── .gitignore
├── EULA.rtf
├── README.rtf
├── banner.bmp
├── comodo.pfx
├── installer.vdproj
├── selfsigncert.pfx
└── signtool.exe
├── pimax-openxr
├── AlphaBlending.hlsli
├── AlphaBlendingCS.hlsl
├── AlphaBlendingTexArrayCS.hlsl
├── FullScreenQuadVS.hlsl
├── PassthroughPS.hlsl
├── action.cpp
├── companion.cpp
├── d3d11_native.cpp
├── d3d12_interop.cpp
├── display_refresh_rate.cpp
├── eye_tracking.cpp
├── frame.cpp
├── framework
│ ├── __init__.py
│ ├── dispatch.cpp
│ ├── dispatch.gen.cpp
│ ├── dispatch.gen.h
│ ├── dispatch.h
│ ├── dispatch_generator.py
│ └── entry.cpp
├── gpu_timers.h
├── guardian.png
├── guardian.xcf
├── hand_tracking.cpp
├── instance.cpp
├── log.cpp
├── log.h
├── mappings.cpp
├── mirror_window.cpp
├── opengl_interop.cpp
├── overlay.cpp
├── overlay.png
├── packages.config
├── pch.cpp
├── pch.h
├── perf_counter.cpp
├── pimax-openxr-32.json
├── pimax-openxr.def
├── pimax-openxr.json
├── pimax-openxr.vcxproj
├── pimax-openxr.vcxproj.filters
├── resource.h
├── resource.rc
├── runtime.h
├── session.cpp
├── space.cpp
├── store.cpp
├── store.h
├── swapchain.cpp
├── system.cpp
├── utils.h
├── version.h
├── visibility_mask.cpp
└── vulkan_interop.cpp
├── pimax_cli
├── pimax_cli.cpp
├── pimax_cli.vcxproj
├── pimax_cli.vcxproj.filters
├── resource.h
└── resource.rc
├── pvr-logger
├── dllmain.cpp
├── packages.config
├── pch.cpp
├── pch.h
├── pvr-logger.vcxproj
└── pvr-logger.vcxproj.filters
├── scripts
├── Build-CTS.ps1
├── Install-Runtime.ps1
├── PimaxOpenXR.wprp
├── Run-Perf.ps1
├── msys-2.0.dll
├── msys-iconv-2.dll
├── msys-intl-8.dll
└── sed.exe
└── version.info
/.clang-format:
--------------------------------------------------------------------------------
1 | Language: Cpp
2 | IndentWidth: 4
3 | ColumnLimit: 120
4 | AllowShortBlocksOnASingleLine: false
5 | AllowShortFunctionsOnASingleLine: false
6 | AlwaysBreakTemplateDeclarations: true
7 | BinPackParameters: false
8 | BinPackArguments: false
9 | IndentWrappedFunctionNames: false
10 | KeepEmptyLinesAtTheStartOfBlocks: false
11 | MaxEmptyLinesToKeep: 1
12 | NamespaceIndentation: All
13 | PenaltyReturnTypeOnItsOwnLine: 100
14 | PointerAlignment: Left
15 | SortIncludes: false
16 | SpaceAfterCStyleCast: false
17 | SpaceBeforeAssignmentOperators: true
18 | SpaceBeforeParens: ControlStatements
19 | SpaceInEmptyParentheses: false
20 | SpacesInAngles: false
21 | SpacesInCStyleCastParentheses: false
22 | SpacesInContainerLiterals: false
23 | SpacesInParentheses: false
24 | SpacesInSquareBrackets: false
25 | UseTab: Never
26 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.gen.* text eol=lf
2 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: mbucchia
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | **ANY ISSUE FILED WITHOUT THE INFORMATION REQUIRED BELOW WILL BE CLOSED WITHOUT BEING LOOKED AT. NO EXCEPTIONS.**
11 |
12 | **Describe the bug**
13 |
14 | _A clear and concise description of what the bug is._
15 | _Always attach (upload, do not copy/paste) the log file that can be found at `%LocalAppData%\pimax-openxr\logs` or opened from the PimaxXR Control Center app._
16 |
17 | **Environment**
18 |
19 | - _Application/Game and version_:
20 | - _Version of Pitool or Pimax client_:
21 |
22 | **To Reproduce**
23 |
24 | _Steps to reproduce the behavior:_
25 |
26 | 1. Run '....' game
27 | 2. Enable option '....'
28 | 3. See error
29 |
30 | **Expected behavior**
31 |
32 | _A clear and concise description of what you expected to happen._
33 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: PimaxXR Homepage
4 | url: https://github.com/mbucchia/Pimax-OpenXR/wiki
5 | about: The homepage has a lot of useful information, including Compatibility list.
6 | - name: OpenComposite Homepage
7 | url: https://gitlab.com/znixian/OpenOVR/-/tree/openxr
8 | about: If your questions/issues are with OpenComposite and not PimaxXR, head to their homepage for information.
9 | - name: OpenComposite Discord
10 | url: https://discord.gg/sQ2jwSb62J
11 | about: If your questions/issues are with OpenComposite and not PimaxXR, use their Discord.
12 | - name: OpenXR Toolkit Homepage
13 | url: https://mbucchia.github.io/OpenXR-Toolkit/
14 | about: The homepage has A LOT OF INFORMATION if you are using OpenXR Toolkit. Check there first for the answer to your questions/issues. There is a Search bar at the top.
15 | - name: OpenXR Toolkit/PimaxXR Discord
16 | url: https://discord.gg/NxvH3x66js
17 | about: Finally, if you have checked all the information above, but still cannot address your questions/issues, ask and answer questions on our Discord.
18 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/question.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Question
3 | about: 'Ask about this project. '
4 | title: ''
5 | labels: question
6 | assignees: ''
7 |
8 | ---
9 |
10 | _Give us as much details as possible_
11 |
--------------------------------------------------------------------------------
/.github/workflows/msbuild.yml:
--------------------------------------------------------------------------------
1 | name: MSBuild
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | - release/*
8 | tags:
9 | - '[0-9]+.[0-9]+.[0-9]+'
10 | pull_request:
11 | branches:
12 | - main
13 | - release/*
14 | workflow_dispatch:
15 |
16 | env:
17 | SOLUTION_FILE_PATH: Pimax-OpenXR.sln
18 | BUILD_CONFIGURATION: Release
19 |
20 | jobs:
21 | build:
22 | runs-on: windows-latest
23 | environment: build-and-sign
24 |
25 | steps:
26 | - name: Checkout project
27 | uses: actions/checkout@v2
28 |
29 | - name: Checkout submodules
30 | working-directory: ${{env.GITHUB_WORKSPACE}}
31 | run: git submodule update --init
32 |
33 | - name: Setup DevEnv
34 | uses: seanmiddleditch/gha-setup-vsdevenv@v4
35 |
36 | - name: Setup Python
37 | uses: actions/setup-python@v2.3.1
38 | with:
39 | python-version: 3.8
40 |
41 | - name: Restore NuGet packages
42 | working-directory: ${{env.GITHUB_WORKSPACE}}
43 | run: nuget restore ${{env.SOLUTION_FILE_PATH}}
44 |
45 | - name: Build
46 | env:
47 | PFX_PASSWORD: ${{ secrets.PFX_PASSWORD }}
48 | PFX_NAME: "comodo"
49 | working-directory: ${{env.GITHUB_WORKSPACE}}
50 | run: |
51 | # Need to build vdproj. We must invoke this tool from inside its own folder.
52 | $DisableOutOfProcBuild=$(vswhere -latest -find **\DisableOutOfProcBuild.exe)
53 | Push-Location $(Split-Path $DisableOutOfProcBuild)
54 | & $DisableOutOfProcBuild
55 | Pop-Location
56 |
57 | # Finally, we may build the project.
58 | devenv.com ${{env.SOLUTION_FILE_PATH}} /Build "${{env.BUILD_CONFIGURATION}}|Win32"
59 | devenv.com ${{env.SOLUTION_FILE_PATH}} /Build "${{env.BUILD_CONFIGURATION}}|x64"
60 |
61 | - name: Signing
62 | env:
63 | PFX_PASSWORD: ${{ secrets.PFX_PASSWORD }}
64 | PFX_NAME: "comodo"
65 | working-directory: ${{env.GITHUB_WORKSPACE}}
66 | run: |
67 | $pfxName = if ($env:PFX_NAME) { $env:PFX_NAME } else { "selfsigncert" };
68 | installer/signtool.exe sign /d "PimaxXR" /du "https://github.com/mbucchia/Pimax-OpenXR" /f installer/$pfxName.pfx /p "$env:PFX_PASSWORD" /v installer/output/PimaxXR.msi
69 |
70 | - name: Publish
71 | uses: actions/upload-artifact@v2
72 | with:
73 | name: Setup
74 | path: |
75 | installer/output/PimaxXR.msi
76 | bin/Win32/Release/pimax-openxr-32.pdb
77 | bin/x64/Release/pimax-openxr.pdb
78 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vs/
2 | packages/
3 | bin/
4 | **/x64/
5 | **/obj/
6 | **/__pycache__/
7 | *.pyc
8 | *.vcxproj.user
9 | *.csproj.user
10 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "external/OpenXR-SDK"]
2 | path = external/OpenXR-SDK
3 | url = https://github.com/KhronosGroup/OpenXR-SDK.git
4 | [submodule "external/OpenXR-SDK-Source"]
5 | path = external/OpenXR-SDK-Source
6 | url = https://github.com/KhronosGroup/OpenXR-SDK-Source.git
7 | [submodule "external/OpenXR-MixedReality"]
8 | path = external/OpenXR-MixedReality
9 | url = https://github.com/mbucchia/OpenXR-MixedReality.git
10 | [submodule "external/PVR"]
11 | path = external/PVR
12 | url = https://github.com/mbucchia/PVR.git
13 | [submodule "external/OpenXR-CTS"]
14 | path = external/OpenXR-CTS
15 | url = https://github.com/KhronosGroup/OpenXR-CTS.git
16 | [submodule "external/FW1FontWrapper"]
17 | path = external/FW1FontWrapper
18 | url = https://github.com/mbucchia/FW1FontWrapper.git
19 | [submodule "external/Vulkan-SDK"]
20 | path = external/Vulkan-SDK
21 | url = https://github.com/mbucchia/Vulkan-SDK.git
22 | [submodule "external/fmt"]
23 | path = external/fmt
24 | url = https://github.com/fmtlib/fmt.git
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Matthieu Bucchianeri
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Pimax-OpenXR.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.7.34031.279
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pimax-openxr", "pimax-openxr\pimax-openxr.vcxproj", "{93D573D0-634F-4BA0-8FE0-FB63D7D00A05}"
7 | ProjectSection(ProjectDependencies) = postProject
8 | {9F62DB07-EA42-4388-82AB-E6FAA371F353} = {9F62DB07-EA42-4388-82AB-E6FAA371F353}
9 | EndProjectSection
10 | EndProject
11 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Files", "Solution Files", "{A53ED6CB-95D3-4833-8A16-C6A588F16F6E}"
12 | ProjectSection(SolutionItems) = preProject
13 | .clang-format = .clang-format
14 | .gitattributes = .gitattributes
15 | .gitignore = .gitignore
16 | LICENSE = LICENSE
17 | README.md = README.md
18 | version.info = version.info
19 | EndProjectSection
20 | EndProject
21 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scripts", "Scripts", "{BA775DE9-671E-4E3B-92AC-9828C2AAF490}"
22 | ProjectSection(SolutionItems) = preProject
23 | scripts\Install-Runtime.ps1 = scripts\Install-Runtime.ps1
24 | scripts\PimaxOpenXR.wprp = scripts\PimaxOpenXR.wprp
25 | EndProjectSection
26 | EndProject
27 | Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "installer", "installer\installer.vdproj", "{8B253B1D-439A-4A30-AEC6-D1984861AD88}"
28 | EndProject
29 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub", "GitHub", "{8F6FBE40-3313-449F-ABA0-D7AB4578BC51}"
30 | ProjectSection(SolutionItems) = preProject
31 | .github\workflows\msbuild.yml = .github\workflows\msbuild.yml
32 | EndProjectSection
33 | EndProject
34 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "companion", "companion\companion.csproj", "{795212E0-1E96-44AB-8D87-9DA1751C0EB2}"
35 | ProjectSection(ProjectDependencies) = postProject
36 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05} = {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}
37 | EndProjectSection
38 | EndProject
39 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pimax_cli", "pimax_cli\pimax_cli.vcxproj", "{C3EF2FE7-770A-448E-A3AC-226276092ABF}"
40 | EndProject
41 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestApps", "TestApps", "{18290AA7-D4EC-42C7-B417-D2CC3422A207}"
42 | EndProject
43 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BasicXrApp_win32", "external\OpenXR-MixedReality\samples\BasicXrApp\BasicXrApp_win32.vcxproj", "{A75A907B-8952-4ED2-BC2D-A68F09CEBD83}"
44 | ProjectSection(ProjectDependencies) = postProject
45 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05} = {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}
46 | EndProjectSection
47 | EndProject
48 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleSceneWin32", "external\OpenXR-MixedReality\samples\SampleSceneWin32\SampleSceneWin32.vcxproj", "{4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}"
49 | ProjectSection(ProjectDependencies) = postProject
50 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05} = {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}
51 | EndProjectSection
52 | EndProject
53 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XrSceneLib_win32", "external\OpenXR-MixedReality\shared\XrSceneLib\XrSceneLib_win32.vcxproj", "{A758AF22-F54F-4C74-BF85-05A377B5892E}"
54 | EndProject
55 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{62ABB036-B5EF-46D5-8D8B-2C4D06164B4C}"
56 | EndProject
57 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Gltf_win32", "external\OpenXR-MixedReality\shared\gltf\Gltf_win32.vcxproj", "{6A3225A3-0750-47B7-8004-80CA543F8B8B}"
58 | EndProject
59 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pbr_win32", "external\OpenXR-MixedReality\shared\pbr\pbr_win32.vcxproj", "{2B7688F8-9AE6-4A67-809B-1BAC82094F21}"
60 | EndProject
61 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleShared_win32", "external\OpenXR-MixedReality\shared\SampleShared\SampleShared_win32.vcxproj", "{269C12FA-E68D-470B-A734-4701034306BD}"
62 | EndProject
63 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EyeGazeInteractionWin32", "external\OpenXR-MixedReality\samples\EyeGazeInteractionUwp\EyeGazeInteractionWin32.vcxproj", "{A4D2019B-622D-49B9-9510-16877979807A}"
64 | ProjectSection(ProjectDependencies) = postProject
65 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05} = {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}
66 | EndProjectSection
67 | EndProject
68 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dependencies", "Dependencies", "{D5F26FBB-3CA3-40F8-859F-C599B2022DC4}"
69 | EndProject
70 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FW1FontWrapper", "external\FW1FontWrapper\FW1FontWrapper\FW1FontWrapper.vcxproj", "{9F62DB07-EA42-4388-82AB-E6FAA371F353}"
71 | EndProject
72 | Global
73 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
74 | Debug|Win32 = Debug|Win32
75 | Debug|x64 = Debug|x64
76 | Release|Win32 = Release|Win32
77 | Release|x64 = Release|x64
78 | EndGlobalSection
79 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
80 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Debug|Win32.ActiveCfg = Debug|Win32
81 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Debug|Win32.Build.0 = Debug|Win32
82 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Debug|x64.ActiveCfg = Debug|x64
83 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Debug|x64.Build.0 = Debug|x64
84 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Release|Win32.ActiveCfg = Release|Win32
85 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Release|Win32.Build.0 = Release|Win32
86 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Release|x64.ActiveCfg = Release|x64
87 | {93D573D0-634F-4BA0-8FE0-FB63D7D00A05}.Release|x64.Build.0 = Release|x64
88 | {8B253B1D-439A-4A30-AEC6-D1984861AD88}.Debug|Win32.ActiveCfg = Release
89 | {8B253B1D-439A-4A30-AEC6-D1984861AD88}.Debug|x64.ActiveCfg = Release
90 | {8B253B1D-439A-4A30-AEC6-D1984861AD88}.Release|Win32.ActiveCfg = Release
91 | {8B253B1D-439A-4A30-AEC6-D1984861AD88}.Release|x64.ActiveCfg = Release
92 | {8B253B1D-439A-4A30-AEC6-D1984861AD88}.Release|x64.Build.0 = Release
93 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Debug|Win32.ActiveCfg = Debug|Any CPU
94 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Debug|Win32.Build.0 = Debug|Any CPU
95 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Debug|x64.ActiveCfg = Debug|Any CPU
96 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Debug|x64.Build.0 = Debug|Any CPU
97 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Release|Win32.ActiveCfg = Release|Any CPU
98 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Release|x64.ActiveCfg = Release|Any CPU
99 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}.Release|x64.Build.0 = Release|Any CPU
100 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Debug|Win32.ActiveCfg = Debug|Win32
101 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Debug|Win32.Build.0 = Debug|Win32
102 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Debug|x64.ActiveCfg = Debug|x64
103 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Debug|x64.Build.0 = Debug|x64
104 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Release|Win32.ActiveCfg = Release|Win32
105 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Release|x64.ActiveCfg = Release|x64
106 | {C3EF2FE7-770A-448E-A3AC-226276092ABF}.Release|x64.Build.0 = Release|x64
107 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Debug|Win32.ActiveCfg = Debug|Win32
108 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Debug|Win32.Build.0 = Debug|Win32
109 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Debug|x64.ActiveCfg = Debug|x64
110 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Debug|x64.Build.0 = Debug|x64
111 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Release|Win32.ActiveCfg = Release|Win32
112 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83}.Release|x64.ActiveCfg = Release|x64
113 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Debug|Win32.ActiveCfg = Debug|Win32
114 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Debug|Win32.Build.0 = Debug|Win32
115 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Debug|x64.ActiveCfg = Debug|x64
116 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Debug|x64.Build.0 = Debug|x64
117 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Release|Win32.ActiveCfg = Release|Win32
118 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB}.Release|x64.ActiveCfg = Release|x64
119 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Debug|Win32.ActiveCfg = Debug|Win32
120 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Debug|Win32.Build.0 = Debug|Win32
121 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Debug|x64.ActiveCfg = Debug|x64
122 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Debug|x64.Build.0 = Debug|x64
123 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Release|Win32.ActiveCfg = Release|Win32
124 | {A758AF22-F54F-4C74-BF85-05A377B5892E}.Release|x64.ActiveCfg = Release|x64
125 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Debug|Win32.ActiveCfg = Debug|Win32
126 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Debug|Win32.Build.0 = Debug|Win32
127 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Debug|x64.ActiveCfg = Debug|x64
128 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Debug|x64.Build.0 = Debug|x64
129 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Release|Win32.ActiveCfg = Release|Win32
130 | {6A3225A3-0750-47B7-8004-80CA543F8B8B}.Release|x64.ActiveCfg = Release|x64
131 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Debug|Win32.ActiveCfg = Debug|Win32
132 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Debug|Win32.Build.0 = Debug|Win32
133 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Debug|x64.ActiveCfg = Debug|x64
134 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Debug|x64.Build.0 = Debug|x64
135 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Release|Win32.ActiveCfg = Release|Win32
136 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21}.Release|x64.ActiveCfg = Release|x64
137 | {269C12FA-E68D-470B-A734-4701034306BD}.Debug|Win32.ActiveCfg = Debug|Win32
138 | {269C12FA-E68D-470B-A734-4701034306BD}.Debug|Win32.Build.0 = Debug|Win32
139 | {269C12FA-E68D-470B-A734-4701034306BD}.Debug|x64.ActiveCfg = Debug|x64
140 | {269C12FA-E68D-470B-A734-4701034306BD}.Debug|x64.Build.0 = Debug|x64
141 | {269C12FA-E68D-470B-A734-4701034306BD}.Release|Win32.ActiveCfg = Release|Win32
142 | {269C12FA-E68D-470B-A734-4701034306BD}.Release|x64.ActiveCfg = Release|x64
143 | {A4D2019B-622D-49B9-9510-16877979807A}.Debug|Win32.ActiveCfg = Debug|Win32
144 | {A4D2019B-622D-49B9-9510-16877979807A}.Debug|Win32.Build.0 = Debug|Win32
145 | {A4D2019B-622D-49B9-9510-16877979807A}.Debug|x64.ActiveCfg = Debug|x64
146 | {A4D2019B-622D-49B9-9510-16877979807A}.Debug|x64.Build.0 = Debug|x64
147 | {A4D2019B-622D-49B9-9510-16877979807A}.Release|Win32.ActiveCfg = Release|Win32
148 | {A4D2019B-622D-49B9-9510-16877979807A}.Release|x64.ActiveCfg = Release|x64
149 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Debug|Win32.ActiveCfg = Debug|Win32
150 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Debug|Win32.Build.0 = Debug|Win32
151 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Debug|x64.ActiveCfg = Debug|x64
152 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Debug|x64.Build.0 = Debug|x64
153 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Release|Win32.ActiveCfg = Release|Win32
154 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Release|Win32.Build.0 = Release|Win32
155 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Release|x64.ActiveCfg = Release|x64
156 | {9F62DB07-EA42-4388-82AB-E6FAA371F353}.Release|x64.Build.0 = Release|x64
157 | EndGlobalSection
158 | GlobalSection(SolutionProperties) = preSolution
159 | HideSolutionNode = FALSE
160 | EndGlobalSection
161 | GlobalSection(NestedProjects) = preSolution
162 | {BA775DE9-671E-4E3B-92AC-9828C2AAF490} = {A53ED6CB-95D3-4833-8A16-C6A588F16F6E}
163 | {8F6FBE40-3313-449F-ABA0-D7AB4578BC51} = {A53ED6CB-95D3-4833-8A16-C6A588F16F6E}
164 | {A75A907B-8952-4ED2-BC2D-A68F09CEBD83} = {18290AA7-D4EC-42C7-B417-D2CC3422A207}
165 | {4D888630-45DB-4CAA-8AAA-3C4CE33F90AB} = {18290AA7-D4EC-42C7-B417-D2CC3422A207}
166 | {A758AF22-F54F-4C74-BF85-05A377B5892E} = {62ABB036-B5EF-46D5-8D8B-2C4D06164B4C}
167 | {62ABB036-B5EF-46D5-8D8B-2C4D06164B4C} = {18290AA7-D4EC-42C7-B417-D2CC3422A207}
168 | {6A3225A3-0750-47B7-8004-80CA543F8B8B} = {62ABB036-B5EF-46D5-8D8B-2C4D06164B4C}
169 | {2B7688F8-9AE6-4A67-809B-1BAC82094F21} = {62ABB036-B5EF-46D5-8D8B-2C4D06164B4C}
170 | {269C12FA-E68D-470B-A734-4701034306BD} = {62ABB036-B5EF-46D5-8D8B-2C4D06164B4C}
171 | {A4D2019B-622D-49B9-9510-16877979807A} = {18290AA7-D4EC-42C7-B417-D2CC3422A207}
172 | {9F62DB07-EA42-4388-82AB-E6FAA371F353} = {D5F26FBB-3CA3-40F8-859F-C599B2022DC4}
173 | EndGlobalSection
174 | GlobalSection(ExtensibilityGlobals) = postSolution
175 | SolutionGuid = {07E77829-9766-4585-AC6C-0A28BA014E77}
176 | EndGlobalSection
177 | EndGlobal
178 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PimaxXR: an implementation of the OpenXR standard for Pimax headsets
2 |
3 | This program is an implementation of the OpenXR standard for Pimax headsets on Windows. It allows you to run OpenXR applications without SteamVR. It is not produced by Pimax.
4 |
5 | It is built on top of the official Pimax PVR native SDK and aims to provide a very fast and efficient implementation of the OpenXR standard for Pimax headsets.
6 |
7 | DISCLAIMER: This runtime is not officially conformant per Khronos standards: it cannot be called "conformant" nor use the OpenXR trademark and logo. However, the runtime passes the majority of OpenXR conformance tests and the reason for not seeking official conformance is the required $30,000 adopter fee.
8 |
9 | DISCLAIMER: This software is distributed as-is, without any warranties or conditions of any kind. Use at your own risks.
10 |
11 | # Details and instructions on the Wiki: https://github.com/mbucchia/Pimax-OpenXR/wiki
12 |
13 | ## Donate
14 |
15 | Donations are welcome and totally optional. Please use [my GitHub sponsorship page](https://github.com/sponsors/mbucchia) to make one-time or recurring donations!
16 |
17 | Thank you!
18 |
19 | ## Contributors
20 |
21 | Logo and icons designed by Smitty.
22 |
23 | Special thanks to the following individuals for their contributions:
24 |
25 | - Vladimir Dranyonkov
26 | - Pavel Skakov
27 | - DJSlane
28 | - TommyVR
29 | - [Omniwhatever](https://www.youtube.com/@Omniwhatever)
30 |
31 | ## Very special thanks
32 |
33 | Very special thanks to Pimax for providing me with a Pimax 8KX and a Pimax Crystal for development.
34 |
--------------------------------------------------------------------------------
/companion/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/companion/ExperimentalSettings.cs:
--------------------------------------------------------------------------------
1 | // MIT License
2 | //
3 | // Copyright(c) 2022-2023 Matthieu Bucchianeri
4 | //
5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
6 | // of this softwareand associated documentation files(the "Software"), to deal
7 | // in the Software without restriction, including without limitation the rights
8 | // to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions :
11 | //
12 | // The above copyright noticeand this permission notice shall be included in all
13 | // copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | // SOFTWARE.
22 |
23 | using System;
24 | using System.Collections.Generic;
25 | using System.ComponentModel;
26 | using System.Data;
27 | using System.Drawing;
28 | using System.Linq;
29 | using System.Text;
30 | using System.Threading.Tasks;
31 | using System.Windows.Forms;
32 |
33 | namespace companion
34 | {
35 | public partial class ExperimentalSettings : Form
36 | {
37 | private bool loading = true;
38 |
39 | public ExperimentalSettings()
40 | {
41 | InitializeComponent();
42 | LoadSettings();
43 | }
44 |
45 | private void ExperimentalSettings_FormClosing(object sender, FormClosingEventArgs e)
46 | {
47 | if (e.CloseReason == CloseReason.UserClosing)
48 | {
49 | e.Cancel = true;
50 | Hide();
51 | }
52 | }
53 |
54 | public void LoadSettings()
55 | {
56 | loading = true;
57 | SuspendLayout();
58 |
59 | Microsoft.Win32.RegistryKey key = null;
60 |
61 | // Read the PimaxXR configuration.
62 | try
63 | {
64 | key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(MainForm.RegPrefix);
65 |
66 | // Must match the defaults in the runtime!
67 | enableFrameTiming.Checked = (int)key.GetValue("quirk_frame_timing_override", 0) == 1 ? true : false;
68 | filterLength.Value = (int)key.GetValue("frame_time_filter_length", 5);
69 | var multiplier = (int)key.GetValue("frame_time_override_multiplier", 0);
70 | if (multiplier == 100)
71 | {
72 | forceHalf.Checked = true;
73 | }
74 | else if (multiplier == 200)
75 | {
76 | forceThird.Checked = true;
77 | }
78 | else
79 | {
80 | forceHalf.Checked = forceThird.Checked = false;
81 | }
82 | // Convert value from microseconds to tenth of milliseconds.
83 | timingBias.Value = multiplier == 0 ? ((int)key.GetValue("frame_time_override_offset", 0) / 100) : 0;
84 | waitForGpuWorkInEndFrame.Checked = (int)key.GetValue("quirk_sync_gpu_work_in_end_frame", 0) == 1 ? true : false;
85 | forceDisableParallelProjection.Checked = (int)key.GetValue("force_parallel_projection_state", 1) == 0 ? true : false;
86 | droolonProjectionDistance.Value = (int)key.GetValue("droolon_projection_distance", 35);
87 |
88 | // DO NOT FORGET TO ADD TO restoreDefaults_Click()!
89 | }
90 | catch (Exception)
91 | {
92 | MessageBox.Show(this, "Failed to write to registry. Please make sure the app is running elevated.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
93 | }
94 | finally
95 | {
96 | if (key != null)
97 | {
98 | key.Close();
99 | }
100 | }
101 |
102 | RefreshEnabledState();
103 | filterLength_Scroll(null, null);
104 | timingBias_Scroll(null, null);
105 | droolonProjectionDistance_Scroll(null, null);
106 |
107 | ResumeLayout();
108 | loading = false;
109 | }
110 |
111 | private void RefreshEnabledState()
112 | {
113 | forceRateLabel.Enabled = forceHalf.Enabled = forceThird.Enabled = enableFrameTiming.Checked;
114 | filterLength.Enabled = filterLengthLabel.Enabled = filterLengthValue.Enabled =
115 | timingBias.Enabled = timingBiasLabel.Enabled = timingBiasValue.Enabled = enableFrameTiming.Checked && !(forceHalf.Checked || forceThird.Checked);
116 | }
117 |
118 | private void enableFrameTiming_CheckedChanged(object sender, EventArgs e)
119 | {
120 | RefreshEnabledState();
121 |
122 | if (loading)
123 | {
124 | return;
125 | }
126 |
127 | MainForm.WriteSetting("quirk_frame_timing_override", enableFrameTiming.Checked ? 1 : 0);
128 | }
129 |
130 | private void filterLength_Scroll(object sender, EventArgs e)
131 | {
132 | filterLengthValue.Text = filterLength.Value.ToString();
133 |
134 | if (loading)
135 | {
136 | return;
137 | }
138 |
139 | MainForm.WriteSetting("frame_time_filter_length", filterLength.Value);
140 | }
141 |
142 | private void timingBias_Scroll(object sender, EventArgs e)
143 | {
144 | // Use the input in tenth of milliseconds to allow one decimal.
145 | timingBiasValue.Text = timingBias.Value != 0 ? (timingBias.Value / 10.0f).ToString("#.##") : "0";
146 |
147 | if (loading)
148 | {
149 | return;
150 | }
151 |
152 | // Store in microseconds.
153 | MainForm.WriteSetting("frame_time_override_offset", timingBias.Value * 100);
154 | }
155 |
156 | private void forceHalf_CheckedChanged(object sender, EventArgs e)
157 | {
158 | forceThird.Checked = false;
159 | RefreshEnabledState();
160 |
161 | if (loading)
162 | {
163 | return;
164 | }
165 |
166 | if (forceHalf.Checked)
167 | {
168 | // Force 100% frame duration + 1ms.
169 | MainForm.WriteSetting("frame_time_override_multiplier", 100);
170 | MainForm.WriteSetting("frame_time_override_offset", 1000);
171 | }
172 | else
173 | {
174 | MainForm.WriteSetting("frame_time_override_multiplier", 0);
175 | timingBias_Scroll(null, null);
176 | }
177 | }
178 |
179 | private void forceThird_CheckedChanged(object sender, EventArgs e)
180 | {
181 | forceHalf.Checked = false;
182 | RefreshEnabledState();
183 |
184 | if (loading)
185 | {
186 | return;
187 | }
188 |
189 | if (forceThird.Checked)
190 | {
191 | // Force 200% frame duration + 1ms.
192 | MainForm.WriteSetting("frame_time_override_multiplier", 200);
193 | MainForm.WriteSetting("frame_time_override_offset", 1000);
194 | }
195 | else
196 | {
197 | MainForm.WriteSetting("frame_time_override_multiplier", 0);
198 | timingBias_Scroll(null, null);
199 | }
200 | }
201 |
202 | private void waitForGpuWorkInEndFrame_CheckedChanged(object sender, EventArgs e)
203 | {
204 | if (loading)
205 | {
206 | return;
207 | }
208 |
209 | MainForm.WriteSetting("quirk_sync_gpu_work_in_end_frame", waitForGpuWorkInEndFrame.Checked ? 1 : 0);
210 | }
211 |
212 | private void forceDisableParallelProjection_CheckedChanged(object sender, EventArgs e)
213 | {
214 | if (loading)
215 | {
216 | return;
217 | }
218 |
219 | if (forceDisableParallelProjection.Checked)
220 | {
221 | MainForm.WriteSetting("force_parallel_projection_state", 0);
222 | }
223 | else
224 | {
225 | Microsoft.Win32.RegistryKey key = null;
226 | try
227 | {
228 | key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(MainForm.RegPrefix);
229 | key.DeleteValue("force_parallel_projection_state", false);
230 | }
231 | catch (Exception)
232 | {
233 | }
234 | finally
235 | {
236 | if (key != null)
237 | {
238 | key.Close();
239 | }
240 | }
241 | }
242 | }
243 |
244 | private void droolonProjectionDistance_Scroll(object sender, EventArgs e)
245 | {
246 | droolonProjectionDistanceValue.Text = droolonProjectionDistance.Value != 0 ? (droolonProjectionDistance.Value / 100.0f).ToString("#.##") : "0";
247 |
248 | if (loading)
249 | {
250 | return;
251 | }
252 |
253 | MainForm.WriteSetting("droolon_projection_distance", droolonProjectionDistance.Value);
254 | }
255 |
256 | private void restoreDefaults_Click(object sender, EventArgs e)
257 | {
258 | Microsoft.Win32.RegistryKey key = null;
259 |
260 | try
261 | {
262 | key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(MainForm.RegPrefix);
263 |
264 | key.DeleteValue("quirk_frame_timing_override", false);
265 | key.DeleteValue("frame_time_filter_length", false);
266 | key.DeleteValue("frame_time_override_multiplier", false);
267 | key.DeleteValue("frame_time_override_offset", false);
268 | key.DeleteValue("quirk_sync_gpu_work_in_end_frame", false);
269 | key.DeleteValue("force_parallel_projection_state", false);
270 | key.DeleteValue("droolon_projection_distance", false);
271 | }
272 | catch (Exception)
273 | {
274 | }
275 | finally
276 | {
277 | if (key != null)
278 | {
279 | key.Close();
280 | }
281 | }
282 |
283 | LoadSettings();
284 | }
285 | }
286 | }
287 |
--------------------------------------------------------------------------------
/companion/Program.cs:
--------------------------------------------------------------------------------
1 | // MIT License
2 | //
3 | // Copyright(c) 2022-2023 Matthieu Bucchianeri
4 | //
5 | // Permission is hereby granted, free of charge, to any person obtaining a copy
6 | // of this softwareand associated documentation files(the "Software"), to deal
7 | // in the Software without restriction, including without limitation the rights
8 | // to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
9 | // copies of the Software, and to permit persons to whom the Software is
10 | // furnished to do so, subject to the following conditions :
11 | //
12 | // The above copyright noticeand this permission notice shall be included in all
13 | // copies or substantial portions of the Software.
14 | //
15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | // SOFTWARE.
22 |
23 | using System;
24 | using System.Collections.Generic;
25 | using System.ComponentModel;
26 | using System.Diagnostics;
27 | using System.Linq;
28 | using System.Reflection;
29 | using System.Security.Principal;
30 | using System.Threading.Tasks;
31 | using System.Windows.Forms;
32 |
33 | namespace companion
34 | {
35 | static class Program
36 | {
37 | ///
38 | /// The main entry point for the application.
39 | ///
40 | [STAThread]
41 | static void Main()
42 | {
43 | #if !DEBUG
44 | var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
45 | if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
46 | {
47 | var processInfo = new System.Diagnostics.ProcessStartInfo();
48 | processInfo.Verb = "RunAs";
49 | processInfo.FileName = Assembly.GetEntryAssembly().Location;
50 | try
51 | {
52 | Process.Start(processInfo).WaitForExit();
53 | }
54 | catch (Win32Exception)
55 | {
56 | MessageBox.Show("This application must be run as Administrator.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
57 | }
58 | Application.Exit();
59 | return;
60 | }
61 | #endif
62 | Application.EnableVisualStyles();
63 | Application.SetCompatibleTextRenderingDefault(false);
64 | Application.Run(new MainForm());
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/companion/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("PimaxXR - OpenXR Control Center")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("companion")]
13 | [assembly: AssemblyCopyright("Copyright 2022 Matthieu Bucchianeri")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("795212e0-1e96-44ab-8d87-9da1751c0eb2")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("0.4.5.0")]
36 | [assembly: AssemblyFileVersion("0.4.5.0")]
37 |
--------------------------------------------------------------------------------
/companion/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 |
12 | namespace companion.Properties
13 | {
14 | ///
15 | /// A strongly-typed resource class, for looking up localized strings, etc.
16 | ///
17 | // This class was auto-generated by the StronglyTypedResourceBuilder
18 | // class via a tool like ResGen or Visual Studio.
19 | // To add or remove a member, edit your .ResX file then rerun ResGen
20 | // with the /str option, or rebuild your VS project.
21 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
22 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
23 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
24 | internal class Resources
25 | {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources()
33 | {
34 | }
35 |
36 | ///
37 | /// Returns the cached ResourceManager instance used by this class.
38 | ///
39 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
40 | internal static global::System.Resources.ResourceManager ResourceManager
41 | {
42 | get
43 | {
44 | if ((resourceMan == null))
45 | {
46 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("companion.Properties.Resources", typeof(Resources).Assembly);
47 | resourceMan = temp;
48 | }
49 | return resourceMan;
50 | }
51 | }
52 |
53 | ///
54 | /// Overrides the current thread's CurrentUICulture property for all
55 | /// resource lookups using this strongly typed resource class.
56 | ///
57 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
58 | internal static global::System.Globalization.CultureInfo Culture
59 | {
60 | get
61 | {
62 | return resourceCulture;
63 | }
64 | set
65 | {
66 | resourceCulture = value;
67 | }
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/companion/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/companion/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 |
12 | namespace companion.Properties
13 | {
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
17 | {
18 |
19 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
20 |
21 | public static Settings Default
22 | {
23 | get
24 | {
25 | return defaultInstance;
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/companion/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/companion/companion.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {795212E0-1E96-44AB-8D87-9DA1751C0EB2}
8 | WinExe
9 | companion
10 | companion
11 | v4.7.2
12 | 512
13 | true
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | ..\bin\x64\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 | false
26 | true
27 |
28 |
29 | AnyCPU
30 | pdbonly
31 | true
32 | ..\bin\x64\Release\
33 | TRACE
34 | prompt
35 | 4
36 | false
37 | true
38 |
39 |
40 | icon.ico
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | Form
60 |
61 |
62 | ExperimentalSettings.cs
63 |
64 |
65 | Form
66 |
67 |
68 | MainForm.cs
69 |
70 |
71 |
72 |
73 | ExperimentalSettings.cs
74 |
75 |
76 | MainForm.cs
77 |
78 |
79 | ResXFileCodeGenerator
80 | Resources.Designer.cs
81 | Designer
82 |
83 |
84 | True
85 | Resources.resx
86 |
87 |
88 | SettingsSingleFileGenerator
89 | Settings.Designer.cs
90 |
91 |
92 | True
93 | Settings.settings
94 | True
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 | if not defined PFX_PASSWORD goto skip_signing
106 | if not defined PFX_NAME set PFX_NAME=selfsigncert
107 | $(SolutionDir)\installer\signtool.exe sign /d "PimaxXR" /du "https://github.com/mbucchia/Pimax-OpenXR" /f $(SolutionDir)\installer\%25PFX_NAME%25.pfx /p "%25PFX_PASSWORD%25" /v $(TargetPath)
108 | REM The installer picks up the file from obj... Sign this one too.
109 | $(SolutionDir)\installer\signtool.exe sign /d "PimaxXR" /du "https://github.com/mbucchia/Pimax-OpenXR" /f $(SolutionDir)\installer\%25PFX_NAME%25.pfx /p "%25PFX_PASSWORD%25" /v $(ProjectDir)\obj\$(ConfigurationName)\$(TargetFilename)
110 | :skip_signing
111 |
112 |
113 | if not exist $(SolutionDir)\version.info goto :skip_version
114 | for /f "delims== tokens=1,2" %25%25G in ($(SolutionDir)\version.info) do set %25%25G=%25%25H
115 | $(SolutionDir)\scripts\sed.exe -i "s/^\[assembly: AssemblyVersion(\".*\")\]$/\[assembly: AssemblyVersion(\"%25major%25.%25minor%25.%25patch%25.0\")\]/g" $(ProjectDir)\Properties\AssemblyInfo.cs
116 | $(SolutionDir)\scripts\sed.exe -i "s/^\[assembly: AssemblyFileVersion(\".*\")\]$/\[assembly: AssemblyFileVersion(\"%25major%25.%25minor%25.%25patch%25.0\")\]/g" $(ProjectDir)\Properties\AssemblyInfo.cs
117 | :skip_version
118 |
119 |
--------------------------------------------------------------------------------
/companion/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mbucchia/Pimax-OpenXR/2f54824af1ac05451d61c1ccf3a281e74e67df0c/companion/icon.ico
--------------------------------------------------------------------------------
/companion/logo.bmp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mbucchia/Pimax-OpenXR/2f54824af1ac05451d61c1ccf3a281e74e67df0c/companion/logo.bmp
--------------------------------------------------------------------------------
/external/aSeeVRClient/bin/aSeeVRClient.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mbucchia/Pimax-OpenXR/2f54824af1ac05451d61c1ccf3a281e74e67df0c/external/aSeeVRClient/bin/aSeeVRClient.dll
--------------------------------------------------------------------------------
/external/aSeeVRClient/include/aSeeVRClient.h:
--------------------------------------------------------------------------------
1 | /*******************************************************************************/
2 | /*
3 | Copyright (C) 2016 - 2020, Beijing 7invensun Technology Co.Ltd.All rights reserved.
4 | Permission is hereby granted, free of charge, to any person or organization obtaining
5 | a copy of the software and accompanying documentation covered by this license(the "Software")
6 | to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare
7 | derivative works of the Software, and to permit third - parties to whom the Software
8 | is furnished to do so, all subject to the following :
9 | The copyright notices in the Software and this entire statement, including the above
10 | license grant, this restriction and the following disclaimer, must be included in all
11 | copies of the Software, in whole or in part, and all derivative works of the Software,
12 | unless such copies or derivative works are solely in the form of machine - executable
13 | object code generated by a source language processor.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 | PURPOSE, TITLE AND NON - INFRINGEMENT.IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
18 | DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT,
19 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 | OTHER DEALINGS IN THE SOFTWARE.
21 |
22 | @author 7invensun
23 | */
24 | #ifndef _INCLUDE_7INVENSUN_ASEEVR_API_H_
25 | #define _INCLUDE_7INVENSUN_ASEEVR_API_H_
26 |
27 | #include "aSeeVRTypes.h"
28 |
29 | #ifdef __cplusplus
30 | extern "C" {
31 | #endif
32 |
33 | /** A callback function to receive asynchronous state from other APIs, registrates though aSeeVR_register_callback function.
34 | * @param state A state(Refer to the definition of the aSeeVRState structure).
35 | * @param context Used to pass the context of the caller, can be empty.
36 | * @return void
37 | */
38 | typedef void (_7INVENSUN_CALL *aSeeVR_state_callback)(const aSeeVRState* state, void* context);
39 |
40 | /** A callback function to receive an eye image��registrates though aSeeVR_register_callback function.
41 | * @param image Eye image data (Refer to the definition of the aSeeVRImage structure).
42 | * @param context Used to pass the context of the caller, can be empty.
43 | * @return void
44 | */
45 | typedef void (_7INVENSUN_CALL *aSeeVR_eye_image_callback)(const aSeeVRImage* image, void* context);
46 |
47 | /** A callback function to receive eye featrues and gaze points, registrates though aSeeVR_register_callback function.
48 |
49 | * @param state Eye data(Refer to the definition of the aSeeVREyeData structure).
50 | * @param context Used to pass the context of the caller, can be empty.
51 | * @return void
52 | */
53 | typedef void (_7INVENSUN_CALL *aSeeVR_eye_data_callback)(const aSeeVREyeData* eye_data, void* context);
54 |
55 | /** A callback function for receiving the calibration coefficient, registrates though aSeeVR_register_callback function.
56 | * @param data Calibration coefficient( Refer to the definition of the aSeeVRCoefficient structure).
57 | * @param context Used to pass the context of the caller, can be empty.
58 | * @return void
59 | */
60 | typedef void (_7INVENSUN_CALL *aSeeVR_coefficient_callback)(const aSeeVRCoefficient* data, void* context);
61 |
62 | /** Registering Callback Function
63 | * @param type Function type.
64 | * @param cb Callback function pointer.
65 | * @param context Used to pass the context of the caller, can be empty.
66 | * @return Refer to the definition of the aSeeVRReturnCode structure.
67 | */
68 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_register_callback(aSeeVRCallbackType type, void* cb, void* context);
69 |
70 | /** Connect to the Server.
71 | * @param param Initialization parameter(Refer to the definition of the aSeeVRImage structure).
72 | * @return Refer to the definition of the aSeeVRReturnCode structure.
73 | */
74 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_connect_server(const aSeeVRInitParam* param);
75 |
76 | /** Disconnect from the Server.
77 | * @param void
78 | * @return Refer to the definition of the aSeeVRReturnCode structure.
79 | */
80 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_disconnect_server(void);
81 |
82 | /** Start the device and start receiving data.
83 | * @param state A state(param descriptive parameter)
84 | * @param context Used to pass the context of the caller, can be empty.
85 | * @return Refer to the definition in aSeeVRReturnCode.
86 | * @note This function sends an asynchronous request to the server, and the return value only indicates whether the asynchronous request was successfully sent, whether the device is successfully stopped is returned asynchronously through the aSeeVR_state_callback function.
87 | * @pre Function aSeeVR_connect_server has been called successfully, has successfully registered aSeeVR_state_callback through aSeeVR_register_callback.
88 | */
89 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_start(const aSeeVRCoefficient* coe, const aSeeVRLanuchParam* others = 0);
90 |
91 | /** Halt Device.
92 | * @param void
93 | * @return Refer to the definition of the aSeeVRReturnCode structure.
94 | * @note This function sends an asynchronous request to the server, and the return value only indicates whether the asynchronous request was successfully sent, whether the device is successfully stopped is returned asynchronously through the aSeeVR_state_callback function.
95 | * @pre Function aSeeVR_connect_server has been called successfully,has successfully registered aSeeVR_state_callback through aSeeVR_register_callback.
96 | */
97 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_stop(void);
98 |
99 | /** Obtain Calibration Coefficient.
100 | * @param void
101 | * @return Refer to the definition of the aSeeVRReturnCode structure.
102 | * @note This function sends an asynchronous request to the server, and the return value only indicates whether the asynchronous request was successfully sent,calibration coefficient is returned by aSeeVR_coefficient_callback function asynchronously.
103 | * @pre Function aSeeVR_connect_server has been called successfully, has successfully registered aSeeVR_coefficient_callback through aSeeVR_register_callback.
104 | */
105 | _7INVENSUN_API aSeeVRReturnCode _7INVENSUN_CALL aSeeVR_get_coefficient(void);
106 |
107 | #ifdef __cplusplus
108 | }
109 | #endif
110 |
111 | #endif//_INCLUDE_7INVENSUN_ASEEVR_API_H_
--------------------------------------------------------------------------------
/external/aSeeVRClient/include/aSeeVRTypes.h:
--------------------------------------------------------------------------------
1 | /*******************************************************************************/
2 | /*
3 | Copyright (C) 2016 - 2020, Beijing 7invensun Technology Co.Ltd.All rights reserved.
4 | Permission is hereby granted, free of charge, to any person or organization obtaining
5 | a copy of the software and accompanying documentation covered by this license(the "Software")
6 | to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare
7 | derivative works of the Software, and to permit third - parties to whom the Software
8 | is furnished to do so, all subject to the following :
9 | The copyright notices in the Software and this entire statement, including the above
10 | license grant, this restriction and the following disclaimer, must be included in all
11 | copies of the Software, in whole or in part, and all derivative works of the Software,
12 | unless such copies or derivative works are solely in the form of machine - executable
13 | object code generated by a source language processor.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 | PURPOSE, TITLE AND NON - INFRINGEMENT.IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
18 | DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT,
19 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 | OTHER DEALINGS IN THE SOFTWARE.
21 |
22 | @author 7invensun
23 | */
24 | #ifndef _INCLUDE_7INVENSUN_ASEEVR_TYPES_H_
25 | #define _INCLUDE_7INVENSUN_ASEEVR_TYPES_H_
26 |
27 | #ifdef _MSC_VER
28 | # ifdef _7INVENSUN_ASEEVRCLIENT_DLL_EXPORTS
29 | # define _7INVENSUN_API __declspec(dllexport)
30 | # else
31 | # define _7INVENSUN_API __declspec(dllimport)
32 | # endif//_7INVENSUN_ASEEVRCLIENT_DLL_EXPORTS
33 | # ifndef _7INVENSUN_CALL
34 | # define _7INVENSUN_CALL __stdcall
35 | # endif//_7INVENSUN_CALL
36 | #else
37 | # define _7INVENSUN_API
38 | # define _7INVENSUN_CALL
39 | #endif//_MSC_VER
40 |
41 | #ifndef uint8_t
42 | typedef unsigned char uint8_t;
43 | #endif
44 |
45 | #ifndef int16_t
46 | typedef short int16_t;
47 | #endif
48 |
49 | #ifndef int32_t
50 | typedef int int32_t;
51 | #endif
52 |
53 | #ifndef uint32_t
54 | typedef unsigned int uint32_t;
55 | #endif
56 |
57 | #ifndef int64_t
58 | typedef long long int64_t;
59 | #endif
60 |
61 | #ifndef uint64_t
62 | typedef unsigned long long uint64_t;
63 | #endif
64 |
65 | /**
66 | * @enum aSeeVRCallbackType
67 | * Enumerate all the callback function types used in the API.
68 | */
69 | typedef enum ASEEVR_CALLBACK_TYPE {
70 | state, /*!