Skip to content

Commit 842ba16

Browse files
authored
Merge pull request #55 from MrScriptX/develop
v1.1 minor update
2 parents 907bca1 + a10e6e1 commit 842ba16

11 files changed

Lines changed: 127 additions & 32 deletions

File tree

Engine/Engine.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Engine::~Engine()
3030
for (size_t t = 0; t < mp_scene->getObjects()[i]->getMeshesCount(); t++)
3131
{
3232
mp_scene->getObjects()[i]->getMesh(t).getMaterial()->DestroyTexture();
33-
mp_scene->getObjects()[i]->getMesh(t).destroyMesh();
33+
mp_scene->getObjects()[i]->getMesh(t).DestroyBuffers();
3434
}
3535

3636
mp_scene->getObjects()[i]->destroy();
@@ -165,13 +165,18 @@ void Engine::update()
165165
m_last_time = current_time;
166166

167167
const int32_t frame = mp_renderer->AcquireNextImage();
168-
if (frame != -1 && (mp_scene->isUpdate(frame) || mp_renderer->IsUpdated(frame)))
168+
if (frame != -1 && (mp_scene->isUpdate(frame) || mp_renderer->NeedUpdate(frame)))
169169
{
170170
mp_renderer->beginRecordCommandBuffers(mp_renderer->getCommandBuffer(frame), mp_renderer->getFrameBuffer(frame));
171171
mp_scene->render(mp_renderer->getCommandBuffer(frame), frame);
172172
mp_renderer->endRecordCommandBuffers(mp_renderer->getCommandBuffer(frame));
173173

174-
mp_renderer->SetUpdate(frame);
174+
mp_renderer->SetUpdated(frame);
175+
176+
if (mp_renderer->IsUpdated())
177+
{
178+
mp_scene->Clean();
179+
}
175180
}
176181

177182
mp_main_camera->UpdateUBO(static_cast<float>(mp_config->width), static_cast<float>(mp_config->height));

Engine/Engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Engine
5353
std::shared_ptr<Camera> mp_main_camera;
5454
std::shared_ptr<Controller> mp_controller;
5555
std::shared_ptr<Config> mp_config;
56-
56+
5757
std::chrono::steady_clock::time_point m_last_time;
5858
};
5959

Engine/renderer/Renderer.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Renderer::Renderer(GLFWwindow& window, uint32_t width, uint32_t height)
1616
{
1717
WIDTH = std::make_unique<uint32_t>(width);
1818
HEIGHT = std::make_unique<uint32_t>(height);
19-
m_is_updated.fill(false);
19+
m_is_updated = { false };
2020

2121
m_pBufferFactory = std::make_unique<VulkanBuffer>(m_graphic);
2222

@@ -223,14 +223,19 @@ const int Renderer::getFrameIndex()
223223
return m_current_image;
224224
}
225225

226-
const bool& Renderer::IsUpdated(const size_t& i)
226+
const bool Renderer::IsUpdated()
227+
{
228+
return m_is_updated == false;
229+
}
230+
231+
const bool Renderer::NeedUpdate(const size_t& i)
227232
{
228233
return m_is_updated[i];
229234
}
230235

231-
void Renderer::SetUpdate(const size_t& i)
236+
void Renderer::SetUpdated(const size_t& i)
232237
{
233-
m_is_updated[i] = false;
238+
m_is_updated.set(i, false);
234239
}
235240

236241
const uint32_t& Renderer::GetHeight()
@@ -668,7 +673,7 @@ void Renderer::recreateSwapchain()
668673
createFramebuffer();
669674
allocateCommandBuffers();
670675

671-
m_is_updated.fill(true);
676+
m_is_updated.set(true);
672677
}
673678

674679
void Renderer::cleanSwapchain()

Engine/renderer/Renderer.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <iostream>
1414
#include <memory>
1515
#include <algorithm>
16+
#include <bitset>
1617

