Added VertexMapper
Former-commit-id: 26765f92782b61443544744ac145ccd02a8ed2b0
This commit is contained in:
parent
962c330390
commit
438d509130
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright (C) 2012 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_VERTEXITERATOR_HPP
|
||||
#define NAZARA_VERTEXITERATOR_HPP
|
||||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
#include <Nazara/Math/Vector2.hpp>
|
||||
#include <Nazara/Math/Vector3.hpp>
|
||||
#include <Nazara/Utility/Enums.hpp>
|
||||
|
||||
class NzSubMesh;
|
||||
class NzVertexBuffer;
|
||||
|
||||
class NzVertexMapperImpl;
|
||||
|
||||
class NAZARA_API NzVertexMapper
|
||||
{
|
||||
public:
|
||||
NzVertexMapper(NzSubMesh* subMesh);
|
||||
~NzVertexMapper();
|
||||
|
||||
NzVector3f GetNormal(unsigned int i) const;
|
||||
NzVector3f GetPosition(unsigned int i) const;
|
||||
NzVector3f GetTangent(unsigned int i) const;
|
||||
NzVector2f GetTexCoords(unsigned int i) const;
|
||||
unsigned int GetTotalVertexCount();
|
||||
|
||||
void SetNormal(unsigned int i, const NzVector3f& normal);
|
||||
void SetPosition(unsigned int i, const NzVector3f& position);
|
||||
void SetTangent(unsigned int i, const NzVector3f& tangent);
|
||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords);
|
||||
|
||||
private:
|
||||
NzVertexMapperImpl* m_impl;
|
||||
};
|
||||
|
||||
#endif // NAZARA_VERTEXITERATOR_HPP
|
||||
|
|
@ -0,0 +1,325 @@
|
|||
// Copyright (C) 2012 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Utility/VertexMapper.hpp>
|
||||
#include <Nazara/Utility/BufferMapper.hpp>
|
||||
#include <Nazara/Utility/Config.hpp>
|
||||
#include <Nazara/Utility/Mesh.hpp> // NzMeshVertex
|
||||
#include <Nazara/Utility/KeyframeMesh.hpp>
|
||||
#include <Nazara/Utility/SkeletalMesh.hpp>
|
||||
#include <Nazara/Utility/StaticMesh.hpp>
|
||||
#include <Nazara/Utility/SubMesh.hpp>
|
||||
#include <Nazara/Utility/Debug.hpp>
|
||||
|
||||
class NzVertexMapperImpl
|
||||
{
|
||||
public:
|
||||
NzVertexMapperImpl() = default;
|
||||
virtual ~NzVertexMapperImpl() = default;
|
||||
|
||||
virtual NzVector3f GetNormal(unsigned int i) const = 0;
|
||||
virtual NzVector3f GetPosition(unsigned int i) const = 0;
|
||||
virtual NzVector3f GetTangent(unsigned int i) const = 0;
|
||||
virtual NzVector2f GetTexCoords(unsigned int i) const = 0;
|
||||
virtual unsigned int GetTotalVertexCount() const = 0;
|
||||
|
||||
virtual void SetNormal(unsigned int i, const NzVector3f& normal) = 0;
|
||||
virtual void SetPosition(unsigned int i, const NzVector3f& position) = 0;
|
||||
virtual void SetTangent(unsigned int i, const NzVector3f& tangent) = 0;
|
||||
virtual void SetTexCoords(unsigned int i, const NzVector2f& texCoords) = 0;
|
||||
};
|
||||
|
||||
namespace
|
||||
{
|
||||
class SubMeshVertexMapper : public NzVertexMapperImpl
|
||||
{
|
||||
public:
|
||||
SubMeshVertexMapper(NzSubMesh* subMesh) :
|
||||
m_subMesh(subMesh)
|
||||
{
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (!m_subMesh)
|
||||
{
|
||||
NazaraError("Invalid subMesh"); ///TODO: Unexpected
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual ~SubMeshVertexMapper() noexcept
|
||||
{
|
||||
m_subMesh->Finish();
|
||||
}
|
||||
|
||||
protected:
|
||||
NzSubMesh* m_subMesh;
|
||||
};
|
||||
|
||||
class KeyframeMeshVertexMapper : public SubMeshVertexMapper
|
||||
{
|
||||
public:
|
||||
KeyframeMeshVertexMapper(NzSubMesh* subMesh) :
|
||||
SubMeshVertexMapper(subMesh)
|
||||
{
|
||||
m_mesh = static_cast<NzKeyframeMesh*>(subMesh);
|
||||
m_vertexPerFrame = m_mesh->GetVertexCount();
|
||||
}
|
||||
|
||||
virtual ~KeyframeMeshVertexMapper() noexcept
|
||||
{
|
||||
}
|
||||
|
||||
NzVector3f GetNormal(unsigned int i) const
|
||||
{
|
||||
return m_mesh->GetNormal(i/m_vertexPerFrame, i%m_vertexPerFrame);
|
||||
}
|
||||
|
||||
NzVector3f GetPosition(unsigned int i) const
|
||||
{
|
||||
return m_mesh->GetPosition(i/m_vertexPerFrame, i%m_vertexPerFrame);
|
||||
}
|
||||
|
||||
NzVector3f GetTangent(unsigned int i) const
|
||||
{
|
||||
return m_mesh->GetTangent(i/m_vertexPerFrame, i%m_vertexPerFrame);
|
||||
}
|
||||
|
||||
NzVector2f GetTexCoords(unsigned int i) const
|
||||
{
|
||||
return m_mesh->GetTexCoords(i%m_vertexPerFrame);
|
||||
}
|
||||
|
||||
unsigned int GetTotalVertexCount() const
|
||||
{
|
||||
return m_vertexPerFrame*m_mesh->GetFrameCount();
|
||||
}
|
||||
|
||||
void SetNormal(unsigned int i, const NzVector3f& normal)
|
||||
{
|
||||
m_mesh->SetNormal(i/m_vertexPerFrame, i%m_vertexPerFrame, normal);
|
||||
}
|
||||
|
||||
void SetPosition(unsigned int i, const NzVector3f& position)
|
||||
{
|
||||
m_mesh->SetPosition(i/m_vertexPerFrame, i%m_vertexPerFrame, position);
|
||||
}
|
||||
|
||||
void SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||
{
|
||||
m_mesh->SetTangent(i/m_vertexPerFrame, i%m_vertexPerFrame, tangent);
|
||||
}
|
||||
|
||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
||||
{
|
||||
m_mesh->SetTexCoords(i%m_vertexPerFrame, texCoords);
|
||||
}
|
||||
|
||||
private:
|
||||
NzKeyframeMesh* m_mesh;
|
||||
unsigned int m_vertexPerFrame;
|
||||
};
|
||||
|
||||
class SkeletalMeshVertexMapper : public SubMeshVertexMapper
|
||||
{
|
||||
public:
|
||||
SkeletalMeshVertexMapper(NzSubMesh* subMesh) :
|
||||
SubMeshVertexMapper(subMesh)
|
||||
{
|
||||
m_mesh = static_cast<NzSkeletalMesh*>(subMesh);
|
||||
m_vertices = reinterpret_cast<NzMeshVertex*>(m_mesh->GetBindPoseBuffer());
|
||||
|
||||
m_mesh->AddResourceReference();
|
||||
}
|
||||
|
||||
virtual ~SkeletalMeshVertexMapper() noexcept
|
||||
{
|
||||
m_mesh->RemoveResourceReference();
|
||||
}
|
||||
|
||||
NzVector3f GetNormal(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].normal;
|
||||
}
|
||||
|
||||
NzVector3f GetPosition(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].position;
|
||||
}
|
||||
|
||||
NzVector3f GetTangent(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].tangent;
|
||||
}
|
||||
|
||||
NzVector2f GetTexCoords(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].uv;
|
||||
}
|
||||
|
||||
unsigned int GetTotalVertexCount() const
|
||||
{
|
||||
return m_mesh->GetVertexCount();
|
||||
}
|
||||
|
||||
void SetNormal(unsigned int i, const NzVector3f& normal)
|
||||
{
|
||||
m_vertices[i].normal = normal;
|
||||
}
|
||||
|
||||
void SetPosition(unsigned int i, const NzVector3f& position)
|
||||
{
|
||||
m_vertices[i].position = position;
|
||||
}
|
||||
|
||||
void SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||
{
|
||||
m_vertices[i].tangent = tangent;
|
||||
}
|
||||
|
||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
||||
{
|
||||
m_vertices[i].uv = texCoords;
|
||||
}
|
||||
|
||||
private:
|
||||
NzMeshVertex* m_vertices;
|
||||
NzSkeletalMesh* m_mesh;
|
||||
};
|
||||
|
||||
class StaticMeshVertexMapper : public SubMeshVertexMapper
|
||||
{
|
||||
public:
|
||||
StaticMeshVertexMapper(NzSubMesh* subMesh) :
|
||||
SubMeshVertexMapper(subMesh),
|
||||
m_vertexMapper(subMesh->GetVertexBuffer(), nzBufferAccess_ReadWrite)
|
||||
{
|
||||
m_vertices = reinterpret_cast<NzMeshVertex*>(m_vertexMapper.GetPointer());
|
||||
}
|
||||
|
||||
virtual ~StaticMeshVertexMapper() noexcept
|
||||
{
|
||||
}
|
||||
|
||||
NzVector3f GetNormal(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].normal;
|
||||
}
|
||||
|
||||
NzVector3f GetPosition(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].position;
|
||||
}
|
||||
|
||||
NzVector3f GetTangent(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].tangent;
|
||||
}
|
||||
|
||||
NzVector2f GetTexCoords(unsigned int i) const
|
||||
{
|
||||
return m_vertices[i].uv;
|
||||
}
|
||||
|
||||
unsigned int GetTotalVertexCount() const
|
||||
{
|
||||
return m_vertexMapper.GetBuffer()->GetVertexCount();
|
||||
}
|
||||
|
||||
void SetNormal(unsigned int i, const NzVector3f& normal)
|
||||
{
|
||||
m_vertices[i].normal = normal;
|
||||
}
|
||||
|
||||
void SetPosition(unsigned int i, const NzVector3f& position)
|
||||
{
|
||||
m_vertices[i].position = position;
|
||||
}
|
||||
|
||||
void SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||
{
|
||||
m_vertices[i].tangent = tangent;
|
||||
}
|
||||
|
||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
||||
{
|
||||
m_vertices[i].uv = texCoords;
|
||||
}
|
||||
|
||||
private:
|
||||
NzBufferMapper<NzVertexBuffer> m_vertexMapper;
|
||||
NzMeshVertex* m_vertices;
|
||||
};
|
||||
}
|
||||
|
||||
NzVertexMapper::NzVertexMapper(NzSubMesh* subMesh)
|
||||
{
|
||||
switch (subMesh->GetAnimationType())
|
||||
{
|
||||
case nzAnimationType_Keyframe:
|
||||
m_impl = new KeyframeMeshVertexMapper(subMesh);
|
||||
break;
|
||||
|
||||
case nzAnimationType_Skeletal:
|
||||
m_impl = new SkeletalMeshVertexMapper(subMesh);
|
||||
break;
|
||||
|
||||
case nzAnimationType_Static:
|
||||
m_impl = new StaticMeshVertexMapper(subMesh);
|
||||
break;
|
||||
}
|
||||
#ifdef NAZARA_DEBUG
|
||||
if (!m_impl)
|
||||
NazaraInternalError("No impl"); ///TODO: Internal, Unexpected
|
||||
#endif
|
||||
}
|
||||
|
||||
NzVertexMapper::~NzVertexMapper()
|
||||
{
|
||||
delete m_impl;
|
||||
}
|
||||
|
||||
NzVector3f NzVertexMapper::GetNormal(unsigned int i) const
|
||||
{
|
||||
return m_impl->GetNormal(i);
|
||||
}
|
||||
|
||||
NzVector3f NzVertexMapper::GetPosition(unsigned int i) const
|
||||
{
|
||||
return m_impl->GetPosition(i);
|
||||
}
|
||||
|
||||
NzVector3f NzVertexMapper::GetTangent(unsigned int i) const
|
||||
{
|
||||
return m_impl->GetTangent(i);
|
||||
}
|
||||
|
||||
NzVector2f NzVertexMapper::GetTexCoords(unsigned int i) const
|
||||
{
|
||||
return m_impl->GetTexCoords(i);
|
||||
}
|
||||
|
||||
unsigned int NzVertexMapper::GetTotalVertexCount()
|
||||
{
|
||||
return m_impl->GetTotalVertexCount();
|
||||
}
|
||||
|
||||
void NzVertexMapper::SetNormal(unsigned int i, const NzVector3f& normal)
|
||||
{
|
||||
m_impl->SetNormal(i, normal);
|
||||
}
|
||||
|
||||
void NzVertexMapper::SetPosition(unsigned int i, const NzVector3f& position)
|
||||
{
|
||||
m_impl->SetPosition(i, position);
|
||||
}
|
||||
|
||||
void NzVertexMapper::SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||
{
|
||||
m_impl->SetTangent(i, tangent);
|
||||
}
|
||||
|
||||
void NzVertexMapper::SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
||||
{
|
||||
m_impl->SetTexCoords(i, texCoords);
|
||||
}
|
||||
Loading…
Reference in New Issue