int GUIManager::MainLoop(sofa::simulation::Node::SPtr groot, const char* filename) { int ret = 0; if (!currentGUI) { createGUI(groot, filename); } ret = currentGUI->mainLoop(); if (ret) { dmsg_error("GUIManager") << " GUI '"<<currentGUI->GetGUIName()<<"' main loop failed (code "<<ret<<")."; return ret; } return ret; }
component::collision::BodyPicked PickHandler::findCollisionUsingBruteForce(const defaulttype::Vector3& origin, const defaulttype::Vector3& direction, double maxLength, core::objectmodel::BaseNode* rootNode) { BodyPicked result; // Look for particles hit by this ray // msg_info()<<"PickHandler::findCollisionUsingBruteForce" << std::endl; simulation::MechanicalPickParticlesVisitor picker(sofa::core::ExecParams::defaultInstance(), origin, direction, maxLength, 0 ); //core::objectmodel::BaseNode* rootNode = mouseNode->getRoot(); //sofa::simulation::getSimulation()->getContext()->toBaseNode(); if (rootNode) picker.execute(rootNode->getContext()); else dmsg_error("PickHandler") << "Root node not found."; picker.getClosestParticle( result.mstate, result.indexCollisionElement, result.point, result.rayLength ); return result; }
void InciseAlongPathPerformer::PerformCompleteIncision() { if (firstIncisionBody.body == NULL || startBody.body == NULL) { msg_error("InciseAlongPathPerformer") << "One picked body is null." ; return; } if (firstIncisionBody.indexCollisionElement == startBody.indexCollisionElement) { msg_error("InciseAlongPathPerformer") << "Picked body are the same." ; return; } // Initial point could have move due to gravity: looking for new coordinates of first incision point and triangle index. bool findTri = false; sofa::helper::vector <unsigned int> triAroundVertex = startBody.body->getMeshTopology()->getTrianglesAroundVertex(initialNbPoints); // Check if point index and triangle index are consistent. for (unsigned int j = 0; j<triAroundVertex.size(); ++j) if (triAroundVertex[j] == initialNbTriangles) { findTri = true; break; } if (!findTri) { dmsg_error("InciseAlongPathPerformer") << " initial point of incision has not been found." ; return; } // Get new coordinate of first incision point: sofa::component::container::MechanicalObject<defaulttype::Vec3Types>* MechanicalObject=NULL; startBody.body->getContext()->get(MechanicalObject, sofa::core::objectmodel::BaseContext::SearchRoot); const sofa::defaulttype::Vector3& the_point = (MechanicalObject->read(core::ConstVecCoordId::position())->getValue())[initialNbPoints]; // Get triangle index that will be incise // - Creating direction of incision sofa::defaulttype::Vector3 dir = startBody.point - the_point; // - looking for triangle in this direction sofa::component::topology::TriangleSetGeometryAlgorithms<defaulttype::Vec3Types>* triangleGeometry; startBody.body->getContext()->get(triangleGeometry); int the_triangle = triangleGeometry->getTriangleInDirection(initialNbPoints, dir); if (the_triangle == -1) { msg_error("InciseAlongPathPerformer") << " initial triangle of incision has not been found." ; return; } sofa::core::topology::TopologyModifier* topologyModifier; startBody.body->getContext()->get(topologyModifier); // Handle Removing of topological element (from any type of topology) if(topologyModifier) { topologyChangeManager.incisionCollisionModel(startBody.body, startBody.indexCollisionElement, startBody.point, firstIncisionBody.body, (unsigned int)the_triangle, the_point, snapingValue, snapingBorderValue ); } startBody = firstIncisionBody; firstIncisionBody.body = NULL; finishIncision = false; //Incure no second cut }
component::collision::BodyPicked PickHandler::findCollisionUsingPipeline() { BodyPicked result; if (!mouseCollision) { dmsg_error("PickHandler") << "No mouseCollision."; return result; } const defaulttype::Vector3& origin = mouseCollision->getRay(0).origin(); const defaulttype::Vector3& direction = mouseCollision->getRay(0).direction(); const double& maxLength = mouseCollision->getRay(0).l(); const std::set< sofa::component::collision::BaseRayContact*> &contacts = mouseCollision->getContacts(); for (std::set< sofa::component::collision::BaseRayContact*>::const_iterator it=contacts.begin(); it != contacts.end(); ++it) { const sofa::helper::vector<core::collision::DetectionOutput*>& output = (*it)->getDetectionOutputs(); sofa::core::CollisionModel *modelInCollision; for (unsigned int i=0; i<output.size(); ++i) { if (output[i]->elem.first.getCollisionModel() == mouseCollision) { modelInCollision = output[i]->elem.second.getCollisionModel(); if (!modelInCollision->isSimulated()) continue; const double d = (output[i]->point[1]-origin)*direction; if (d<0.0 || d>maxLength) continue; if (result.body == NULL || d < result.rayLength) { result.body=modelInCollision; result.indexCollisionElement = output[i]->elem.second.getIndex(); result.point = output[i]->point[1]; #ifdef DETECTIONOUTPUT_BARYCENTRICINFO result.baryCoords = output[i]->baryCoords[1]; #endif result.dist = (output[i]->point[1]-output[i]->point[0]).norm(); result.rayLength = d; } } else if (output[i]->elem.second.getCollisionModel() == mouseCollision) { modelInCollision = output[i]->elem.first.getCollisionModel(); if (!modelInCollision->isSimulated()) continue; const double d = (output[i]->point[0]-origin)*direction; if (d<0.0 || d>maxLength) continue; if (result.body == NULL || d < result.rayLength) { result.body=modelInCollision; result.indexCollisionElement = output[i]->elem.first.getIndex(); result.point = output[i]->point[0]; #ifdef DETECTIONOUTPUT_BARYCENTRICINFO result.baryCoords = output[i]->baryCoords[0]; #endif result.dist = (output[i]->point[1]-output[i]->point[0]).norm(); result.rayLength = d; } } } } return result; }