Program Listing for File ParticleData.h

Return to documentation for file (Simulation/ParticleData.h)

#ifndef __PARTICLEDATA_H__
#define __PARTICLEDATA_H__

#include <vector>
#include "Common/Common.h"


namespace PBD
{
    class VertexData
    {
    private:
        std::vector<Vector3r> m_x;

    public:
        FORCE_INLINE VertexData(void) :
            m_x()
        {
        }

        FORCE_INLINE ~VertexData(void)
        {
            m_x.clear();
        }

        FORCE_INLINE void addVertex(const Vector3r &vertex)
        {
            m_x.push_back(vertex);
        }

        FORCE_INLINE Vector3r &getPosition(const unsigned int i)
        {
            return m_x[i];
        }

        FORCE_INLINE const Vector3r &getPosition(const unsigned int i) const
        {
            return m_x[i];
        }

        FORCE_INLINE void setPosition(const unsigned int i, const Vector3r &pos)
        {
            m_x[i] = pos;
        }

        FORCE_INLINE void resize(const unsigned int newSize)
        {
            m_x.resize(newSize);
        }

        FORCE_INLINE void reserve(const unsigned int newSize)
        {
            m_x.reserve(newSize);
        }

        FORCE_INLINE void release()
        {
            m_x.clear();
        }

        FORCE_INLINE unsigned int size() const
        {
            return (unsigned int)m_x.size();
        }

        FORCE_INLINE const std::vector<Vector3r>& getVertices() const
        {
            return m_x;
        }
    };

    class ParticleData
    {
        private:
            // Mass
            // If the mass is zero, the particle is static
            std::vector<Real> m_masses;
            std::vector<Real> m_invMasses;

            // Dynamic state
            std::vector<Vector3r> m_x0;
            std::vector<Vector3r> m_x;
            std::vector<Vector3r> m_v;
            std::vector<Vector3r> m_a;
            std::vector<Vector3r> m_oldX;
            std::vector<Vector3r> m_lastX;

        public:
            FORCE_INLINE ParticleData(void) :
                  m_masses(),
                  m_invMasses(),
                  m_x0(),
                  m_x(),
                  m_v(),
                  m_a(),
                  m_oldX(),
                  m_lastX()
            {
            }

            FORCE_INLINE ~ParticleData(void)
            {
                m_masses.clear();
                m_invMasses.clear();
                m_x0.clear();
                m_x.clear();
                m_v.clear();
                m_a.clear();
                m_oldX.clear();
                m_lastX.clear();
            }

            FORCE_INLINE void addVertex(const Vector3r &vertex)
            {
                m_x0.push_back(vertex);
                m_x.push_back(vertex);
                m_oldX.push_back(vertex);
                m_lastX.push_back(vertex);
                m_masses.push_back(1.0);
                m_invMasses.push_back(1.0);
                m_v.push_back(Vector3r(0.0, 0.0, 0.0));
                m_a.push_back(Vector3r(0.0, 0.0, 0.0));
            }

            FORCE_INLINE Vector3r &getPosition(const unsigned int i)
            {
                return m_x[i];
            }

            FORCE_INLINE const Vector3r &getPosition(const unsigned int i) const
            {
                return m_x[i];
            }

            FORCE_INLINE void setPosition(const unsigned int i, const Vector3r &pos)
            {
                m_x[i] = pos;
            }

            FORCE_INLINE Vector3r &getPosition0(const unsigned int i)
            {
                return m_x0[i];
            }

            FORCE_INLINE const Vector3r &getPosition0(const unsigned int i) const
            {
                return m_x0[i];
            }

            FORCE_INLINE void setPosition0(const unsigned int i, const Vector3r &pos)
            {
                m_x0[i] = pos;
            }

            FORCE_INLINE Vector3r &getLastPosition(const unsigned int i)
            {
                return m_lastX[i];
            }

            FORCE_INLINE const Vector3r &getLastPosition(const unsigned int i) const
            {
                return m_lastX[i];
            }

            FORCE_INLINE void setLastPosition(const unsigned int i, const Vector3r &pos)
            {
                m_lastX[i] = pos;
            }

            FORCE_INLINE Vector3r &getOldPosition(const unsigned int i)
            {
                return m_oldX[i];
            }

            FORCE_INLINE const Vector3r &getOldPosition(const unsigned int i) const
            {
                return m_oldX[i];
            }

