Merge remote-tracking branch 'refs/remotes/origin/master' into vulkan

Former-commit-id: e4243c916b02d58153bbda5cb317a75dbaba4a1c [formerly b061bd4916fdfb2ddb8f9a5321a2474427cd1e0b]
Former-commit-id: 45002c1ea81078974e4c77a2f70273515c09a134
This commit is contained in:
Lynix
2016-07-08 12:37:07 +02:00
17 changed files with 246 additions and 80 deletions

View File

@@ -298,12 +298,12 @@ namespace Nz
namespace Loaders
{
void RegisterOBJ()
void RegisterOBJLoader()
{
MeshLoader::RegisterLoader(IsSupported, Check, Load);
}
void UnregisterOBJ()
void UnregisterOBJLoader()
{
MeshLoader::UnregisterLoader(IsSupported, Check, Load);
}

View File

@@ -13,8 +13,8 @@ namespace Nz
{
namespace Loaders
{
void RegisterOBJ();
void UnregisterOBJ();
void RegisterOBJLoader();
void UnregisterOBJLoader();
}
}

View File

@@ -125,9 +125,9 @@ namespace Nz
for (unsigned int i = 0; i < vertexCount; ++i)
{
int offset;
int& n = currentMesh->vertices[face.firstVertex + i].normal;
int& p = currentMesh->vertices[face.firstVertex + i].position;
int& t = currentMesh->vertices[face.firstVertex + i].texCoord;
int n = 0;
int p = 0;
int t = 0;
if (std::sscanf(&m_currentLine[pos], "%d/%d/%d%n", &p, &t, &n, &offset) != 3)
{
@@ -199,6 +199,10 @@ namespace Nz
break;
}
currentMesh->vertices[face.firstVertex + i].normal = static_cast<std::size_t>(n);
currentMesh->vertices[face.firstVertex + i].position = static_cast<std::size_t>(p);
currentMesh->vertices[face.firstVertex + i].texCoord = static_cast<std::size_t>(t);
pos += offset;
}

View File

@@ -121,7 +121,7 @@ namespace Nz
ImageType type = image.GetType();
if (type != ImageType_1D && type != ImageType_2D)
{
NazaraError("Image type 0x" + String::Number(type, 16) + " is not ");
NazaraError("Image type 0x" + String::Number(type, 16) + " is not in a supported format");
return false;
}

View File

@@ -12,6 +12,13 @@ namespace Nz
{
namespace
{
UInt32 GetterSequential(const void* buffer, unsigned int i)
{
NazaraUnused(buffer);
return i;
}
UInt32 Getter16(const void* buffer, unsigned int i)
{
const UInt16* ptr = static_cast<const UInt16*>(buffer);
@@ -42,61 +49,67 @@ namespace Nz
}
}
IndexMapper::IndexMapper(IndexBuffer* indexBuffer, BufferAccess access) :
m_indexCount(indexBuffer->GetIndexCount())
IndexMapper::IndexMapper(IndexBuffer* indexBuffer, BufferAccess access, std::size_t indexCount) :
m_indexCount((indexCount != 0) ? indexCount : indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
}
#endif
NazaraAssert(indexCount != 0 || indexBuffer, "Invalid index count with invalid index buffer");
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
if (indexBuffer)
{
m_getter = Getter32;
if (access != BufferAccess_ReadOnly)
m_setter = Setter32;
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
{
m_getter = Getter32;
if (access != BufferAccess_ReadOnly)
m_setter = Setter32;
else
m_setter = SetterError;
}
else
m_setter = SetterError;
{
m_getter = Getter16;
if (access != BufferAccess_ReadOnly)
m_setter = Setter16;
else
m_setter = SetterError;
}
}
else
{
m_getter = Getter16;
if (access != BufferAccess_ReadOnly)
m_setter = Setter16;
else
m_setter = SetterError;
m_getter = GetterSequential;
m_setter = SetterError;
}
}
IndexMapper::IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access) :
IndexMapper::IndexMapper(SubMesh* subMesh, BufferAccess access) :
IndexMapper(subMesh->GetIndexBuffer(), access, (subMesh->GetIndexBuffer()) ? 0 : subMesh->GetVertexCount())
{
}
IndexMapper::IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access, std::size_t indexCount) :
m_setter(SetterError),
m_indexCount(indexBuffer->GetIndexCount())
m_indexCount((indexCount != 0) ? indexCount : indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
NazaraAssert(indexCount != 0 || indexBuffer, "Invalid index count with invalid index buffer");
if (indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
m_getter = Getter32;
else
m_getter = Getter16;
}
#endif
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
m_getter = Getter32;
else
m_getter = Getter16;
m_getter = GetterSequential;
}
IndexMapper::IndexMapper(const SubMesh* subMesh) :
IndexMapper(subMesh->GetIndexBuffer())
IndexMapper::IndexMapper(const SubMesh* subMesh, BufferAccess access) :
IndexMapper(subMesh->GetIndexBuffer(), access, (subMesh->GetIndexBuffer()) ? 0 : subMesh->GetVertexCount())
{
}

