From 16cec38f9c648bc92636beef9f25ed520ac6b94b Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 3 Jan 2013 19:42:25 +0100 Subject: [PATCH] Made use of BufferMapper Former-commit-id: 2b24f9d6cabf9fbf639b2c5e9319aaa304fe809a --- src/Nazara/Utility/Loaders/MD2/Loader.cpp | 97 ++++++++++--------- src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp | 65 +++---------- src/Nazara/Utility/SkeletalMesh.cpp | 12 +-- src/Nazara/Utility/StaticMesh.cpp | 11 +-- 4 files changed, 68 insertions(+), 117 deletions(-) diff --git a/src/Nazara/Utility/Loaders/MD2/Loader.cpp b/src/Nazara/Utility/Loaders/MD2/Loader.cpp index 192e54a23..67bfb2efa 100644 --- a/src/Nazara/Utility/Loaders/MD2/Loader.cpp +++ b/src/Nazara/Utility/Loaders/MD2/Loader.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -103,10 +104,8 @@ namespace /// Chargement des submesh // Actuellement le loader ne charge qu'un submesh - // FIXME: Utiliser les commandes OpenGL ? - unsigned int vertexCount = header.num_tris * 3; - - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), vertexCount, parameters.storage, nzBufferUsage_Dynamic)); + std::unique_ptr indexBuffer(new NzIndexBuffer(header.num_tris * 3, false, parameters.storage, nzBufferUsage_Static)); + std::unique_ptr vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), header.num_vertices, parameters.storage, nzBufferUsage_Dynamic)); std::unique_ptr subMesh(new NzKeyframeMesh(mesh)); if (!subMesh->Create(vertexBuffer.get(), header.num_frames)) { @@ -117,27 +116,7 @@ namespace vertexBuffer->SetPersistent(false); vertexBuffer.release(); - /// Lecture des triangles - std::vector triangles(header.num_tris); - - stream.SetCursorPos(header.offset_tris); - stream.Read(&triangles[0], header.num_tris*sizeof(md2_triangle)); - - #ifdef NAZARA_BIG_ENDIAN - for (unsigned int i = 0; i < header.num_tris; ++i) - { - NzByteSwap(&triangles[i].vertices[0], sizeof(nzUInt16)); - NzByteSwap(&triangles[i].texCoords[0], sizeof(nzUInt16)); - - NzByteSwap(&triangles[i].vertices[1], sizeof(nzUInt16)); - NzByteSwap(&triangles[i].texCoords[1], sizeof(nzUInt16)); - - NzByteSwap(&triangles[i].vertices[2], sizeof(nzUInt16)); - NzByteSwap(&triangles[i].texCoords[2], sizeof(nzUInt16)); - } - #endif - - /// Lecture des coordonnées de texture + /// Coordonnées de texture std::vector texCoords(header.num_st); // Lecture des coordonnées de texture @@ -152,6 +131,45 @@ namespace } #endif + /// Lecture des triangles + std::vector triangles(header.num_tris); + + stream.SetCursorPos(header.offset_tris); + stream.Read(&triangles[0], header.num_tris*sizeof(md2_triangle)); + + NzBufferMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + nzUInt16* index = reinterpret_cast(indexMapper.GetPointer()); + + const unsigned int indexFix[3] = {0, 2, 1}; // Pour respécifier les indices dans le bon ordre + + for (unsigned int i = 0; i < header.num_tris; ++i) + { + #ifdef NAZARA_BIG_ENDIAN + NzByteSwap(&triangles[i].vertices[0], sizeof(nzUInt16)); + NzByteSwap(&triangles[i].texCoords[0], sizeof(nzUInt16)); + + NzByteSwap(&triangles[i].vertices[1], sizeof(nzUInt16)); + NzByteSwap(&triangles[i].texCoords[1], sizeof(nzUInt16)); + + NzByteSwap(&triangles[i].vertices[2], sizeof(nzUInt16)); + NzByteSwap(&triangles[i].texCoords[2], sizeof(nzUInt16)); + #endif + + for (unsigned int j = 0; j < 3; ++j) + { + const unsigned int fixedIndex = indexFix[j]; + index[fixedIndex] = triangles[i].vertices[j]; + + const md2_texCoord& texC = texCoords[triangles[i].texCoords[fixedIndex]]; + subMesh->SetTexCoords(triangles[i].vertices[fixedIndex], NzVector2f(static_cast(texC.u) / header.skinwidth, 1.f - static_cast(texC.v)/header.skinheight)); + } + + index += 3; + } + + indexMapper.Unmap(); + subMesh->SetIndexBuffer(indexBuffer.release()); + /// Chargement des frames stream.SetCursorPos(header.offset_frames); @@ -165,7 +183,7 @@ namespace stream.Read(scale, sizeof(NzVector3f)); stream.Read(translate, sizeof(NzVector3f)); - stream.Read(nullptr, 16*sizeof(char)); + stream.Read(nullptr, 16*sizeof(char)); // On avance en ignorant le nom de la frame (Géré par l'animation) stream.Read(vertices.get(), header.num_vertices*sizeof(md2_vertex)); #ifdef NAZARA_BIG_ENDIAN @@ -178,30 +196,13 @@ namespace NzByteSwap(&translate.z, sizeof(float)); #endif - for (unsigned int t = 0; t < header.num_tris; ++t) + for (unsigned int v = 0; v < header.num_vertices; ++v) { - for (unsigned int v = 0; v < 3; ++v) - { - const md2_vertex& vert = vertices[triangles[t].vertices[v]]; - NzVector3f position = rotationQuat * NzVector3f(vert.x * scale.x + translate.x, vert.y * scale.y + translate.y, vert.z * scale.z + translate.z); + const md2_vertex& vert = vertices[v]; + NzVector3f position = rotationQuat * NzVector3f(vert.x * scale.x + translate.x, vert.y * scale.y + translate.y, vert.z * scale.z + translate.z); - // On calcule l'indice (On affecte dans le sens inverse) - unsigned int vertexIndex = vertexCount - (t*3 + v) - 1; - - // Et on finit par copier les éléments dans le buffer - subMesh->SetNormal(f, vertexIndex, md2Normals[vert.n]); - subMesh->SetPosition(f, vertexIndex, position); - } - } - } - - // Définit les coordonnées de textures - for (unsigned int t = 0; t < header.num_tris; ++t) - { - for (unsigned int v = 0; v < 3; ++v) - { - const md2_texCoord& texC = texCoords[triangles[t].texCoords[v]]; - subMesh->SetTexCoords(vertexCount - (t*3 + v) - 1, NzVector2f(texC.u / static_cast(header.skinwidth), 1.f - texC.v / static_cast(header.skinheight))); + subMesh->SetNormal(f, v, md2Normals[vert.n]); + subMesh->SetPosition(f, v, position); } } diff --git a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp index 35293b85f..9fc35c918 100644 --- a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp +++ b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -180,7 +181,6 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) { const Mesh& md5Mesh = m_meshes[i]; - void* ptr; unsigned int indexCount = md5Mesh.triangles.size()*3; unsigned int vertexCount = md5Mesh.vertices.size(); unsigned int weightCount = md5Mesh.weights.size(); @@ -189,22 +189,11 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) bool largeIndices = (vertexCount > std::numeric_limits::max()); std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage)); - if (!indexBuffer->GetBuffer()->IsValid()) - { - NazaraError("Failed to create index buffer"); - continue; - } - - ptr = indexBuffer->Map(nzBufferAccess_WriteOnly); - if (!ptr) - { - NazaraError("Failed to map index buffer"); - continue; - } + NzBufferMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); if (largeIndices) { - nzUInt32* index = reinterpret_cast(ptr); + nzUInt32* index = reinterpret_cast(indexMapper.GetPointer()); for (const Mesh::Triangle& triangle : md5Mesh.triangles) { @@ -216,7 +205,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } else { - nzUInt16* index = reinterpret_cast(ptr); + nzUInt16* index = reinterpret_cast(indexMapper.GetPointer()); for (const Mesh::Triangle& triangle : md5Mesh.triangles) { @@ -227,7 +216,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } } - indexBuffer->Unmap(); + indexMapper.Unmap(); std::unique_ptr vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), vertexCount, m_parameters.storage, nzBufferUsage_Dynamic)); @@ -311,7 +300,6 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) for (unsigned int i = 0; i < m_meshes.size(); ++i) { const Mesh& md5Mesh = m_meshes[i]; - void* ptr; unsigned int indexCount = md5Mesh.triangles.size()*3; unsigned int vertexCount = md5Mesh.vertices.size(); @@ -319,22 +307,11 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) bool largeIndices = (vertexCount > std::numeric_limits::max()); std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage)); - if (!indexBuffer->GetBuffer()->IsValid()) - { - NazaraError("Failed to create index buffer"); - continue; - } - - ptr = indexBuffer->Map(nzBufferAccess_WriteOnly); - if (!ptr) - { - NazaraError("Failed to map index buffer"); - continue; - } + NzBufferMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); if (largeIndices) { - nzUInt32* index = reinterpret_cast(ptr); + nzUInt32* index = reinterpret_cast(indexMapper.GetPointer()); for (const Mesh::Triangle& triangle : md5Mesh.triangles) { @@ -346,7 +323,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } else { - nzUInt16* index = reinterpret_cast(ptr); + nzUInt16* index = reinterpret_cast(indexMapper.GetPointer()); for (const Mesh::Triangle& triangle : md5Mesh.triangles) { @@ -357,25 +334,13 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } } - indexBuffer->Unmap(); + indexMapper.Unmap(); // Vertex buffer std::unique_ptr vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), vertexCount, m_parameters.storage, nzBufferUsage_Dynamic)); - if (!vertexBuffer->GetBuffer()->IsValid()) - { - NazaraError("Failed to create vertex buffer"); - continue; - } + NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - ptr = vertexBuffer->Map(nzBufferAccess_WriteOnly); - if (!ptr) - { - NazaraError("Failed to map vertex buffer"); - continue; - } - - NzAxisAlignedBox aabb; - NzMeshVertex* vertex = reinterpret_cast(ptr); + NzMeshVertex* vertex = reinterpret_cast(vertexMapper.GetPointer()); for (const Mesh::Vertex& md5Vertex : md5Mesh.vertices) { // Skinning MD5 (Formule d'Id Tech) @@ -389,15 +354,12 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } // On retourne le modèle dans le bon sens - finalPos = rotationQuat * finalPos; - aabb.ExtendTo(finalPos); - - vertex->position = finalPos; + vertex->position = rotationQuat * finalPos; vertex->uv.Set(md5Vertex.uv.x, 1.f - md5Vertex.uv.y); vertex++; } - vertexBuffer->Unmap(); + vertexMapper.Unmap(); // Submesh std::unique_ptr subMesh(new NzStaticMesh(mesh)); @@ -410,7 +372,6 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) vertexBuffer->SetPersistent(false); vertexBuffer.release(); - subMesh->SetAABB(aabb); subMesh->SetIndexBuffer(indexBuffer.get()); indexBuffer->SetPersistent(false); diff --git a/src/Nazara/Utility/SkeletalMesh.cpp b/src/Nazara/Utility/SkeletalMesh.cpp index 4884f89fe..2badca925 100644 --- a/src/Nazara/Utility/SkeletalMesh.cpp +++ b/src/Nazara/Utility/SkeletalMesh.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -270,15 +271,10 @@ void NzSkeletalMesh::Skin(const NzSkeleton* skeleton) const } #endif - void* outputBuffer = m_impl->vertexBuffer->Map(nzBufferAccess_DiscardAndWrite); - if (!outputBuffer) - { - NazaraError("Failed to map vertex buffer"); - return; - } + NzBufferMapper mapper(m_impl->vertexBuffer, nzBufferAccess_DiscardAndWrite); NzMeshVertex* inputVertex = reinterpret_cast(m_impl->bindPoseBuffer); - NzMeshVertex* outputVertex = reinterpret_cast(outputBuffer); + NzMeshVertex* outputVertex = reinterpret_cast(mapper.GetPointer()); const NzJoint* joints = skeleton->GetJoints(); unsigned int vertexCount = m_impl->vertexBuffer->GetVertexCount(); @@ -314,8 +310,6 @@ void NzSkeletalMesh::Skin(const NzSkeleton* skeleton) const outputVertex++; } - m_impl->vertexBuffer->Unmap(); - m_impl->aabb = skeleton->GetAABB(); } diff --git a/src/Nazara/Utility/StaticMesh.cpp b/src/Nazara/Utility/StaticMesh.cpp index c3cdea0ba..34e73c404 100644 --- a/src/Nazara/Utility/StaticMesh.cpp +++ b/src/Nazara/Utility/StaticMesh.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -65,13 +66,9 @@ bool NzStaticMesh::GenerateAABB() return true; // On lock le buffer pour itérer sur toutes les positions et composer notre AABB - NzMeshVertex* vertex = reinterpret_cast(m_vertexBuffer->Map(nzBufferAccess_ReadOnly)); - if (!vertex) - { - NazaraWarning("Failed to lock vertex buffer"); - return false; - } + NzBufferMapper mapper(m_vertexBuffer, nzBufferAccess_ReadOnly); + NzMeshVertex* vertex = reinterpret_cast(mapper.GetPointer()); unsigned int vertexCount = m_vertexBuffer->GetVertexCount(); for (unsigned int i = 0; i < vertexCount; ++i) { @@ -79,8 +76,6 @@ bool NzStaticMesh::GenerateAABB() vertex++; } - m_vertexBuffer->Unmap(); - return true; }