finish refactor
This commit is contained in:
parent
9f3ed45b12
commit
8cc0b081ef
16 changed files with 195 additions and 223 deletions
|
@ -1 +0,0 @@
|
||||||
VULKAN_SDK=/home/tylerm/Documents/Vulkan
|
|
4
Makefile
4
Makefile
|
@ -1,12 +1,9 @@
|
||||||
include .env
|
|
||||||
|
|
||||||
CC = clang++
|
CC = clang++
|
||||||
|
|
||||||
INCFLAGS = -Isrc
|
INCFLAGS = -Isrc
|
||||||
INCFLAGS += -Iengine
|
INCFLAGS += -Iengine
|
||||||
INCFLAGS += -Ilib/glfw/include
|
INCFLAGS += -Ilib/glfw/include
|
||||||
INCFLAGS += -Ilib/glm
|
INCFLAGS += -Ilib/glm
|
||||||
INCFLAGS += -L${VULKAN_SDK}/lib -lvulkan
|
|
||||||
|
|
||||||
CCFLAGS = -std=c++17 -O2 -g
|
CCFLAGS = -std=c++17 -O2 -g
|
||||||
CCFLAGS += $(INCFLAGS)
|
CCFLAGS += $(INCFLAGS)
|
||||||
|
@ -15,6 +12,7 @@ LDFLAGS = -lm
|
||||||
LDFLAGS += $(INCFLAGS)
|
LDFLAGS += $(INCFLAGS)
|
||||||
LDFLAGS += lib/glfw/src/libglfw3.a
|
LDFLAGS += lib/glfw/src/libglfw3.a
|
||||||
LDFLAGS += lib/glm/glm/libglm_static.a
|
LDFLAGS += lib/glm/glm/libglm_static.a
|
||||||
|
LDFLAGS += -lvulkan
|
||||||
|
|
||||||
SRC = $(shell find src -name "*.cpp")
|
SRC = $(shell find src -name "*.cpp")
|
||||||
SRC += $(shell find engine -name "*.cpp")
|
SRC += $(shell find engine -name "*.cpp")
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
#include "xe_engine.hpp"
|
#include "xe_engine.hpp"
|
||||||
#include "xe_descriptors.hpp"
|
#include <chrono>
|
||||||
|
|
||||||
#include <string>
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
|
||||||
XeEngine::XeEngine(int width, int height, std::string name)
|
XeEngine::XeEngine(int width, int height, std::string name) : xeWindow{width, height, name},
|
||||||
: xeWindow{width, height, name},
|
|
||||||
xeDevice{xeWindow},
|
xeDevice{xeWindow},
|
||||||
xeRenderer{xeWindow, xeDevice},
|
xeRenderer{xeWindow, xeDevice},
|
||||||
xeCamera{} {
|
xeCamera{} {
|
||||||
|
@ -24,45 +22,27 @@ void XeEngine::loadDescriptors() {
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<XeRenderSystem> XeEngine::createRenderSystem(const std::string &vert, const std::string &frag, uint32_t pushCunstantDataSize, uint32_t uniformBufferDataSize) {
|
std::shared_ptr<XeModel> XeEngine::loadModelFromFile(const std::string &filename) {
|
||||||
return std::make_unique<XeRenderSystem>(
|
|
||||||
xeDevice,
|
|
||||||
xeRenderer,
|
|
||||||
*xeDescriptorPool,
|
|
||||||
*xeDescriptorSetLayout,
|
|
||||||
vert,
|
|
||||||
frag,
|
|
||||||
pushCunstantDataSize,
|
|
||||||
uniformBufferDataSize
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<XeModel> XeEngine::createModel(const std::string &filename) {
|
|
||||||
return XeModel::createModelFromFile(xeDevice, filename);
|
return XeModel::createModelFromFile(xeDevice, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XeEngine::render(
|
std::shared_ptr<XeModel> XeEngine::loadModelFromData(std::vector<XeModel::Vertex> vertices, std::vector<uint32_t> indices) {
|
||||||
XeRenderSystem& xeRenderSystem,
|
XeModel::Builder builder{};
|
||||||
std::vector<XeGameObject>& gameObjects,
|
builder.vertices = vertices;
|
||||||
void* pushConstantData,
|
if(&indices == NULL) {
|
||||||
uint32_t pushConstantSize,
|
builder.indices = indices;
|
||||||
void* uniformBufferData,
|
}
|
||||||
uint32_t uniformBufferSize) {
|
return std::make_shared<XeModel>(xeDevice, builder);
|
||||||
|
}
|
||||||
|
|
||||||
auto commandBuffer = xeRenderer.getCurrentCommandBuffer();
|
bool XeEngine::poll() {
|
||||||
xeRenderer.beginSwapChainRenderPass(commandBuffer);
|
glfwPollEvents();
|
||||||
|
auto newTime = std::chrono::high_resolution_clock::now();
|
||||||
xeRenderSystem.renderGameObjects(
|
frameTime = std::chrono::duration<float, std::chrono::seconds::period>(newTime - currentTime).count();
|
||||||
xeRenderer.getFrameIndex(),
|
currentTime = newTime;
|
||||||
commandBuffer,
|
float aspect = xeRenderer.getAspectRatio();
|
||||||
gameObjects,
|
xeCamera.setPerspectiveProjection(glm::radians(FOV), aspect, 0.1f, 100.f);
|
||||||
pushConstantData,
|
return !xeWindow.shouldClose();
|
||||||
pushConstantSize,
|
|
||||||
uniformBufferData,
|
|
||||||
uniformBufferSize
|
|
||||||
);
|
|
||||||
|
|
||||||
xeRenderer.endSwapChainRenderPass(commandBuffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -3,8 +3,9 @@
|
||||||
#include "xe_window.hpp"
|
#include "xe_window.hpp"
|
||||||
#include "xe_device.hpp"
|
#include "xe_device.hpp"
|
||||||
#include "xe_renderer.hpp"
|
#include "xe_renderer.hpp"
|
||||||
#include "xe_render_system.hpp"
|
#include "xe_camera.hpp"
|
||||||
#include "xe_descriptors.hpp"
|
#include "xe_descriptors.hpp"
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -14,41 +15,25 @@ class XeEngine {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
XeEngine(int width, int height, std::string name);
|
XeEngine(int width, int height, std::string name);
|
||||||
|
|
||||||
~XeEngine() {};
|
~XeEngine() {};
|
||||||
|
|
||||||
XeEngine(const XeEngine&) = delete;
|
XeEngine(const XeEngine&) = delete;
|
||||||
XeEngine operator=(const XeEngine&) = delete;
|
XeEngine operator=(const XeEngine&) = delete;
|
||||||
|
|
||||||
XeWindow& getWindow() {
|
XeWindow& getWindow() {return xeWindow;}
|
||||||
return xeWindow;
|
XeCamera& getCamera() {return xeCamera;}
|
||||||
};
|
|
||||||
|
|
||||||
XeRenderer& getRenderer() {
|
std::shared_ptr<XeModel> loadModelFromFile(const std::string &filename);
|
||||||
return xeRenderer;
|
std::shared_ptr<XeModel> loadModelFromData(std::vector<XeModel::Vertex> vertices, std::vector<uint32_t> indices);
|
||||||
};
|
|
||||||
|
|
||||||
XeCamera& getCamera() {
|
|
||||||
return xeCamera;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::unique_ptr<XeRenderSystem> createRenderSystem(const std::string &vert, const std::string &frag, uint32_t pushCunstantDataSize, uint32_t uniformBufferDataSize);
|
|
||||||
|
|
||||||
std::shared_ptr<XeModel> createModel(const std::string &filename);
|
|
||||||
|
|
||||||
bool beginFrame() { return xeRenderer.beginFrame(); }
|
bool beginFrame() { return xeRenderer.beginFrame(); }
|
||||||
|
void endFrame() { xeRenderer.endFrame(); }
|
||||||
void endFrame() { return xeRenderer.endFrame(); }
|
|
||||||
|
|
||||||
void render(
|
|
||||||
XeRenderSystem& xeRenderSystem,
|
|
||||||
std::vector<XeGameObject>& gameObjects,
|
|
||||||
void* pushConstantData,
|
|
||||||
uint32_t pushConstantSize,
|
|
||||||
void* uniformBufferData,
|
|
||||||
uint32_t uniformBufferSize);
|
|
||||||
|
|
||||||
void close() { vkDeviceWaitIdle(xeDevice.device()); }
|
void close() { vkDeviceWaitIdle(xeDevice.device()); }
|
||||||
|
|
||||||
|
bool poll();
|
||||||
|
float getFrameTime() { return frameTime; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void loadDescriptors();
|
void loadDescriptors();
|
||||||
|
@ -58,8 +43,15 @@ class XeEngine {
|
||||||
XeRenderer xeRenderer;
|
XeRenderer xeRenderer;
|
||||||
XeCamera xeCamera;
|
XeCamera xeCamera;
|
||||||
|
|
||||||
|
std::chrono::_V2::system_clock::time_point currentTime;
|
||||||
|
float frameTime;
|
||||||
|
|
||||||
|
float FOV = 50.f;
|
||||||
|
|
||||||
std::unique_ptr<XeDescriptorPool> xeDescriptorPool;
|
std::unique_ptr<XeDescriptorPool> xeDescriptorPool;
|
||||||
std::unique_ptr<XeDescriptorSetLayout> xeDescriptorSetLayout;
|
std::unique_ptr<XeDescriptorSetLayout> xeDescriptorSetLayout;
|
||||||
|
|
||||||
|
friend class XeRenderSystem;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,16 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "xe_camera.hpp"
|
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
|
|
||||||
namespace xe {
|
|
||||||
|
|
||||||
struct XeFrameInfo {
|
|
||||||
int frameIndex;
|
|
||||||
float frameTime;
|
|
||||||
VkCommandBuffer commandBuffer;
|
|
||||||
XeCamera &camera;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -3,11 +3,11 @@
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#include "xe_device.hpp"
|
#include "xe_device.hpp"
|
||||||
#include "xe_pipeline.hpp"
|
#include "xe_pipeline.hpp"
|
||||||
#include "xe_frame_info.hpp"
|
|
||||||
#include "xe_game_object.hpp"
|
#include "xe_game_object.hpp"
|
||||||
#include "xe_swap_chain.hpp"
|
#include "xe_swap_chain.hpp"
|
||||||
#include "xe_renderer.hpp"
|
#include "xe_renderer.hpp"
|
||||||
#include "xe_descriptors.hpp"
|
#include "xe_descriptors.hpp"
|
||||||
|
#include "xe_engine.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
@ -17,18 +17,15 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
|
||||||
XeRenderSystem::XeRenderSystem(
|
XeRenderSystem::XeRenderSystem(
|
||||||
XeDevice &device,
|
XeEngine &xeEngine,
|
||||||
XeRenderer &renderer,
|
|
||||||
XeDescriptorPool &xeDescriptorPool,
|
|
||||||
XeDescriptorSetLayout &xeDescriptorSetLayout,
|
|
||||||
std::string vert,
|
std::string vert,
|
||||||
std::string frag,
|
std::string frag,
|
||||||
uint32_t pushCunstantDataSize,
|
uint32_t pushCunstantDataSize,
|
||||||
uint32_t uniformBufferDataSize)
|
uint32_t uniformBufferDataSize)
|
||||||
: xeDevice{device} {
|
: xeDevice{xeEngine.xeDevice}, xeRenderer{xeEngine.xeRenderer} {
|
||||||
createUniformBuffers(xeDescriptorPool, xeDescriptorSetLayout, uniformBufferDataSize);
|
createUniformBuffers(*xeEngine.xeDescriptorPool, *xeEngine.xeDescriptorSetLayout, uniformBufferDataSize);
|
||||||
createPipelineLayout(xeDescriptorSetLayout, pushCunstantDataSize, uniformBufferDataSize);
|
createPipelineLayout(*xeEngine.xeDescriptorSetLayout, pushCunstantDataSize, uniformBufferDataSize);
|
||||||
createPipeline(renderer.getSwapChainRenderPass(), vert, frag);
|
createPipeline(xeRenderer.getSwapChainRenderPass(), vert, frag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -108,55 +105,54 @@ void XeRenderSystem::createPipeline(VkRenderPass renderPass, std::string vert, s
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XeRenderSystem::renderGameObjects(
|
void XeRenderSystem::loadPushConstant(void *pushConstantData, uint32_t pushConstantSize) {
|
||||||
int frameIndex,
|
if(!boundPipeline) {
|
||||||
VkCommandBuffer commandBuffer,
|
xeRenderer.beginSwapChainRenderPass(xeRenderer.getCurrentCommandBuffer());
|
||||||
std::vector<XeGameObject> &gameObjects,
|
xePipeline->bind(xeRenderer.getCurrentCommandBuffer());
|
||||||
void *pushConstantData,
|
boundPipeline = true;
|
||||||
uint32_t pushConstantSize,
|
}
|
||||||
void* uniformBufferData,
|
if(!boundDescriptor) {
|
||||||
uint32_t uniformBufferSize) {
|
|
||||||
|
|
||||||
uboBuffers[frameIndex]->writeToBuffer(uniformBufferData);
|
|
||||||
uboBuffers[frameIndex]->flush();
|
|
||||||
|
|
||||||
xePipeline->bind(commandBuffer);
|
|
||||||
|
|
||||||
if(pushConstantSize > 0) {
|
|
||||||
vkCmdBindDescriptorSets(
|
vkCmdBindDescriptorSets(
|
||||||
commandBuffer,
|
xeRenderer.getCurrentCommandBuffer(),
|
||||||
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||||
pipelineLayout,
|
pipelineLayout,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
&descriptorSets[frameIndex],
|
&descriptorSets[xeRenderer.getFrameIndex()],
|
||||||
0,
|
0,
|
||||||
nullptr);
|
nullptr);
|
||||||
|
boundDescriptor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& obj: gameObjects) {
|
|
||||||
|
|
||||||
struct PushConstant {
|
|
||||||
glm::mat4 modelMatrix;
|
|
||||||
glm::mat4 normalMatrix;
|
|
||||||
};
|
|
||||||
|
|
||||||
PushConstant pc = PushConstant{obj.transform.mat4(), obj.transform.normalMatrix()};
|
|
||||||
|
|
||||||
if(pushConstantSize > 0) {
|
|
||||||
vkCmdPushConstants(
|
vkCmdPushConstants(
|
||||||
commandBuffer,
|
xeRenderer.getCurrentCommandBuffer(),
|
||||||
pipelineLayout,
|
pipelineLayout,
|
||||||
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
|
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
0,
|
0,
|
||||||
pushConstantSize,
|
pushConstantSize,
|
||||||
&pc);
|
pushConstantData);
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.model->bind(commandBuffer);
|
void XeRenderSystem::loadUniformObject(void *uniformBufferData, uint32_t uniformBufferSize) {
|
||||||
obj.model->draw(commandBuffer);
|
uboBuffers[xeRenderer.getFrameIndex()]->writeToBuffer(uniformBufferData);
|
||||||
|
uboBuffers[xeRenderer.getFrameIndex()]->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XeRenderSystem::render(XeGameObject &gameObject) {
|
||||||
|
if(!boundPipeline){
|
||||||
|
xeRenderer.beginSwapChainRenderPass(xeRenderer.getCurrentCommandBuffer());
|
||||||
|
xePipeline->bind(xeRenderer.getCurrentCommandBuffer());
|
||||||
|
boundPipeline = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
gameObject.model->bind(xeRenderer.getCurrentCommandBuffer());
|
||||||
|
gameObject.model->draw(xeRenderer.getCurrentCommandBuffer());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void XeRenderSystem::stop() {
|
||||||
|
boundPipeline = false;
|
||||||
|
boundDescriptor = false;
|
||||||
|
xeRenderer.endSwapChainRenderPass(xeRenderer.getCurrentCommandBuffer());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -3,10 +3,10 @@
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#include "xe_device.hpp"
|
#include "xe_device.hpp"
|
||||||
#include "xe_pipeline.hpp"
|
#include "xe_pipeline.hpp"
|
||||||
#include "xe_frame_info.hpp"
|
|
||||||
#include "xe_game_object.hpp"
|
#include "xe_game_object.hpp"
|
||||||
#include "xe_descriptors.hpp"
|
#include "xe_descriptors.hpp"
|
||||||
#include "xe_renderer.hpp"
|
#include "xe_renderer.hpp"
|
||||||
|
#include "xe_engine.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
@ -15,13 +15,8 @@ namespace xe {
|
||||||
class XeRenderSystem {
|
class XeRenderSystem {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct XeData{};
|
|
||||||
|
|
||||||
XeRenderSystem(
|
XeRenderSystem(
|
||||||
XeDevice &device,
|
XeEngine &xeEngine,
|
||||||
XeRenderer &renderer,
|
|
||||||
XeDescriptorPool &xeDescriptorPool,
|
|
||||||
XeDescriptorSetLayout &xeDescriptorSetLayout,
|
|
||||||
std::string vert,
|
std::string vert,
|
||||||
std::string frag,
|
std::string frag,
|
||||||
uint32_t pushCunstantDataSize,
|
uint32_t pushCunstantDataSize,
|
||||||
|
@ -33,23 +28,22 @@ class XeRenderSystem {
|
||||||
XeRenderSystem(const XeRenderSystem &) = delete;
|
XeRenderSystem(const XeRenderSystem &) = delete;
|
||||||
XeRenderSystem operator=(const XeRenderSystem &) = delete;
|
XeRenderSystem operator=(const XeRenderSystem &) = delete;
|
||||||
|
|
||||||
void setUnifroms(XeFrameInfo & frameInfo);
|
void loadPushConstant(void *pushConstantData, uint32_t pushConstantSize);
|
||||||
|
void loadUniformObject(void *uniformBufferData, uint32_t uniformBufferSize);
|
||||||
void renderGameObjects(
|
void render(XeGameObject &gameObject);
|
||||||
int frameIndex,
|
void stop();
|
||||||
VkCommandBuffer commandBuffer,
|
|
||||||
std::vector<XeGameObject> &gameObjects,
|
|
||||||
void *pushConstantData,
|
|
||||||
uint32_t pushConstantSize,
|
|
||||||
void* uniformBufferData,
|
|
||||||
uint32_t uniformBufferSize);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void createUniformBuffers(XeDescriptorPool &xeDescriptorPool, XeDescriptorSetLayout &xeDescriptorSetLayout, uint32_t uniformBufferDataSize);
|
void createUniformBuffers(XeDescriptorPool &xeDescriptorPool, XeDescriptorSetLayout &xeDescriptorSetLayout, uint32_t uniformBufferDataSize);
|
||||||
void createPipelineLayout(XeDescriptorSetLayout &xeDescriptorSetLayout, uint32_t pushCunstantDataSize, uint32_t uniformBufferDataSize);
|
void createPipelineLayout(XeDescriptorSetLayout &xeDescriptorSetLayout, uint32_t pushCunstantDataSize, uint32_t uniformBufferDataSize);
|
||||||
void createPipeline(VkRenderPass renderPass, std::string vert, std::string frag);
|
void createPipeline(VkRenderPass renderPass, std::string vert, std::string frag);
|
||||||
|
|
||||||
|
bool boundPipeline{false};
|
||||||
|
bool boundDescriptor{false};
|
||||||
|
|
||||||
XeDevice& xeDevice;
|
XeDevice& xeDevice;
|
||||||
|
XeRenderer& xeRenderer;
|
||||||
|
|
||||||
std::unique_ptr<XePipeline> xePipeline;
|
std::unique_ptr<XePipeline> xePipeline;
|
||||||
std::vector<std::unique_ptr<XeBuffer>> uboBuffers;
|
std::vector<std::unique_ptr<XeBuffer>> uboBuffers;
|
||||||
|
|
|
@ -26,5 +26,5 @@ void main() {
|
||||||
|
|
||||||
float lightIntensity = AMBIENT + max(dot(normalWorldSpace, ubo.directionToLight), 0);
|
float lightIntensity = AMBIENT + max(dot(normalWorldSpace, ubo.directionToLight), 0);
|
||||||
|
|
||||||
fragColor = lightIntensity * color;
|
fragColor = lightIntensity * vec3(1/position.y,position.y,clamp(sin(position.x - position.z), 0, 1));
|
||||||
}
|
}
|
Binary file not shown.
|
@ -1,32 +1,20 @@
|
||||||
#include "first_app.hpp"
|
#include "first_app.hpp"
|
||||||
|
|
||||||
#include "xe_camera.hpp"
|
#include "xe_camera.hpp"
|
||||||
|
#include "xe_engine.hpp"
|
||||||
#include "xe_game_object.hpp"
|
#include "xe_game_object.hpp"
|
||||||
#include "xe_model.hpp"
|
#include "xe_model.hpp"
|
||||||
|
#include "xe_render_system.hpp"
|
||||||
#include "keyboard_movement_controller.hpp"
|
#include "keyboard_movement_controller.hpp"
|
||||||
|
#include "simple_renderer.hpp"
|
||||||
|
|
||||||
#define GLM_FORCE_RADIANS
|
#define GLM_FORCE_RADIANS
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include <glm/gtc/constants.hpp>
|
#include <glm/gtc/constants.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <chrono>
|
|
||||||
#include <cassert>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <iostream>
|
|
||||||
namespace xe {
|
|
||||||
|
|
||||||
struct UniformBuffer {
|
namespace app {
|
||||||
alignas(16) glm::mat4 projectionView{1.f};
|
|
||||||
alignas(4) glm::vec3 lightDirection = glm::normalize(glm::vec3{-1.f, 3.f, 1.f});
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PushConstant {
|
|
||||||
alignas(16) glm::mat4 modelMatrix{1.f};
|
|
||||||
alignas(16) glm::mat4 normalMatrix{1.f};
|
|
||||||
};
|
|
||||||
|
|
||||||
FirstApp::FirstApp() : xeEngine{WIDTH, HEIGHT, "Hello, Vulkan!"} {
|
FirstApp::FirstApp() : xeEngine{WIDTH, HEIGHT, "Hello, Vulkan!"} {
|
||||||
loadGameObjects();
|
loadGameObjects();
|
||||||
|
@ -36,53 +24,23 @@ FirstApp::~FirstApp() {}
|
||||||
|
|
||||||
void FirstApp::run() {
|
void FirstApp::run() {
|
||||||
|
|
||||||
std::unique_ptr<XeRenderSystem> simpleRenderSystem = xeEngine.createRenderSystem(
|
SimpleRenderer renderer{xeEngine};
|
||||||
"res/shaders/simple_shader.vert.spv",
|
|
||||||
"res/shaders/simple_shader.frag.spv",
|
|
||||||
sizeof(PushConstant),
|
|
||||||
sizeof(UniformBuffer));
|
|
||||||
|
|
||||||
XeCamera camera{};
|
xeEngine.getCamera().setViewTarget(glm::vec3(-1.f, -2.f, 20.f), glm::vec3(0.f, 0.f, 2.5f));
|
||||||
camera.setViewTarget(glm::vec3(-1.f, -2.f, 20.f), glm::vec3(0.f, 0.f, 2.5f));
|
|
||||||
|
|
||||||
auto viewerObject = XeGameObject::createGameObject();
|
auto viewerObject = xe::XeGameObject::createGameObject();
|
||||||
KeyboardMovementController cameraController{};
|
KeyboardMovementController cameraController{};
|
||||||
|
|
||||||
auto currentTime = std::chrono::high_resolution_clock::now();
|
while (xeEngine.poll()) {
|
||||||
|
|
||||||
while (!xeEngine.getWindow().shouldClose()) {
|
float frameTime = xeEngine.getFrameTime();
|
||||||
glfwPollEvents();
|
|
||||||
|
|
||||||
auto newTime = std::chrono::high_resolution_clock::now();
|
|
||||||
float frameTime = std::chrono::duration<float, std::chrono::seconds::period>(newTime - currentTime).count();
|
|
||||||
currentTime = newTime;
|
|
||||||
|
|
||||||
cameraController.moveInPlaneXZ(xeEngine.getWindow().getGLFWwindow(), frameTime, viewerObject);
|
cameraController.moveInPlaneXZ(xeEngine.getWindow().getGLFWwindow(), frameTime, viewerObject);
|
||||||
camera.setViewYXZ(viewerObject.transform.translation, viewerObject.transform.rotation);
|
xeEngine.getCamera().setViewYXZ(viewerObject.transform.translation, viewerObject.transform.rotation);
|
||||||
|
|
||||||
float aspect = xeEngine.getRenderer().getAspectRatio();
|
|
||||||
camera.setPerspectiveProjection(glm::radians(50.f), aspect, 0.1f, 100.f);
|
|
||||||
|
|
||||||
if(xeEngine.beginFrame()) {
|
if(xeEngine.beginFrame()) {
|
||||||
|
renderer.render(gameObjects, xeEngine.getCamera());
|
||||||
PushConstant pc{};
|
|
||||||
pc.modelMatrix = gameObjects[0].transform.mat4();
|
|
||||||
pc.normalMatrix = gameObjects[0].transform.normalMatrix();
|
|
||||||
|
|
||||||
UniformBuffer ubo{};
|
|
||||||
ubo.projectionView = camera.getProjection() * camera.getView();
|
|
||||||
|
|
||||||
xeEngine.render(
|
|
||||||
*simpleRenderSystem,
|
|
||||||
gameObjects,
|
|
||||||
&pc,
|
|
||||||
sizeof(pc),
|
|
||||||
&ubo,
|
|
||||||
sizeof(ubo)
|
|
||||||
);
|
|
||||||
|
|
||||||
xeEngine.endFrame();
|
xeEngine.endFrame();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,13 +49,20 @@ void FirstApp::run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirstApp::loadGameObjects() {
|
void FirstApp::loadGameObjects() {
|
||||||
std::shared_ptr<XeModel> xeModel = xeEngine.createModel("res/models/stanford-dragon.obj");
|
std::shared_ptr<xe::XeModel> xeModel = xeEngine.loadModelFromFile("res/models/stanford-dragon.obj");
|
||||||
|
|
||||||
auto cube = XeGameObject::createGameObject();
|
auto dragon = xe::XeGameObject::createGameObject();
|
||||||
cube.model = xeModel;
|
dragon.model = xeModel;
|
||||||
cube.transform.translation = {.0f, .0f, 2.5f};
|
dragon.transform.translation = {.0f, .0f, 2.5f};
|
||||||
cube.transform.scale = {.5f, .5f, .5f};
|
dragon.transform.scale = {.5f, .5f, .5f};
|
||||||
gameObjects.push_back(std::move(cube));
|
gameObjects.push_back(std::move(dragon));
|
||||||
|
|
||||||
|
auto dragon2 = xe::XeGameObject::createGameObject();
|
||||||
|
dragon2.model = xeModel;
|
||||||
|
dragon2.transform.translation = {5.0f, .0f, -1.5f};
|
||||||
|
dragon2.transform.rotation.y = glm::radians(90.f);
|
||||||
|
dragon2.transform.scale = {.35f, .35f, .35f};
|
||||||
|
gameObjects.push_back(std::move(dragon2));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,11 +7,9 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace xe {
|
namespace app {
|
||||||
class FirstApp {
|
class FirstApp {
|
||||||
public:
|
public:
|
||||||
static constexpr int WIDTH = 800;
|
|
||||||
static constexpr int HEIGHT = 600;
|
|
||||||
|
|
||||||
FirstApp();
|
FirstApp();
|
||||||
~FirstApp();
|
~FirstApp();
|
||||||
|
@ -22,10 +20,14 @@ class FirstApp {
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static constexpr int WIDTH = 800;
|
||||||
|
static constexpr int HEIGHT = 600;
|
||||||
|
|
||||||
void loadGameObjects();
|
void loadGameObjects();
|
||||||
|
|
||||||
XeEngine xeEngine;
|
xe::XeEngine xeEngine;
|
||||||
|
|
||||||
std::vector<XeGameObject> gameObjects;
|
std::vector<xe::XeGameObject> gameObjects;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -4,9 +4,9 @@
|
||||||
#include <glm/geometric.hpp>
|
#include <glm/geometric.hpp>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
namespace xe {
|
namespace app {
|
||||||
|
|
||||||
void KeyboardMovementController::moveInPlaneXZ(GLFWwindow* window, float dt, XeGameObject& gameObject) {
|
void KeyboardMovementController::moveInPlaneXZ(GLFWwindow* window, float dt, xe::XeGameObject& gameObject) {
|
||||||
glm::vec3 rotate{0};
|
glm::vec3 rotate{0};
|
||||||
if(glfwGetKey(window, keys.lookRight) == GLFW_PRESS) rotate.y += 1.f;
|
if(glfwGetKey(window, keys.lookRight) == GLFW_PRESS) rotate.y += 1.f;
|
||||||
if(glfwGetKey(window, keys.lookLeft) == GLFW_PRESS) rotate.y -= 1.f;
|
if(glfwGetKey(window, keys.lookLeft) == GLFW_PRESS) rotate.y -= 1.f;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "xe_window.hpp"
|
#include "xe_window.hpp"
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
namespace xe {
|
namespace app {
|
||||||
class KeyboardMovementController {
|
class KeyboardMovementController {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -21,7 +21,7 @@ namespace xe {
|
||||||
int lookDown = GLFW_KEY_DOWN;
|
int lookDown = GLFW_KEY_DOWN;
|
||||||
};
|
};
|
||||||
|
|
||||||
void moveInPlaneXZ(GLFWwindow* window, float dt, XeGameObject& gameObject);
|
void moveInPlaneXZ(GLFWwindow* window, float dt, xe::XeGameObject& gameObject);
|
||||||
|
|
||||||
KeyMappings keys{};
|
KeyMappings keys{};
|
||||||
float moveSpeed{3.f};
|
float moveSpeed{3.f};
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
xe::FirstApp app{};
|
app::FirstApp app{};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
app.run();
|
app.run();
|
||||||
|
|
26
src/simple_renderer.cpp
Normal file
26
src/simple_renderer.cpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#include "simple_renderer.hpp"
|
||||||
|
|
||||||
|
namespace app {
|
||||||
|
|
||||||
|
SimpleRenderer::SimpleRenderer(xe::XeEngine &xeEngine)
|
||||||
|
: xeRenderSystem{xeEngine, "res/shaders/simple_shader.vert.spv", "res/shaders/simple_shader.frag.spv", sizeof(PushConstant), sizeof(UniformBuffer)} {};
|
||||||
|
|
||||||
|
void SimpleRenderer::render(std::vector<xe::XeGameObject> &gameObjects, xe::XeCamera &xeCamera) {
|
||||||
|
|
||||||
|
UniformBuffer ubo{};
|
||||||
|
ubo.projectionView = xeCamera.getProjection() * xeCamera.getView();
|
||||||
|
xeRenderSystem.loadUniformObject(&ubo, sizeof(ubo));
|
||||||
|
|
||||||
|
for(auto &obj : gameObjects) {
|
||||||
|
PushConstant pc{};
|
||||||
|
pc.modelMatrix = obj.transform.mat4();
|
||||||
|
pc.normalMatrix = obj.transform.normalMatrix();
|
||||||
|
xeRenderSystem.loadPushConstant(&pc, sizeof(pc));
|
||||||
|
xeRenderSystem.render(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
xeRenderSystem.stop();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
36
src/simple_renderer.hpp
Normal file
36
src/simple_renderer.hpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "xe_render_system.hpp"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace app {
|
||||||
|
|
||||||
|
struct UniformBuffer {
|
||||||
|
alignas(16) glm::mat4 projectionView{1.f};
|
||||||
|
alignas(4) glm::vec3 lightDirection = glm::normalize(glm::vec3{-1.f, 3.f, 1.f});
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PushConstant {
|
||||||
|
alignas(16) glm::mat4 modelMatrix{1.f};
|
||||||
|
alignas(16) glm::mat4 normalMatrix{1.f};
|
||||||
|
};
|
||||||
|
|
||||||
|
class SimpleRenderer {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SimpleRenderer(xe::XeEngine &xeEngine);
|
||||||
|
|
||||||
|
~SimpleRenderer() {};
|
||||||
|
|
||||||
|
SimpleRenderer(const SimpleRenderer&) = delete;
|
||||||
|
SimpleRenderer operator=(const SimpleRenderer&) = delete;
|
||||||
|
|
||||||
|
void render(std::vector<xe::XeGameObject> &gameObjects, xe::XeCamera &xeCamera);
|
||||||
|
|
||||||
|
private:
|
||||||
|
xe::XeRenderSystem xeRenderSystem;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue