Add my own math library

GLM works only for C++ and I plan on moving to back to C. There is
a C port, but it would be good for me to figure out vertex math myself.
Hence, my own library has been created.
This commit is contained in:
Piotr Krygier committed 2023-08-10 09:43:26 +02:00
1 parent c22569cc48
commit bf31b96a2e
26 files changed
+554 -187

No files matched your search

+9 -11
View File
@@ -1,7 +1,6 @@
find_package(Vulkan REQUIRED)
find_package(vma REQUIRED)
find_package(glfw3 REQUIRED)
find_package(glm REQUIRED)
find_package(Vulkan COMPONENTS glslc)
find_program(glslc_executable NAMES glslc HINTS ${Vulkan_GLSLC_EXECUTABLE}/..)
@@ -43,24 +42,23 @@ ${CMAKE_SOURCE_DIR}
${Vulkan_INCLUDE_DIR}
${vma_INCLUDE_DIR}
${glfw3_INCLUDE_DIR}
${glm_INCLUDE_DIR}
)
message("Vulkan_INCLUDE_DIR: ${Vulkan_INCLUDE_DIR}")
target_sources(rse_graphics PRIVATE
src/window.cpp
src/vulkan_base.cpp
src/vulkan_pipeline.cpp
src/vulkan_buffers.cpp
src/vulkan_descriptors.cpp
src/rse_graphics.cpp
src/mesh_controller.cpp
src/vulkan_commons.cpp
src/window.cpp
src/vulkan_base.cpp
src/vulkan_pipeline.cpp
src/vulkan_buffers.cpp
src/vulkan_descriptors.cpp
src/rse_graphics.cpp
src/rse_math.c
src/mesh_controller.cpp
src/vulkan_commons.cpp
)
target_link_libraries(rse_graphics PRIVATE
rse_utilities
${Vulkan_LIBRARIES}
${glfw}
${glm}
)
+3 -4
View File
@@ -2,11 +2,10 @@
#define RSE_GRAPHICS_HPP
#include <cstdint>
struct VulkanState;
namespace rse::graphics
{
namespace vulkanbase {
struct VulkanState;
};
class RseGraphics {
public:
RseGraphics();
@@ -24,7 +23,7 @@ class RseGraphics {
private:
/* Hold vulkan state. It is modified by function initializing and communicating with Vulkan API */
vulkanbase::VulkanState* vulkan_state;
VulkanState* vulkan_state;
};
@@ -9,15 +9,10 @@
*
*/
#pragma once
#ifndef LOCALE_VULKAN_H
#define LOCALE_VULKAN_H
#include <array>
#include <vector>
#include "utilities/localization.hpp"
namespace rse::locale::vulkan
{
#include "utilities/localization.h"
#define vulkanErrorMesssages vulkanErrorMesssages_nolocale[SELECTED_LANGUAGE]
@@ -53,7 +48,7 @@ enum Errors
LAST_MESSAGE
};
inline std::array<std::array<const char*, LAST_MESSAGE>, rse::utils::locale::LAST_LANGUAGE> vulkanErrorMesssages_nolocale = {
const char vulkanErrorMesssages_nolocale[LAST_LANGUAGE][LAST_MESSAGE][MAX_MESSAGE_LENGHT] = {
{/* EN_US */
/* VULKAN_LAYER_NOT_SUPPORTED */
"Selected layer is not supported: ",
@@ -112,4 +107,4 @@ inline std::array<std::array<const char*, LAST_MESSAGE>, rse::utils::locale::LAS
}
};
} // namespace rse::locale::vulkan
#endif /* LOCALE_VULKAN_H */
@@ -13,11 +13,7 @@
#include <array>
#include "utilities/localization.hpp"
namespace rse::locale::window
{
#include "utilities/localization.h"
#define windowErrorMesssages windowErrorMesssages_nolocale[SELECTED_LANGUAGE]
@@ -29,15 +25,13 @@ enum Errors
LAST_MESSAGE
};
std::array<std::array<const char*, rse::utils::locale::LAST_LANGUAGE>, LAST_MESSAGE> windowErrorMesssages_nolocale = {
const char windowErrorMesssages_nolocale[LAST_LANGUAGE][LAST_MESSAGE][MAX_MESSAGE_LENGHT] = {
{/* EN_US */
/* WINDOW_GLFW_INIT_FAILED */
"GLFW init failed!"
"GLFW init failed!",
/* WINDOW_VULKAN_NOT_SUPPORTED */
"Unable to load Vulkan"
"Unable to load Vulkan",
/*WINDOW_NOT_CREATED*/
"Window context creation failed"
}
};
} // namespace rse::locale::window
};
+6 -12
View File
@@ -1,20 +1,16 @@
#include "mesh_controller.hpp"
#include <map>
#include <queue>
#include <memory>
#include "mesh_controller.h"
#include "vulkan_buffers.hpp"
namespace rse::graphics::mesh
{
#include <map>
#include <queue>
std::map<uint16_t, struct Mesh> g_meshes;
std::queue<uint16_t> free_ids;
std::map<uint16_t, std::queue<uint16_t>> instance_free_ids;
uint16_t create_mesh(std::vector<rse::graphics::vulkanbase::Vertex> vertices,
uint16_t create_mesh(std::vector<Vertex> vertices,
std::vector<uint16_t> indices)
{
static uint16_t last_id = 0U;
@@ -72,12 +68,10 @@ std::vector<InstanceData> get_instance_data_for_mesh(uint16_t mesh_id) {
}
std::vector<rse::graphics::vulkanbase::Vertex> get_mesh_vertices(uint16_t mesh_id) {
std::vector<Vertex> get_mesh_vertices(uint16_t mesh_id) {
return g_meshes[mesh_id].vertices;
}
std::vector<uint16_t> get_mesh_indices(uint16_t mesh_id) {
return g_meshes[mesh_id].indices;
}
} // namespace rse::graphics::mesh
}
@@ -1,5 +1,5 @@
/**
* @file mesh_controller.hpp
* @file mesh_controller.h
* @author Piotr Krygier (piotr.krygier@meshsystems.com)
* @brief
* @version 0.1
@@ -9,19 +9,15 @@
*
*/
#ifndef RSE_MESH_CONTROLLER_HPP
#define RSE_MESH_CONTROLLER_HPP
#ifndef RSE_MESH_CONTROLLER_H
#define RSE_MESH_CONTROLLER_H
#include "vulkan_commons.h"
#include <map>
#include <vector>
#include <cstdint>
#include <memory>
#include <vector>
#include <map>
#include "vulkan_commons.hpp"
namespace rse::graphics::mesh
{
/* Forward declarations */
struct MeshInstance;
@@ -34,7 +30,7 @@ struct MeshInstance
struct Mesh
{
uint32_t unique_id;
const std::vector<rse::graphics::vulkanbase::Vertex> vertices;
const std::vector<Vertex> vertices;
std::vector<uint16_t> indices;
std::map<uint16_t, std::unique_ptr<MeshInstance>> instances;
};
@@ -47,7 +43,7 @@ struct Mesh
* @param indices indices for mesh
* @return uint16_t Mesh identifier. Can be useful for getting vertices, indices and instances
*/
uint16_t create_mesh(std::vector<rse::graphics::vulkanbase::Vertex> vertices,
uint16_t create_mesh(std::vector<Vertex> vertices,
std::vector<uint16_t> indices);
/**
@@ -59,13 +55,9 @@ uint16_t create_mesh(std::vector<rse::graphics::vulkanbase::Vertex> vertices,
void create_mesh_instance(uint16_t mesh_id,
InstanceData instance_data);
std::vector<rse::graphics::vulkanbase::Vertex> get_mesh_vertices(uint16_t mesh_id);
std::vector<Vertex> get_mesh_vertices(uint16_t mesh_id);
std::vector<uint16_t> get_mesh_indices(uint16_t mesh_id);
std::vector<InstanceData> get_instance_data_for_mesh(uint16_t mesh_id);
} // namespace rse::graphics::mesh
#endif
#endif /* RSE_MESH_CONTROLLER_H */
+18 -16
View File
@@ -2,14 +2,16 @@
#include "window.hpp"
#include "vulkan_base.hpp"
#include "mesh_controller.hpp"
#include "vulkan_commons.hpp"
#include "mesh_controller.h"
#include "vulkan_commons.h"
#include "rse_math.h"
namespace rse::graphics
{
RseGraphics::RseGraphics()
{
vulkan_state = new vulkanbase::VulkanState;
vulkan_state = new VulkanState;
vulkan_state->graphicsQueue = VK_NULL_HANDLE;
vulkan_state->physicalDevice = VK_NULL_HANDLE;
vulkan_state->currentFrame = 0U;
@@ -44,11 +46,11 @@ uint8_t RseGraphics::graphics_run(void)
return -1;
// FIXME: Temporary array of vertices, for testing purposes
const std::vector<rse::graphics::vulkanbase::Vertex> vertices = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}},
const std::vector<Vertex> vertices = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}},
{{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 1.0f}},
{{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}}};
const std::vector<rse::graphics::vulkanbase::Vertex> vertices2 = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}},
const std::vector<Vertex> vertices2 = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}},
{{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}},
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}},
@@ -57,23 +59,23 @@ uint8_t RseGraphics::graphics_run(void)
// FIXME: Temporary array of vertices, for testing purposes
std::vector<uint16_t> indices = {0, 1, 2, 2, 3, 0};
uint16_t mesh_id = rse::graphics::mesh::create_mesh(vertices, indices);
rse::graphics::mesh::create_mesh_instance(mesh_id, rse::graphics::mesh::InstanceData(
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, glm::radians(45.0f)),
uint16_t mesh_id = create_mesh(vertices, indices);
create_mesh_instance(mesh_id, InstanceData(
{0.0f, 0.0f, 0.0f},
{0.0f, 0.0f, rse_math_deg_to_radians(45.0f)},
1.0f
));
rse::graphics::mesh::create_mesh_instance(mesh_id, rse::graphics::mesh::InstanceData(
glm::vec3(-1.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
create_mesh_instance(mesh_id, InstanceData(
{-1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 0.0f},
1.0f
));
mesh_id = rse::graphics::mesh::create_mesh(vertices, indices);
rse::graphics::mesh::create_mesh_instance(mesh_id, rse::graphics::mesh::InstanceData(
glm::vec3(0.0f, 1.0f, 0.0f),
glm::vec3(0.0f, 0.0f, glm::radians(0.0f)),
mesh_id = create_mesh(vertices, indices);
create_mesh_instance(mesh_id, InstanceData(
{0.0f, 1.0f, 0.0f},
{0.0f, 0.0f, rse_math_deg_to_radians(0.0f)},
1.0f
));
+126
View File
@@ -0,0 +1,126 @@
#include "rse_math.h"
#include <math.h>
#define PI 3.14159265359f
static struct vec3_t substract_vec3(const struct vec3_t* vec1, const struct vec3_t* vec2)
{
struct vec3_t result;
result.x = vec1->x - vec2->x;
result.y = vec1->y - vec2->y;
result.z = vec1->z - vec2->z;
return result;
}
static float length_vec3(const struct vec3_t* vec)
{
return sqrt((vec->x * vec->x)
+(vec->y * vec->y)
+(vec->z * vec->z));
}
static float scalar_cross_vec3(const struct vec3_t* vec1, const struct vec3_t* vec2)
{
return (vec1->x * vec2->x)
+(vec1->y * vec2->y)
+(vec1->z * vec2->z);
}
float rse_math_deg_to_radians(float degrees)
{
return degrees * (PI/180.0f);
}
struct vec3_t rse_math_cross_vec3(const struct vec3_t* vec1, const struct vec3_t* vec2)
{
struct vec3_t result;
result.x = (vec1->y * vec2->z) - (vec1->z * vec2->y);
result.y = (vec1->z * vec2->x) - (vec1->x * vec2->z);
result.z = (vec1->x * vec2->y) - (vec1->y * vec2->x);
return result;
}
struct vec3_t rse_math_normalize_vec3(const struct vec3_t* vec)
{
struct vec3_t result = {0};
float vec_length = 0.0f;
vec_length = length_vec3(vec);
result.x = vec->x / vec_length;
result.y = vec->y / vec_length;
result.z = vec->z / vec_length;
return result;
}
struct mat4_t rse_math_uniform_mat4()
{
struct mat4_t result= {0.0f};
result.x_1 = 1.0f;
result.y_2 = 1.0f;
result.z_3 = 1.0f;
result.w_4 = 1.0f;
return result;
}
struct mat4_t rse_math_perspective(float fovy, float aspect_ratio, float z_near, float z_far)
{
float tan_half_fovy = 0;
struct mat4_t result = {0};
tan_half_fovy = tan(fovy / 2.0f);
result.x_1 = -1.0f / (aspect_ratio * tan_half_fovy);
result.y_2 = 1.0f / (tan_half_fovy);
result.z_3 = - (z_far + z_near) / (z_far - z_near);
result.w_3 = -1.0f;
result.z_4 = - (2.0f * z_far * z_near) / (z_far - z_near);
return result;
}
struct mat4_t rse_math_look_at(const struct vec3_t* eye, const struct vec3_t* center, const struct vec3_t* up)
{
struct mat4_t result = {0.0f};
struct vec3_t forward_vec = {0};
struct vec3_t right_vec = {0};
struct vec3_t up_vec = {0};
struct vec3_t tmp = substract_vec3(eye, center);
forward_vec = rse_math_normalize_vec3(&tmp);
tmp = rse_math_cross_vec3(up, &forward_vec);
right_vec = rse_math_normalize_vec3(&tmp);
up_vec = rse_math_cross_vec3(&forward_vec, &right_vec);
result.x_1 = right_vec.x;
result.x_2 = right_vec.y;
result.x_3 = right_vec.z;
result.y_1 = up_vec.x;
result.y_2 = up_vec.y;
result.y_3 = up_vec.z;
result.z_1 = forward_vec.x;
result.z_2 = forward_vec.y;
result.z_3 = forward_vec.z;
result.x_4 = -scalar_cross_vec3(&right_vec, eye);
result.y_4 = -scalar_cross_vec3(&up_vec, eye);
result.z_4 = -scalar_cross_vec3(&forward_vec, eye);
result.w_1 = 0;
result.w_2 = 0;
result.w_3 = 0;
result.w_4 = 1;
return result;
}
+120
View File
@@ -0,0 +1,120 @@
/**
* @file rse_math.h
* @author Piotr Krygier (piotr.krygier@)
* @brief RedScarfEngine math operations
* @version 0.1
* @date 2023-08-07
*
* @copyright Copyright (c) 2023
*
*/
#ifndef RSE_MATH_H
#define RSE_MATH_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Simple representation of vector
*
*/
struct vec3_t {
float x;
float y;
float z;
};
/* 4x4 matrix.
* [x_1 | x_2 | x_3 | x_4]
* [y_1 | y_2 | y_3 | y_4]
* [z_1 | x_2 | z_3 | z_4]
* [z_1 | w_2 | w_3 | w_4]
*
* Vulkan and OpenGL expects matrix to be passed by columns, this is why members are created in this order.
* */
struct mat4_t {
/* First column */
float x_1;
float y_1;
float z_1;
float w_1;
/* Second column */
float x_2;
float y_2;
float z_2;
float w_2;
/* Third column */
float x_3;
float y_3;
float z_3;
float w_3;
/* Fourth column */
float x_4;
float y_4;
float z_4;
float w_4;
};
/**
* @brief Calculate radians from provided degree
*
* @param degrees degrees
* @return float radians
*/
float rse_math_deg_to_radians(float degrees);
/**
* @brief Create an uniform matrix, the one with ones on diagonal
*
* @return struct mat4_t Diagonal matrix
*/
struct mat4_t rse_math_uniform_mat4();
/**
* @brief Normalizes provided vector. Changes the values inside the vector to range 0.0...1.0
*
* @param vec Vector to normalize
* @return struct vec3_t Normalized vector
*/
struct vec3_t rse_math_normalize_vec3(const struct vec3_t* vec);
/**
* @brief Creates vector cross product, a vector, using right hand rule. Note, that order of vectors is important
*
* @param vec1 Input vector
* @param vec2 Input vector
* @return struct vec3_t Resulting cross product vector
*/
struct vec3_t rse_math_cross_vec3(const struct vec3_t* vec1, const struct vec3_t* vec2);
/**
* @brief Calculates transformation matrix for viewing object from and eye cooridinates
*
* @param eye Location of the camera or the eye
* @param center Where are we looking at
* @param up Where "up" is located. Usually (0, 1, 0), since Y is up in most cases
* @return struct mat4_t Resulting lootAtMatrix
*/
struct mat4_t rse_math_look_at(const struct vec3_t* eye, const struct vec3_t* center, const struct vec3_t* up);
/**
* @brief Creates perspective matrix, used in projection
*
* @param fovy_rad Field of view, in radians
* @param aspect_ratio Aspect ratio (usally screen width / height)
* @param z_near How near objects we can see
* @param z_far How far objects we can see
* @return struct mat4_t Resulting perspective matrix
*/
struct mat4_t rse_math_perspective(float fovy_rad, float aspect_ratio, float z_near, float z_far);
#ifdef __cplusplus
}
#endif
#endif /* RSE_MATH_H */
+7 -5
View File
@@ -11,7 +11,7 @@
#include "vulkan_base.hpp"
#include "vulkan_errors.hpp"
#include "vulkan_errors.h"
#include <GLFW/glfw3.h>
#pragma GCC diagnostic push
@@ -27,11 +27,11 @@
#include "vk_mem_alloc.h"
#pragma GCC diagnostic pop
#include "locale_vulkan.hpp"
#include "locale_vulkan.h"
#include "utilities/logger.hpp"
#include "window.hpp"
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
#include "vulkan_buffers.hpp"
#include "vulkan_descriptors.hpp"
#include "vulkan_pipeline.hpp"
@@ -39,8 +39,6 @@
namespace rse::graphics::vulkanbase
{
using namespace locale::vulkan;
#define APPLICATION_NAME "RedScarfEngine PoC"
#define ENGINE_NAME "RedScarf Engine"
@@ -394,17 +392,21 @@ uint8_t createDevice()
{
size_t numberOfQueues = 0;
for (size_t familyIdx = 0; familyIdx < queueFamiliesPropertyCount; ++familyIdx) {
LOGI << "Checking queue: " << familyIdx;
if (pQueueFamilyProperties[familyIdx].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
if (pQueueFamilyProperties[familyIdx].queueCount > numberOfQueues) {
graphicsFamilyIdx = familyIdx;
LOGI << "Setting graphics family idx to " << familyIdx;
numberOfQueues = pQueueFamilyProperties[familyIdx].queueCount;
}
}
/* Check for family with surface support */
VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR(g_vulkan_state.physicalDevice, familyIdx, g_vulkan_state.surface, &presentSupport);
if (presentSupport) {
presentationFamiliyIdx = familyIdx;
LOGI << "Setting present family idx to " << familyIdx;
}
if (graphicsFamilyIdx > 0 && presentationFamiliyIdx > 0) {
+1 -1
View File
@@ -17,7 +17,7 @@
#include <vulkan/vulkan.hpp>
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
namespace rse::graphics::vulkanbase
{
+29 -20
View File
@@ -3,21 +3,17 @@
#include <cstdint>
#define GLM_FORCE_RADIANS
#include <glm/gtc/matrix_transform.hpp>
#include "vulkan_errors.hpp"
#include "locale_vulkan.hpp"
#include "vulkan_errors.h"
#include "locale_vulkan.h"
#include "utilities/logger.hpp"
#include "mesh_controller.hpp"
#include "mesh_controller.h"
#include "rse_math.h"
namespace rse::graphics::vulkanbase
{
#define MAX_VERTEX_BUFFER_SIZE 33554432 /* 32 MB*/
using namespace locale::vulkan;
// // FIXME: Temporary array of vertices, for testing purposes
// const std::vector<Vertex> vertices = {{{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 1.0f}},
// {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 1.0f}},
@@ -320,19 +316,32 @@ uint8_t allocateCommandBuffers()
*/
void updateUniformBuffer()
{
struct vec3_t eye = {0};
struct vec3_t center = {0};
struct vec3_t up = {0};
float fovy;
float z_near;
float z_far;
UniformBufferObject ubo{};
// ubo.model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 0.0f, 0.0f)) * glm::rotate(glm::mat4(1.0f), glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f)) * glm::scale(glm::mat4(1.0f), glm::vec3(2, 1, 1));
ubo.model = glm::mat4(1.0f);
ubo.view = glm::lookAt(glm::vec3(0.0f, 0.0f, 5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
ubo.proj = glm::perspective(glm::radians(45.0f),
g_vulkan_state.swapchainExtent.width / (float)g_vulkan_state.swapchainExtent.height,
0.1f,
20.0f);
ubo.proj[1][1] *= -1; /* GLM was developed for OpenGL, where Y coordinate of the clip is inverted */
eye.z = 5.0f;
up.y = 1.0f;
fovy = rse_math_deg_to_radians(45.0f);
z_near = 0.1f;
z_far = 20.0f;
ubo.model = rse_math_uniform_mat4();
ubo.view = rse_math_look_at(&eye, &center, &up);
ubo.proj = rse_math_perspective(fovy,
g_vulkan_state.swapchainExtent.width / (float)g_vulkan_state.swapchainExtent.height,
z_near,
z_far);
memcpy(g_vulkan_state.uniformBuffers[g_vulkan_state.currentFrame].allocationInfo.pMappedData, &ubo, sizeof(ubo));
}
uint8_t update_mesh_buffers(const std::vector<rse::graphics::vulkanbase::Vertex>& vertices,
uint8_t update_mesh_buffers(const std::vector<Vertex>& vertices,
const std::vector<uint16_t>& indices)
{
// void* mapped_data;
@@ -375,7 +384,7 @@ uint8_t update_mesh_buffers(const std::vector<rse::graphics::vulkanbase::Vertex>
return VULKAN_ERROR_NO_ERROR;
}
uint8_t update_mesh_instances(rse::graphics::mesh::InstanceData& instance_data)
uint8_t update_mesh_instances(InstanceData& instance_data)
{
Buffer staging_buffer;
@@ -460,8 +469,8 @@ uint8_t recordCommandBuffer(uint32_t imageIndex)
VkBuffer vertexBuffers[] = {gVertexBuffers[i].buffer};
VkBuffer indexBuffer = {gIndexBuffers[i].buffer};
VkBuffer instanceBuffers[] = {gInstanceBuffers[i].buffer};
auto indices = rse::graphics::mesh::get_mesh_indices(0);
auto instances = rse::graphics::mesh::get_instance_data_for_mesh(0);
auto indices = get_mesh_indices(0);
auto instances = get_instance_data_for_mesh(0);
/* TODO: Figure out the offset */
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);
+3 -3
View File
@@ -7,7 +7,7 @@
#include "vk_mem_alloc.h"
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
namespace rse::graphics::vulkanbase
{
@@ -27,10 +27,10 @@ uint8_t create_buffers();
*/
void updateUniformBuffer();
uint8_t update_mesh_buffers(const std::vector<rse::graphics::vulkanbase::Vertex>& vertices,
uint8_t update_mesh_buffers(const std::vector<Vertex>& vertices,
const std::vector<uint16_t>& indices);
uint8_t update_mesh_instances(rse::graphics::mesh::InstanceData& instance_data);
uint8_t update_mesh_instances(InstanceData& instance_data);
/**
* @brief Record commands for given image index
*
+2 -6
View File
@@ -1,7 +1,3 @@
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
namespace rse::graphics::vulkanbase {
VulkanState g_vulkan_state;
}
VulkanState g_vulkan_state;
@@ -1,5 +1,5 @@
/**
* @file vulkan_global.hpp
* @file vulkan_global.h
* @author Piotr Krygier (piotr.krygier@meshsystems.com)
* @brief Declaration of a structure holding Vulkan variables needed by different parts of the code
* @version 0.1
@@ -13,25 +13,20 @@
#define RSE_VULKAN_GLOBAL_HPP
#include <vulkan/vulkan.hpp>
#pragma GCC diagnostic ignored "-Wvolatile"
#include <glm/glm.hpp>
#pragma GCC diagnostic pop
#include <vk_mem_alloc.h>
#include "vk_mem_alloc.h"
#include "rse_math.h"
#define SWAP_BUFFER_COUNT 2U
namespace rse::graphics::vulkanbase
{
/**
* @brief Represents single vertex on the screen
*
*/
struct Vertex
{
glm::vec3 pos;
glm::vec3 color;
struct vec3_t pos;
struct vec3_t color;
static VkVertexInputBindingDescription getBindingDescription() {
VkVertexInputBindingDescription bindingDescription;
@@ -75,9 +70,9 @@ struct Buffer
struct UniformBufferObject
{
alignas(16) glm::mat4 model;
alignas(16) glm::mat4 view;
alignas(16) glm::mat4 proj;
alignas(16) mat4_t model;
alignas(16) mat4_t view;
alignas(16) mat4_t proj;
};
struct VulkanState
@@ -105,16 +100,10 @@ struct VulkanState
extern VulkanState g_vulkan_state;
} // namespace rse::graphics::vulkanbase
namespace rse::graphics::mesh
{
struct InstanceData {
glm::vec3 pos;
glm::vec3 rot;
struct vec3_t pos;
struct vec3_t rot;
float scale;
};
} // namespace rse::graphics::mesh
#endif
+2 -4
View File
@@ -1,14 +1,12 @@
#include "vulkan_descriptors.hpp"
#include "locale_vulkan.hpp"
#include "locale_vulkan.h"
#include "utilities/logger.hpp"
#include "vulkan_errors.hpp"
#include "vulkan_errors.h"
namespace rse::graphics::vulkanbase
{
using namespace locale::vulkan;
VkDescriptorPool gDescriptorPool = {};
static uint8_t createDescriptorPool();
+1 -1
View File
@@ -5,7 +5,7 @@
#include <vector>
#include <vulkan/vulkan.hpp>
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
namespace rse::graphics::vulkanbase
{
@@ -1,5 +1,5 @@
#ifndef VULKAN_ERRORS_HPP
#define VULKAN_ERRORS_HPP
#ifndef VULKAN_ERRORS_H
#define VULKAN_ERRORS_H
/* Macro for checking status of function execution in initVulkan. Created to avoid writing boilerplate code */
#define STATUS_CHECK(FUNC) \
+7 -9
View File
@@ -1,10 +1,10 @@
#include "vulkan_pipeline.hpp"
#include "locale_vulkan.hpp"
#include "locale_vulkan.h"
#include "utilities/file_utils.hpp"
#include "utilities/logger.hpp"
#include "vulkan_errors.hpp"
#include "mesh_controller.hpp"
#include "vulkan_errors.h"
#include "mesh_controller.h"
#include <cstdint>
#include <map>
@@ -14,8 +14,6 @@
namespace rse::graphics::vulkanbase
{
using namespace locale::vulkan;
enum class ShaderStage
{
VERTEX,
@@ -505,7 +503,7 @@ void fillVertexInputInfo(VkPipelineVertexInputStateCreateInfo* vertexInputInfo)
bindingDescriptions[0] = vertexBindingDescription;
bindingDescriptions[1].binding = 1;
bindingDescriptions[1].stride = sizeof(rse::graphics::mesh::InstanceData); //TODO: change
bindingDescriptions[1].stride = sizeof(InstanceData); //TODO: change
bindingDescriptions[1].inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;
auto attributeDescriptions = new VkVertexInputAttributeDescription[5];
@@ -514,17 +512,17 @@ void fillVertexInputInfo(VkPipelineVertexInputStateCreateInfo* vertexInputInfo)
attributeDescriptions[2].binding = 1;
attributeDescriptions[2].location = 2;
attributeDescriptions[2].format = VK_FORMAT_R32G32B32_SFLOAT;
attributeDescriptions[2].offset = offsetof(rse::graphics::mesh::InstanceData, pos);
attributeDescriptions[2].offset = offsetof(InstanceData, pos);
attributeDescriptions[3].binding = 1;
attributeDescriptions[3].location = 3;
attributeDescriptions[3].format = VK_FORMAT_R32G32B32_SFLOAT;
attributeDescriptions[3].offset = offsetof(rse::graphics::mesh::InstanceData, rot);
attributeDescriptions[3].offset = offsetof(InstanceData, rot);
attributeDescriptions[4].binding = 1;
attributeDescriptions[4].location = 4;
attributeDescriptions[4].format = VK_FORMAT_R32_SFLOAT;
attributeDescriptions[4].offset = offsetof(rse::graphics::mesh::InstanceData, scale);
attributeDescriptions[4].offset = offsetof(InstanceData, scale);
// ************************
vertexInputInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+1 -1
View File
@@ -4,7 +4,7 @@
#include <vector>
#include <vulkan/vulkan.hpp>
#include "vulkan_commons.hpp"
#include "vulkan_commons.h"
namespace rse::graphics::vulkanbase
{
+1 -3
View File
@@ -11,15 +11,13 @@
#include "window.hpp"
#include "locale_window.hpp"
#include "locale_window.h"
#include "utilities/logger.hpp"
#include "vulkan_base.hpp"
namespace rse::graphics::window
{
using namespace locale::window;
/* Error codes */
typedef enum {
WINDOW_ERROR_NO_ERROR = 0U,