Switch from Nz prefix to namespace Nz
What a huge commit Former-commit-id: 38ac5eebf70adc1180f571f6006192d28fb99897
This commit is contained in:
@@ -12,199 +12,202 @@
|
||||
#include <stdexcept>
|
||||
#include <Nazara/Utility/Debug.hpp>
|
||||
|
||||
NzSubMesh::NzSubMesh(const NzMesh* parent) :
|
||||
NzRefCounted(false), // Un SubMesh n'est pas persistant par défaut
|
||||
m_primitiveMode(nzPrimitiveMode_TriangleList),
|
||||
m_parent(parent),
|
||||
m_matIndex(0)
|
||||
namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
NzSubMesh::~NzSubMesh()
|
||||
{
|
||||
OnSubMeshRelease(this);
|
||||
}
|
||||
|
||||
void NzSubMesh::GenerateNormals()
|
||||
{
|
||||
NzVertexMapper mapper(this);
|
||||
unsigned int vertexCount = GetVertexCount();
|
||||
|
||||
NzSparsePtr<NzVector3f> normals = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Normal);
|
||||
NzSparsePtr<NzVector3f> positions = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Position);
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
normals[i].MakeZero();
|
||||
|
||||
NzTriangleIterator iterator(this);
|
||||
do
|
||||
SubMesh::SubMesh(const Mesh* parent) :
|
||||
RefCounted(false), // Un SubMesh n'est pas persistant par défaut
|
||||
m_primitiveMode(PrimitiveMode_TriangleList),
|
||||
m_parent(parent),
|
||||
m_matIndex(0)
|
||||
{
|
||||
NzVector3f pos0 = positions[iterator[0]];
|
||||
|
||||
NzVector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
|
||||
NzVector3f normal = dv[0].CrossProduct(dv[1]);
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
normals[iterator[i]] += normal;
|
||||
}
|
||||
while (iterator.Advance());
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
normals[i].Normalize();
|
||||
}
|
||||
|
||||
void NzSubMesh::GenerateNormalsAndTangents()
|
||||
{
|
||||
NzVertexMapper mapper(this);
|
||||
unsigned int vertexCount = GetVertexCount();
|
||||
|
||||
NzSparsePtr<NzVector3f> normals = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Normal);
|
||||
NzSparsePtr<NzVector3f> positions = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Position);
|
||||
NzSparsePtr<NzVector3f> tangents = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Tangent);
|
||||
NzSparsePtr<NzVector2f> texCoords = mapper.GetComponentPtr<NzVector2f>(nzVertexComponent_TexCoord);
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
{
|
||||
normals[i].MakeZero();
|
||||
tangents[i].MakeZero();
|
||||
}
|
||||
|
||||
NzTriangleIterator iterator(this);
|
||||
do
|
||||
SubMesh::~SubMesh()
|
||||
{
|
||||
NzVector3f pos0 = positions[iterator[0]];
|
||||
OnSubMeshRelease(this);
|
||||
}
|
||||
|
||||
NzVector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
void SubMesh::GenerateNormals()
|
||||
{
|
||||
VertexMapper mapper(this);
|
||||
unsigned int vertexCount = GetVertexCount();
|
||||
|
||||
NzVector3f normal = dv[0].CrossProduct(dv[1]);
|
||||
SparsePtr<Vector3f> normals = mapper.GetComponentPtr<Vector3f>(VertexComponent_Normal);
|
||||
SparsePtr<Vector3f> positions = mapper.GetComponentPtr<Vector3f>(VertexComponent_Position);
|
||||
|
||||
NzVector2f uv0 = texCoords[iterator[0]];
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
normals[i].MakeZero();
|
||||
|
||||
NzVector2f duv[2];
|
||||
duv[0] = texCoords[iterator[1]] - uv0;
|
||||
duv[1] = texCoords[iterator[2]] - uv0;
|
||||
|
||||
float coef = 1.f / (duv[0].x*duv[1].y - duv[1].x*duv[0].y);
|
||||
|
||||
NzVector3f tangent;
|
||||
tangent.x = coef * (dv[0].x*duv[1].y + dv[1].x*(-duv[0].y));
|
||||
tangent.y = coef * (dv[0].y*duv[1].y + dv[1].y*(-duv[0].y));
|
||||
tangent.z = coef * (dv[0].z*duv[1].y + dv[1].z*(-duv[0].y));
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
TriangleIterator iterator(this);
|
||||
do
|
||||
{
|
||||
nzUInt32 index = iterator[i];
|
||||
normals[index] += normal;
|
||||
tangents[index] += tangent;
|
||||
Vector3f pos0 = positions[iterator[0]];
|
||||
|
||||
Vector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
|
||||
Vector3f normal = dv[0].CrossProduct(dv[1]);
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
normals[iterator[i]] += normal;
|
||||
}
|
||||
while (iterator.Advance());
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
normals[i].Normalize();
|
||||
}
|
||||
|
||||
void SubMesh::GenerateNormalsAndTangents()
|
||||
{
|
||||
VertexMapper mapper(this);
|
||||
unsigned int vertexCount = GetVertexCount();
|
||||
|
||||
SparsePtr<Vector3f> normals = mapper.GetComponentPtr<Vector3f>(VertexComponent_Normal);
|
||||
SparsePtr<Vector3f> positions = mapper.GetComponentPtr<Vector3f>(VertexComponent_Position);
|
||||
SparsePtr<Vector3f> tangents = mapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent);
|
||||
SparsePtr<Vector2f> texCoords = mapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord);
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
{
|
||||
normals[i].MakeZero();
|
||||
tangents[i].MakeZero();
|
||||
}
|
||||
|
||||
TriangleIterator iterator(this);
|
||||
do
|
||||
{
|
||||
Vector3f pos0 = positions[iterator[0]];
|
||||
|
||||
Vector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
|
||||
Vector3f normal = dv[0].CrossProduct(dv[1]);
|
||||
|
||||
Vector2f uv0 = texCoords[iterator[0]];
|
||||
|
||||
Vector2f duv[2];
|
||||
duv[0] = texCoords[iterator[1]] - uv0;
|
||||
duv[1] = texCoords[iterator[2]] - uv0;
|
||||
|
||||
float coef = 1.f / (duv[0].x*duv[1].y - duv[1].x*duv[0].y);
|
||||
|
||||
Vector3f tangent;
|
||||
tangent.x = coef * (dv[0].x*duv[1].y + dv[1].x*(-duv[0].y));
|
||||
tangent.y = coef * (dv[0].y*duv[1].y + dv[1].y*(-duv[0].y));
|
||||
tangent.z = coef * (dv[0].z*duv[1].y + dv[1].z*(-duv[0].y));
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
{
|
||||
UInt32 index = iterator[i];
|
||||
normals[index] += normal;
|
||||
tangents[index] += tangent;
|
||||
}
|
||||
}
|
||||
while (iterator.Advance());
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
{
|
||||
normals[i].Normalize();
|
||||
tangents[i].Normalize();
|
||||
}
|
||||
}
|
||||
while (iterator.Advance());
|
||||
|
||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||
void SubMesh::GenerateTangents()
|
||||
{
|
||||
normals[i].Normalize();
|
||||
tangents[i].Normalize();
|
||||
}
|
||||
}
|
||||
VertexMapper mapper(this);
|
||||
|
||||
void NzSubMesh::GenerateTangents()
|
||||
{
|
||||
NzVertexMapper mapper(this);
|
||||
SparsePtr<Vector3f> normals = mapper.GetComponentPtr<Vector3f>(VertexComponent_Normal);
|
||||
SparsePtr<Vector3f> positions = mapper.GetComponentPtr<Vector3f>(VertexComponent_Position);
|
||||
SparsePtr<Vector3f> tangents = mapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent);
|
||||
SparsePtr<Vector2f> texCoords = mapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord);
|
||||
|
||||
NzSparsePtr<NzVector3f> normals = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Normal);
|
||||
NzSparsePtr<NzVector3f> positions = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Position);
|
||||
NzSparsePtr<NzVector3f> tangents = mapper.GetComponentPtr<NzVector3f>(nzVertexComponent_Tangent);
|
||||
NzSparsePtr<NzVector2f> texCoords = mapper.GetComponentPtr<NzVector2f>(nzVertexComponent_TexCoord);
|
||||
|
||||
NzTriangleIterator iterator(this);
|
||||
do
|
||||
{
|
||||
NzVector3f pos0 = positions[iterator[0]];
|
||||
NzVector2f uv0 = texCoords[iterator[0]];
|
||||
NzVector2f uv1 = texCoords[iterator[1]];
|
||||
NzVector2f uv2 = texCoords[iterator[2]];
|
||||
|
||||
NzVector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
|
||||
float ds[2];
|
||||
ds[0] = uv1.x - uv0.x;
|
||||
ds[1] = uv2.x - uv0.x;
|
||||
|
||||
NzVector3f ppt;
|
||||
ppt.x = ds[0]*dv[1].x - dv[0].x*ds[1];
|
||||
ppt.y = ds[0]*dv[1].y - dv[0].y*ds[1];
|
||||
ppt.z = ds[0]*dv[1].z - dv[0].z*ds[1];
|
||||
ppt.Normalize();
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
TriangleIterator iterator(this);
|
||||
do
|
||||
{
|
||||
NzVector3f normal = normals[iterator[i]];
|
||||
float d = ppt.DotProduct(normal);
|
||||
Vector3f pos0 = positions[iterator[0]];
|
||||
Vector2f uv0 = texCoords[iterator[0]];
|
||||
Vector2f uv1 = texCoords[iterator[1]];
|
||||
Vector2f uv2 = texCoords[iterator[2]];
|
||||
|
||||
tangents[iterator[i]] = ppt - (d * normal);
|
||||
Vector3f dv[2];
|
||||
dv[0] = positions[iterator[1]] - pos0;
|
||||
dv[1] = positions[iterator[2]] - pos0;
|
||||
|
||||
float ds[2];
|
||||
ds[0] = uv1.x - uv0.x;
|
||||
ds[1] = uv2.x - uv0.x;
|
||||
|
||||
Vector3f ppt;
|
||||
ppt.x = ds[0]*dv[1].x - dv[0].x*ds[1];
|
||||
ppt.y = ds[0]*dv[1].y - dv[0].y*ds[1];
|
||||
ppt.z = ds[0]*dv[1].z - dv[0].z*ds[1];
|
||||
ppt.Normalize();
|
||||
|
||||
for (unsigned int i = 0; i < 3; ++i)
|
||||
{
|
||||
Vector3f normal = normals[iterator[i]];
|
||||
float d = ppt.DotProduct(normal);
|
||||
|
||||
tangents[iterator[i]] = ppt - (d * normal);
|
||||
}
|
||||
}
|
||||
while (iterator.Advance());
|
||||
}
|
||||
while (iterator.Advance());
|
||||
}
|
||||
|
||||
const NzMesh* NzSubMesh::GetParent() const
|
||||
{
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
nzPrimitiveMode NzSubMesh::GetPrimitiveMode() const
|
||||
{
|
||||
return m_primitiveMode;
|
||||
}
|
||||
|
||||
unsigned int NzSubMesh::GetTriangleCount() const
|
||||
{
|
||||
const NzIndexBuffer* indexBuffer = GetIndexBuffer();
|
||||
unsigned int indexCount;
|
||||
if (indexBuffer)
|
||||
indexCount = indexBuffer->GetIndexCount();
|
||||
else
|
||||
indexCount = GetVertexCount();
|
||||
|
||||
switch (m_primitiveMode)
|
||||
const Mesh* SubMesh::GetParent() const
|
||||
{
|
||||
case nzPrimitiveMode_LineList:
|
||||
case nzPrimitiveMode_LineStrip:
|
||||
case nzPrimitiveMode_PointList:
|
||||
return 0;
|
||||
|
||||
case nzPrimitiveMode_TriangleFan:
|
||||
return (indexCount - 1) / 2;
|
||||
|
||||
case nzPrimitiveMode_TriangleList:
|
||||
return indexCount / 3;
|
||||
|
||||
case nzPrimitiveMode_TriangleStrip:
|
||||
return indexCount - 2;
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
NazaraError("Primitive mode not handled (0x" + NzString::Number(m_primitiveMode, 16) + ')');
|
||||
return 0;
|
||||
}
|
||||
PrimitiveMode SubMesh::GetPrimitiveMode() const
|
||||
{
|
||||
return m_primitiveMode;
|
||||
}
|
||||
|
||||
unsigned int NzSubMesh::GetMaterialIndex() const
|
||||
{
|
||||
return m_matIndex;
|
||||
}
|
||||
unsigned int SubMesh::GetTriangleCount() const
|
||||
{
|
||||
const IndexBuffer* indexBuffer = GetIndexBuffer();
|
||||
unsigned int indexCount;
|
||||
if (indexBuffer)
|
||||
indexCount = indexBuffer->GetIndexCount();
|
||||
else
|
||||
indexCount = GetVertexCount();
|
||||
|
||||
void NzSubMesh::SetPrimitiveMode(nzPrimitiveMode mode)
|
||||
{
|
||||
m_primitiveMode = mode;
|
||||
}
|
||||
switch (m_primitiveMode)
|
||||
{
|
||||
case PrimitiveMode_LineList:
|
||||
case PrimitiveMode_LineStrip:
|
||||
case PrimitiveMode_PointList:
|
||||
return 0;
|
||||
|
||||
void NzSubMesh::SetMaterialIndex(unsigned int matIndex)
|
||||
{
|
||||
m_matIndex = matIndex;
|
||||
case PrimitiveMode_TriangleFan:
|
||||
return (indexCount - 1) / 2;
|
||||
|
||||
case PrimitiveMode_TriangleList:
|
||||
return indexCount / 3;
|
||||
|
||||
case PrimitiveMode_TriangleStrip:
|
||||
return indexCount - 2;
|
||||
}
|
||||
|
||||
NazaraError("Primitive mode not handled (0x" + String::Number(m_primitiveMode, 16) + ')');
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int SubMesh::GetMaterialIndex() const
|
||||
{
|
||||
return m_matIndex;
|
||||
}
|
||||
|
||||
void SubMesh::SetPrimitiveMode(PrimitiveMode mode)
|
||||
{
|
||||
m_primitiveMode = mode;
|
||||
}
|
||||
|
||||
void SubMesh::SetMaterialIndex(unsigned int matIndex)
|
||||
{
|
||||
m_matIndex = matIndex;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user