Files
XCEngine/engine/src/Resources/Mesh/Mesh.cpp

98 lines
2.4 KiB
C++

#include <XCEngine/Resources/Mesh/Mesh.h>
#include <XCEngine/Resources/Material/Material.h>
#include <XCEngine/Resources/Texture/Texture.h>
#include <cstring>
namespace XCEngine {
namespace Resources {
Mesh::Mesh() = default;
Mesh::~Mesh() = default;
void Mesh::Release() {
m_vertexData.Clear();
m_indexData.Clear();
m_sections.Clear();
m_materials.Clear();
m_textures.Clear();
m_vertexCount = 0;
m_vertexStride = 0;
m_attributes = VertexAttribute::Position;
m_indexCount = 0;
m_use32BitIndex = false;
m_bounds = Math::Bounds();
UpdateMemorySize();
SetInvalid();
}
void Mesh::SetVertexData(const void* data, size_t size, Core::uint32 vertexCount,
Core::uint32 vertexStride, VertexAttribute attributes) {
m_vertexCount = vertexCount;
m_vertexStride = vertexStride;
m_attributes = attributes;
m_vertexData.Resize(size);
if (size > 0 && data != nullptr) {
std::memcpy(m_vertexData.Data(), data, size);
}
UpdateMemorySize();
}
void Mesh::SetIndexData(const void* data, size_t size, Core::uint32 indexCount, bool use32Bit) {
m_indexCount = indexCount;
m_use32BitIndex = use32Bit;
m_indexData.Resize(size);
if (size > 0 && data != nullptr) {
std::memcpy(m_indexData.Data(), data, size);
}
UpdateMemorySize();
}
void Mesh::AddSection(const MeshSection& section) {
m_sections.PushBack(section);
UpdateMemorySize();
}
void Mesh::AddMaterial(Material* material) {
m_materials.PushBack(material);
UpdateMemorySize();
}
void Mesh::AddTexture(Texture* texture) {
m_textures.PushBack(texture);
UpdateMemorySize();
}
Material* Mesh::GetMaterial(Core::uint32 index) const {
if (index >= m_materials.Size()) {
return nullptr;
}
return m_materials[index];
}
void Mesh::UpdateMemorySize() {
m_memorySize = m_vertexData.Size() +
m_indexData.Size() +
m_sections.Size() * sizeof(MeshSection) +
m_materials.Size() * sizeof(Material*) +
m_textures.Size() * sizeof(Texture*);
for (const Material* material : m_materials) {
if (material != nullptr) {
m_memorySize += material->GetMemorySize();
}
}
for (const Texture* texture : m_textures) {
if (texture != nullptr) {
m_memorySize += texture->GetMemorySize();
}
}
}
} // namespace Resources
} // namespace XCEngine