adding materials, adding serialization for meshes and materials, random fixes
This commit is contained in:
@@ -10,6 +10,14 @@
|
||||
namespace OpenEngine {
|
||||
|
||||
// SHOULD BE MOVED ==================================
|
||||
|
||||
enum class PrimitiveType
|
||||
{
|
||||
None = 0,
|
||||
Quad,
|
||||
Cube
|
||||
};
|
||||
|
||||
struct MeshVertex
|
||||
{
|
||||
glm::vec3 position;
|
||||
@@ -19,6 +27,15 @@ namespace OpenEngine {
|
||||
uint32_t id = -1;
|
||||
};
|
||||
|
||||
struct Material
|
||||
{
|
||||
glm::vec4 albedo = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
float roughness = 1.0f;
|
||||
float metallic = 1.0f;
|
||||
float ambient_strength = 1.0f;
|
||||
float specular_strength = 1.0f;
|
||||
};
|
||||
|
||||
struct Mesh
|
||||
{
|
||||
Ref<VertexArray> vertex_array;
|
||||
@@ -46,7 +63,8 @@ namespace OpenEngine {
|
||||
static void BeginScene(const EditorCamera& camera);
|
||||
static void EndScene();
|
||||
|
||||
static void DrawMesh(const Ref<Mesh>& mesh, const glm::mat4& transform);
|
||||
static void DrawMesh(const Ref<Mesh>& mesh, Material& material,
|
||||
const glm::mat4& transform);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -86,17 +86,28 @@ namespace OpenEngine {
|
||||
(delete nsc->instance);
|
||||
nsc->instance = nullptr;
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
struct MeshComponent
|
||||
{
|
||||
Ref<Mesh> mesh;
|
||||
PrimitiveType primitive_type = PrimitiveType::None;
|
||||
|
||||
MeshComponent() = default;
|
||||
MeshComponent(const MeshComponent&) = default;
|
||||
MeshComponent(const Ref<Mesh>& mesh)
|
||||
: mesh(mesh) {}
|
||||
: mesh(mesh) {};
|
||||
};
|
||||
|
||||
struct MaterialComponent
|
||||
{
|
||||
Material material;
|
||||
|
||||
MaterialComponent() = default;
|
||||
MaterialComponent(const MaterialComponent&) = default;
|
||||
MaterialComponent(const Material& material)
|
||||
: material(material) {};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace OpenEngine {
|
||||
|
||||
uint32_t viewport_width = 0, viewport_height = 0;
|
||||
|
||||
std::vector<entt::entity> entities_to_be_deleted;
|
||||
std::vector<entt::entity> pending_deletion;
|
||||
|
||||
friend class SceneSerializer;
|
||||
friend class Entity;
|
||||
|
||||
@@ -176,6 +176,9 @@ namespace OpenEngine {
|
||||
};
|
||||
TransformData transform_buffer;
|
||||
Ref<UniformBuffer> transform_uniform_buffer;
|
||||
|
||||
Material material_buffer;
|
||||
Ref<UniformBuffer> material_uniform_buffer;
|
||||
};
|
||||
|
||||
static Renderer3DData renderer_data;
|
||||
@@ -190,6 +193,7 @@ namespace OpenEngine {
|
||||
renderer_data.color_shader_3d = Shader::Create("assets/shaders/color3d.glsl");
|
||||
renderer_data.camera_uniform_buffer = UniformBuffer::Create(sizeof(Renderer3DData::CameraData), 0);
|
||||
renderer_data.transform_uniform_buffer = UniformBuffer::Create(sizeof(Renderer3DData::TransformData), 1);
|
||||
renderer_data.material_uniform_buffer = UniformBuffer::Create(sizeof(Material), 2);
|
||||
|
||||
glEnable(GL_DEBUG_OUTPUT);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
|
||||
@@ -230,7 +234,8 @@ namespace OpenEngine {
|
||||
|
||||
}
|
||||
|
||||
void Renderer3D::DrawMesh(const Ref<Mesh>& mesh, const glm::mat4& transform)
|
||||
void Renderer3D::DrawMesh(const Ref<Mesh>& mesh, Material& material,
|
||||
const glm::mat4& transform)
|
||||
{
|
||||
OE_PROFILE_FUNCTION();
|
||||
|
||||
@@ -239,6 +244,9 @@ namespace OpenEngine {
|
||||
renderer_data.transform_buffer.transform = transform;
|
||||
renderer_data.transform_uniform_buffer->SetData(&renderer_data.transform_buffer, sizeof(Renderer3DData::TransformData));
|
||||
|
||||
renderer_data.material_buffer = material;
|
||||
renderer_data.material_uniform_buffer->SetData(&renderer_data.material_buffer, sizeof(Material));
|
||||
|
||||
mesh->vertex_array->Bind();
|
||||
|
||||
RenderCommand::DrawIndexed(mesh->vertex_array, mesh->indices.size());
|
||||
|
||||
@@ -26,15 +26,15 @@ namespace OpenEngine {
|
||||
|
||||
void Scene::MarkEntityForDeletion(Entity entity)
|
||||
{
|
||||
entities_to_be_deleted.emplace_back(entity);
|
||||
pending_deletion.emplace_back(entity);
|
||||
}
|
||||
|
||||
void Scene::UpdateEntities()
|
||||
{
|
||||
for (auto& entity : entities_to_be_deleted)
|
||||
for (auto& entity : pending_deletion)
|
||||
DeleteEntity(entity);
|
||||
|
||||
entities_to_be_deleted.clear();
|
||||
pending_deletion.clear();
|
||||
}
|
||||
|
||||
void Scene::OnUpdateRuntime()
|
||||
@@ -75,8 +75,13 @@ namespace OpenEngine {
|
||||
|
||||
for (const auto& entity : view) {
|
||||
auto [transform, mesh] = view.get<TransformComponent, MeshComponent>(entity);
|
||||
Material material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, GetTransformFromComp(transform));
|
||||
Entity _entity(entity, this);
|
||||
if (_entity.HasComponent<MaterialComponent>())
|
||||
material = _entity.GetComponents<MaterialComponent>().material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, material, GetTransformFromComp(transform));
|
||||
/*
|
||||
if (sprite.texture)
|
||||
Renderer2D::DrawQuad(GetTransformFromComp(transform),
|
||||
@@ -101,7 +106,13 @@ namespace OpenEngine {
|
||||
for (const auto& entity : view) {
|
||||
auto [transform, mesh] = view.get<TransformComponent, MeshComponent>(entity);
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, GetTransformFromComp(transform));
|
||||
Material material;
|
||||
|
||||
Entity _entity(entity, this);
|
||||
if (_entity.HasComponent<MaterialComponent>())
|
||||
material = _entity.GetComponents<MaterialComponent>().material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, material, GetTransformFromComp(transform));
|
||||
}
|
||||
|
||||
Renderer3D::EndScene();
|
||||
@@ -170,4 +181,9 @@ namespace OpenEngine {
|
||||
void Scene::OnComponentAdded<MeshComponent>(Entity entity, MeshComponent& component)
|
||||
{
|
||||
}
|
||||
|
||||
template<>
|
||||
void Scene::OnComponentAdded<MaterialComponent>(Entity entity, MaterialComponent& component)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#include <cstdint>
|
||||
#include <pch.hpp>
|
||||
|
||||
#include "core.hpp"
|
||||
#include <scene/scene_serializer.hpp>
|
||||
#include "renderer/renderer3d.hpp"
|
||||
#include "scene/components.hpp"
|
||||
#include "scene/entity.hpp"
|
||||
|
||||
@@ -149,6 +151,32 @@ namespace OpenEngine {
|
||||
out << YAML::EndMap; // SpriteRendererComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<MeshComponent>())
|
||||
{
|
||||
out << YAML::Key << "MeshComponent";
|
||||
out << YAML::BeginMap; // MeshComponent
|
||||
|
||||
auto& mesh_component = entity.GetComponents<MeshComponent>();
|
||||
out << YAML::Key << "MeshType" << YAML::Value << (int)mesh_component.primitive_type;
|
||||
|
||||
out << YAML::EndMap; // MeshComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<MaterialComponent>())
|
||||
{
|
||||
out << YAML::Key << "MaterialComponent";
|
||||
out << YAML::BeginMap; // MaterialComponent
|
||||
|
||||
auto& material = entity.GetComponents<MaterialComponent>().material;
|
||||
out << YAML::Key << "Albedo" << YAML::Value << material.albedo;
|
||||
out << YAML::Key << "Roughness" << YAML::Value << material.roughness;
|
||||
out << YAML::Key << "Metalic" << YAML::Value << material.metallic;
|
||||
out << YAML::Key << "AmbiantStrength" << YAML::Value << material.ambient_strength;
|
||||
out << YAML::Key << "SpecularStrength" << YAML::Value << material.specular_strength;
|
||||
|
||||
out << YAML::EndMap; // MaterialComponent
|
||||
}
|
||||
|
||||
out << YAML::EndMap;
|
||||
}
|
||||
|
||||
@@ -241,6 +269,40 @@ namespace OpenEngine {
|
||||
auto& src = deserializedEntity.AddComponent<SpriteRendererComponent>();
|
||||
src.color = spriteRendererComponent["Color"].as<glm::vec4>();
|
||||
}
|
||||
|
||||
auto mesh_component = entity["MeshComponent"];
|
||||
if (mesh_component)
|
||||
{
|
||||
auto& mesh = deserializedEntity.AddComponent<MeshComponent>();
|
||||
switch (mesh.primitive_type) {
|
||||
case OpenEngine::PrimitiveType::Quad:
|
||||
{
|
||||
mesh.mesh = CreateQuad((uint32_t)deserializedEntity);
|
||||
break;
|
||||
}
|
||||
case OpenEngine::PrimitiveType::Cube:
|
||||
{
|
||||
mesh.mesh = CreateCube((uint32_t)deserializedEntity);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto material_component = entity["MaterialComponent"];
|
||||
if (material_component)
|
||||
{
|
||||
auto& material = deserializedEntity.AddComponent<MaterialComponent>();
|
||||
material.material.albedo = material_component["Albedo"].as<glm::vec4>();
|
||||
material.material.roughness = material_component["Roughness"].as<float>();
|
||||
material.material.metallic = material_component["Metalic"].as<float>();
|
||||
material.material.ambient_strength = material_component["AmbiantStrength"].as<float>();
|
||||
material.material.specular_strength = material_component["SpecularStrength"].as<float>();
|
||||
}
|
||||
|
||||
auto mesh = CreateCube((uint32_t)deserializedEntity);
|
||||
deserializedEntity.AddComponent<MeshComponent>(mesh);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user