Utility/MeshLoader: Fix pre-transformation matrix not affecting normal and tangents in some cases (Fix #131)

This commit is contained in:
Lynix
2017-08-30 15:58:19 +02:00
parent 4df9c94eb0
commit c48d752ad4
3 changed files with 19 additions and 4 deletions

View File

@@ -219,13 +219,16 @@ namespace Nz
Nz::Matrix4f matrix = Matrix4f::Transform(translate, rotationQuat, scale);
matrix *= parameters.matrix;
Nz::Matrix4f normalMatrix = Matrix4f::Rotate(rotationQuat);
normalMatrix *= parameters.matrix;
for (unsigned int v = 0; v < header.num_vertices; ++v)
{
const MD2_Vertex& vert = vertices[v];
Vector3f position = matrix * Vector3f(vert.x, vert.y, vert.z);
vertex->position = position;
vertex->normal = rotationQuat * md2Normals[vert.n];
vertex->normal = normalMatrix.Transform(md2Normals[vert.n], 0.f);
vertex++;
}

View File

@@ -244,6 +244,12 @@ namespace Nz
indexMapper.Unmap(); // Pour laisser les autres tâches affecter l'index buffer
// Remplissage des vertices
// Make sure the normal matrix won't rescale our normals
Nz::Matrix4f normalMatrix = parameters.matrix;
if (normalMatrix.HasScale())
normalMatrix.ApplyScale(1.f / normalMatrix.GetScale());
bool hasNormals = true;
bool hasTexCoords = true;
BufferMapper<VertexBuffer> vertexMapper(vertexBuffer, BufferAccess_WriteOnly);
@@ -259,7 +265,7 @@ namespace Nz
vertex.position = Vector3f(parameters.matrix * vec);
if (vertexIndices.normal > 0)
vertex.normal = normals[vertexIndices.normal-1];
vertex.normal = normalMatrix.Transform(normals[vertexIndices.normal - 1], 0.f);
else
hasNormals = false;