1718
#include "VulkanInstance.h"
1819
#include "VulkanDevice.h"
@@ -57,10 +58,12 @@ class Renderer
5758
std::unique_ptr<VulkanBuffer>& getBufferFactory();
5859
std::unique_ptr<VulkanPipeline>& GetPipelineFactory();
5960
const int getFrameIndex();
60-
const bool& IsUpdated(const size_t& i);
61-
void SetUpdate(const size_t& i);
6261
const uint32_t& GetHeight();
6362

63+
const bool IsUpdated();
64+
const bool NeedUpdate(const size_t& i);
65+
void SetUpdated(const size_t& i);
66+
6467
//rendering
6568
void createVerticesBuffer(std::shared_ptr<std::vector<Vertex>> vertices, Buffer& buffer);
6669
void createIndicesBuffer(std::shared_ptr<std::vector<uint32_t>> indices, Buffer& buffer);
@@ -148,7 +151,7 @@ class Renderer
148151

149152
uint32_t m_current_image = 0;
150153
uint32_t m_last_image = 0;
151-
std::array<bool, 3> m_is_updated;
154+
std::bitset<3> m_is_updated;
152155
};
153156

154157
#endif _RENDERER_H

Engine/world/GameObject.cpp

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ void GameObject::registerDrawCmd(VkCommandBuffer& command_buffer)
3030
}
3131
}
3232

33+
void GameObject::Clean()
34+
{
35+
for (size_t i = 0; i < m_meshes.size(); i++)
36+
{
37+
m_meshes[i].DestroyOldBuffers();
38+
}
39+
}
40+
3341
void GameObject::bindMatToMesh(const size_t& index, std::shared_ptr<Material> p_material)
3442
{
3543
m_meshes[index].bindMaterial(p_material, m_ubo, mp_renderer);
@@ -38,17 +46,34 @@ void GameObject::bindMatToMesh(const size_t& index, std::shared_ptr<Material> p_
3846
void GameObject::LoadMesh(std::vector<Vertex>& vertices, const std::vector<uint32_t>& indices)
3947
{
4048
Mesh mesh(vertices, indices, mp_renderer);
41-
mesh.createBuffer(mp_renderer);
49+
mesh.CreateBuffers(mp_renderer);
4250

43-
m_meshes.push_back(mesh);
51+
m_meshes.push_back(std::move(mesh));
4452
}
4553

4654
void GameObject::loadMesh(const std::string& mesh_path)
4755
{
4856
Mesh mesh(mesh_path, mp_renderer);
49-
mesh.createBuffer(mp_renderer);
57+
mesh.CreateBuffers(mp_renderer);
5058

51-
m_meshes.push_back(mesh);
59+
m_meshes.push_back(std::move(mesh));
60+
}
61+
62+
void GameObject::UpdateMesh(const size_t& index, const std::vector<Vertex>& vertices, const std::vector<uint32_t>& indices)
63+
{
64+
m_meshes[index].SetVertices(vertices);
65+
m_meshes[index].SetIndices(indices);
66+
m_meshes[index].CreateBuffers(mp_renderer);
67+
}
68+
69+
std::vector<Vertex> GameObject::GetVertices(const size_t& index)
70+
{
71+
return m_meshes[index].get_vertices();
72+
}
73+
74+
std::vector<uint32_t> GameObject::GetIndices(const size_t& index)
75+
{
76+
return m_meshes[index].get_indices();
5277
}
5378

5479
void GameObject::UpdateMesh(const size_t& index, const std::vector<Vertex>& vertices, const std::vector<uint32_t>& indices)
@@ -76,7 +101,7 @@ Mesh& GameObject::getMesh(const size_t& index)
76101
void GameObject::setMesh(const size_t& index, std::vector<Vertex> vertices)
77102
{
78103
m_meshes[index].SetVertices(vertices);
79-
m_meshes[index].createBuffer(mp_renderer);
104+
m_meshes[index].CreateBuffers(mp_renderer);
80105
}
81106

82107
void GameObject::setPosition(const glm::vec3& pos)

Engine/world/GameObject.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define _GAMEOBJECT_H
33

44
#include <vector>
5+
#include <utility>
56

67
#include "Mesh.h"
78
#include "../errors.h"
@@ -15,6 +16,7 @@ class GameObject
1516
void destroy();
1617

1718
void registerDrawCmd(VkCommandBuffer& command_buffer);
19+
void Clean();
1820
void bindMatToMesh(const size_t& index, std::shared_ptr<Material> p_material);
1921

2022
// MESH

Engine/world/Mesh.cpp

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22

33
Mesh::Mesh(std::vector<Vertex> vertices, const std::vector<uint32_t>& indices, std::shared_ptr<Renderer> p_renderer) : m_vertices(vertices), m_indices(indices), mp_renderer(p_renderer)
44
{
5+
m_buffer = nullptr;
6+
m_old_buffer = nullptr;
57
}
68

79
Mesh::Mesh(const std::string& obj_path, std::shared_ptr<Renderer> p_renderer) : m_obj_path(obj_path), mp_renderer(p_renderer)
810
{
11+
m_buffer = nullptr;
12+
m_old_buffer = nullptr;
13+
914
loadModel();
1015
}
1116

@@ -17,11 +22,11 @@ void Mesh::draw(const VkCommandBuffer& command_buffer)
1722
{
1823
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, p_material->GetPipeline().handle);
1924

20-
VkBuffer vertex_buffer[] = { m_buffer.vertex };
25+
VkBuffer vertex_buffer[] = { m_buffer->vertex };
2126
VkDeviceSize offsets[] = { 0 };
2227

2328
vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffer, offsets);
24-
vkCmdBindIndexBuffer(command_buffer, m_buffer.index, 0, VK_INDEX_TYPE_UINT32);
29+
vkCmdBindIndexBuffer(command_buffer, m_buffer->index, 0, VK_INDEX_TYPE_UINT32);
2530

2631
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, p_material->GetPipeline().layout, 0, 1, &p_material->getDescriptorSet(), 0, nullptr);
2732

