2025-11-28 00:35:46 +09:00

136 lines
6.1 KiB
C++

#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 BasicHologram
{
class BasicHologramMain : public DX::IDeviceNotify
{
public:
BasicHologramMain(std::shared_ptr<DX::DeviceResources> const& deviceResources);
~BasicHologramMain();
// Sets the holographic space. This is our closest analogue to setting a new window
// for the app.
void SetHolographicSpace(
HWND hWnd,
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;
};
}