working textures

This commit is contained in:
kbz_8
2023-04-01 15:48:28 +02:00
parent e9c3fb8046
commit 3a93881392
17 changed files with 387 additions and 138 deletions

View File

@@ -6,12 +6,17 @@
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/31 18:03:35 by maldavid #+# #+# */
/* Updated: 2023/03/31 18:06:26 by maldavid ### ########.fr */
/* Updated: 2023/04/01 15:39:59 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
#include <core/errors.h>
#include <renderer/images/texture.h>
#include <renderer/buffers/vk_buffer.h>
#include <renderer/renderer.h>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
namespace mlx
{
@@ -26,10 +31,67 @@ namespace mlx
Image::createImageView(VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT);
Image::createSampler();
Buffer staging_buffer;
std::size_t size = width * height * (format == VK_FORMAT_R32G32B32A32_SFLOAT ? 16 : 4);
staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, pixels);
Image::copyBuffer(staging_buffer);
staging_buffer.destroy();
std::vector<Vertex> vertexData = {
{{0, 0}, {1.f, 1.f, 1.f, 1.f}, {0.0f, 0.0f}},
{{width, 0}, {1.f, 1.f, 1.f, 1.f}, {1.0f, 0.0f}},
{{width, height}, {1.f, 1.f, 1.f, 1.f}, {1.0f, 1.0f}},
{{0, height}, {1.f, 1.f, 1.f, 1.f}, {0.0f, 1.0f}}
};
std::vector<uint16_t> indexData = { 0, 1, 2, 2, 3, 0 };
_vbo.create(sizeof(Vertex) * vertexData.size(), vertexData.data());
_ibo.create(sizeof(uint16_t) * indexData.size(), indexData.data());
if(pixels != nullptr)
{
Buffer staging_buffer;
std::size_t size = width * height * (format == VK_FORMAT_R32G32B32A32_SFLOAT ? 16 : 4);
staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, pixels);
Image::copyBuffer(staging_buffer);
staging_buffer.destroy();
}
}
void Texture::render(Renderer& renderer, int x, int y)
{
_vbo.bind(renderer);
_ibo.bind(renderer);
auto cmd = renderer.getActiveCmdBuffer().get();
glm::vec2 translate(x, y);
vkCmdPushConstants(cmd, renderer.getPipeline().getPipelineLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(translate), &translate);
vkCmdDrawIndexed(cmd, static_cast<uint32_t>(_ibo.getSize() / sizeof(uint16_t)), 1, 0, 0, 0);
}
void Texture::destroy() noexcept
{
Image::destroy();
_vbo.destroy();
_ibo.destroy();
}
Texture stb_texture_load(std::filesystem::path file, int* w, int* h)
{
Texture texture;
int channels;
VkFormat format;
uint8_t* data = nullptr;
std::string filename = file.string();
if(!std::filesystem::exists(std::move(file)))
core::error::report(e_kind::fatal_error, "Image : file not found '%s'", filename.c_str());
if(stbi_is_hdr(filename.c_str()))
{
data = (uint8_t*)stbi_loadf(filename.c_str(), w, h, &channels, 4);
format = VK_FORMAT_R32G32B32A32_SFLOAT;
}
else
{
data = stbi_load(filename.c_str(), w, h, &channels, 4);
format = VK_FORMAT_R8G8B8A8_UNORM;
}
texture.create(data, *w, *h, format);
stbi_image_free(data);
return texture;
}
}

View File

@@ -6,14 +6,18 @@
/* By: maldavid <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/08 02:24:58 by maldavid #+# #+# */
/* Updated: 2023/03/31 18:06:09 by maldavid ### ########.fr */
/* Updated: 2023/04/01 15:31:26 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef __MLX_TEXTURE__
#define __MLX_TEXTURE__
#include <filesystem>
#include <renderer/images/vk_image.h>
#include <renderer/descriptors/vk_descriptor_set.h>
#include <renderer/buffers/vk_ibo.h>
#include <renderer/buffers/vk_vbo.h>
namespace mlx
{
@@ -21,9 +25,24 @@ namespace mlx
{
public:
Texture() = default;
void create(uint8_t* pixels, uint32_t width, uint32_t height, VkFormat format);
void render(class Renderer& renderer, int x, int y);
void destroy() noexcept override;
inline void setDescriptor(DescriptorSet set) noexcept { _set = std::move(set); }
inline VkDescriptorSet getSet() noexcept { return _set.isInit() ? _set.get() : VK_NULL_HANDLE; }
inline void updateSet(int binding) noexcept { _set.writeDescriptor(binding, getImageView(), getSampler());}
~Texture() = default;
private:
C_VBO _vbo;
C_IBO _ibo;
DescriptorSet _set;
};
Texture stb_texture_load(std::filesystem::path file, int* w, int* h);
}
#endif

View File

@@ -6,7 +6,7 @@
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/25 11:54:21 by maldavid #+# #+# */
/* Updated: 2023/03/31 18:04:35 by maldavid ### ########.fr */
/* Updated: 2023/04/01 15:22:43 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
@@ -15,7 +15,7 @@
#include <volk.h>
#include <cstddef>
#include <renderer/descriptors/vk_descriptor_set.h>
#include <vector>
namespace mlx
{
@@ -30,7 +30,7 @@ namespace mlx
void createImageView(VkImageViewType type, VkImageAspectFlags aspectFlags) noexcept;
void createSampler() noexcept;
void copyBuffer(class Buffer& buffer);
void destroy() noexcept;
virtual void destroy() noexcept;
inline VkImage get() noexcept { return _image; }
inline VkImage operator()() noexcept { return _image; }
@@ -42,7 +42,6 @@ namespace mlx
virtual ~Image() = default;
private:
DescriptorSet _desc;
VkImage _image = VK_NULL_HANDLE;
VkDeviceMemory _memory = VK_NULL_HANDLE;
VkImageView _image_view = VK_NULL_HANDLE;