Commit 8e8cd55e authored by Emeric Verschuur's avatar Emeric Verschuur

Mise en cache du nombre de fragments (entité composée) pour éviter des...

Mise en cache du nombre de fragments (entité composée) pour éviter des parcours intempestifs et inutils de l'arbre des entité
Clonage récursif de l'arbre des entité
Application d'une optique à l'arbre des entité
parent 7962c009
......@@ -18,6 +18,7 @@
#include "LrRay.h"
#include "LrHit.h"
#include "LrPoint.h"
#include "LrOptic.h"
#include <list>
class LrGeometry;
......@@ -50,6 +51,11 @@ public:
*/
virtual LrEntity *clone() const = 0;
/**
* @brief Clone récursif
*/
virtual LrEntity *cloneRec() const = 0;
/**
* @brief Constructeur par copie.
* @param src Référence d'un objet LrEntity.
......@@ -72,6 +78,12 @@ public:
* @param mat Référence d'un objet LrMatrix.
*/
void setMat(const LrMatrix &mat);
/**
* @brief Défini l'optique de l'arbre d'entité.
* @param optic Pointeur sur un objet LrOptic.
*/
virtual void setOpticRec(LrOptic *optic)=0;
/**
* @brief Opérateur d'affectation.
......@@ -94,8 +106,9 @@ public:
/**
* @brief Calcul des matrices de transformation.
* @return le nombre de fragment (usage interne)
*/
virtual void pack(const LrMatrix &mat)=0;
virtual int pack(const LrMatrix &mat)=0;
/**
* @brief Donne d'intersection entre un rayon et l'entitée.
......
......@@ -34,11 +34,28 @@ LrEntityComposed::LrEntityComposed(const LrEntityComposed &src)
{
}
void LrEntityComposed::setOpticRec(LrOptic *optic){
for (LrEntityList::const_iterator it=m_entities.begin();it!=m_entities.end();it++)
{
(*it)->setOpticRec(optic);
}
}
LrEntityComposed * LrEntityComposed::clone() const
{
return new LrEntityComposed(*this);
}
LrEntityComposed * LrEntityComposed::cloneRec() const
{
LrEntityList lst;
for (LrEntityList::const_iterator it=m_entities.begin();it!=m_entities.end();it++)
{
lst.push_back((*it)->cloneRec());
}
return new LrEntityComposed(getMat(), lst);
}
LrEntityComposed::~LrEntityComposed()
{
}
......@@ -63,11 +80,13 @@ bool LrEntityComposed::operator != (const LrEntityComposed& src)
return ! operator == (src);
}
void LrEntityComposed::pack(const LrMatrix &mat){
int LrEntityComposed::pack(const LrMatrix &mat){
m_nbFragments = 0;
for (LrEntityList::const_iterator it=m_entities.begin();it!=m_entities.end();it++)
{
(*it)->pack(mat * getMat());
m_nbFragments += (*it)->pack(mat * getMat());
}
return m_nbFragments;
}
bool LrEntityComposed::getIntersection(const LrRay &ray, LrHit *hit,
......@@ -156,10 +175,11 @@ void LrEntityComposed::getMinMax(LrPoint &min, LrPoint &max, int fragment,
}
int LrEntityComposed::getNbFragments() const{
int somFrags=0;
for (LrEntityList::const_iterator it=m_entities.begin(); it != m_entities.end(); it++)
{
somFrags += (*it)->getNbFragments();
}
return somFrags;
// int somFrags=0;
// for (LrEntityList::const_iterator it=m_entities.begin(); it != m_entities.end(); it++)
// {
// somFrags += (*it)->getNbFragments();
// }
// return somFrags;
return m_nbFragments;
}
......@@ -40,11 +40,22 @@ public:
*/
virtual LrEntityComposed *clone() const;
/**
* @brief Clone récursif
*/
virtual LrEntityComposed *cloneRec() const;
/**
* @brief Destructeur.
*/
virtual ~LrEntityComposed();
/**
* @brief Défini l'optique de l'arbre d'entité.
* @param optic Pointeur sur un objet LrOptic.
*/
virtual void setOpticRec(LrOptic *optic);
/**
* @brief Opérateur d'affectation.
* @param src Entitée source.
......@@ -66,8 +77,9 @@ public:
/**
* @brief Calcul des matrices de transformation.
* @return le nombre de fragment (usage interne)
*/
virtual void pack(const LrMatrix &mat);
virtual int pack(const LrMatrix &mat);
/**
* @brief Donne d'intersection entre un rayon et l'entité.
......@@ -133,6 +145,8 @@ public:
protected:
///@brief Liste des entités
LrEntityList m_entities;
int m_nbFragments;
};
#endif
......@@ -40,10 +40,19 @@ LrEntityElementary * LrEntityElementary::clone() const
return new LrEntityElementary(*this);
}
LrEntityElementary * LrEntityElementary::cloneRec() const
{
return new LrEntityElementary(*this);
}
LrEntityElementary::~LrEntityElementary()
{
}
void LrEntityElementary::setOpticRec(LrOptic *optic){
m_optic = optic;
}
LrEntityElementary& LrEntityElementary::operator = (const LrEntityElementary& src)
{
if (this==&src)
......@@ -66,11 +75,12 @@ bool LrEntityElementary::operator != (const LrEntityElementary& src)
return ! operator == (src);
}
void LrEntityElementary::pack(const LrMatrix &mat){
int LrEntityElementary::pack(const LrMatrix &mat){
m_transfInv = m_transf = mat * getMat();
m_transfInv.inverse();
m_transfInvTransp = m_transfInv;
m_transfInvTransp.transpose();
return m_geometry->getNbFragments();
}
bool LrEntityElementary::getIntersection(const LrRay &ray, LrHit *hit,
......
......@@ -44,12 +44,23 @@ public:
* @brief Clone
*/
virtual LrEntityElementary *clone() const;
/**
* @brief Clone récursif
*/
virtual LrEntityElementary *cloneRec() const;
/**
* @brief Destructeur.
*/
virtual ~LrEntityElementary();
/**
* @brief Défini l'optique de l'arbre d'entité.
* @param optic Pointeur sur un objet LrOptic.
*/
virtual void setOpticRec(LrOptic *optic);
/**
* @brief Opérateur d'affectation.
* @param src Entitée source.
......@@ -71,8 +82,9 @@ public:
/**
* @brief Calcul des matrices de transformation.
* @return le nombre de fragment (usage interne)
*/
virtual void pack(const LrMatrix &mat);
virtual int pack(const LrMatrix &mat);
/**
* @brief Donne d'intersection entre un rayon et l'entitée.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment