Skip to content

Commit

Permalink
Very basic material system working. Need to test for different materials
Browse files Browse the repository at this point in the history
Will move on after that
  • Loading branch information
tomheeleynz committed Jul 31, 2022
1 parent e7c5b4f commit 69486b5
Show file tree
Hide file tree
Showing 14 changed files with 65 additions and 20 deletions.
40 changes: 26 additions & 14 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanMaterial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,16 @@ namespace Arcane
// Get Material descriptor, then add uniform buffer to it
m_UniformBuffer = UniformBuffer::Create(vulkanShader->GetMaterialSize());

// Create internal structure
m_UniformBufferMemory = new float[vulkanShader->GetMaterialSize()];
}
m_DescriptorSet = vulkanShader->GetMaterialDescriptor();
m_DescriptorSet->AddUniformBuffer(m_UniformBuffer, 2, 0);

void VulkanMaterial::WriteVec3(uint32_t offset, glm::vec3 value)
{
m_UniformBufferMemory[offset] = value.x;
m_UniformBufferMemory[offset + 1] = value.y;
m_UniformBufferMemory[offset + 2] = value.z;
// Create internal structure
m_UniformBufferMemory = new float[3];
}

glm::vec3 VulkanMaterial::GetVec3(uint32_t offset)
void VulkanMaterial::UpdateMaterialData()
{
return glm::vec3(
m_UniformBufferMemory[offset],
m_UniformBufferMemory[offset + 1],
m_UniformBufferMemory[offset + 2]
);
m_UniformBuffer->WriteData((void*)m_UniformBufferMemory, m_Shader->GetMaterialSize());
}

std::vector<ShaderVariable> VulkanMaterial::GetMaterialVariables()
Expand All @@ -48,4 +40,24 @@ namespace Arcane
return m_UniformBuffer;
}

//////////////////////////////////////////////////////////////////
////// Getters and Setters
//////////////////////////////////////////////////////////////////

void VulkanMaterial::WriteVec3(uint32_t offset, glm::vec3 value)
{
m_UniformBufferMemory[offset] = value.x;
m_UniformBufferMemory[offset + 1] = value.y;
m_UniformBufferMemory[offset + 2] = value.z;
}

glm::vec3 VulkanMaterial::GetVec3(uint32_t offset)
{
return glm::vec3(
m_UniformBufferMemory[offset],
m_UniformBufferMemory[offset + 1],
m_UniformBufferMemory[offset + 2]
);
}

}
4 changes: 4 additions & 0 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanMaterial.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ namespace Arcane
// Write Material Variables to material buffer
virtual void WriteVec3(uint32_t offset, glm::vec3 value) override;

void UpdateMaterialData() override;

std::vector<ShaderVariable> GetMaterialVariables();


private:
Shader* m_Shader;
DescriptorSet* m_DescriptorSet;
Expand Down
4 changes: 4 additions & 0 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,10 @@ namespace Arcane {
}
}

void VulkanRenderer::RenderMeshWithMaterial(VertexBuffer* buffer, Pipeline* pipeline, Material* material)
{
}

void VulkanRenderer::RenderQuad(VertexBuffer* buffer, Pipeline* pipeline, std::vector<DescriptorSet*> descriptorSets)
{
Application& app = Application::Get();
Expand Down
1 change: 1 addition & 0 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ namespace Arcane {
void RenderQuad(VertexBuffer* buffer, Pipeline* pipeline, std::vector<DescriptorSet*> descriptorSets);

void RenderMesh(VertexBuffer* buffer, Pipeline* pipeline, std::vector<DescriptorSet*> descriptorSets) override;
void RenderMeshWithMaterial(VertexBuffer* buffer, Pipeline* pipeline, Material* material) override;
private:

};
Expand Down
3 changes: 3 additions & 0 deletions Arcane/src/Arcane/Renderer/Material.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ namespace Arcane
// Write Material Variables to material buffer
virtual void WriteVec3(uint32_t offset, glm::vec3 value) = 0;

// Update Material data from internal structures
virtual void UpdateMaterialData() = 0;

static Material* Create(Shader* shader);
private:
};
Expand Down
5 changes: 5 additions & 0 deletions Arcane/src/Arcane/Renderer/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,9 @@ namespace Arcane {
{
s_RendererAPI->RenderMesh(buffer, pipeline, descriptorSets);
}

void Renderer::RenderMeshWithMaterial(VertexBuffer* buffer, Pipeline* pipeline, Material* material)
{

}
}
2 changes: 2 additions & 0 deletions Arcane/src/Arcane/Renderer/Renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "Pipeline.h"
#include "RendererAPI.h"
#include "RenderPass.h"
#include "Material.h"

namespace Arcane {

Expand All @@ -28,6 +29,7 @@ namespace Arcane {

// Render Mesh
static void RenderMesh(VertexBuffer* buffer, Pipeline* pipeline, std::vector<DescriptorSet*> descriptorSets);
static void RenderMeshWithMaterial(VertexBuffer* buffer, Pipeline* pipeline, Material* material);
private:
};
}
2 changes: 2 additions & 0 deletions Arcane/src/Arcane/Renderer/RendererAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "RenderPass.h"
#include "UniformBuffer.h"
#include "DescriptorSet.h"
#include "Material.h"