View File

@@ -697,4 +697,5 @@ namespace Nz
MeshLoader::LoaderList Mesh::s_loaders;
MeshManager::ManagerMap Mesh::s_managerMap;
MeshManager::ManagerParams Mesh::s_managerParameters;
MeshSaver::SaverList Mesh::s_savers;
}

View File

@@ -17,12 +17,19 @@ namespace Nz
m_triangleIndices[1] = m_indexMapper.Get(1);
m_triangleIndices[2] = m_indexMapper.Get(2);
m_indexCount = indexBuffer->GetIndexCount();
m_indexCount = m_indexMapper.GetIndexCount();
}
TriangleIterator::TriangleIterator(SubMesh* subMesh) :
TriangleIterator(subMesh->GetPrimitiveMode(), subMesh->GetIndexBuffer())
TriangleIterator::TriangleIterator(const SubMesh* subMesh) :
m_primitiveMode(subMesh->GetPrimitiveMode()),
m_indexMapper(subMesh, BufferAccess_ReadOnly)
{
m_currentIndex = 3;
m_triangleIndices[0] = m_indexMapper.Get(0);
m_triangleIndices[1] = m_indexMapper.Get(1);
m_triangleIndices[2] = m_indexMapper.Get(2);
m_indexCount = m_indexMapper.GetIndexCount();
}
bool TriangleIterator::Advance()

View File

@@ -124,7 +124,7 @@ namespace Nz
Loaders::RegisterMD5Anim(); // Loader de fichiers .md5anim (v10)
// Mesh (text)
Loaders::RegisterOBJ();
Loaders::RegisterOBJLoader();
// Mesh
Loaders::RegisterMD2(); // Loader de fichiers .md2 (v8)
@@ -162,7 +162,7 @@ namespace Nz
Loaders::UnregisterMD2();
Loaders::UnregisterMD5Anim();
Loaders::UnregisterMD5Mesh();
Loaders::UnregisterOBJ();
Loaders::UnregisterOBJLoader();
Loaders::UnregisterPCX();
Loaders::UnregisterSTBLoader();
Loaders::UnregisterSTBSaver();

View File

@@ -47,6 +47,42 @@ namespace Nz
ErrorFlags flags(ErrorFlag_ThrowException, true);
m_mapper.Map(vertexBuffer, access);
}
VertexMapper::VertexMapper(const SubMesh* subMesh, BufferAccess access)
{
ErrorFlags flags(ErrorFlag_ThrowException, true);
const VertexBuffer* buffer = nullptr;
switch (subMesh->GetAnimationType())
{
case AnimationType_Skeletal:
{
const SkeletalMesh* skeletalMesh = static_cast<const SkeletalMesh*>(subMesh);
buffer = skeletalMesh->GetVertexBuffer();
break;
}
case AnimationType_Static:
{
const StaticMesh* staticMesh = static_cast<const StaticMesh*>(subMesh);
buffer = staticMesh->GetVertexBuffer();
break;
}
}
if (!buffer)
{
NazaraInternalError("Animation type not handled (0x" + String::Number(subMesh->GetAnimationType(), 16) + ')');
}
m_mapper.Map(buffer, access);
}
VertexMapper::VertexMapper(const VertexBuffer* vertexBuffer, BufferAccess access)
{
ErrorFlags flags(ErrorFlag_ThrowException, true);
m_mapper.Map(vertexBuffer, access);
}
VertexMapper::~VertexMapper() = default;