AnimateVisitor.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <sofa/simulation/common/AnimateVisitor.h>
00026 #include <sofa/simulation/common/MechanicalVisitor.h>
00027 #include <sofa/simulation/common/CollisionVisitor.h>
00028
00029
00030 namespace sofa
00031 {
00032
00033 namespace simulation
00034 {
00035
00036
00037 void AnimateVisitor::processMasterSolver(simulation::Node*, core::componentmodel::behavior::MasterSolver* obj)
00038 {
00039 obj->step(getDt());
00040 }
00041
00042 void AnimateVisitor::processBehaviorModel(simulation::Node*, core::BehaviorModel* obj)
00043 {
00044 obj->updatePosition(getDt());
00045 }
00046
00047 void AnimateVisitor::fwdInteractionForceField(simulation::Node*, core::componentmodel::behavior::InteractionForceField* obj)
00048 {
00049 obj->addForce();
00050 }
00051
00052 void AnimateVisitor::processCollisionPipeline(simulation::Node* node, core::componentmodel::collision::Pipeline*)
00053 {
00054 CollisionVisitor act;
00055 node->execute(&act);
00056 }
00057
00058 void AnimateVisitor::processOdeSolver(simulation::Node* , core::componentmodel::behavior::OdeSolver* solver)
00059 {
00060
00061
00062 cerr<<"AnimateVisitor::processOdeSolver "<<solver->getName()<<endl;
00063 solver->solve(getDt());
00064 }
00065
00066 Visitor::Result AnimateVisitor::processNodeTopDown(simulation::Node* node)
00067 {
00068
00069 if (!node->is_activated.getValue()) return Visitor::RESULT_PRUNE;
00070 if (dt == 0) setDt(node->getDt());
00071
00072 if (node->masterSolver != NULL)
00073 {
00074 ctime_t t0 = begin(node, node->masterSolver);
00075 processMasterSolver(node, node->masterSolver);
00076 end(node, node->masterSolver, t0);
00077 return RESULT_PRUNE;
00078 }
00079 if (node->collisionPipeline != NULL)
00080 {
00081
00082 processCollisionPipeline(node, node->collisionPipeline);
00083
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 if (!node->solver.empty() )
00093 {
00094 double nextTime = node->getTime() + dt;
00095 MechanicalBeginIntegrationVisitor beginVisitor(dt);
00096 node->execute(&beginVisitor);
00097
00098
00099 for( unsigned i=0; i<node->solver.size(); i++ ){
00100 ctime_t t0 = begin(node, node->solver[i]);
00101
00102 node->solver[i]->solve(getDt());
00103 end(node, node->solver[i], t0);
00104 }
00105
00106 MechanicalPropagatePositionAndVelocityVisitor(nextTime,core::componentmodel::behavior::OdeSolver::VecId::position(),core::componentmodel::behavior::OdeSolver::VecId::velocity()).execute( node );
00107
00108 MechanicalEndIntegrationVisitor endVisitor(dt);
00109 node->execute(&endVisitor);
00110 return RESULT_PRUNE;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119 {
00120
00121 for_each(this, node, node->interactionForceField, &AnimateVisitor::fwdInteractionForceField);
00122 return RESULT_CONTINUE;
00123 }
00124 }
00125
00126
00127
00128
00129
00130
00131
00132 }
00133
00134 }
00135