added UniqueVertexCollection
This commit is contained in:
parent
f183b15dd7
commit
e5b39df0f4
108
src/geometry/uniquevertexcollection.h
Normal file
108
src/geometry/uniquevertexcollection.h
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
#ifndef __GEOMETRY_UNIQUEVERTEXCOLLECTION_H_INCLUDED__
|
||||||
|
#define __GEOMETRY_UNIQUEVERTEXCOLLECTION_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "vector2.h"
|
||||||
|
#include "vector3.h"
|
||||||
|
#include "uniquevertex.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
typedef std::vector<UniqueVertex> UniqueVertices;
|
||||||
|
|
||||||
|
class UniqueVertexCollection
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UniqueVertexCollection();
|
||||||
|
virtual ~UniqueVertexCollection();
|
||||||
|
|
||||||
|
int32_t Add(const Vector3 &vertex, const Vector3 &normal, const Vector2 &texCoord, uint32_t originalIndex);
|
||||||
|
int32_t Find(const Vector3 &vertex, const Vector3 &normal, const Vector2 &texCoord) const;
|
||||||
|
int32_t Find(uint32_t originalIndex) const;
|
||||||
|
uint32_t GetCountSharing(uint32_t originalIndex) const;
|
||||||
|
|
||||||
|
uint32_t GetCount() const { return m_vertices.size(); }
|
||||||
|
const UniqueVertex* GetVertex(uint32_t i) const { return &m_vertices[i]; }
|
||||||
|
UniqueVertex* GetVertex(uint32_t i) { return &m_vertices[i]; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int32_t Find(const UniqueVertex &vertex) const;
|
||||||
|
|
||||||
|
UniqueVertices m_vertices;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline UniqueVertexCollection::UniqueVertexCollection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UniqueVertexCollection::~UniqueVertexCollection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UniqueVertexCollection::Add(const Vector3 &vertex, const Vector3 &normal, const Vector2 &texCoord, uint32_t originalIndex)
|
||||||
|
{
|
||||||
|
UniqueVertex newVertex;
|
||||||
|
newVertex.vertex = vertex;
|
||||||
|
newVertex.normal = normal;
|
||||||
|
newVertex.texCoord = texCoord;
|
||||||
|
newVertex.originalVertexIndex = originalIndex;
|
||||||
|
|
||||||
|
int32_t existingIndex = Find(newVertex);
|
||||||
|
if (existingIndex > -1)
|
||||||
|
return existingIndex;
|
||||||
|
|
||||||
|
m_vertices.push_back(newVertex);
|
||||||
|
return m_vertices.size() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UniqueVertexCollection::Find(const Vector3 &vertex, const Vector3 &normal, const Vector2 &texCoord) const
|
||||||
|
{
|
||||||
|
for (int32_t i = 0; i < m_vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
const UniqueVertex *v = &m_vertices[i];
|
||||||
|
if (
|
||||||
|
vertex == v->vertex &&
|
||||||
|
normal == v->normal &&
|
||||||
|
texCoord == v->texCoord
|
||||||
|
)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UniqueVertexCollection::Find(uint32_t originalIndex) const
|
||||||
|
{
|
||||||
|
for (int32_t i = 0; i < m_vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
if (m_vertices[i].originalVertexIndex == originalIndex)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t UniqueVertexCollection::GetCountSharing(uint32_t originalIndex) const
|
||||||
|
{
|
||||||
|
uint32_t count = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < m_vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
if (m_vertices[i].originalVertexIndex == originalIndex)
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UniqueVertexCollection::Find(const UniqueVertex &vertex) const
|
||||||
|
{
|
||||||
|
for (int32_t i = 0; i < m_vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
if (vertex.IsSameAs(m_vertices[i]))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Reference in a new issue