            FORCE_INLINE void setOldPosition(const unsigned int i, const Vector3r &pos)
            {
                m_oldX[i] = pos;
            }

            FORCE_INLINE Vector3r &getVelocity(const unsigned int i)
            {
                return m_v[i];
            }

            FORCE_INLINE const Vector3r &getVelocity(const unsigned int i) const
            {
                return m_v[i];
            }

            FORCE_INLINE void setVelocity(const unsigned int i, const Vector3r &vel)
            {
                m_v[i] = vel;
            }

            FORCE_INLINE Vector3r &getAcceleration(const unsigned int i)
            {
                return m_a[i];
            }

            FORCE_INLINE const Vector3r &getAcceleration(const unsigned int i) const
            {
                return m_a[i];
            }

            FORCE_INLINE void setAcceleration(const unsigned int i, const Vector3r &accel)
            {
                m_a[i] = accel;
            }

            FORCE_INLINE const Real getMass(const unsigned int i) const
            {
                return m_masses[i];
            }

            FORCE_INLINE Real& getMass(const unsigned int i)
            {
                return m_masses[i];
            }

            FORCE_INLINE void setMass(const unsigned int i, const Real mass)
            {
                m_masses[i] = mass;
                if (mass != 0.0)
                    m_invMasses[i] = static_cast<Real>(1.0) / mass;
                else
                    m_invMasses[i] = 0.0;
            }

            FORCE_INLINE const Real getInvMass(const unsigned int i) const
            {
                return m_invMasses[i];
            }

            FORCE_INLINE const unsigned int getNumberOfParticles() const
            {
                return (unsigned int) m_x.size();
            }

            FORCE_INLINE const std::vector<Vector3r>& getVertices() const
            {
                return m_x;
            }

            FORCE_INLINE void resize(const unsigned int newSize)
            {
                m_masses.resize(newSize);
                m_invMasses.resize(newSize);
                m_x0.resize(newSize);
                m_x.resize(newSize);
                m_v.resize(newSize);
                m_a.resize(newSize);
                m_oldX.resize(newSize);
                m_lastX.resize(newSize);
            }

            FORCE_INLINE void reserve(const unsigned int newSize)
            {
                m_masses.reserve(newSize);
                m_invMasses.reserve(newSize);
                m_x0.reserve(newSize);
                m_x.reserve(newSize);
                m_v.reserve(newSize);
                m_a.reserve(newSize);
                m_oldX.reserve(newSize);
                m_lastX.reserve(newSize);
            }

            FORCE_INLINE void release()
            {
                m_masses.clear();
                m_invMasses.clear();
                m_x0.clear();
                m_x.clear();
                m_v.clear();
                m_a.clear();
                m_oldX.clear();
                m_lastX.clear();
            }

            FORCE_INLINE unsigned int size() const
            {
                return (unsigned int) m_x.size();
            }
    };

    class OrientationData
    {
    private:
        // Mass
        // If the mass is zero, the particle is static
        std::vector<Real> m_masses;
        std::vector<Real> m_invMasses;

        // Dynamic state
        std::vector<Quaternionr> m_q0;
        std::vector<Quaternionr> m_q;
        std::vector<Vector3r> m_omega;
        std::vector<Vector3r> m_alpha;
        std::vector<Quaternionr> m_oldQ;
        std::vector<Quaternionr> m_lastQ;

    public:
        FORCE_INLINE OrientationData(void) :
            m_masses(),
            m_invMasses(),
            m_q0(),
            m_q(),
            m_omega(),
            m_alpha(),
            m_oldQ(),
            m_lastQ()
        {
        }

        FORCE_INLINE ~OrientationData(void)
        {
            m_masses.clear();
            m_invMasses.clear();
            m_q0.clear();
            m_q.clear();
            m_omega.clear();
            m_alpha.clear();
            m_oldQ.clear();
            m_lastQ.clear();
        }

        FORCE_INLINE void addQuaternion(const Quaternionr &vertex)
        {
            m_q0.push_back(vertex);
            m_q.push_back(vertex);
            m_oldQ.push_back(vertex);
            m_lastQ.push_back(vertex);
            m_masses.push_back(1.0);
            m_invMasses.push_back(1.0);
            m_omega.push_back(Vector3r(0.0, 0.0, 0.0));
            m_alpha.push_back(Vector3r(0.0, 0.0, 0.0));
        }

