Commit aa94dd0c authored by Thomas Pitiot 's avatar Thomas Pitiot

up

parent eac00783
#ifndef ParticleAgent_H
#define ParticleAgent_H
#include "mapOperators.h"
#include "utils.h"
#include "pfp_movingObjects.h"
// un particle agent est un agent ponctuel associé à une particule
namespace CGoGN
{
......@@ -18,18 +18,11 @@ namespace MovingObjects
{
class mapOperators;
class ParticleAgent
{
public:
ParticleAgent(Particule * particule, unsigned int numParent, float ro=1.0f, float gr=0.0f, float bl=0.0)
{
part_=particule;
AgentNumero=numParent;
r=ro;
g=gr;
b=bl;
}
ParticleAgent(mapOperators * operators,VEC3 pos, unsigned int numeroAgent, float ro=1.0f, float gr=0.0f, float bl=0.0);
~ParticleAgent()
{
......@@ -50,13 +43,15 @@ public:
// attributs
//particule
Particule * part_;
bool alive;
VEC3 newVelocity_ ;
//couleur
float r;
float g;
float b;
// lien parent
unsigned int AgentNumero;
mapOperators * envMap_;
};
typedef std::vector<ParticleAgent*> ParticleAgents ;
......
......@@ -32,7 +32,7 @@ namespace MovingObjects
class Surface : public EmbeddedEntity
{
public:
Surface(mapOperators *op, float wid, PFPSurface::MAP & surf, int index, float ro, float gr, float bl) ;
Surface(mapOperators *op, float wid, PFPSurface::MAP *surf, int index, float ro, float gr, float bl) ;
inline int getIndexOfParticuleAtVertex(Dart d) const
......
......@@ -2,7 +2,7 @@
#define mapOperators_H
//#define DEBUG_affichage
#define DEBUG_affichage
//#define DEBUG
#include <iostream>
......@@ -30,8 +30,8 @@
#include "pfp_movingObjects.h"
#include "segment.h"
#include "triangle.h"
#include "ParticleAgent.h"
#include "ParticleAgent.h"
#include "ArticulatedObject.h"
#include "Surface.h"
......@@ -71,6 +71,7 @@ public:
VolumeAttribute<bool,MAP> CellOnMaxLevel; // TODO : utiliser un marker ?
float maxCellRay;
void resetPartNeighborsFace(Dart neighbor, unsigned int vLevel);
void resetPartNeighborsEdge(Dart neighbor, unsigned int vLevel);
void simplifyNeedle(Dart celltoSimplify, Dart needleCell); // simplifier une cellule dans le cas du parcours d'aiguille ( needlecell doit etre la cellule du bout de l'aiguille)
bool simplifyCellAgents(Dart volume); // simplifier une cellule dans le cas d'agents ponctuels
bool simplifyVolume (Dart d , CellMarkerMemo<MAP,VOLUME>& smallCells ); // simplifier un volume (aucun test fait ici, le volume parent doit etre de subdivisé une seule fois)
......
......@@ -51,7 +51,7 @@ public :
VEC3 m_positionFace;
VEC3 m_positionVolume;
unsigned int callState;
int callState;
unsigned int crossCell ;
bool debug;
ParticleCell3D(MAP& map) : m(map)
......@@ -86,6 +86,8 @@ public :
inline void setCell(Dart cell)
{
d = cell;
reset_positionFace();
reset_positionVolume();
}
// inline Geom::Orientation3D isLeftENextVertex(const VEC3& c, Dart d, const VEC3& base);
......@@ -119,18 +121,22 @@ public :
void placeOnRightFaceAndRightEdge(const VEC3& current,bool * casON, bool * enDessous);
void conclusionVolume(const VEC3& current,VEC3 tempObjectif, bool * casON, bool * enDessous);
int checkPosInVol();
void reset_positionFace(); // remet a jour la positionFace
void reset_positionVolume(); // remet a jour la positionVolume
void resetParticuleSimplif(Dart newD); // a appeler pour changer la dart visée par une particule et réinitialiser ses positionsFace et Volume ( en cas de simplif )
void resetParticuleSubdiv(); // a appeler pour replacer correctement une particule (apres une subdivision par exemple)
void move(const VEC3& newCurrent)
{
debug=true;
debug=false;
crossCell = NO_CROSS ;
callState=this->getState();
if(!Geom::arePointsEquals(newCurrent, this->getPosition()))
{
if(this->debug)
{
CGoGNout<<"Debut Mouvement Normal "<<CGoGNendl;
}
while(callState!=-1)
{
if(this->m.isBoundaryMarkedCurrent(this->d))
......
......@@ -46,6 +46,33 @@ void ParticleCell3D<PFP>::display()
// std::cout << "position : " << this->m_position << std::endl;
}
template <typename PFP>
int ParticleCell3D<PFP>::checkPosInVol() // renvoie 1 si m_position dedans 0 si dehors et 2 si sur une face du volume courant
{
Dart oldD=d;
bool oldDebug=debug;
VEC3 oldPosFace=this->m_positionFace;
debug=false;
int res= 0;
bool casON=false;
bool enDessous=false;
this->placeOnRightFaceAndRightEdge(this->m_position,&casON,&enDessous);
Geom::Orientation3D wsof =this->whichSideOfFace(this->m_position,this->d);
switch (wsof) {
case Geom::OVER : res=0; break;
case Geom::UNDER : res=1; break;
case Geom::ON : res=2; break;
default : break;
}
d=oldD;
debug=oldDebug;
this->m_positionFace=oldPosFace;
return res;
}
template <typename PFP>
void ParticleCell3D<PFP>:: reset_positionFace()
{
......@@ -505,6 +532,19 @@ if(debug) {
if(interLineSeg(this->position[this->d], v, v*v,this->m_position, current,inter))
{
this->m_position=inter;
if(debug)
{
std::cout << "faceState place sur l'inter : "<<this->m_position<<std::endl;
}
}
else
{
if(debug)
{
std::cout << "faceState pas d'intersection en 3D !!! on fait quoi ? :"<<this->m_position<< std::endl;
exit(1);
}
}
if(casON)
......@@ -568,7 +608,7 @@ if(debug) {
case Geom::UNDER :*enDessous=true; // si on est en dessous on l'indique
break;
case Geom::ON : // si on c'est qu'on aura pas enDessous a vrai
case Geom::ON : // si ON c'est qu'on aura pas enDessous a vrai
break;
default : CGoGNout<<"erreur detection orientation"<<__LINE__<<__FILE__<<CGoGNendl; break;
......@@ -584,9 +624,10 @@ if(debug) {
template <typename PFP>
void ParticleCell3D<PFP>::conclusionVolume(const VEC3& current,VEC3 tempObjectif, bool * casON, bool * enDessous)
{
if(debug) {
std::cout << "debut conclusion volume"<< std::endl;
}
int insideVol=0;
if(debug) {
std::cout << "debut conclusion volume"<< std::endl;
}
Geom::Orientation3D wsof =this->whichSideOfFace(tempObjectif,this->d);
switch (wsof) {
case Geom::UNDER :
......@@ -600,14 +641,21 @@ if(debug) {
else
{
VEC3 inter = VEC3(0,0,0);
if(debug)
{
insideVol=checkPosInVol();
if(insideVol==0)
{
std::cout << "Position outside of current volume !!!!!!!!!!!!!"<<this->m_position<< std::endl;
exit(1);
}
}
if(intersect3D_SegmentTriangle<PFP>(this->m_position,current,this->position[this->m.phi1(this->d)],this->position[this->d],this->m_positionFace,inter)==0)
{
debug=true;
std::cout<<"tempoObj et intersections pas dans la meme zone... on retente" <<std::endl<<std::endl<<std::endl<<std::endl;
this->m_position = tempObjectif;
tempObjectif=(tempObjectif+current)/2;
if(debug) {
std::cout << "intersection pas dans le meme tétra que tempobj, on recommence avec tempo et pos : "<<tempObjectif<<" || "<<this->m_position<< std::endl;
std::cout << "intersection pas dans le meme tétra que tempobj, on recommence avec tempo, pos et checkpos : "<<tempObjectif<<" || "<<this->m_position<<" || "<<insideVol<< std::endl;
}
placeOnRightFaceAndRightEdge (tempObjectif,casON,enDessous);
......@@ -616,6 +664,10 @@ if(debug) {
else
{
this->m_position=inter;
if(debug) {
std::cout << "on se place sur l'inter cas tempoObj inside : "<<this->m_position<< std::endl;
}
this->d=this->m.phi3(this->d);
this->crossCell = CROSS_FACE ;
this->callState=VOLUME;
......@@ -668,18 +720,26 @@ if(debug) {
break;
default : // over l'obj est de l'autre coté de la face
VEC3 inter = VEC3(0,0,0);
//
if(debug)
{
insideVol=checkPosInVol();
if(insideVol==0)
{
std::cout << "Position outside of current volume !!!!!!!!!!!!!"<<this->m_position<< std::endl;
exit(1);
}
}
if(intersect3D_SegmentTriangle<PFP>(this->m_position,current,this->position[this->m.phi1(this->d)],this->position[this->d],this->m_positionFace,inter)==0)
{
if(Geom::arePointsEquals(tempObjectif, this->m_position))
{
std::cout << "stoooooop " << Algo::Surface::Geometry::isPointInVolume<PFP>(this->m,this->d,this->position,this->m_position)<<" position = "<<this->m_position<< std::endl;
std::cout << "stoooooop " << Algo::Surface::Geometry::isPointInVolume<PFP>(this->m,this->d,this->position,this->m_position)<<" position = "<<this->m_position<< " || pos in vol :"<<insideVol<< std::endl;
exit(1);
}
tempObjectif=(tempObjectif+this->m_position)/2;
if(debug) {
std::cout << "intersection pas dans le tétra, on recommence avec objectif tempo et position et inter : "<<tempObjectif<<" || "<<this->m_position<< std::endl;
std::cout << "intersection pas dans le tétra, on recommence avec objectif tempo et position et inter : "<<tempObjectif<<" || "<<this->m_position<< " || pos in vol :"<<insideVol<< std::endl;
}
placeOnRightFaceAndRightEdge (tempObjectif,casON,enDessous);
......@@ -687,7 +747,11 @@ if(debug) {
}
else
{
this->m_position=inter;
this->m_position=inter;
if(debug) {
std::cout << "on se place sur l'inter cas dehors : "<<this->m_position<< std::endl;
}
this->d=this->m.phi3(this->d);
this->crossCell = CROSS_FACE ;
if(*enDessous)
......@@ -699,6 +763,7 @@ if(debug) {
{
if(*casON)
{
this->d=this->m.phi1(this->d);
this->callState=VERTEX;
}
else
......@@ -712,7 +777,7 @@ if(debug) {
}
if(debug) {
std::cout << "fin conclusion volume \n"<< std::endl;
std::cout << "fin conclusion volume, callState : "<<this->callState<<"\n"<< std::endl;
}
}
......
......@@ -55,6 +55,10 @@ public :
this->callState=this->getState();
if(!Geom::arePointsEquals(newCurrent, this->getPosition()))
{
if(this->debug)
{
CGoGNout<<"Debut Mouvement Opti "<<CGoGNendl;
}
while(this->callState!=-1)
{
switch(this->callState) {
......
......@@ -46,12 +46,16 @@ std::vector<Dart> ParticleCell3DMemo<PFP>::move(const VEC3& newCurrent)
template <typename PFP>
std::vector<Dart> ParticleCell3DMemo<PFP>::move(const VEC3& newCurrent, CellMarkerMemo<MAP, VOLUME>& memo_cross)
{
this->debug=true;
this->debug=false;
this->crossCell = NO_CROSS ;
this->callState=this->getState();
memo_cross.mark(this->d);
if(!Geom::arePointsEquals(newCurrent, this->getPosition()))
{
if(this->debug)
{
CGoGNout<<"Debut Mouvement Memo "<<CGoGNendl;
}
while(this->callState!=-1)
{
if(this->m.isBoundaryMarkedCurrent(this->d))
......@@ -62,7 +66,7 @@ std::vector<Dart> ParticleCell3DMemo<PFP>::move(const VEC3& newCurrent, CellMark
break;
}
memo_cross.mark(this->d);
if(this->debug)
{
CGoGNout<<"Memo ";
......
QGLViewer
nl
tinyxml2
/usr/lib64/libGLU.so
/usr/lib64/libGL.so
/usr/lib64/libGLEW.so
/usr/lib64/libz.so
/usr/lib64/libamd.so
/usr/lib64/libcamd.so
/usr/lib64/libccolamd.so
/usr/lib64/libcolamd.so
/usr/lib64/libcholmod.so
/usr/lib64/libspqr.so
/usr/lib64/libldl.so
/usr/lib64/libbtf.so
/usr/lib64/libklu.so
/usr/lib64/libcxsparse.so
/usr/lib64/libumfpack.so
/usr/lib/x86_64-linux-gnu/libGLU.so
/usr/lib/x86_64-linux-gnu/libGL.so
/usr/lib/x86_64-linux-gnu/libSM.so
/usr/lib/x86_64-linux-gnu/libICE.so
/usr/lib/x86_64-linux-gnu/libX11.so
/usr/lib/x86_64-linux-gnu/libXext.so
/usr/lib/x86_64-linux-gnu/libGLEW.so
/usr/lib/x86_64-linux-gnu/libz.so
/usr/lib/x86_64-linux-gnu/libamd.so
/usr/lib/x86_64-linux-gnu/libcamd.so
/usr/lib/x86_64-linux-gnu/libccolamd.so
/usr/lib/x86_64-linux-gnu/libcolamd.so
/usr/lib/x86_64-linux-gnu/libcholmod.so
/usr/lib/x86_64-linux-gnu/libspqr.so
/usr/lib/x86_64-linux-gnu/libldl.so
/usr/lib/x86_64-linux-gnu/libbtf.so
/usr/lib/x86_64-linux-gnu/libklu.so
/usr/lib/x86_64-linux-gnu/libcxsparse.so
/usr/lib/x86_64-linux-gnu/libumfpack.so
pthread
/usr/lib/x86_64-linux-gnu/libboost_regex.so
......@@ -12,11 +12,11 @@ namespace Volume
namespace MovingObjects
{
//initialisation Surface
Surface::Surface(mapOperators * op, float wid,PFPSurface::MAP & surf,int index, float ro, float gr, float bl):
Surface::Surface(mapOperators * op, float wid,PFPSurface::MAP * surf,int index, float ro, float gr, float bl):
EmbeddedEntity( op, wid, ro, gr, bl),
mapOperator(surf)
mapOperator(*surf)
{
surfaceMap = &surf;
surfaceMap = surf;
index_surface=index;
r=ro;
g=gr;
......@@ -24,17 +24,19 @@ Surface::Surface(mapOperators * op, float wid,PFPSurface::MAP & surf,int index,
width=1.0;
nbTriangles=0;
}
void Surface::init()
{
surfaceMap->initImplicitProperties();
initOperators(LERP);
positionSurface = surfaceMap->checkAttribute<VEC3, VERTEX, SurfaceMap>("positionSurface");
}
void Surface::init()
{
indexParticule = surfaceMap->checkAttribute<int, VERTEX, SurfaceMap>("indexParticule");
indexTriangle= surfaceMap->checkAttribute<int, FACE, SurfaceMap>("indexTriangle");
faceColor=surfaceMap->checkAttribute<VEC3, FACE, SurfaceMap>("faceColor");
......
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