1
// 2010 © Václav Šmilauer <eudoxos@arcig.cz>
5
#include "BodyContainer.hpp"
12
CREATE_LOGGER(BodyContainer);
14
void BodyContainer::clear(){
18
Body::id_t BodyContainer::insert(shared_ptr<Body>& b){
19
const shared_ptr<Scene>& scene=Omega::instance().getScene();
20
b->iterBorn=scene->iter;
21
b->timeBorn=scene->time;
25
// Notify ForceContainer about new id
26
scene->forces.addMaxId(b->id);
30
bool BodyContainer::erase(Body::id_t id, bool eraseClumpMembers){//default is false (as before)
31
if(!body[id]) return false;
33
const shared_ptr<Body>& b=Body::byId(id);
35
if ((b) and (b->isClumpMember())) {
36
const shared_ptr<Body>& clumpBody=Body::byId(b->clumpId);
37
const shared_ptr<Clump> clump=YADE_PTR_CAST<Clump>(clumpBody->shape);
38
Clump::del(clumpBody, b);
40
if (clump->members.size()==0) this->erase(b->clumpId,false); //Clump has no members any more. Remove it
43
if ((b) and (b->isClump())){
44
//erase all members if eraseClumpMembers is true:
45
const shared_ptr<Clump>& clump=YADE_PTR_CAST<Clump>(b->shape);
46
std::map<Body::id_t,Se3r>& members = clump->members;
47
FOREACH(MemberMap::value_type& mm, members){
48
const Body::id_t& memberId=mm.first;
49
if (eraseClumpMembers) this->erase(memberId,false); // erase members
50
//when the last members is erased, the clump will be erased automatically, see above
51
else Body::byId(memberId)->clumpId=Body::id_t(-1); // make members standalones
54
const shared_ptr<Scene>& scene=Omega::instance().getScene();
55
for(Body::MapId2IntrT::iterator it=b->intrs.begin(),end=b->intrs.end(); it!=end; ++it) { //Iterate over all body's interactions
56
scene->interactions->requestErase((*it).second);