namespace Arcane {

Expand Down Expand Up @@ -36,6 +37,7 @@ namespace Arcane {

// Mesh
virtual void RenderMesh(VertexBuffer* buffer, Pipeline* pipeline, std::vector<DescriptorSet*> descriptorSets) = 0;
virtual void RenderMeshWithMaterial(VertexBuffer* buffer, Pipeline* pipeline, Material* materal) = 0;

// Static Renderer Functions
static void SetAPI(RendererAPIType api);
Expand Down
12 changes: 10 additions & 2 deletions Arcane/src/Arcane/Renderer/SceneRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ namespace Arcane
// Transform for meshes
std::vector<TransformComponent> MeshTransforms;

// Materials for meshses
std::vector<Material*> materials;

// Camera to render with
Camera* SceneCamera;
};
Expand Down Expand Up @@ -256,12 +259,15 @@ namespace Arcane

void SceneRenderer::GeometryPass()
{

// Update any per pass resources
Renderer::BeginRenderPass(s_Data.GeometryRenderPass);
{
for (int i = 0; i < s_Data.Meshes.size(); i++)
{
Mesh* currentMesh = s_Data.Meshes[i];
Material* material = s_Data.materials[i];
material->UpdateMaterialData();

// Create Transform Component
TransformComponent& currentMeshComponent = s_Data.MeshTransforms[i];
Expand All @@ -277,7 +283,7 @@ namespace Arcane

for (int j = 0; j < currentMesh->GetSubMeshes().size(); j++) {
SubMesh* currentSubMesh = currentMesh->GetSubMeshes()[j];
Renderer::RenderMesh(currentSubMesh->GetVertexBuffer(), s_Data.GeometryPipeline, {s_Data.GlobalDescriptorSet, s_Data.ObjectDescriptorSet});
Renderer::RenderMesh(currentSubMesh->GetVertexBuffer(), s_Data.GeometryPipeline, {s_Data.GlobalDescriptorSet, s_Data.ObjectDescriptorSet, material->GetDescriptorSet()});
}

}
Expand All @@ -304,12 +310,14 @@ namespace Arcane

s_Data.Meshes.clear();
s_Data.MeshTransforms.clear();
s_Data.materials.clear();
}

void SceneRenderer::SubmitMesh(Mesh* mesh, TransformComponent& transform)
void SceneRenderer::SubmitMesh(Mesh* mesh, TransformComponent& transform, Material* material)
{
s_Data.Meshes.push_back(mesh);
s_Data.MeshTransforms.push_back(transform);
s_Data.materials.push_back(material);
}

void SceneRenderer::SetCamera(Camera* camera)
Expand Down
4 changes: 3 additions & 1 deletion Arcane/src/Arcane/Renderer/SceneRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "UniformBuffer.h"
#include "Camera.h"
#include "DescriptorSet.h"
#include "Material.h"

namespace Arcane
{
Expand All @@ -25,7 +26,8 @@ namespace Arcane
void RenderScene();

void SetCamera(Camera* camera);
void SubmitMesh(Mesh* mesh, TransformComponent& component);
void SubmitMesh(Mesh* mesh, TransformComponent& component, Material* material);


void ResizeScene(uint32_t width, uint32_t height);
private:
Expand Down
5 changes: 3 additions & 2 deletions Arcane/src/Arcane/Scene/Scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ namespace Arcane
{
// Render Mesh
{
auto view = m_Registry.view<MeshComponent, TransformComponent>();
auto view = m_Registry.view<MeshComponent, TransformComponent, MeshRendererComponent>();
for (auto& entity : view)
{
auto& mesh = view.get<MeshComponent>(entity);
auto& transform = view.get<TransformComponent>(entity);
m_SceneRenderer->SubmitMesh(mesh.mesh, transform);
auto& meshRenderer = view.get<MeshRendererComponent>(entity);
m_SceneRenderer->SubmitMesh(mesh.mesh, transform, meshRenderer.material);
}
}
m_SceneRenderer->RenderScene();
Expand Down
2 changes: 1 addition & 1 deletion EnchantingTable/src/Assets/Shaders/Mesh.frag
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void main() {
vec3 specular = specularStrength * spec * lightColor;

// Calculate Result
vec3 result = (ambient + diffuse + specular) * vec3(1.0f, 0.0f, 0.0f);
vec3 result = (ambient + diffuse + specular) * material.color;

// Final Color
Color = vec4(result, 1.0f);
Expand Down
Binary file modified EnchantingTable/src/Assets/Shaders/MeshFrag.spv
Binary file not shown.
1 change: 1 addition & 0 deletions EnchantingTable/src/Panels/EntityPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ void EntityPanel::DrawComponents(Arcane::Entity& entity)
if (variable.Type == Arcane::ShaderVariableType::Vec3)
{
glm::vec3 currentValue = material->GetVec3(variable.offset);

if (currentValue.x < 0)
currentValue = {0.0f, 0.0f, 0.0f};

Expand Down

0 comments on commit 69486b5

Please sign in to comment.