summaryrefslogtreecommitdiff
path: root/src/first_app.cpp
diff options
context:
space:
mode:
authortylermurphy534 <tylermurphy534@gmail.com>2022-09-18 21:20:51 -0400
committertylermurphy534 <tylermurphy534@gmail.com>2022-09-18 21:20:51 -0400
commit8045b8ba04aae39a4cf9733e72413f648b6ebe2b (patch)
treef90a9bd50a2316d5077df99c9e8584afc76ed656 /src/first_app.cpp
downloadminecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.tar.gz
minecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.tar.bz2
minecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.zip
stanford dragon rendering
Diffstat (limited to 'src/first_app.cpp')
-rwxr-xr-xsrc/first_app.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/first_app.cpp b/src/first_app.cpp
new file mode 100755
index 0000000..6a5bfa9
--- /dev/null
+++ b/src/first_app.cpp
@@ -0,0 +1,125 @@
+#include "first_app.hpp"
+
+#include "xe_camera.hpp"
+#include "xe_game_object.hpp"
+#include "xe_model.hpp"
+#include "simple_render_system.hpp"
+#include "keyboard_movement_controller.hpp"
+
+
+#define GLM_FORCE_RADIANS
+#define GLM_FORCE_DEPTH_ZERO_TO_ONE
+#include <glm/glm.hpp>
+#include <glm/gtc/constants.hpp>
+
+#include <array>
+#include <chrono>
+#include <cassert>
+#include <stdexcept>
+
+namespace xe {
+
+struct GlobalUbo {
+ glm::mat4 projectionView{1.f};
+ glm::vec3 lightDirection = glm::normalize(glm::vec3{-1.f, 3.f, 1.f});
+};
+
+FirstApp::FirstApp() {
+ globalPool = XeDescriptorPool::Builder(xeDevice)
+ .setMaxSets(XeSwapChain::MAX_FRAMES_IN_FLIGHT)
+ .addPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, XeSwapChain::MAX_FRAMES_IN_FLIGHT)
+ .addPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, XeSwapChain::MAX_FRAMES_IN_FLIGHT)
+ .build();
+ loadGameObjects();
+}
+
+FirstApp::~FirstApp() {}
+
+void FirstApp::run() {
+
+ std::vector<std::unique_ptr<XeBuffer>> uboBuffers(XeSwapChain::MAX_FRAMES_IN_FLIGHT);
+ for (int i = 0; i < uboBuffers.size(); i++) {
+ uboBuffers[i] = std::make_unique<XeBuffer>(
+ xeDevice,
+ sizeof(GlobalUbo),
+ XeSwapChain::MAX_FRAMES_IN_FLIGHT,
+ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
+ uboBuffers[i]->map();
+ }
+
+ auto globalSetLayout = XeDescriptorSetLayout::Builder(xeDevice)
+ .addBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT)
+ .build();
+
+ std::vector<VkDescriptorSet> globalDescriptorSets(XeSwapChain::MAX_FRAMES_IN_FLIGHT);
+ for (int i = 0; i < globalDescriptorSets.size(); i++) {
+ auto bufferInfo = uboBuffers[i]->descriptorInfo();
+ XeDescriptorWriter(*globalSetLayout, *globalPool)
+ .writeBuffer(0, &bufferInfo)
+ .build(globalDescriptorSets[i]);
+ }
+
+ SimpleRenderSystem simpleRenderSystem{xeDevice, xeRenderer.getSwapChainRenderPass(), globalSetLayout->getDescriptorSetLayout()};
+ XeCamera camera{};
+ camera.setViewTarget(glm::vec3(-1.f, -2.f, 20.f), glm::vec3(0.f, 0.f, 2.5f));
+
+ auto viewerObject = XeGameObject::createGameObject();
+ KeyboardMovementController cameraController{};
+
+ auto currentTime = std::chrono::high_resolution_clock::now();
+
+ while (!xeWindow.shouldClose()) {
+ 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(xeWindow.getGLFWwindow(), frameTime, viewerObject);
+ camera.setViewYXZ(viewerObject.transform.translation, viewerObject.transform.rotation);
+
+ float aspect = xeRenderer.getAspectRatio();
+ camera.setPerspectiveProjection(glm::radians(50.f), aspect, 0.1f, 100.f);
+
+ if(auto commandBuffer = xeRenderer.beginFrame()) {
+
+ int frameIndex = xeRenderer.getFrameIndex();
+ XeFrameInfo frameInfo{
+ frameIndex,
+ frameTime,
+ commandBuffer,
+ camera,
+ globalDescriptorSets[frameIndex]
+ };
+
+ // update
+ GlobalUbo ubo{};
+ ubo.projectionView = camera.getProjection() * camera.getView();
+ uboBuffers[frameIndex]->writeToBuffer(&ubo);
+ uboBuffers[frameIndex]->flush();
+
+ // render
+ xeRenderer.beginSwapChainRenderPass(commandBuffer);
+ simpleRenderSystem.renderGameObjects(frameInfo, gameObjects);
+ xeRenderer.endSwapChainRenderPass(commandBuffer);
+ xeRenderer.endFrame();
+ }
+
+ }
+
+ vkDeviceWaitIdle(xeDevice.device());
+
+}
+
+void FirstApp::loadGameObjects() {
+ std::shared_ptr<XeModel> xeModel = XeModel::createModelFromFile(xeDevice, "res/models/stanford-dragon.obj");
+
+ auto cube = XeGameObject::createGameObject();
+ cube.model = xeModel;
+ cube.transform.translation = {.0f, .0f, 2.5f};
+ cube.transform.scale = {.5f, .5f, .5f};
+ gameObjects.push_back(std::move(cube));
+}
+
+} \ No newline at end of file