Commit 70a6de52 authored by pitiot's avatar pitiot

maj avec subdiv mais pas simplif

parent e2acbb61
......@@ -37,10 +37,12 @@ struct PFP : public PFP_STANDARD
// definition des listes d'agent
typedef std::vector<Agent*> AGENTS ;
typedef std::vector<Obstacle*> OBSTACLES ;
typedef std::vector<MovingObstacle*> MOVINGOBSTACLES;
typedef NoMathIONameAttribute<AGENTS> AGENTVECT ;
typedef NoMathIONameAttribute<OBSTACLES> OBSTACLEVECT ;
typedef NoMathIONameAttribute<MOVINGOBSTACLES> MOVINGOBSTACLEVECT;
typedef VertexAttribute<PFP::VEC3> TVEC3;
......@@ -194,7 +196,7 @@ void update_registration(Obstacle * o);
void register_pop(Obstacle* o, int n);
void resetObstInFace(Obstacle* o);
void resetObstPartInFace(Obstacle* o, Dart d);
void resetPart(MovingObstacle * mo, Dart d);
void resetPart(MovingObstacle * mo,int index, Dart d);
void displayMO(Obstacle * o);
/**************************************
......
......@@ -514,8 +514,7 @@ void EnvMap::updateMap()
popAgentInCells(*ait, old) ;
for (PFP::OBSTACLEVECT::iterator ait = oldObst.begin(); ait != oldObst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
for (PFP::OBSTACLEVECT::iterator ait = oldNeighborObst.begin();
ait != oldNeighborObst.end(); ++ait)
for (PFP::OBSTACLEVECT::iterator ait = oldNeighborObst.begin();ait != oldNeighborObst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
neighborAgentvect[old].clear() ;
......@@ -613,209 +612,213 @@ void EnvMap::updateMap()
// On recrée une liste des faces à simplifier en empêchant les doublons
// On en profite pour vérifier les conditions de simplifications
std::vector<Dart> checkCoarsenCandidate ;
checkCoarsenCandidate.reserve(coarsenCandidate.size()) ;
for (unsigned int it = 0; it < coarsenCandidate.size(); ++it)
{
Dart old = coarsenCandidate[it] ;
bool oldIsMarked = coarsenMark.isMarked(old) ;
coarsenMark.unmark(old) ;
unsigned int fLevel = map.faceLevel(old) ;
if (oldIsMarked && fLevel > 0 && map.getDartLevel(old) < fLevel)
{
unsigned int cur = map.getCurrentLevel() ;
map.setCurrentLevel(fLevel - 1) ;
if (map.faceIsSubdividedOnce(old))
{
// on compte le nombre d'agents dans les sous-faces
// on en profite pour compter le degré de la face grossière
unsigned int degree = 0 ;
unsigned int nbAgents = 0 ;
Dart fit = old ;
do
{
nbAgents += agentvect[fit].size() ;
++degree ;
coarsenMark.unmark(fit) ;
// TODO Optimisation déjà faite
// unsigned int start = it + 1;
// unsigned int fEmb = map.getEmbedding<FACE>(fit) ;
// while(start < coarsenCandidate.size())
// std::vector<Dart> checkCoarsenCandidate ;
// checkCoarsenCandidate.reserve(coarsenCandidate.size()) ;
//
// for (unsigned int it = 0; it < coarsenCandidate.size(); ++it)
// {
// Dart old = coarsenCandidate[it] ;
// bool oldIsMarked = coarsenMark.isMarked(old) ;
// coarsenMark.unmark(old) ;
//
// unsigned int fLevel = map.faceLevel(old) ;
//
// if (oldIsMarked && fLevel > 0 && map.getDartLevel(old) < fLevel)
// {
// unsigned int cur = map.getCurrentLevel() ;
// map.setCurrentLevel(fLevel - 1) ;
//
// if (map.faceIsSubdividedOnce(old))
// {
// // on compte le nombre d'agents dans les sous-faces
// // on en profite pour compter le degré de la face grossière
// unsigned int degree = 0 ;
// unsigned int nbAgents = 0 ;
// Dart fit = old ;
// do
// {
// nbAgents += agentvect[fit].size() ;
// ++degree ;
// coarsenMark.unmark(fit) ;
//// TODO Optimisation déjà faite
//// unsigned int start = it + 1;
//// unsigned int fEmb = map.getEmbedding<FACE>(fit) ;
//// while(start < coarsenCandidate.size())
//// {
//// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
//// {
//// coarsenCandidate[start] = coarsenCandidate.back() ;
//// coarsenCandidate.pop_back() ;
//// }
//// else
//// ++start ;
//// }
//
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
//
// //Loop subdivision
// if (degree == 3)
// {
// map.setCurrentLevel(fLevel) ;
// Dart centerFace = map.phi2(map.phi1(old)) ;
// nbAgents += agentvect[centerFace].size() ;
// coarsenMark.unmark(centerFace) ;
//// TODO Optimisation déjà faite
//// unsigned int start = it + 1;
//// unsigned int fEmb = map.getEmbedding<FACE>(centerFace) ;
//// while(start < coarsenCandidate.size())
//// {
//// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
//// {
//// coarsenCandidate[start] = coarsenCandidate.back() ;
//// coarsenCandidate.pop_back() ;
//// }
//// else
//// ++start ;
//// }
// map.setCurrentLevel(fLevel - 1) ;
// }
// if (nbAgents < nbAgentsToSimplify) checkCoarsenCandidate.push_back(old) ;
// }
// map.setCurrentLevel(cur) ;
// }
// }
// coarsenCandidate.clear() ;
//
// // On réalise la simplification (les conditions ont déjà été vérifiées)
// for (unsigned int it = 0; it < checkCoarsenCandidate.size(); ++it)
// {
// Dart old = checkCoarsenCandidate[it] ;
//
// unsigned int fLevel = map.faceLevel(old) ;
// unsigned int cur = map.getCurrentLevel() ;
// map.setCurrentLevel(fLevel - 1) ;
//
// // on compte le degré de la face grossière
// unsigned int degree = 0 ;
// Dart fit = old ;
// do
// {
// ++degree ;
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
// PFP::AGENTS agents ;
// PFP::OBSTACLEVECT obst ;
// PFP::OBSTACLEVECT neighborObst ;
//
// fit = old ;
// do
// {
// PFP::AGENTS a(agentvect[fit]) ;
// PFP::OBSTACLEVECT ob(obstvect[fit]) ;
// PFP::OBSTACLEVECT nob(neighborObstvect[fit]) ;
//
// agents.insert(agents.end(), a.begin(), a.end()) ;
// obst.insert(obst.end(), ob.begin(), ob.end()) ;
// neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
// popAgentInCells(*ait, fit) ;
// map.setCurrentLevel(fLevel - 1) ;
// Dart nf = map.phi2(fit) ;
// if (!map.faceIsSubdivided(nf))
// {
// map.setCurrentLevel(fLevel) ;
// PFP::AGENTS& an = agentvect[nf] ;
// PFP::OBSTACLEVECT resetob = obstvect[nf] ;
// for (PFP::AGENTS::iterator ait = an.begin(); ait != an.end(); ++ait)
// {
// if ((*ait)->part_.d == map.phi1(nf)) (*ait)->part_.d = nf ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = resetob.begin(); ait != resetob.end(); ++ait)
// {
// MovingObstacle* mo = (*ait)->mo ;
// if (mo != NULL)
// {
// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
// {
// coarsenCandidate[start] = coarsenCandidate.back() ;
// coarsenCandidate.pop_back() ;
// }
// else
// ++start ;
// resetPart(mo,(*ait)->index, nf) ;
// }
fit = map.phi1(fit) ;
} while (fit != old) ;
//Loop subdivision
if (degree == 3)
{
map.setCurrentLevel(fLevel) ;
Dart centerFace = map.phi2(map.phi1(old)) ;
nbAgents += agentvect[centerFace].size() ;
coarsenMark.unmark(centerFace) ;
// TODO Optimisation déjà faite
// unsigned int start = it + 1;
// unsigned int fEmb = map.getEmbedding<FACE>(centerFace) ;
// while(start < coarsenCandidate.size())
// {
// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
// {
// coarsenCandidate[start] = coarsenCandidate.back() ;
// coarsenCandidate.pop_back() ;
// }
// else
// ++start ;
// }
map.setCurrentLevel(fLevel - 1) ;
}
if (nbAgents < nbAgentsToSimplify) checkCoarsenCandidate.push_back(old) ;
}
map.setCurrentLevel(cur) ;
}
}
coarsenCandidate.clear() ;
// On réalise la simplification (les conditions ont déjà été vérifiées)
for (unsigned int it = 0; it < checkCoarsenCandidate.size(); ++it)
{
Dart old = checkCoarsenCandidate[it] ;
unsigned int fLevel = map.faceLevel(old) ;
unsigned int cur = map.getCurrentLevel() ;
map.setCurrentLevel(fLevel - 1) ;
// on compte le degré de la face grossière
unsigned int degree = 0 ;
Dart fit = old ;
do
{
++degree ;
fit = map.phi1(fit) ;
} while (fit != old) ;
PFP::AGENTS agents ;
PFP::OBSTACLEVECT obst ;
PFP::OBSTACLEVECT neighborObst ;
fit = old ;
do
{
PFP::AGENTS a(agentvect[fit]) ;
PFP::OBSTACLEVECT ob(obstvect[fit]) ;
PFP::OBSTACLEVECT nob(neighborObstvect[fit]) ;
agents.insert(agents.end(), a.begin(), a.end()) ;
obst.insert(obst.end(), ob.begin(), ob.end()) ;
neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
map.setCurrentLevel(map.getMaxLevel()) ;
for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
popAgentInCells(*ait, fit) ;
map.setCurrentLevel(fLevel - 1) ;
Dart nf = map.phi2(fit) ;
if (!map.faceIsSubdivided(nf))
{
map.setCurrentLevel(fLevel) ;
PFP::AGENTS& an = agentvect[nf] ;
PFP::OBSTACLEVECT resetob = obstvect[nf] ;
for (PFP::AGENTS::iterator ait = an.begin(); ait != an.end(); ++ait)
{
if ((*ait)->part_.d == map.phi1(nf)) (*ait)->part_.d = nf ;
}
for (PFP::OBSTACLEVECT::iterator ait = resetob.begin(); ait != resetob.end(); ++ait)
{
MovingObstacle* mo = (*ait)->mo ;
if (mo != NULL)
{
resetPart(mo, nf) ;
}
}
map.setCurrentLevel(fLevel - 1) ;
}
fit = map.phi1(fit) ;
} while (fit != old) ;
if (degree == 3)
{
map.setCurrentLevel(fLevel) ;
Dart centerFace = map.phi2(map.phi1(old)) ;
PFP::AGENTS a(agentvect[centerFace]) ;
PFP::OBSTACLEVECT ob(obstvect[centerFace]) ;
PFP::OBSTACLEVECT nob(neighborObstvect[centerFace]) ;
agents.insert(agents.end(), a.begin(), a.end()) ;
obst.insert(obst.end(), ob.begin(), ob.end()) ;
neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
map.setCurrentLevel(map.getMaxLevel()) ;
for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
popAgentInCells(*ait, centerFace) ;
map.setCurrentLevel(fLevel - 1) ;
}
neighborAgentvect[old].clear() ;
// TODO Check with optimisation
map.setCurrentLevel(map.getMaxLevel()) ;
for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
map.setCurrentLevel(fLevel - 1) ;
Algo::IHM::coarsenFace<PFP>(map, old, position) ;
std::pair<bool, bool>& sf = subdivisableFace[old] ;
sf.first = true ;
sf.second = true ;
map.setCurrentLevel(map.getMaxLevel()) ;
for (PFP::AGENTS::iterator itA = agents.begin(); itA != agents.end(); ++itA)
{
(*itA)->part_.d = old ;
pushAgentInCells(*itA, old) ;
}
for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
{
resetObstPartInFace(*ait, old) ;
update_registration(*ait) ;
}
for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
{
update_registration(*ait) ;
}
Dart dd = old ;
do
{
Dart ddd = map.alpha1(map.alpha1(dd)) ;
while (ddd != dd)
{
neighborAgentvect[old].insert(neighborAgentvect[old].end(), agentvect[ddd].begin(), agentvect[ddd].end()) ;
ddd = map.alpha1(ddd) ;
}
dd = map.phi1(dd) ;
} while (dd != old) ;
if (fLevel > 1 && !coarsenMark.isMarked(old) && agentvect[old].size() < nbAgentsToSimplify)
{
coarsenMark.mark(old) ;
coarsenCandidate.push_back(map.faceOldestDart(old)) ;
}
map.setCurrentLevel(cur) ;
}
map.setCurrentLevel(map.getMaxLevel()) ;
if (coarsenCandidate.size() > 0) updateMap() ;
// }
// map.setCurrentLevel(fLevel - 1) ;
// }
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
// if (degree == 3)
// {
// map.setCurrentLevel(fLevel) ;
// Dart centerFace = map.phi2(map.phi1(old)) ;
// PFP::AGENTS a(agentvect[centerFace]) ;
// PFP::OBSTACLEVECT ob(obstvect[centerFace]) ;
// PFP::OBSTACLEVECT nob(neighborObstvect[centerFace]) ;
// agents.insert(agents.end(), a.begin(), a.end()) ;
// obst.insert(obst.end(), ob.begin(), ob.end()) ;
// neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
// popAgentInCells(*ait, centerFace) ;
// map.setCurrentLevel(fLevel - 1) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// {
// removeElementFromVector<Obstacle*>(neighborObst, (*ait)) ;
// }
// neighborAgentvect[old].clear() ;
// // TODO Check with optimisation
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// register_pop(*ait, (*ait)->index) ;
// for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
// register_pop(*ait, (*ait)->index) ;
// map.setCurrentLevel(fLevel - 1) ;
//
// Algo::IHM::coarsenFace<PFP>(map, old, position) ;
//
// std::pair<bool, bool>& sf = subdivisableFace[old] ;
// sf.first = true ;
// sf.second = true ;
//
// map.setCurrentLevel(map.getMaxLevel()) ;
//
// for (PFP::AGENTS::iterator itA = agents.begin(); itA != agents.end(); ++itA)
// {
// (*itA)->part_.d = old ;
// pushAgentInCells(*itA, old) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// {
// resetObstPartInFace(*ait, old) ;
// update_registration(*ait) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
// {
// update_registration(*ait) ;
// }
//
// Dart dd = old ;
// do
// {
// Dart ddd = map.alpha1(map.alpha1(dd)) ;
// while (ddd != dd)
// {
// neighborAgentvect[old].insert(neighborAgentvect[old].end(), agentvect[ddd].begin(), agentvect[ddd].end()) ;
// ddd = map.alpha1(ddd) ;
// }
// dd = map.phi1(dd) ;
// } while (dd != old) ;
//
// if (fLevel > 1 && !coarsenMark.isMarked(old) && agentvect[old].size() < nbAgentsToSimplify)
// {
// coarsenMark.mark(old) ;
// coarsenCandidate.push_back(map.faceOldestDart(old)) ;
// }
//
// map.setCurrentLevel(cur) ;
// }
// map.setCurrentLevel(map.getMaxLevel()) ;
// if (coarsenCandidate.size() > 0) updateMap() ;
}
void EnvMap::resetAgentInFace(Agent* agent)
......
......@@ -418,7 +418,7 @@ void MovingObstacle::register_update(Obstacle* o, Dart d, int n)
std::list<Dart> memo;
bool modif=false;
// bool modif=false;
// if(p1->crossCell != CGoGN::Algo::MovingObjects::NO_CROSS
// || p2->crossCell != CGoGN::Algo::MovingObjects::NO_CROSS)
......@@ -501,13 +501,13 @@ void resetObstPartInFace(Obstacle* o, Dart d1)
}
}
void resetPart(MovingObstacle * mo, Dart d1)
void resetPart(MovingObstacle * mo,int index, Dart d1)
{
for (unsigned int i = 0; i < mo->nbVertices; i++) {
int i = index;
if (mo->parts_[i]->d == mo->sim_->envMap_.map.phi1(d1))
mo->parts_[i]->d = d1;
}
}
void displayMO(Obstacle * o)
......
......@@ -88,9 +88,14 @@ void Simulator::doStep()
for (unsigned int i = 0 ; i < movingObstacles_.size() ; ++i)
{
movingObstacles_[i]->computePrefVelocity() ;
#ifndef SPATIAL_HASHING
envMap_.map.setCurrentLevel(envMap_.map.getMaxLevel()) ;
#endif
movingObstacles_[i]->update() ;
}
#ifndef SPATIAL_HASHING
envMap_.map.setCurrentLevel(0) ;
#endif
for (unsigned int i = 0 ; i < agents_.size() ; ++i)
{
agents_[i]->updateObstacleNeighbors() ;
......@@ -148,7 +153,7 @@ void Simulator::doStep()
nbRefineCandidate += envMap_.refineCandidate.size() ;
nbCoarsenCandidate += envMap_.coarsenCandidate.size() ;
// envMap_.updateMap() ;
envMap_.updateMap() ;
#endif
globalTime_ += timeStep_ ;
......
......@@ -277,22 +277,22 @@ void SocialAgents::cb_redraw()
}
// affiche les cases de la map qui ont des obstacles
// glColor3f(1.0f, 0.5f, 0.5f);
// glLineWidth(5.0f);
// int nb =0;
// for(Dart d = sim.envMap_.map.begin(); d != sim.envMap_.map.end(); sim.envMap_.map.next(d))
// {
// for(std::vector<Obstacle*>::const_iterator it =sim.envMap_.obstvect[d].begin();it!=sim.envMap_.obstvect[d].end();++it)
// {
// if((*it)->mo!=NULL){
//
// renderDart(sim.envMap_, d);
//// CGoGNout << "Dart "<< d.index << " coloriée" << CGoGNendl;
// nb ++;
// break;
// }
// }
// }
glColor3f(1.0f, 0.5f, 0.5f);
glLineWidth(5.0f);
int nb =0;
for(Dart d = sim.envMap_.map.begin(); d != sim.envMap_.map.end(); sim.envMap_.map.next(d))
{
for(std::vector<Obstacle*>::const_iterator it =sim.envMap_.obstvect[d].begin();it!=sim.envMap_.obstvect[d].end();++it)
{
if((*it)->mo!=NULL){
renderDart(sim.envMap_, d);
// CGoGNout << "Dart "<< d.index << " coloriée" << CGoGNendl;
nb ++;
break;
}
}
}
}
......
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