        FORCE_INLINE Quaternionr &getQuaternion(const unsigned int i)
        {
            return m_q[i];
        }

        FORCE_INLINE const Quaternionr &getQuaternion(const unsigned int i) const
        {
            return m_q[i];
        }

        FORCE_INLINE void setQuaternion(const unsigned int i, const Quaternionr &pos)
        {
            m_q[i] = pos;
        }

        FORCE_INLINE Quaternionr &getQuaternion0(const unsigned int i)
        {
            return m_q0[i];
        }

        FORCE_INLINE const Quaternionr &getQuaternion0(const unsigned int i) const
        {
            return m_q0[i];
        }

        FORCE_INLINE void setQuaternion0(const unsigned int i, const Quaternionr &pos)
        {
            m_q0[i] = pos;
        }

        FORCE_INLINE Quaternionr &getLastQuaternion(const unsigned int i)
        {
            return m_lastQ[i];
        }

        FORCE_INLINE const Quaternionr &getLastQuaternion(const unsigned int i) const
        {
            return m_lastQ[i];
        }

        FORCE_INLINE void setLastQuaternion(const unsigned int i, const Quaternionr &pos)
        {
            m_lastQ[i] = pos;
        }

        FORCE_INLINE Quaternionr &getOldQuaternion(const unsigned int i)
        {
            return m_oldQ[i];
        }

        FORCE_INLINE const Quaternionr &getOldQuaternion(const unsigned int i) const
        {
            return m_oldQ[i];
        }

        FORCE_INLINE void setOldQuaternion(const unsigned int i, const Quaternionr &pos)
        {
            m_oldQ[i] = pos;
        }

        FORCE_INLINE Vector3r &getVelocity(const unsigned int i)
        {
            return m_omega[i];
        }

        FORCE_INLINE const Vector3r &getVelocity(const unsigned int i) const
        {
            return m_omega[i];
        }

        FORCE_INLINE void setVelocity(const unsigned int i, const Vector3r &vel)
        {
            m_omega[i] = vel;
        }

        FORCE_INLINE Vector3r &getAcceleration(const unsigned int i)
        {
            return m_alpha[i];
        }

        FORCE_INLINE const Vector3r &getAcceleration(const unsigned int i) const
        {
            return m_alpha[i];
        }

        FORCE_INLINE void setAcceleration(const unsigned int i, const Vector3r &accel)
        {
            m_alpha[i] = accel;
        }

        FORCE_INLINE const Real getMass(const unsigned int i) const
        {
            return m_masses[i];
        }

        FORCE_INLINE Real& getMass(const unsigned int i)
        {
            return m_masses[i];
        }

        FORCE_INLINE void setMass(const unsigned int i, const Real mass)
        {
            m_masses[i] = mass;
            if (mass != 0.0)
                m_invMasses[i] = static_cast<Real>(1.0) / mass;
            else
                m_invMasses[i] = 0.0;
        }

        FORCE_INLINE const Real getInvMass(const unsigned int i) const
        {
            return m_invMasses[i];
        }

        FORCE_INLINE const unsigned int getNumberOfQuaternions() const
        {
            return (unsigned int)m_q.size();
        }

        FORCE_INLINE void resize(const unsigned int newSize)
        {
            m_masses.resize(newSize);
            m_invMasses.resize(newSize);
            m_q0.resize(newSize);
            m_q.resize(newSize);
            m_omega.resize(newSize);
            m_alpha.resize(newSize);
            m_oldQ.resize(newSize);
            m_lastQ.resize(newSize);
        }

        FORCE_INLINE void reserve(const unsigned int newSize)
        {
            m_masses.reserve(newSize);
            m_invMasses.reserve(newSize);
            m_q0.reserve(newSize);
            m_q.reserve(newSize);
            m_omega.reserve(newSize);
            m_alpha.reserve(newSize);
            m_oldQ.reserve(newSize);
            m_lastQ.reserve(newSize);
        }

        FORCE_INLINE void release()
        {
            m_masses.clear();
            m_invMasses.clear();
            m_q0.clear();
            m_q.clear();
            m_omega.clear();
            m_alpha.clear();
            m_oldQ.clear();
            m_lastQ.clear();
        }

        FORCE_INLINE unsigned int size() const
        {
            return (unsigned int)m_q.size();
        }
    };
}

#endif