Foundation
Loading...
Searching...
No Matches
Examples.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/BuildInfo.hpp>
3#include <Core/JobSystem.hpp>
4#include <Core/Container.hpp>
8#include <RHICore/Surface.hpp>
10#include <Renderer/Renderer.hpp>
11#include <Renderer/Texture.hpp>
12#include <Renderer/Mesh.hpp>
13#include <Math/Math.hpp>
17#include <SDL3/SDL_main.h>
19
20#if defined(__ANDROID__) && !defined(FOUNDATION_EXAMPLES_IMPLEMENTATION)
21#ifdef main
22#undef main
23#endif
24int Foundation_ExampleMain(int argc, char** argv);
25extern "C" int SDL_main(int argc, char** argv)
26{
27 return Foundation_ExampleMain(argc, argv);
28}
29#define main Foundation_ExampleMain
30#endif
31
32using namespace Foundation;
33using namespace Core;
34using namespace Math;
35using namespace RenderCore;
36
37// ExampleVulkanContext members, in structured-binding order: [renderer, app, device, surface, swapchain, presenter]
38constexpr int Examples_SDLWindowFlagsVulkan = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_VULKAN;
39// Common command-line options shared by all examples (mirrors Editor::SDLMain):
40// -h, --help Show usage and exit
41// -g, --gpu <id> Select GPU device index
42// -l, --list-gpus List available GPU devices and exit
43//
55
57{
58 uint32_t id{};
59 int x{};
60 int y{};
61 int w{};
62 int h{};
63};
64
66{
67 SDL_FingerID fingerId{};
70 bool active{};
72};
73
75{
76 static constexpr size_t kMaxPressedKeys = 16;
77 static constexpr size_t kMaxHudLines = 64;
78 static constexpr size_t kMaxClickableRegions = kMaxHudLines;
79 // Set to true whenever the window is resized. Clear manually.
80 // You can also set this to true to force a resize for e.g. Renderer to be rebuilt.
82 // Inputs
83 bool keyForward{};
84 bool keyBack{};
85 bool keyLeft{};
86 bool keyRight{};
87 bool keyFast{};
93 float zoomDelta{};
94 SDL_Event lastEvent{};
95 uint32_t clickedControl{};
96 uint32_t activeControl{};
97 uint32_t nextControlId = 1u;
98 uint32_t pressedKeyCount{};
101 // UI states
102 static constexpr size_t kMaxUiStyleStack = 8;
103 int uiX = 16;
104 int uiY = 16;
105 int uiStartX = 16;
106 int uiLineHeight = 24;
107 int uiYSpacing = 2;
114 int uiScale = 2;
115 int uiColor = -1;
121 size_t hudCount{};
126
132
133 bool KeyPressed(SDL_Keycode key) const
134 {
135 for (uint32_t i = 0; i < pressedKeyCount; ++i)
136 if (pressedKeys[i] == key)
137 return true;
138 return false;
139 }
140};
141
143{
144 static constexpr char kControlsText[] =
145 "Drag orbit | 2-finger/right-drag pan | pinch/wheel zoom | WASD move";
146
149 float radius = 1.0f;
150 quat rot = quat(1.0f, 0.0f, 0.0f, 0.0f);
151 float zNear = 0.01f;
152 float fovY = radians(45.0f);
153 float aspect = 1.0f;
154 mat4 view{};
155 mat4 proj{};
156 float moveSpeed = 2.0f;
157
158 bool Update(ExampleInputState const& input, float dt);
159 void RefreshMatrices();
160};
161
163 RendererConfig const& config);
164
165ExampleVulkanContext Examples_InitVulkan(SDL_Window* window, int argc, char** argv, RendererDesc desc = {});
166bool Examples_PollEvents(SDL_Window* window, ExampleVulkanContext& ctx, ExampleInputState& input, SDL_Event* outLastEvent = nullptr,
167 void (*processEvent)(SDL_Event*) = nullptr);
168bool Examples_ShouldClose(SDL_Window* window, ExampleVulkanContext& ctx, SDL_Event* outEvent = nullptr);
169
171void Examples_BeginControls(ExampleInputState& input, int x = 16, int y = 16);
172void Examples_SameLine(ExampleInputState& input, int spacing = 16);
173void Examples_PushScale(ExampleInputState& input, int scale);
175void Examples_PushColor(ExampleInputState& input, int col32);
176void Examples_PushColor(ExampleInputState& input, int r, int g, int b, int a = 255);
180bool Examples_Slider(ExampleInputState& input, StringView label, float& value, float minValue, float maxValue,
181 float step = 0.01f, const char* unit = "x", bool draggable = true);
183void Examples_NewFrame(Renderer* renderer); // Headless
184void Examples_NewFrame(SDL_Window* window, ExampleVulkanContext& ctx); // To Window WSI
186void Examples_DestroyVulkan(SDL_Window* window, ExampleVulkanContext& ctx);
187bool Examples_CreateSwapchain(SDL_Window* window, RHIDevice* device, RHIDeviceScopedHandle<RHISurface>& outSurface, RHIDeviceScopedHandle<RHISwapchain>& outSwapchain);
188void Examples_DumpAndOpenImage(RHIApplication const& app, StringView path, RHIExtent2D extent, void const* data,
189 int channels = 4, int strideBytes = 0);
190float Examples_GetTime();
191
192
194{
195 size_t lastTick{};
196 size_t frames{};
197 float fps{};
198 float Update()
199 {
200 size_t now = SDL_GetTicksNS();
201 size_t delta = now - lastTick;
202 if (delta >= 1e9)
203 {
204 fps = 1e9 * (static_cast<float>(frames) / delta);
205 frames = 0;
206 lastTick = now;
207 }
208 frames++;
209 return fps;
210 }
211};
#define GLOBAL_ALLOC
Definition Allocator.hpp:240
bool Examples_ShouldClose(SDL_Window *window, ExampleVulkanContext &ctx, SDL_Event *outEvent=nullptr)
Definition Examples.cpp:608
void Examples_PopColor(ExampleInputState &input)
Definition Examples.cpp:693
bool Examples_Button(ExampleInputState &input, StringView text)
Definition Examples.cpp:709
void Examples_PopScale(ExampleInputState &input)
Definition Examples.cpp:675
void Examples_BeginFrameInput(ExampleInputState &input)
Definition Examples.cpp:630
constexpr int Examples_SDLWindowFlagsVulkan
Definition Examples.hpp:38
void Examples_PushColor(ExampleInputState &input, int col32)
Definition Examples.cpp:681
bool Examples_Slider(ExampleInputState &input, StringView label, float &value, float minValue, float maxValue, float step=0.01f, const char *unit="x", bool draggable=true)
Definition Examples.cpp:722
void Examples_SameLine(ExampleInputState &input, int spacing=16)
Definition Examples.cpp:662
void Examples_Text(ExampleInputState &input, StringView text)
Definition Examples.cpp:699
float Examples_GetTime()
Definition Examples.cpp:850
ExampleVulkanContext Examples_InitVulkan(SDL_Window *window, int argc, char **argv, RendererDesc desc={})
Definition Examples.cpp:502
void Examples_PushScale(ExampleInputState &input, int scale)
Definition Examples.cpp:668
void Examples_ResetRenderer(ExampleVulkanContext &ctx, RendererDesc desc={})
Definition Examples.cpp:783
void Examples_NewFrame(Renderer *renderer)
Definition Examples.cpp:791
void Examples_DestroyVulkan(SDL_Window *window, ExampleVulkanContext &ctx)
Definition Examples.cpp:815
bool Examples_CreateSwapchain(SDL_Window *window, RHIDevice *device, RHIDeviceScopedHandle< RHISurface > &outSurface, RHIDeviceScopedHandle< RHISwapchain > &outSwapchain)
Definition Examples.cpp:445
void Examples_DumpAndOpenImage(RHIApplication const &app, StringView path, RHIExtent2D extent, void const *data, int channels=4, int strideBytes=0)
Definition Examples.cpp:834
void Examples_BeginControls(ExampleInputState &input, int x=16, int y=16)
Definition Examples.cpp:643
void Examples_ReportFatalException()
Definition Examples.cpp:479
Span< const RenderUtils::CSDebugTextData > Examples_HudLines(ExampleInputState const &input)
Definition Examples.cpp:778
void Examples_UpdateCameraUBO(RendererUBO &ubo, Renderer *renderer, FExampleOrbitCamera &camera, RendererConfig const &config)
Definition Examples.cpp:488
bool Examples_PollEvents(SDL_Window *window, ExampleVulkanContext &ctx, ExampleInputState &input, SDL_Event *outLastEvent=nullptr, void(*processEvent)(SDL_Event *)=nullptr)
Definition Examples.cpp:577
The root object of everything RHI. Implementation of this class inherently defines the RHI backend.
Definition Application.hpp:24
Definition Device.hpp:246
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:85
Renderer implementing a Frame Graph system with automatic resource tracking and synchronization.
Definition Renderer.hpp:377
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::array< T, Size > Array
Alias for std::array
Definition Container.hpp:45
std::basic_string_view< char > StringView
Alias for std::basic_string_view<char>
Definition Container.hpp:56
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:180
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
vec2 float2
Definition Math.hpp:27
vec3 float3
Definition Math.hpp:26
glm::vec< 2, uint32_t > RHIExtent2D
Definition Common.hpp:10
Definition Allocator.hpp:6
Definition Examples.hpp:57
int x
Definition Examples.hpp:59
int h
Definition Examples.hpp:62
int y
Definition Examples.hpp:60
int w
Definition Examples.hpp:61
Definition Examples.hpp:194
size_t lastTick
Definition Examples.hpp:195
float fps
Definition Examples.hpp:197
float Update()
Definition Examples.hpp:198
size_t frames
Definition Examples.hpp:196
Definition Examples.hpp:75
int uiLineHeight
Definition Examples.hpp:106
size_t hudCount
Definition Examples.hpp:121
Array< ExampleTouchState, 4 > touches
Definition Examples.hpp:123
int uiColor
Definition Examples.hpp:115
static constexpr size_t kMaxPressedKeys
Definition Examples.hpp:76
Vector< ExampleClickableRegion > nextClickableRegions
Definition Examples.hpp:125
bool mouseCapturedByHud
Definition Examples.hpp:88
size_t uiColorStackCount
Definition Examples.hpp:117
float2 move
Definition Examples.hpp:92
Array< int, kMaxUiStyleStack > uiColorStack
Definition Examples.hpp:119
bool keyLeft
Definition Examples.hpp:85
int uiLastItemWidth
Definition Examples.hpp:109
bool keyBack
Definition Examples.hpp:84
int uiY
Definition Examples.hpp:104
float2 pointerPosition
Definition Examples.hpp:99
int uiScale
Definition Examples.hpp:114
int uiYSpacing
Definition Examples.hpp:107
Vector< ExampleClickableRegion > clickableRegions
Definition Examples.hpp:124
Array< SDL_Keycode, kMaxPressedKeys > pressedKeys
Definition Examples.hpp:122
float2 clickPosition
Definition Examples.hpp:100
Array< RenderUtils::CSDebugTextData, kMaxHudLines > hud
Definition Examples.hpp:120
int uiX
Definition Examples.hpp:103
int uiLastItemX
Definition Examples.hpp:111
uint32_t activeControl
Definition Examples.hpp:96
bool pointerDown
Definition Examples.hpp:89
SDL_Event lastEvent
Definition Examples.hpp:94
uint32_t nextControlId
Definition Examples.hpp:97
static constexpr size_t kMaxHudLines
Definition Examples.hpp:77
bool keyFast
Definition Examples.hpp:87
size_t uiScaleStackCount
Definition Examples.hpp:116
static constexpr size_t kMaxClickableRegions
Definition Examples.hpp:78
bool wantResizeOrRebuild
Definition Examples.hpp:81
int uiLastItemY
Definition Examples.hpp:112
uint32_t pressedKeyCount
Definition Examples.hpp:98
static constexpr size_t kMaxUiStyleStack
Definition Examples.hpp:102
float2 orbitDelta
Definition Examples.hpp:90
float2 panDelta
Definition Examples.hpp:91
ExampleInputState()
Definition Examples.hpp:127
float zoomDelta
Definition Examples.hpp:93
uint32_t clickedControl
Definition Examples.hpp:95
int uiLastItemHeight
Definition Examples.hpp:110
int uiSameLineSpacing
Definition Examples.hpp:108
int uiStartX
Definition Examples.hpp:105
bool uiSameLine
Definition Examples.hpp:113
bool KeyPressed(SDL_Keycode key) const
Definition Examples.hpp:133
bool keyRight
Definition Examples.hpp:86
bool keyForward
Definition Examples.hpp:83
Array< int, kMaxUiStyleStack > uiScaleStack
Definition Examples.hpp:118
Definition Examples.hpp:66
bool capturedByHud
Definition Examples.hpp:71
SDL_FingerID fingerId
Definition Examples.hpp:67
bool active
Definition Examples.hpp:70
float2 position
Definition Examples.hpp:68
float2 previous
Definition Examples.hpp:69
Definition Examples.hpp:45
RHIDeviceScopedHandle< RHISurface > surface
Definition Examples.hpp:50
RHIApplicationScopedHandle< RHIDevice > device
Definition Examples.hpp:47
RHIDeviceScopedHandle< RHIPipelineStateCache > psoCache
Definition Examples.hpp:49
UniquePtr< VulkanApplication > app
Definition Examples.hpp:46
UniquePtr< Presenter > presenter
Definition Examples.hpp:52
UniquePtr< Renderer > renderer
Definition Examples.hpp:53
RHIDeviceScopedHandle< RHISwapchain > swapchain
Definition Examples.hpp:51
UniquePtr< JobSystem > jobs
Definition Examples.hpp:48
Definition Examples.hpp:143
mat4 view
Definition Examples.hpp:154
float3 center
Definition Examples.hpp:147
float zNear
Definition Examples.hpp:151
float aspect
Definition Examples.hpp:153
quat rot
Definition Examples.hpp:150
void RefreshMatrices()
Definition Examples.cpp:898
float radius
Definition Examples.hpp:149
float3 position
Definition Examples.hpp:148
mat4 proj
Definition Examples.hpp:155
float fovY
Definition Examples.hpp:152
float moveSpeed
Definition Examples.hpp:156
static constexpr char kControlsText[]
Definition Examples.hpp:144
Parameters for Renderer creation.
Definition Renderer.hpp:27
Definition Renderer.hpp:122
Definition Renderer.hpp:11