Nazara now use meters as units

Added scale mesh parameter
Added smooth camera to FirstScene demo


Former-commit-id: b3985e10d84512e3b32f2569ac034ba63ace589a
This commit is contained in:
Lynix
2013-06-13 19:29:59 +02:00
parent 3294f18608
commit bb99d044bb
6 changed files with 109 additions and 22 deletions

View File

@@ -123,7 +123,8 @@ namespace
NzMeshVertex& vertex = meshVertices[positionIt.second];
const NzVector4f& vec = positions[positionIt.first];
vertex.position.Set(vec.x/vec.w, vec.y/vec.w, vec.z/vec.w);
vertex.position.Set(vec.x, vec.y, vec.z);
vertex.position *= parameters.mesh.scale/vec.w;
int index;

View File

@@ -183,6 +183,10 @@ namespace
NzByteSwap(&translate.z, sizeof(float));
#endif
// Un personnage de taille moyenne fait ~50 unités de haut dans Quake 2
// Avec Nazara, 1 unité = 1 mètre, nous devons donc adapter l'échelle
scale *= parameters.scale/29.f; // 50/29 = 1.72 (Soit 1.72 mètre, proche de la taille moyenne d'un individu)
NzBufferMapper<NzVertexBuffer> vertexMapper(vertexBuffer.get(), nzBufferAccess_DiscardAndWrite);
NzMeshVertex* vertex = reinterpret_cast<NzMeshVertex*>(vertexMapper.GetPointer());

View File

@@ -155,6 +155,10 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
NzQuaternionf rotationQuat = NzEulerAnglesf(-90.f, 180.f, 0.f);
NzString baseDir = m_stream.GetDirectory();
// Le hellknight de Doom 3 fait ~120 unités, et il est dit qu'il fait trois mètres
// Nous réduisons donc sa taille de 1/40
NzVector3f scale(m_parameters.scale/40.f);
if (m_parameters.animated)
{
if (!mesh->CreateSkeletal(m_joints.size())) // Ne devrait jamais échouer
@@ -175,8 +179,11 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
joint->SetName(m_joints[i].name);
NzMatrix4f bindMatrix;
bindMatrix.MakeRotation((parent >= 0) ? m_joints[i].bindOrient : rotationQuat * m_joints[i].bindOrient);
bindMatrix.SetTranslation((parent >= 0) ? m_joints[i].bindPos : rotationQuat * m_joints[i].bindPos); // Plus rapide que de multiplier par une matrice de translation
if (parent >= 0)
bindMatrix.MakeTransform(m_joints[i].bindPos, m_joints[i].bindOrient);
else
bindMatrix.MakeTransform(rotationQuat * m_joints[i].bindPos, rotationQuat * m_joints[i].bindOrient, scale);
joint->SetInverseBindMatrix(bindMatrix.InverseAffine());
}
@@ -243,7 +250,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
vertexWeight->weights[j] = vertex.startWeight + j;
}
bindPosVertex->position = finalPos;
bindPosVertex->position = scale * finalPos;
bindPosVertex->uv.Set(vertex.uv.x, 1.f-vertex.uv.y);
bindPosVertex++;
vertexWeight++;
@@ -323,7 +330,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
}
// On retourne le modèle dans le bon sens
vertex->position = rotationQuat * finalPos;
vertex->position = scale * (rotationQuat * finalPos);
vertex->uv.Set(md5Vertex.uv.x, 1.f - md5Vertex.uv.y);
vertex++;
}
@@ -349,6 +356,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
// Material
mesh->SetMaterial(i, baseDir + md5Mesh.shader);
subMesh->GenerateAABB();
subMesh->GenerateNormalsAndTangents();
subMesh->SetMaterialIndex(i);

View File

@@ -37,6 +37,12 @@ bool NzMeshParams::IsValid() const
return false;
}
if (scale == NzVector3f::Zero())
{
NazaraError("Invalid scale");
return false;
}
return true;
}