Archived
1
Fork 0

Add moving camera

This commit is contained in:
Joshua Goins 2018-10-25 08:57:36 -04:00
parent 82ede190a6
commit dd8131a059
6 changed files with 82 additions and 63 deletions

8
include/camera.h Normal file
View file

@ -0,0 +1,8 @@
#pragma once
#include <glm/glm.hpp>
class Camera {
public:
glm::vec3 position, target;
};

View file

@ -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);

View file

@ -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_;

View file

@ -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;

View file

@ -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 = {};

View file

@ -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);