@@ -86,19 +91,47 @@ void Mesh::bindMaterial(std::shared_ptr<Material> mat, VkBuffer& ubo, std::share
8691
p_material = mat;
8792
}
8893

89-
void Mesh::createBuffer(std::shared_ptr<Renderer> engine)
94+
void Mesh::CreateBuffers(std::shared_ptr<Renderer> engine)
9095
{
91-
engine->createVerticesBuffer(std::make_shared<std::vector<Vertex>>(m_vertices), m_buffer);
92-
engine->createIndicesBuffer(std::make_shared<std::vector<uint32_t>>(m_indices), m_buffer);
96+
m_old_buffer = m_buffer;
97+
m_buffer = new Buffer();
98+
99+
engine->createVerticesBuffer(std::make_shared<std::vector<Vertex>>(m_vertices), *m_buffer);
100+
engine->createIndicesBuffer(std::make_shared<std::vector<uint32_t>>(m_indices), *m_buffer);
93101
}
94102

95-
void Mesh::destroyMesh()
103+
void Mesh::DestroyOldBuffers()
96104
{
97-
vkDestroyBuffer(mp_renderer->getDevice(), m_buffer.index, nullptr);
98-
vkFreeMemory(mp_renderer->getDevice(), m_buffer.index_memory, nullptr);
105+
if (m_old_buffer == nullptr)
106+
return;
107+
108+
vkDestroyBuffer(mp_renderer->getDevice(), m_old_buffer->index, nullptr);
109+
vkFreeMemory(mp_renderer->getDevice(), m_old_buffer->index_memory, nullptr);
99110

100-
vkDestroyBuffer(mp_renderer->getDevice(), m_buffer.vertex, nullptr);
101-
vkFreeMemory(mp_renderer->getDevice(), m_buffer.vertex_memory, nullptr);
111+
vkDestroyBuffer(mp_renderer->getDevice(), m_old_buffer->vertex, nullptr);
112+
vkFreeMemory(mp_renderer->getDevice(), m_old_buffer->vertex_memory, nullptr);
113+
114+
delete(m_old_buffer);
115+
m_old_buffer = nullptr;
116+
}
117+
118+
void Mesh::DestroyBuffers()
119+
{
120+
vkDestroyBuffer(mp_renderer->getDevice(), m_buffer->index, nullptr);
121+
vkFreeMemory(mp_renderer->getDevice(), m_buffer->index_memory, nullptr);
122+
123+
vkDestroyBuffer(mp_renderer->getDevice(), m_buffer->vertex, nullptr);
124+
vkFreeMemory(mp_renderer->getDevice(), m_buffer->vertex_memory, nullptr);
125+
}
126+
127+
void Mesh::SetVertices(const std::vector<Vertex>& vertices)
128+
{
129+
m_vertices = vertices;
130+
}
131+
132+
void Mesh::SetIndices(const std::vector<uint32_t>& indices)
133+
{
134+
m_indices = indices;
102135
}
103136

