Skip to content

Commit a28bbf1

Browse files
committed
Add operator""_B, FixedBitmap
- Use `u` instead of `U` for unsigned literals.
1 parent 4108003 commit a28bbf1

File tree

13 files changed

+50
-55
lines changed

13 files changed

+50
-55
lines changed

lib/engine/include/facade/engine/scene_renderer.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
#include <facade/render/renderer.hpp>
33
#include <facade/scene/scene.hpp>
44
#include <facade/vk/buffer.hpp>
5-
#include <facade/vk/skybox.hpp>
65

76
namespace facade {
7+
class Skybox;
8+
89
class SceneRenderer {
910
public:
1011
explicit SceneRenderer(Gfx const& gfx);
1112

12-
void render(Scene const& scene, Renderer& renderer, vk::CommandBuffer cb);
13+
void render(Scene const& scene, Ptr<Skybox const> skybox, Renderer& renderer, vk::CommandBuffer cb);
1314

1415
private:
1516
void write_view(glm::vec2 const extent);

lib/engine/src/engine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ auto Engine::poll() -> State const& {
256256
void Engine::render() {
257257
auto cb = vk::CommandBuffer{};
258258
// we skip rendering the scene if acquiring a swapchain image fails (unlikely)
259-
if (m_impl->window.renderer.next_frame({&cb, 1})) { m_impl->renderer.render(scene(), renderer(), cb); }
259+
if (m_impl->window.renderer.next_frame({&cb, 1})) { m_impl->renderer.render(scene(), {}, renderer(), cb); }
260260
m_impl->window.gui->end_frame();
261261
m_impl->window.renderer.render();
262262
}

lib/engine/src/scene_renderer.cpp

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,9 @@
11
#include <facade/engine/scene_renderer.hpp>
2+
#include <facade/vk/skybox.hpp>
23

34
namespace facade {
45
namespace {
5-
struct Img1x1 {
6-
std::byte bytes[4]{};
7-
8-
Image::View view() const {
9-
return Image::View{
10-
.bytes = {reinterpret_cast<std::byte const*>(bytes), std::size(bytes)},
11-
.extent = {1, 1},
12-
};
13-
}
14-
15-
static Img1x1 make(std::array<std::uint8_t, 4> const& rgba) {
16-
return {
17-
.bytes =
18-
{
19-
static_cast<std::byte>(rgba[0]),
20-
static_cast<std::byte>(rgba[1]),
21-
static_cast<std::byte>(rgba[2]),
22-
static_cast<std::byte>(rgba[3]),
23-
},
24-
};
25-
}
26-
};
6+
using Bmp1x1 = FixedBitmap<1, 1>;
277

288
struct DirLightSSBO {
299
alignas(16) glm::vec3 direction{front_v};
@@ -41,12 +21,13 @@ struct DirLightSSBO {
4121

4222
SceneRenderer::SceneRenderer(Gfx const& gfx)
4323
: m_gfx(gfx), m_sampler(gfx), m_view_proj(gfx, Buffer::Type::eUniform), m_dir_lights(gfx, Buffer::Type::eStorage),
44-
m_white(gfx, m_sampler.sampler(), Img1x1::make({0xff, 0xff, 0xff, 0xff}).view(), Texture::CreateInfo{.mip_mapped = false}),
45-
m_black(gfx, m_sampler.sampler(), Img1x1::make({0x0, 0x0, 0x0, 0xff}).view(), Texture::CreateInfo{.mip_mapped = false}) {}
24+
m_white(gfx, m_sampler.sampler(), Bmp1x1{0xff_B, 0xff_B, 0xff_B, 0xff_B}.view(), Texture::CreateInfo{.mip_mapped = false}),
25+
m_black(gfx, m_sampler.sampler(), Bmp1x1{0x0_B, 0x0_B, 0x0_B, 0xff_B}.view(), Texture::CreateInfo{.mip_mapped = false}) {}
4626

47-
void SceneRenderer::render(Scene const& scene, Renderer& renderer, vk::CommandBuffer cb) {
27+
void SceneRenderer::render(Scene const& scene, Ptr<Skybox const> skybox, Renderer& renderer, vk::CommandBuffer cb) {
4828
m_scene = &scene;
4929
write_view(renderer.framebuffer_extent());
30+
if (skybox) { render(renderer, cb, *skybox); }
5031
for (auto const& node : m_scene->roots()) { render(renderer, cb, node); }
5132
}
5233

lib/render/src/renderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ Pipeline Renderer::bind_pipeline(vk::CommandBuffer cb, Pipeline::State const& st
209209
glm::vec2 const extent = glm::uvec2{m_impl->render_target->extent.width, m_impl->render_target->extent.height};
210210
auto viewport = vk::Viewport{0.0f, extent.y, extent.x, -extent.y, 0.0f, 1.0f};
211211
auto scissor = vk::Rect2D{{}, m_impl->render_target->extent};
212-
cb.setViewport(0U, viewport);
213-
cb.setScissor(0U, scissor);
212+
cb.setViewport(0u, viewport);
213+
cb.setScissor(0u, scissor);
214214
return ret;
215215
}
216216

lib/scene/src/detail/gltf.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ struct Data {
346346
// TODO
347347
assert(json.contains("buffer") && json.contains("byteLength"));
348348
bv.buffer = json["buffer"].as<std::size_t>();
349-
bv.span = {.length = json["byteLength"].as<std::size_t>(), .offset = json["byteOffset"].as<std::size_t>(0U)};
349+
bv.span = {.length = json["byteLength"].as<std::size_t>(), .offset = json["byteOffset"].as<std::size_t>(0)};
350350
bv.target = static_cast<Target>(json["target"].as<int>());
351351
}
352352

@@ -359,7 +359,7 @@ struct Data {
359359
a.type = Accessor::get_type(json["type"].as_string());
360360

361361
if (auto const& bv = json["bufferView"]) { a.buffer_view = bv.as<std::size_t>(); }
362-
a.byte_offset = json["byteOffset"].as<std::size_t>(0U);
362+
a.byte_offset = json["byteOffset"].as<std::size_t>(0);
363363
a.normalized = json["normalized"].as_bool(dj::Boolean{false}).value;
364364
a.name = json["name"].as_string("(Unnamed)");
365365
for (auto const& min : json["min"].array_view()) { a.clamp.min.insert(min.as_double()); }

lib/util/include/facade/util/image.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include <string>
66

77
namespace facade {
8+
constexpr std::byte operator""_B(unsigned long long l) { return static_cast<std::byte>(l); }
9+
810
///
911
/// \brief Storage for uncompressed RGBA image data (as bytes)
1012
///
@@ -64,4 +66,12 @@ class Image {
6466
Unique<Storage, Storage::Deleter> m_storage{};
6567
glm::uvec2 m_extent{};
6668
};
69+
70+
template <std::uint32_t Width, std::uint32_t Height, std::uint32_t Channels = 4>
71+
struct FixedBitmap {
72+
std::byte bytes[Width * Height * Channels]{};
73+
74+
constexpr Image::View view() const { return {.bytes = bytes, .extent = {Width, Height}}; }
75+
constexpr operator Image::View() const { return view(); }
76+
};
6777
} // namespace facade

lib/vk/src/cmd.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ Cmd::~Cmd() {
3131
m_fence = m_gfx.device.createFenceUnique({});
3232
auto si = vk::SubmitInfo{};
3333
si.pWaitDstStageMask = &m_wait;
34-
si.commandBufferCount = 1U;
34+
si.commandBufferCount = 1u;
3535
si.pCommandBuffers = &cb;
3636
{
3737
auto lock = std::scoped_lock{m_gfx.shared->mutex};
38-
if (m_gfx.queue.submit(1U, &si, *m_fence) != vk::Result::eSuccess) { return; }
38+
if (m_gfx.queue.submit(1u, &si, *m_fence) != vk::Result::eSuccess) { return; }
3939
}
4040
m_gfx.wait(*m_fence);
4141
}

lib/vk/src/drawer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ void Drawer::draw(vk::CommandBuffer const cb, MeshView mesh, std::span<glm::mat4
1212
std::memcpy(instance_buffer.get().ptr, instances.data(), instances.size_bytes());
1313
vk::Buffer const buffers[] = {mesh.vertices.buffer, instance_buffer.get().buffer};
1414
vk::DeviceSize const offsets[] = {0, 0};
15-
cb.bindVertexBuffers(0U, buffers, offsets);
15+
cb.bindVertexBuffers(0u, buffers, offsets);
1616
auto const count = static_cast<std::uint32_t>(instances.size());
1717
if (mesh.index_count > 0) {
1818
cb.bindIndexBuffer(mesh.indices.buffer, mesh.indices.offset, vk::IndexType::eUint32);
19-
cb.drawIndexed(mesh.index_count, count, 0U, 0U, 0U);
19+
cb.drawIndexed(mesh.index_count, count, 0u, 0u, 0u);
2020
} else {
21-
cb.draw(mesh.vertex_count, count, 0U, 0U);
21+
cb.draw(mesh.vertex_count, count, 0u, 0u);
2222
}
2323
}
2424

lib/vk/src/pipes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ std::vector<SetLayout> make_set_layouts(SpirV::View vert, SpirV::View frag) {
3232
dslb.stageFlags |= stage;
3333
auto const& type = compiler.get_type(resource.type_id);
3434
if (type.array.size() == 0) {
35-
dslb.descriptorCount = std::max(dslb.descriptorCount, 1U);
35+
dslb.descriptorCount = std::max(dslb.descriptorCount, 1u);
3636
} else {
3737
dslb.descriptorCount = type.array[0];
3838
}
@@ -163,7 +163,7 @@ vk::UniquePipeline create_pipeline(vk::Device dv, PipeInfo const& info) {
163163
gpci.pMultisampleState = &pmssci;
164164

165165
auto ret = vk::Pipeline{};
166-
if (dv.createGraphicsPipelines({}, 1U, &gpci, {}, &ret) != vk::Result::eSuccess) { throw Error{"Failed to create graphics pipeline"}; }
166+
if (dv.createGraphicsPipelines({}, 1u, &gpci, {}, &ret) != vk::Result::eSuccess) { throw Error{"Failed to create graphics pipeline"}; }
167167

168168
return vk::UniquePipeline{ret, dv};
169169
}

lib/vk/src/render_pass.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ vk::UniqueRenderPass create_render_pass(vk::Device device, vk::SampleCountFlagBi
5353
auto rpci = vk::RenderPassCreateInfo{};
5454
rpci.attachmentCount = static_cast<std::uint32_t>(attachments.size());
5555
rpci.pAttachments = attachments.data();
56-
rpci.subpassCount = 1U;
56+
rpci.subpassCount = 1u;
5757
rpci.pSubpasses = &subpass;
5858
auto sd = vk::SubpassDependency{};
5959
sd.srcSubpass = VK_SUBPASS_EXTERNAL;
6060
sd.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
6161
sd.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentWrite;
6262
sd.srcStageMask = sd.dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests;
63-
rpci.dependencyCount = 1U;
63+
rpci.dependencyCount = 1u;
6464
rpci.pDependencies = &sd;
6565
return device.createRenderPassUnique(rpci);
6666
}
@@ -113,12 +113,12 @@ void RenderPass::bind(vk::CommandBuffer cb, vk::Pipeline pipeline) {
113113
glm::vec2 const extent = glm::uvec2{m_extent.width, m_extent.height};
114114
auto viewport = vk::Viewport{0.0f, extent.y, extent.x, -extent.y, 0.0f, 1.0f};
115115
auto scissor = vk::Rect2D{{}, m_extent};
116-
cb.setViewport(0U, viewport);
117-
cb.setScissor(0U, scissor);
116+
cb.setViewport(0u, viewport);
117+
cb.setScissor(0u, scissor);
118118
}
119119

120120
void RenderPass::execute(Framebuffer const& frame, vk::ClearColorValue const& clear) {
121-
vk::ClearValue const clear_values[] = {clear, vk::ClearDepthStencilValue{1.0f, 0U}};
121+
vk::ClearValue const clear_values[] = {clear, vk::ClearDepthStencilValue{1.0f, 0u}};
122122
auto rpbi = vk::RenderPassBeginInfo{*m_render_pass, frame.framebuffer, vk::Rect2D{{}, m_extent}, clear_values};
123123
frame.primary.beginRenderPass(rpbi, vk::SubpassContents::eSecondaryCommandBuffers);
124124
frame.primary.executeCommands(static_cast<std::uint32_t>(frame.secondary.size()), frame.secondary.data());

lib/vk/src/swapchain.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ vk::SurfaceFormatKHR surface_format(SurfaceFormats const& formats, ColourSpace c
2626
}
2727

2828
constexpr std::uint32_t image_count(vk::SurfaceCapabilitiesKHR const& caps) noexcept {
29-
if (caps.maxImageCount < caps.minImageCount) { return std::max(3U, caps.minImageCount); }
30-
return std::clamp(3U, caps.minImageCount, caps.maxImageCount);
29+
if (caps.maxImageCount < caps.minImageCount) { return std::max(3u, caps.minImageCount); }
30+
return std::clamp(3u, caps.minImageCount, caps.maxImageCount);
3131
}
3232

3333
constexpr vk::Extent2D image_extent(vk::SurfaceCapabilitiesKHR const& caps, vk::Extent2D const fb) noexcept {
@@ -44,10 +44,10 @@ vk::SwapchainCreateInfoKHR make_swci(Gfx const& gfx, vk::SurfaceKHR surface, Sur
4444
ret.surface = surface;
4545
ret.presentMode = mode;
4646
ret.imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst;
47-
ret.queueFamilyIndexCount = 1U;
47+
ret.queueFamilyIndexCount = 1u;
4848
ret.pQueueFamilyIndices = &gfx.queue_family;
4949
ret.imageColorSpace = format.colorSpace;
50-
ret.imageArrayLayers = 1U;
50+
ret.imageArrayLayers = 1u;
5151
ret.imageFormat = format.format;
5252
return ret;
5353
}
@@ -109,9 +109,9 @@ vk::Result Swapchain::acquire(Lock const&, glm::uvec2 extent, ImageView& out, vk
109109
vk::Result Swapchain::present(Lock const&, glm::uvec2 extent, vk::Semaphore wait) {
110110
if (!m_storage.acquired || is_zero(extent)) { return vk::Result::eNotReady; }
111111
auto pi = vk::PresentInfoKHR{};
112-
pi.swapchainCount = 1U;
112+
pi.swapchainCount = 1u;
113113
pi.pSwapchains = &*m_storage.swapchain;
114-
pi.waitSemaphoreCount = 1U;
114+
pi.waitSemaphoreCount = 1u;
115115
pi.pWaitSemaphores = &wait;
116116
pi.pImageIndices = &*m_storage.acquired;
117117
auto const ret = m_gfx.queue.presentKHR(&pi);

lib/vk/src/texture.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ struct MipMapWriter {
6666

6767
auto src_extent = vk::Extent3D{extent, 1};
6868
for (std::uint32_t mip = 0; mip + 1 < mip_levels; ++mip) {
69-
vk::Extent3D dst_extent = vk::Extent3D(std::max(src_extent.width / 2, 1U), std::max(src_extent.height / 2, 1U), 1U);
69+
vk::Extent3D dst_extent = vk::Extent3D(std::max(src_extent.width / 2, 1u), std::max(src_extent.height / 2, 1u), 1u);
7070
auto const src_offset = vk::Offset3D{static_cast<int>(src_extent.width), static_cast<int>(src_extent.height), 1};
7171
auto const dst_offset = vk::Offset3D{static_cast<int>(dst_extent.width), static_cast<int>(dst_extent.height), 1};
7272
blit_next_mip(mip, src_offset, dst_offset);
@@ -137,16 +137,15 @@ Sampler::Sampler(Gfx const& gfx, CreateInfo info) {
137137
m_name = std::move(info.name);
138138
}
139139

140-
std::uint32_t Texture::mip_levels(vk::Extent2D extent) { return static_cast<std::uint32_t>(std::floor(std::log2(std::max(extent.width, extent.height)))) + 1U; }
140+
std::uint32_t Texture::mip_levels(vk::Extent2D extent) { return static_cast<std::uint32_t>(std::floor(std::log2(std::max(extent.width, extent.height)))) + 1u; }
141141

142142
Texture::Texture(Gfx const& gfx, vk::Sampler sampler, Image::View image, CreateInfo info) : Texture(gfx, sampler, std::move(info.name)) {
143-
static constexpr std::uint8_t magenta_v[] = {0xff, 0x0, 0xff, 0xff};
143+
static constexpr auto magenta_v = FixedBitmap<1, 1>{0xff_B, 0x0_B, 0xff_B, 0xff_B};
144144
m_info.format = info.colour_space == ColourSpace::eLinear ? vk::Format::eR8G8B8A8Unorm : vk::Format::eR8G8B8A8Srgb;
145145
bool mip_mapped = info.mip_mapped;
146146
if (image.extent.x == 0 || image.extent.y == 0) {
147147
logger::warn("[Texture] invalid image extent: [0x0]");
148-
image.extent = {1, 1};
149-
image.bytes = {reinterpret_cast<std::byte const*>(magenta_v), std::size(magenta_v)};
148+
image = magenta_v;
150149
mip_mapped = false;
151150
}
152151
if (mip_mapped && can_mip(m_gfx.gpu, m_info.format)) { m_info.mip_levels = mip_levels({image.extent.x, image.extent.y}); }

src/gui/main_menu.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
#include <facade/util/fixed_string.hpp>
1111
#include <facade/util/logger.hpp>
1212
#include <gui/main_menu.hpp>
13+
#include <filesystem>
1314

1415
namespace facade {
16+
namespace fs = std::filesystem;
17+
1518
void WindowMenu::display_menu(editor::NotClosed<editor::MainMenu> main) {
1619
auto menu = editor::Menu{main, "Window"};
1720
if (!menu) { return; }
@@ -150,6 +153,7 @@ void WindowMenu::operator()(std::span<logger::Entry const> entries) {
150153
void FileMenu::add_recent(std::string path) {
151154
if (auto it = std::find(m_recents.begin(), m_recents.end(), path); it != m_recents.end()) { m_recents.erase(it); }
152155
m_recents.push_back(std::move(path));
156+
std::erase_if(m_recents, [](std::string const& path) { return !fs::is_regular_file(path); });
153157
max_recents = std::max(max_recents, std::uint8_t{1});
154158
auto const trim = static_cast<std::ptrdiff_t>(m_recents.size()) - static_cast<std::ptrdiff_t>(max_recents);
155159
if (trim > 0) {

0 commit comments

Comments
 (0)