Program Listing for File TriangleMesh.cpp

Return to documentation for file (SPlisHSPlasH/TriangleMesh.cpp)

#include "TriangleMesh.h"
#include "Utilities/FileSystem.h"
#include "Utilities/Logger.h"
#include "Utilities/OBJLoader.h"
#include "Utilities/PLYLoader.h"

using namespace SPH;
using namespace std;
using namespace Utilities;

TriangleMesh::TriangleMesh()
{
}

TriangleMesh::~TriangleMesh()
{
    release();
}

void TriangleMesh::initMesh(const unsigned int nPoints, const unsigned int nFaces)
{
    m_x0.reserve(nPoints);
    m_x.reserve(nPoints);
    m_indices.reserve(nFaces*3);
    m_normals.reserve(nFaces);
    m_vertexNormals.reserve(nPoints);
}

void TriangleMesh::release()
{
    m_indices.clear();
    m_x0.clear();
    m_x.clear();
    m_normals.clear();
    m_vertexNormals.clear();
}

void TriangleMesh::addFace(const unsigned int * const indices)
{
    for (unsigned int i=0u; i < 3; i++)
        m_indices.push_back(indices[i]);
}

void TriangleMesh::addFace(const int * const indices)
{
    for (unsigned int i=0u; i < 3; i++)
        m_indices.push_back((unsigned int) indices[i]);
}

void TriangleMesh::addVertex(const Vector3r &vertex)
{
    m_x0.push_back(vertex);
    m_x.push_back(vertex);
}

void SPH::TriangleMesh::updateNormals()
{
    m_normals.resize(numFaces());

    #pragma omp parallel default(shared)
    {
        #pragma omp for schedule(static)
        for (int i = 0; i < (int)numFaces(); i++)
        {
            // Get first three points of face
            const Vector3r &a = m_x[m_indices[3 * i]];
            const Vector3r &b = m_x[m_indices[3 * i + 1]];
            const Vector3r &c = m_x[m_indices[3 * i + 2]];

            // Create normal
            Vector3r v1 = b - a;
            Vector3r v2 = c - a;

            m_normals[i] = v1.cross(v2);
            m_normals[i].normalize();
        }
    }
}

void SPH::TriangleMesh::updateVertexNormals()
{
    m_vertexNormals.resize(numVertices());


    for (unsigned int i = 0; i < numVertices(); i++)
    {
        m_vertexNormals[i].setZero();
    }

    for (unsigned int i = 0u; i < numFaces(); i++)
    {
        const Vector3r &n = m_normals[i];
        m_vertexNormals[m_indices[3*i]] += n;
        m_vertexNormals[m_indices[3*i + 1]] += n;
        m_vertexNormals[m_indices[3*i + 2]] += n;
    }

    for (unsigned int i = 0; i < numVertices(); i++)
    {
        m_vertexNormals[i].normalize();
    }
}

void TriangleMesh::updateMeshTransformation(const Vector3r& x, const Matrix3r& R)
{
    for (unsigned int j = 0; j < numVertices(); j++)
        m_x[j] = R * m_x0[j] + x;
}