// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include #include namespace Nz { GraphicalMesh::GraphicalMesh(const Mesh& mesh) { assert(mesh.GetAnimationType() == AnimationType::Static); const std::shared_ptr& renderDevice = Graphics::Instance()->GetRenderDevice(); m_subMeshes.reserve(mesh.GetSubMeshCount()); for (std::size_t i = 0; i < mesh.GetSubMeshCount(); ++i) { const SubMesh& subMesh = *mesh.GetSubMesh(i); const StaticMesh& staticMesh = static_cast(subMesh); const std::shared_ptr& indexBuffer = staticMesh.GetIndexBuffer(); const std::shared_ptr& vertexBuffer = staticMesh.GetVertexBuffer(); assert(indexBuffer->GetBuffer()->GetStorage() == DataStorage::Software); const SoftwareBuffer* indexBufferContent = static_cast(indexBuffer->GetBuffer()->GetImpl()); assert(vertexBuffer->GetBuffer()->GetStorage() == DataStorage::Software); const SoftwareBuffer* vertexBufferContent = static_cast(vertexBuffer->GetBuffer()->GetImpl()); auto& submeshData = m_subMeshes.emplace_back(); submeshData.indexBuffer = renderDevice->InstantiateBuffer(BufferType::Index); if (!submeshData.indexBuffer->Initialize(indexBuffer->GetStride() * indexBuffer->GetIndexCount(), BufferUsage::DeviceLocal)) throw std::runtime_error("failed to create index buffer"); if (!submeshData.indexBuffer->Fill(indexBufferContent->GetData() + indexBuffer->GetStartOffset(), 0, indexBuffer->GetEndOffset() - indexBuffer->GetStartOffset())) throw std::runtime_error("failed to fill index buffer"); submeshData.indexCount = indexBuffer->GetIndexCount(); submeshData.vertexBuffer = renderDevice->InstantiateBuffer(BufferType::Vertex); if (!submeshData.vertexBuffer->Initialize(vertexBuffer->GetStride() * vertexBuffer->GetVertexCount(), BufferUsage::DeviceLocal)) throw std::runtime_error("failed to create vertex buffer"); if (!submeshData.vertexBuffer->Fill(vertexBufferContent->GetData() + vertexBuffer->GetStartOffset(), 0, vertexBuffer->GetEndOffset() - vertexBuffer->GetStartOffset())) throw std::runtime_error("failed to fill vertex buffer"); submeshData.vertexDeclaration = vertexBuffer->GetVertexDeclaration(); } } }