#include #include #include #include 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