Changeset 4a9416a in opengl-game for vulkan-game.cpp


Ignore:
Timestamp:
Apr 26, 2020, 9:50:00 PM (4 years ago)
Author:
Dmitry Portnoy <dmitry.portnoy@…>
Branches:
feature/imgui-sdl, master
Children:
b8d4456
Parents:
52a02e6
git-author:
Dmitry Portnoy <dmitry.portnoy@…> (04/26/20 19:00:18)
git-committer:
Dmitry Portnoy <dmitry.portnoy@…> (04/26/20 21:50:00)
Message:

Create a pipeline and shaders to render explosions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    r52a02e6 r4a9416a  
    33#include <array>
    44#include <iostream>
     5#include <numeric>
    56#include <set>
    67
     
    2829   this->asteroid_VP_mats = {};
    2930   this->laser_VP_mats = {};
     31   this->explosion_UBO = {};
    3032}
    3133
     
    564566   laserPipeline.createDescriptorSets(swapChainImages);
    565567
     568   explosionPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ExplosionVertex::particleStartVelocity));
     569   explosionPipeline.addAttribute(VK_FORMAT_R32_SFLOAT, offset_of(&ExplosionVertex::particleStartTime));
     570   explosionPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ExplosionVertex::objIndex));
     571
     572   createBufferSet(sizeof(UBO_Explosion), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
     573      uniformBuffers_explosionPipeline, uniformBuffersMemory_explosionPipeline, uniformBufferInfoList_explosionPipeline);
     574
     575   explosionPipeline.addDescriptorInfo(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
     576      VK_SHADER_STAGE_VERTEX_BIT, &uniformBufferInfoList_explosionPipeline);
     577   explosionPipeline.addStorageDescriptor(VK_SHADER_STAGE_VERTEX_BIT);
     578
     579   explosionPipeline.createDescriptorSetLayout();
     580   explosionPipeline.createPipeline("shaders/explosion-vert.spv", "shaders/explosion-frag.spv");
     581   explosionPipeline.createDescriptorPool(swapChainImages);
     582   explosionPipeline.createDescriptorSets(swapChainImages);
     583
    566584   cout << "Created all the graphics pipelines" << endl;
    567585
     
    591609      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
    592610      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 8, 18, 2);
     611
     612   explosionPipeline = GraphicsPipeline_Vulkan<ExplosionVertex, SSBO_Explosion>(
     613      VK_PRIMITIVE_TOPOLOGY_POINT_LIST, physicalDevice, device, renderPass,
     614      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height },
     615      swapChainImages, EXPLOSION_PARTICLE_COUNT, EXPLOSION_PARTICLE_COUNT, 2);
    593616}
    594617
     
    621644   laser_VP_mats.view = viewMat;
    622645   laser_VP_mats.proj = projMat;
     646
     647   explosion_UBO.view = viewMat;
     648   explosion_UBO.proj = projMat;
    623649}
    624650
     
    691717                     vec3(-0.21f, -1.19f, 1.76f) + offset,
    692718                     vec3(-0.21f, -1.19f, -3.0f) + offset,
    693                      vec3(1.0f, 0.0f, 0.0f), 0.03f);
     719                     LASER_COLOR, 0.03f);
    694720
    695721                  leftLaserIdx = laserObjects.size() - 1;
     
    700726                     vec3(0.21f, -1.19f, 1.76f) + offset,
    701727                     vec3(0.21f, -1.19f, -3.0f) + offset,
    702                      vec3(0.0f, 1.0f, 0.0f), 0.03f);
     728                     LASER_COLOR, 0.03f);
    703729
    704730                  rightLaserIdx = laserObjects.size() - 1;
     
    818844         vec3 objCenter = vec3(viewMat * vec4(asteroid.center, 1.0f));
    819845
    820          if ((objCenter.z - asteroid.radius) > -NEAR_CLIP || asteroid.ssbo.hp <= 0.0f) {
     846         if (asteroid.ssbo.hp <= 0.0f) {
    821847            asteroid.ssbo.deleted = true;
    822848
    823             // TODO: Create explosion here
     849            // TODO: Optimize this so I don't recalculate the camera rotation every time
     850            // TODO: Also, avoid re-declaring cam_pitch
     851            float cam_pitch = -50.0f;
     852            mat4 pitch_mat = rotate(mat4(1.0f), radians(cam_pitch), vec3(1.0f, 0.0f, 0.0f));
     853            mat4 model_mat = translate(mat4(1.0f), asteroid.center) * pitch_mat;
     854
     855            addExplosion(model_mat, 0.5f, curTime);
     856
     857            // TODO: Increment player's score here
     858         } else if ((objCenter.z - asteroid.radius) > -NEAR_CLIP) {
     859            asteroid.ssbo.deleted = true;
    824860         } else {
    825861            asteroid.model_transform =
     
    914950   }
    915951
     952   for (SceneObject<ExplosionVertex, SSBO_Explosion>& explosion : this->explosionObjects) {
     953      if (!explosion.ssbo.deleted) {
     954         if (curTime > (explosion.ssbo.explosionStartTime + explosion.ssbo.explosionDuration)) {
     955            explosion.ssbo.deleted = true;
     956            explosion.modified = true;
     957         }
     958      }
     959   }
     960
    916961   for (size_t i = 0; i < shipObjects.size(); i++) {
    917962      if (shipObjects[i].modified) {
     
    938983   }
    939984
     985   for (size_t i = 0; i < explosionObjects.size(); i++) {
     986      if (explosionObjects[i].modified) {
     987         updateObject(explosionObjects, explosionPipeline, i);
     988      }
     989   }
     990
     991   explosion_UBO.cur_time = curTime;
     992
    940993   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_modelPipeline[currentImage], 0, object_VP_mats);
    941994
     
    945998
    946999   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_laserPipeline[currentImage], 0, laser_VP_mats);
     1000
     1001   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_explosionPipeline[currentImage], 0, explosion_UBO);
    9471002}
    9481003
     
    10511106   asteroidPipeline.cleanupBuffers();
    10521107   laserPipeline.cleanupBuffers();
     1108   explosionPipeline.cleanupBuffers();
    10531109
    10541110   for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
     
    15431599      asteroidPipeline.createRenderCommands(commandBuffers[i], i);
    15441600      laserPipeline.createRenderCommands(commandBuffers[i], i);
     1601      explosionPipeline.createRenderCommands(commandBuffers[i], i);
    15451602
    15461603      // Always render this pipeline last
     
    17971854}
    17981855
     1856void VulkanGame::addExplosion(mat4 model_mat, float duration, float cur_time) {
     1857   vector<ExplosionVertex> vertices;
     1858   vertices.reserve(EXPLOSION_PARTICLE_COUNT);
     1859
     1860   float particle_start_time = 0.0f;
     1861
     1862   for (int i = 0; i < EXPLOSION_PARTICLE_COUNT; i++) {
     1863      float randx = ((float)rand() / (float)RAND_MAX) - 0.5f;
     1864      float randy = ((float)rand() / (float)RAND_MAX) - 0.5f;
     1865
     1866      vertices.push_back({ vec3(randx, randy, 0.0f), particle_start_time});
     1867
     1868      particle_start_time += .01f;
     1869      // TODO: Get this working
     1870      // particle_start_time += 1.0f * EXPLOSION_PARTICLE_COUNT / duration
     1871   }
     1872
     1873   // Fill the indices with the the first EXPLOSION_PARTICLE_COUNT ints
     1874   vector<uint16_t> indices(EXPLOSION_PARTICLE_COUNT);
     1875   iota(indices.begin(), indices.end(), 0);
     1876
     1877   SceneObject<ExplosionVertex, SSBO_Explosion>& explosion = addObject(
     1878      explosionObjects, explosionPipeline,
     1879      addObjectIndex(explosionObjects.size(), vertices),
     1880      indices, {
     1881         mat4(1.0f),
     1882         cur_time,
     1883         duration,
     1884         false
     1885      }, true);
     1886
     1887   explosion.model_base = model_mat;
     1888   explosion.model_transform = mat4(1.0f);
     1889
     1890   explosion.modified = true;
     1891}
     1892
    17991893// TODO: Fix the crash that happens when alt-tabbing
    18001894void VulkanGame::recreateSwapChain() {
     
    18581952   laserPipeline.createDescriptorPool(swapChainImages);
    18591953   laserPipeline.createDescriptorSets(swapChainImages);
     1954
     1955   createBufferSet(sizeof(UBO_Explosion), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
     1956      uniformBuffers_explosionPipeline, uniformBuffersMemory_explosionPipeline, uniformBufferInfoList_explosionPipeline);
     1957
     1958   explosionPipeline.updateRenderPass(renderPass);
     1959   explosionPipeline.createPipeline("shaders/explosion-vert.spv", "shaders/explosion-frag.spv");
     1960   explosionPipeline.createDescriptorPool(swapChainImages);
     1961   explosionPipeline.createDescriptorSets(swapChainImages);
    18601962
    18611963   createCommandBuffers();
     
    18761978   asteroidPipeline.cleanup();
    18771979   laserPipeline.cleanup();
     1980   explosionPipeline.cleanup();
    18781981
    18791982   for (size_t i = 0; i < uniformBuffers_modelPipeline.size(); i++) {
     
    18972000   }
    18982001
     2002   for (size_t i = 0; i < uniformBuffers_explosionPipeline.size(); i++) {
     2003      vkDestroyBuffer(device, uniformBuffers_explosionPipeline[i], nullptr);
     2004      vkFreeMemory(device, uniformBuffersMemory_explosionPipeline[i], nullptr);
     2005   }
     2006
    18992007   vkDestroyRenderPass(device, renderPass, nullptr);
    19002008
Note: See TracChangeset for help on using the changeset viewer.