servo/support/hololens/ServoApp/ImmersiveMain.h

151 lines
5.4 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#pragma once
//
// Comment out this preprocessor definition to disable all of the
// sample content.
//
// To remove the content after disabling it:
// * Remove the unused code from your app's Main class.
// * Delete the Content folder provided with this template.
//
#define DRAW_SAMPLE_CONTENT
#include "Common/DeviceResources.h"
#include "Common/StepTimer.h"
#ifdef DRAW_SAMPLE_CONTENT
#include "Content/SpinningCubeRenderer.h"
#include "Content/SpatialInputHandler.h"
#endif
// Updates, renders, and presents holographic content using Direct3D.
namespace Immersive {
class ImmersiveMain : public DX::IDeviceNotify {
public:
ImmersiveMain(std::shared_ptr<DX::DeviceResources> const &deviceResources);
~ImmersiveMain();
// Sets the holographic space. This is our closest analogue to setting a new
// window for the app.
void SetHolographicSpace(
winrt::Windows::Graphics::Holographic::HolographicSpace const
&holographicSpace);
// Starts the holographic frame and updates the content.
winrt::Windows::Graphics::Holographic::HolographicFrame Update();
// Renders holograms, including world-locked content.
bool Render(winrt::Windows::Graphics::Holographic::HolographicFrame const
&holographicFrame);
// Handle saving and loading of app state owned by AppMain.
void SaveAppState();
void LoadAppState();
// Handle mouse input.
void OnPointerPressed();
// IDeviceNotify
void OnDeviceLost() override;
void OnDeviceRestored() override;
private:
// Asynchronously creates resources for new holographic cameras.
void OnCameraAdded(
winrt::Windows::Graphics::Holographic::HolographicSpace const &sender,
winrt::Windows::Graphics::Holographic::
HolographicSpaceCameraAddedEventArgs const &args);
// Synchronously releases resources for holographic cameras that are no longer
// attached to the system.
void OnCameraRemoved(
winrt::Windows::Graphics::Holographic::HolographicSpace const &sender,
winrt::Windows::Graphics::Holographic::
HolographicSpaceCameraRemovedEventArgs const &args);
// Used to notify the app when the positional tracking state changes.
void OnLocatabilityChanged(
winrt::Windows::Perception::Spatial::SpatialLocator const &sender,
winrt::Windows::Foundation::IInspectable const &args);
// Used to be aware of gamepads that are plugged in after the app starts.
void OnGamepadAdded(winrt::Windows::Foundation::IInspectable,
winrt::Windows::Gaming::Input::Gamepad const &args);
// Used to stop looking for gamepads that are removed while the app is
// running.
void OnGamepadRemoved(winrt::Windows::Foundation::IInspectable,
winrt::Windows::Gaming::Input::Gamepad const &args);
// Used to respond to changes to the default spatial locator.
void OnHolographicDisplayIsAvailableChanged(
winrt::Windows::Foundation::IInspectable,
winrt::Windows::Foundation::IInspectable);
// Clears event registration state. Used when changing to a new
// HolographicSpace and when tearing down AppMain.
void UnregisterHolographicEventHandlers();
#ifdef DRAW_SAMPLE_CONTENT
// Renders a colorful holographic cube that's 20 centimeters wide. This sample
// content is used to demonstrate world-locked rendering.
std::unique_ptr<SpinningCubeRenderer> m_spinningCubeRenderer;
// Listens for the Pressed spatial input event.
std::shared_ptr<SpatialInputHandler> m_spatialInputHandler;
#endif
// Cached pointer to device resources.
std::shared_ptr<DX::DeviceResources> m_deviceResources;
// Render loop timer.
DX::StepTimer m_timer;
// Represents the holographic space around the user.
winrt::Windows::Graphics::Holographic::HolographicSpace m_holographicSpace =
nullptr;
// SpatialLocator that is attached to the default HolographicDisplay.
winrt::Windows::Perception::Spatial::SpatialLocator m_spatialLocator =
nullptr;
// A stationary reference frame based on m_spatialLocator.
winrt::Windows::Perception::Spatial::SpatialStationaryFrameOfReference
m_stationaryReferenceFrame = nullptr;
// Event registration tokens.
winrt::event_token m_cameraAddedToken;
winrt::event_token m_cameraRemovedToken;
winrt::event_token m_locatabilityChangedToken;
winrt::event_token m_gamepadAddedEventToken;
winrt::event_token m_gamepadRemovedEventToken;
winrt::event_token m_holographicDisplayIsAvailableChangedEventToken;
// Keep track of gamepads.
struct GamepadWithButtonState {
winrt::Windows::Gaming::Input::Gamepad gamepad;
bool buttonAWasPressedLastFrame = false;
};
std::vector<GamepadWithButtonState> m_gamepads;
// Keep track of mouse input.
bool m_pointerPressed = false;
// Cache whether or not the HolographicCamera.Display property can be
// accessed.
bool m_canGetHolographicDisplayForCamera = false;
// Cache whether or not the HolographicDisplay.GetDefault() method can be
// called.
bool m_canGetDefaultHolographicDisplay = false;
// Cache whether or not the
// HolographicCameraRenderingParameters.CommitDirect3D11DepthBuffer() method
// can be called.
bool m_canCommitDirect3D11DepthBuffer = false;
};
} // namespace Immersive