vktutorial/first_app.cpp

136 lines
4.4 KiB
C++
Raw Permalink Normal View History

2024-02-21 13:28:50 +08:00
#include "first_app.hpp"
2024-04-03 22:22:29 +08:00
#include "simple_render_system.hpp"
2024-04-12 23:24:53 +08:00
#include "rainbow_system.hpp"
#include "gravity_physics_system.hpp"
2024-02-21 13:28:50 +08:00
2024-04-03 21:28:08 +08:00
// libs
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/glm.hpp>
#include <glm/gtc/constants.hpp>
2024-02-21 13:28:50 +08:00
// std
#include <stdexcept>
#include <array>
2024-04-12 23:24:53 +08:00
2024-02-21 13:28:50 +08:00
namespace hk
{
FirstApp::FirstApp()
{
2024-04-03 21:28:08 +08:00
loadGameObjects();
2024-02-21 13:28:50 +08:00
}
FirstApp::~FirstApp()
{
}
2024-04-12 23:24:53 +08:00
void FirstApp::runGravitySystem()
{
// Gravity Physics System
// Create some Models
std::shared_ptr<Model> squareModel = createSquareModel(m_device, {.5f, .0f});
std::shared_ptr<Model> circleModel = createCircleModel(m_device, 64);
// Create Physics Objects
std::vector<GameObject> physicsObjects{};
auto red = GameObject::createGameObject();
red.m_transform2d.scale = glm::vec2{.05f};
red.m_transform2d.translation = {.5f, .5f};
red.m_color = {1.f, 0.f, 0.f};
red.m_rigidBody2d.velocity = {-.5f, .0f};
red.m_model = circleModel;
physicsObjects.push_back(std::move(red));
auto blue = GameObject::createGameObject();
blue.m_transform2d.scale = glm::vec2{.05f};
blue.m_transform2d.translation = {-.45f, -.25f};
blue.m_color = {0.f, 0.f, 1.f};
blue.m_rigidBody2d.velocity = {.5f, .0f};
blue.m_model = circleModel;
physicsObjects.push_back(std::move(blue));
// Create Vector Field
std::vector<GameObject> vectorField{};
int gridCount = 40;
for (int i = 0; i < gridCount; i++)
{
for(int j = 0; j < gridCount; j ++)
{
auto vf = GameObject::createGameObject();
vf.m_transform2d.scale = glm::vec2{0.005f};
vf.m_transform2d.translation = {-1.0f + (i + 0.5f) * 2.0f / gridCount, -1.0f + (j + 0.5f) * 2.0f / gridCount};
vf.m_color = glm::vec3{1.0f};
vf.m_model = squareModel;
vectorField.push_back(std::move(vf));
}
}
GravityPhysicsSystem gravitySystem(0.81f);
Vec2FieldSystem vecFieldSystem{};
SimpleRenderSystem simpleRenderSystem{m_device, m_renderer.getSwapChainRenderPass()};
while(!m_window.shouldClose())
{
glfwPollEvents();
if (auto commandBuffer = m_renderer.beginFrame())
{
// update system
gravitySystem.update(physicsObjects, 1.f / 60, 5);
vecFieldSystem.update(gravitySystem, physicsObjects, vectorField);
// render system
m_renderer.beginSwapChainRenderPass(commandBuffer);
simpleRenderSystem.renderGameObjects(commandBuffer, physicsObjects);
simpleRenderSystem.renderGameObjects(commandBuffer, vectorField);
m_renderer.endSwapChainRenderPass(commandBuffer);
m_renderer.endFrame();
}
vkDeviceWaitIdle(m_device.device());
}
}
2024-02-21 13:28:50 +08:00
void FirstApp::run()
{
2024-04-03 22:22:29 +08:00
SimpleRenderSystem simpleRenderSystem{m_device, m_renderer.getSwapChainRenderPass()};
2024-04-12 23:24:53 +08:00
RainbowSystem rainbowSystem(2000.0f);
2024-04-03 21:28:08 +08:00
while (!m_window.shouldClose())
2024-02-21 13:28:50 +08:00
{
glfwPollEvents();
2024-04-03 21:28:08 +08:00
2024-04-12 23:24:53 +08:00
// update objects color
rainbowSystem.update(5.0f, m_gameObjects);
2024-04-03 21:28:08 +08:00
if (auto commandBuffer = m_renderer.beginFrame())
{
m_renderer.beginSwapChainRenderPass(commandBuffer);
2024-04-03 22:22:29 +08:00
simpleRenderSystem.renderGameObjects(commandBuffer, m_gameObjects);
2024-04-03 21:28:08 +08:00
m_renderer.endSwapChainRenderPass(commandBuffer);
m_renderer.endFrame();
}
2024-02-21 13:28:50 +08:00
}
2024-04-03 21:28:08 +08:00
vkDeviceWaitIdle(m_device.device());
2024-02-21 13:28:50 +08:00
}
2024-04-03 21:28:08 +08:00
void FirstApp::loadGameObjects()
2024-02-21 13:28:50 +08:00
{
std::vector<Model::Vertex> vertices{
{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}
};
2024-04-03 21:28:08 +08:00
auto model = std::make_shared<Model>(m_device, vertices);
auto triangle = GameObject::createGameObject();
triangle.m_model = model;
triangle.m_color = {.1f, .8f, .1f};
triangle.m_transform2d.translation.x = .2f;
triangle.m_transform2d.scale = {2.0f, .5f};
triangle.m_transform2d.rotation = .25f * glm::two_pi<float>();
m_gameObjects.push_back(std::move(triangle));
2024-02-21 13:28:50 +08:00
}
2024-04-03 22:22:29 +08:00
} // namespace hk