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_dialog.h>
18#include <SDL3/SDL_main.h>
20
21#if defined(__ANDROID__) && !defined(FOUNDATION_EXAMPLES_IMPLEMENTATION)
22#ifdef main
23#undef main
24#endif
25int Foundation_ExampleMain(int argc, char** argv);
26extern "C" int SDL_main(int argc, char** argv)
27{
28 return Foundation_ExampleMain(argc, argv);
29}
30#define main Foundation_ExampleMain
31#endif
32
33using namespace Foundation;
34using namespace Core;
35using namespace Math;
36using namespace RenderCore;
37
38// ExampleVulkanContext members, in structured-binding order: [renderer, app, device, surface, swapchain, presenter]
39constexpr int Examples_SDLWindowFlagsVulkan = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_VULKAN;
40// Common command-line options shared by all examples (mirrors Editor::SDLMain):
41// -h, --help Show usage and exit
42// -g, --gpu <id> Select GPU device index
43// -l, --list-gpus List available GPU devices and exit
44//
56
58{
59 uint32_t id{};
60 int x{};
61 int y{};
62 int w{};
63 int h{};
64};
65
67{
68 SDL_FingerID fingerId{};
71 bool active{};
73};
74
76{
77 static constexpr size_t kMaxPressedKeys = 16;
78 static constexpr size_t kMaxHudLines = 64;
79 static constexpr size_t kMaxClickableRegions = kMaxHudLines;
80 // Set to true whenever the window is resized. Clear manually.
81 // You can also set this to true to force a resize for e.g. Renderer to be rebuilt.
83 // Inputs
84 bool keyForward{};
85 bool keyBack{};
86 bool keyLeft{};
87 bool keyRight{};
88 bool keyFast{};
94 float zoomDelta{};
95 SDL_Event lastEvent{};
96 uint32_t clickedControl{};
97 uint32_t activeControl{};
98 uint32_t nextControlId = 1u;
99 uint32_t pressedKeyCount{};
102 // UI states
103 static constexpr size_t kMaxUiStyleStack = 8;
104 int uiX = 16;
105 int uiY = 16;
106 int uiStartX = 16;
107 int uiLineHeight = 24;
108 int uiYSpacing = 2;
115 int uiScale = 2;
116 int uiColor = -1;
122 size_t hudCount{};
127
133
134 bool KeyPressed(SDL_Keycode key) const
135 {
136 for (uint32_t i = 0; i < pressedKeyCount; ++i)
137 if (pressedKeys[i] == key)
138 return true;
139 return false;
140 }
141};
142
144{
145 static constexpr char kControlsText[] =
146 "Drag orbit | 2-finger/right-drag pan | pinch/wheel zoom | WASD move";
147
150 float radius = 1.0f;
151 quat rot = quat(1.0f, 0.0f, 0.0f, 0.0f);
152 float zNear = 0.01f;
153 float fovY = radians(45.0f);
154 float aspect = 1.0f;
155 mat4 view{};
156 mat4 proj{};
157 float moveSpeed = 2.0f;
158
159 bool Update(ExampleInputState const& input, float dt);
160 void RefreshMatrices();
161};
162
164 RendererConfig const& config);
165
166// Largest render scale allowed for the given present extent. Mobile is capped at 480p on the short axis.
167float Examples_MaxRenderScale(RHIExtent2D presentExtent);
168// Render extent for a requested scale, clamped by Examples_MaxRenderScale.
169RHIExtent2D Examples_RenderExtent(RHIExtent2D presentExtent, float scale = 1.0f);
170
171ExampleVulkanContext Examples_InitVulkan(SDL_Window* window, int argc, char** argv, RendererDesc desc = {});
172bool Examples_PollEvents(SDL_Window* window, ExampleVulkanContext& ctx, ExampleInputState& input, SDL_Event* outLastEvent = nullptr,
173 void (*processEvent)(SDL_Event*) = nullptr);
174bool Examples_ShouldClose(SDL_Window* window, ExampleVulkanContext& ctx, SDL_Event* outEvent = nullptr);
175
177void Examples_BeginControls(ExampleInputState& input, int x = 16, int y = 16);
178void Examples_SameLine(ExampleInputState& input, int spacing = 16);
179void Examples_PushScale(ExampleInputState& input, int scale);
181void Examples_PushColor(ExampleInputState& input, int col32);
182void Examples_PushColor(ExampleInputState& input, int r, int g, int b, int a = 255);
186bool Examples_Slider(ExampleInputState& input, StringView label, float& value, float minValue, float maxValue,
187 float step = 0.01f, const char* unit = "x", bool draggable = true);
189void Examples_NewFrame(Renderer* renderer); // Headless
190void Examples_NewFrame(SDL_Window* window, ExampleVulkanContext& ctx); // To Window WSI
192void Examples_DestroyVulkan(SDL_Window* window, ExampleVulkanContext& ctx);
193bool Examples_CreateSwapchain(SDL_Window* window, RHIDevice* device, RHIDeviceScopedHandle<RHISurface>& outSurface, RHIDeviceScopedHandle<RHISwapchain>& outSwapchain);
194void Examples_DumpAndOpenImage(RHIApplication const& app, StringView path, RHIExtent2D extent, void const* data,
195 int channels = 4, int strideBytes = 0);
196String Examples_PromptForFile(SDL_DialogFileFilter filter, StringView localCopyStem = "Picked",
197 StringView (*extensionFromMagic)(Span<const unsigned char>) = nullptr);
198float Examples_GetTime();
199
200
202{
203 size_t lastTick{};
204 size_t frames{};
205 float fps{};
206 float Update()
207 {
208 size_t now = SDL_GetTicksNS();
209 size_t delta = now - lastTick;
210 if (delta >= 1e9)
211 {
212 fps = 1e9 * (static_cast<float>(frames) / delta);
213 frames = 0;
214 lastTick = now;
215 }
216 frames++;
217 return fps;
218 }
219};
#define GLOBAL_ALLOC
Definition Allocator.hpp:240
bool Examples_ShouldClose(SDL_Window *window, ExampleVulkanContext &ctx, SDL_Event *outEvent=nullptr)
Definition Examples.cpp:701
void Examples_PopColor(ExampleInputState &input)
Definition Examples.cpp:786
bool Examples_Button(ExampleInputState &input, StringView text)
Definition Examples.cpp:802
void Examples_PopScale(ExampleInputState &input)
Definition Examples.cpp:768
void Examples_BeginFrameInput(ExampleInputState &input)
Definition Examples.cpp:723
constexpr int Examples_SDLWindowFlagsVulkan
Definition Examples.hpp:39
void Examples_PushColor(ExampleInputState &input, int col32)
Definition Examples.cpp:774
RHIExtent2D Examples_RenderExtent(RHIExtent2D presentExtent, float scale=1.0f)
Definition Examples.cpp:588
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:815
void Examples_SameLine(ExampleInputState &input, int spacing=16)
Definition Examples.cpp:755
void Examples_Text(ExampleInputState &input, StringView text)
Definition Examples.cpp:792
float Examples_GetTime()
Definition Examples.cpp:959
ExampleVulkanContext Examples_InitVulkan(SDL_Window *window, int argc, char **argv, RendererDesc desc={})
Definition Examples.cpp:595
void Examples_PushScale(ExampleInputState &input, int scale)
Definition Examples.cpp:761
void Examples_ResetRenderer(ExampleVulkanContext &ctx, RendererDesc desc={})
Definition Examples.cpp:876
float Examples_MaxRenderScale(RHIExtent2D presentExtent)
Definition Examples.cpp:573
void Examples_NewFrame(Renderer *renderer)
Definition Examples.cpp:884
void Examples_DestroyVulkan(SDL_Window *window, ExampleVulkanContext &ctx)
Definition Examples.cpp:908
bool Examples_CreateSwapchain(SDL_Window *window, RHIDevice *device, RHIDeviceScopedHandle< RHISurface > &outSurface, RHIDeviceScopedHandle< RHISwapchain > &outSwapchain)
Definition Examples.cpp:516
void Examples_DumpAndOpenImage(RHIApplication const &app, StringView path, RHIExtent2D extent, void const *data, int channels=4, int strideBytes=0)
Definition Examples.cpp:927
void Examples_BeginControls(ExampleInputState &input, int x=16, int y=16)
Definition Examples.cpp:736
String Examples_PromptForFile(SDL_DialogFileFilter filter, StringView localCopyStem="Picked", StringView(*extensionFromMagic)(Span< const unsigned char >)=nullptr)
Definition Examples.cpp:943
void Examples_ReportFatalException()
Definition Examples.cpp:550
Span< const RenderUtils::CSDebugTextData > Examples_HudLines(ExampleInputState const &input)
Definition Examples.cpp:871
void Examples_UpdateCameraUBO(RendererUBO &ubo, Renderer *renderer, FExampleOrbitCamera &camera, RendererConfig const &config)
Definition Examples.cpp:559
bool Examples_PollEvents(SDL_Window *window, ExampleVulkanContext &ctx, ExampleInputState &input, SDL_Event *outLastEvent=nullptr, void(*processEvent)(SDL_Event *)=nullptr)
Definition Examples.cpp:670
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:404
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string< char, std::char_traits< char >, StlDefaultAllocator< char > > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:120
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:58
int x
Definition Examples.hpp:60
int h
Definition Examples.hpp:63
int y
Definition Examples.hpp:61
int w
Definition Examples.hpp:62
Definition Examples.hpp:202
size_t lastTick
Definition Examples.hpp:203
float fps
Definition Examples.hpp:205
float Update()
Definition Examples.hpp:206
size_t frames
Definition Examples.hpp:204
Definition Examples.hpp:76
int uiLineHeight
Definition Examples.hpp:107
size_t hudCount
Definition Examples.hpp:122
Array< ExampleTouchState, 4 > touches
Definition Examples.hpp:124
int uiColor
Definition Examples.hpp:116
static constexpr size_t kMaxPressedKeys
Definition Examples.hpp:77
Vector< ExampleClickableRegion > nextClickableRegions
Definition Examples.hpp:126
bool mouseCapturedByHud
Definition Examples.hpp:89
size_t uiColorStackCount
Definition Examples.hpp:118
float2 move
Definition Examples.hpp:93
Array< int, kMaxUiStyleStack > uiColorStack
Definition Examples.hpp:120
bool keyLeft
Definition Examples.hpp:86
int uiLastItemWidth
Definition Examples.hpp:110
bool keyBack
Definition Examples.hpp:85
int uiY
Definition Examples.hpp:105
float2 pointerPosition
Definition Examples.hpp:100
int uiScale
Definition Examples.hpp:115
int uiYSpacing
Definition Examples.hpp:108
Vector< ExampleClickableRegion > clickableRegions
Definition Examples.hpp:125
Array< SDL_Keycode, kMaxPressedKeys > pressedKeys
Definition Examples.hpp:123
float2 clickPosition
Definition Examples.hpp:101
Array< RenderUtils::CSDebugTextData, kMaxHudLines > hud
Definition Examples.hpp:121
int uiX
Definition Examples.hpp:104
int uiLastItemX
Definition Examples.hpp:112
uint32_t activeControl
Definition Examples.hpp:97
bool pointerDown
Definition Examples.hpp:90
SDL_Event lastEvent
Definition Examples.hpp:95
uint32_t nextControlId
Definition Examples.hpp:98
static constexpr size_t kMaxHudLines
Definition Examples.hpp:78
bool keyFast
Definition Examples.hpp:88
size_t uiScaleStackCount
Definition Examples.hpp:117
static constexpr size_t kMaxClickableRegions
Definition Examples.hpp:79
bool wantResizeOrRebuild
Definition Examples.hpp:82
int uiLastItemY
Definition Examples.hpp:113
uint32_t pressedKeyCount
Definition Examples.hpp:99
static constexpr size_t kMaxUiStyleStack
Definition Examples.hpp:103
float2 orbitDelta
Definition Examples.hpp:91
float2 panDelta
Definition Examples.hpp:92
ExampleInputState()
Definition Examples.hpp:128
float zoomDelta
Definition Examples.hpp:94
uint32_t clickedControl
Definition Examples.hpp:96
int uiLastItemHeight
Definition Examples.hpp:111
int uiSameLineSpacing
Definition Examples.hpp:109
int uiStartX
Definition Examples.hpp:106
bool uiSameLine
Definition Examples.hpp:114
bool KeyPressed(SDL_Keycode key) const
Definition Examples.hpp:134
bool keyRight
Definition Examples.hpp:87
bool keyForward
Definition Examples.hpp:84
Array< int, kMaxUiStyleStack > uiScaleStack
Definition Examples.hpp:119
Definition Examples.hpp:67
bool capturedByHud
Definition Examples.hpp:72
SDL_FingerID fingerId
Definition Examples.hpp:68
bool active
Definition Examples.hpp:71
float2 position
Definition Examples.hpp:69
float2 previous
Definition Examples.hpp:70
Definition Examples.hpp:46
RHIDeviceScopedHandle< RHISurface > surface
Definition Examples.hpp:51
RHIApplicationScopedHandle< RHIDevice > device
Definition Examples.hpp:48
RHIDeviceScopedHandle< RHIPipelineStateCache > psoCache
Definition Examples.hpp:50
UniquePtr< VulkanApplication > app
Definition Examples.hpp:47
UniquePtr< Presenter > presenter
Definition Examples.hpp:53
UniquePtr< Renderer > renderer
Definition Examples.hpp:54
RHIDeviceScopedHandle< RHISwapchain > swapchain
Definition Examples.hpp:52
UniquePtr< JobSystem > jobs
Definition Examples.hpp:49
Definition Examples.hpp:144
mat4 view
Definition Examples.hpp:155
float3 center
Definition Examples.hpp:148
float zNear
Definition Examples.hpp:152
float aspect
Definition Examples.hpp:154
quat rot
Definition Examples.hpp:151
void RefreshMatrices()
Definition Examples.cpp:1007
float radius
Definition Examples.hpp:150
float3 position
Definition Examples.hpp:149
mat4 proj
Definition Examples.hpp:156
float fovY
Definition Examples.hpp:153
float moveSpeed
Definition Examples.hpp:157
static constexpr char kControlsText[]
Definition Examples.hpp:145
Parameters for Renderer creation.
Definition Renderer.hpp:47
Definition Renderer.hpp:124
Definition Renderer.hpp:11