Add moving camera
This commit is contained in:
parent
82ede190a6
commit
dd8131a059
6 changed files with 82 additions and 63 deletions
8
include/camera.h
Normal file
8
include/camera.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
class Camera {
|
||||
public:
|
||||
glm::vec3 position, target;
|
||||
};
|
|
@ -37,13 +37,14 @@ struct RenderTarget {
|
|||
|
||||
class World;
|
||||
class Mesh;
|
||||
class Camera;
|
||||
|
||||
class Renderer {
|
||||
public:
|
||||
Renderer();
|
||||
~Renderer();
|
||||
|
||||
void render(World& world, RenderTarget* target);
|
||||
void render(World& world, Camera& camera, RenderTarget* target);
|
||||
|
||||
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr);
|
||||
void destroyRenderTarget(RenderTarget* target);
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
class Renderer;
|
||||
class World;
|
||||
struct RenderTarget;
|
||||
class Camera;
|
||||
|
||||
class WorldPass {
|
||||
public:
|
||||
WorldPass(Renderer& renderer);
|
||||
~WorldPass();
|
||||
|
||||
void render(VkCommandBuffer commandBuffer, World& world, RenderTarget* target);
|
||||
void render(VkCommandBuffer commandBuffer, World& world, Camera& camera, RenderTarget* target);
|
||||
|
||||
VkRenderPass getRenderPass() const {
|
||||
return renderPass_;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "world.h"
|
||||
#include "mesh.h"
|
||||
#include "light.h"
|
||||
#include "camera.h"
|
||||
|
||||
SDL_Window* window = nullptr;
|
||||
|
||||
|
@ -145,6 +146,10 @@ int main(int, char*[]) {
|
|||
|
||||
world.lights.push_back(light);
|
||||
|
||||
Camera camera;
|
||||
camera.position.y = 1;
|
||||
camera.position.z = 3;
|
||||
|
||||
bool running = true;
|
||||
while(running) {
|
||||
SDL_Event event = {};
|
||||
|
@ -174,7 +179,9 @@ int main(int, char*[]) {
|
|||
}
|
||||
}
|
||||
|
||||
renderer->render(world, target);
|
||||
camera.position.x = sin(platform::getTime() / 500.0f);
|
||||
|
||||
renderer->render(world, camera, target);
|
||||
}
|
||||
|
||||
delete light;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "platform.h"
|
||||
#include "mesh.h"
|
||||
#include "camera.h"
|
||||
|
||||
Renderer::Renderer() {
|
||||
createInstance();
|
||||
|
@ -47,7 +48,7 @@ Renderer::~Renderer() {
|
|||
vkDestroyInstance(instance_, nullptr);
|
||||
}
|
||||
|
||||
void Renderer::render(World& world, RenderTarget* target) {
|
||||
void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
||||
vkAcquireNextImageKHR(device_, target->swapchain, UINT64_MAX, target->imageAvailableSemaphore, nullptr, &target->currentImage);
|
||||
|
||||
vkWaitForFences(device_, 1, &target->fences[target->currentImage], true, UINT64_MAX);
|
||||
|
@ -72,7 +73,7 @@ void Renderer::render(World& world, RenderTarget* target) {
|
|||
|
||||
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
|
||||
|
||||
worldPass_->render(commandBuffer, world, target);
|
||||
worldPass_->render(commandBuffer, world, camera, target);
|
||||
|
||||
VkClearValue clearColor = {};
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "world.h"
|
||||
#include "mesh.h"
|
||||
#include "light.h"
|
||||
#include "camera.h"
|
||||
|
||||
WorldPass::WorldPass(Renderer& renderer) : renderer_(renderer) {
|
||||
createRenderPass();
|
||||
|
@ -28,7 +29,7 @@ WorldPass::~WorldPass() {
|
|||
vkDestroyBuffer(renderer_.getDevice(), lightBuffer_, nullptr);
|
||||
}
|
||||
|
||||
void WorldPass::render(VkCommandBuffer commandBuffer, World& world, RenderTarget* target) {
|
||||
void WorldPass::render(VkCommandBuffer commandBuffer, World& world, Camera& camera, RenderTarget* target) {
|
||||
struct ShaderLight {
|
||||
glm::vec4 position;
|
||||
glm::vec3 color;
|
||||
|
@ -65,7 +66,7 @@ void WorldPass::render(VkCommandBuffer commandBuffer, World& world, RenderTarget
|
|||
for(const auto& mesh : world.meshes) {
|
||||
glm::mat4 mvp;
|
||||
mvp = glm::perspective(glm::radians(75.0f), (float)target->extent.width / target->extent.height, 0.1f, 100.0f);
|
||||
mvp *= glm::lookAt(glm::vec3(2), glm::vec3(0), glm::vec3(0, -1, 0));
|
||||
mvp *= glm::lookAt(camera.position, camera.target, glm::vec3(0, -1, 0));
|
||||
|
||||
vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &mvp);
|
||||
|
||||
|
|
Reference in a new issue