104137
void Mesh::SetVertices(const std::vector<Vertex>& vertices)
@@ -123,7 +156,12 @@ std::vector<uint32_t>& Mesh::get_indices()
123156

124157
Buffer & Mesh::getBuffer()
125158
{
126-
return m_buffer;
159+
return *m_buffer;
160+
}
161+
162+
Buffer* Mesh::GetOldBuffer()
163+
{
164+
return m_old_buffer;
127165
}
128166

129167
std::shared_ptr<Material> Mesh::getMaterial()

Engine/world/Mesh.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,21 @@ class Mesh
2424
void draw(const VkCommandBuffer& command_buffer);
2525
void loadModel();
2626
void bindMaterial(std::shared_ptr<Material> mat, VkBuffer& ubo, std::shared_ptr<Renderer> renderer);
27-
void createBuffer(std::shared_ptr<Renderer> engine);
2827

29-
void destroyMesh();
28+
void CreateBuffers(std::shared_ptr<Renderer> engine);
29+
void DestroyOldBuffers();
30+
void DestroyBuffers();
31+
32+
void SetVertices(const std::vector<Vertex>& vertices);
33+
void SetIndices(const std::vector<uint32_t>& indices);
3034

3135
void SetVertices(const std::vector<Vertex>& vertices);
3236
void SetIndices(const std::vector<uint32_t>& indices);
3337

3438
std::vector<Vertex>& get_vertices();
3539
std::vector<uint32_t>& get_indices();
3640
Buffer& getBuffer();
41+
Buffer* GetOldBuffer();
3742
std::shared_ptr<Material> getMaterial();
3843

3944
private:
@@ -42,10 +47,10 @@ class Mesh
4247
std::vector<Vertex> m_vertices;
4348
std::vector<uint32_t> m_indices;
4449

45-
Buffer m_buffer;
50+
Buffer* m_buffer;
51+
Buffer* m_old_buffer;
4652

4753
std::shared_ptr<Material> p_material;
48-
4954
std::shared_ptr<Renderer> mp_renderer;
5055
};
5156

Engine/world/Scene.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ void Scene::updateUBO(std::shared_ptr<Camera> p_camera, std::shared_ptr<Renderer
7777
}
7878
}
7979

80+
void Scene::Clean()
81+
{
82+
for (size_t i = 0; i < vp_objects.size(); i++)
83+
{
84+
vp_objects[i]->Clean();
85+
}
86+
}
87+
8088
void Scene::Update()
8189
{
8290
m_changed.fill(true);

Engine/world/Scene.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class Scene
2020
R3DResult removeGameObject(std::shared_ptr<GameObject> gameobject);
2121
void render(VkCommandBuffer& command_buffer, const int i);
2222
void updateUBO(std::shared_ptr<Camera> p_camera, std::shared_ptr<Renderer> p_renderer);
23+
void Clean();
2324

2425
void Update();
2526
const bool& isUpdate(const int i);

0 commit comments

Comments
 (0)