CudaCollision.cpp

Go to the documentation of this file.
00001 /******************************************************************************
00002 *       SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3      *
00003 *                (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS                    *
00004 *                                                                             *
00005 * This library is free software; you can redistribute it and/or modify it     *
00006 * under the terms of the GNU Lesser General Public License as published by    *
00007 * the Free Software Foundation; either version 2.1 of the License, or (at     *
00008 * your option) any later version.                                             *
00009 *                                                                             *
00010 * This library is distributed in the hope that it will be useful, but WITHOUT *
00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
00013 * for more details.                                                           *
00014 *                                                                             *
00015 * You should have received a copy of the GNU Lesser General Public License    *
00016 * along with this library; if not, write to the Free Software Foundation,     *
00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.          *
00018 *******************************************************************************
00019 *                               SOFA :: Modules                               *
00020 *                                                                             *
00021 * Authors: The SOFA Team and external contributors (see Authors.txt)          *
00022 *                                                                             *
00023 * Contact information: contact@sofa-framework.org                             *
00024 ******************************************************************************/
00025 #include "CudaDistanceGridCollisionModel.h"
00026 #include "CudaSphereModel.h"
00027 #include "CudaPointModel.h"
00028 #include <sofa/component/collision/NewProximityIntersection.inl>
00029 #include <sofa/component/collision/DiscreteIntersection.inl>
00030 #include <sofa/component/collision/RayPickInteractor.inl>
00031 #include <sofa/component/collision/RayContact.h>
00032 #include "CudaContactMapper.h"
00033 #include <sofa/component/collision/BarycentricPenalityContact.inl>
00034 #include <sofa/component/collision/BarycentricContactMapper.inl>
00035 #include <sofa/component/forcefield/PenalityContactForceField.h>
00036 #include "CudaPenalityContactForceField.h"
00037 #include "CudaSpringForceField.h"
00038 #include <sofa/component/forcefield/VectorSpringForceField.h>
00039 #include <fstream>
00040 #include <sofa/helper/system/gl.h>
00041 #include <sofa/helper/Factory.inl>
00042 
00043 namespace sofa
00044 {
00045 
00046 namespace component
00047 {
00048 
00049 namespace collision
00050 {
00051 
00052 using namespace sofa::gpu::cuda;
00053 
00054 template <>
00055 void BarycentricPenalityContact<CudaPointModel,CudaRigidDistanceGridCollisionModel,CudaVec3fTypes>::setDetectionOutputs(OutputVector* o)
00056 {
00057     TOutputVector& outputs = *static_cast<TOutputVector*>(o);
00058     //const bool printLog = this->f_printLog.getValue();
00059     if (ff==NULL)
00060     {
00061         MechanicalState1* mstate1 = mapper1.createMapping("contactPointsCUDA");
00062         MechanicalState2* mstate2 = mapper2.createMapping("contactPointsCUDA");
00063     ff = new ResponseForceField(mstate1,mstate2);ff->setName( getName());
00064     }
00065     
00066     mapper1.setPoints1(&outputs);
00067     mapper2.setPoints2(&outputs);
00068     const double d0 = intersectionMethod->getContactDistance() + model1->getProximity() + model2->getProximity(); // - 0.001;
00069 #if 0
00070     int insize = outputs.size();
00071     int size = insize;
00072     ff->clear(size);
00073     //int i = 0;
00074     for (int i=0; i<insize; i++)
00075     {
00076         int index = i; //oldIndex[i];
00077         if (index < 0) continue; // this contact is ignored
00078         //DetectionOutput* o = &outputs[i];
00079         //CollisionElement1 elem1(o->elem.first);
00080         //CollisionElement2 elem2(o->elem.second);
00081         //int index1 = elem1.getIndex();
00082         //int index2 = elem2.getIndex();
00083         int index1 = index;
00084         int index2 = index;
00086         //index1 = mapper1.addPoint(o->point[0], index1);
00088         //index2 = mapper2.addPoint(o->point[1], index2);
00089         double distance = d0 + outputs.get(i)->distance; // + mapper1.radius(elem1) + mapper2.radius(elem2);
00090         double stiffness = (model1->getContactStiffness(0) * model1->getContactStiffness(0))/distance;
00091         double mu_v = (model1->getContactFriction(0) + model1->getContactFriction(0));
00092         ff->addContact(index1, index2, outputs.get(i)->normal, (float)distance, (float)stiffness, (float)mu_v, (float)mu_v, index);
00093     }
00094 #else
00095     double distance = d0; // + mapper1.radius(elem1) + mapper2.radius(elem2);
00096     double stiffness = (model1->getContactStiffness(0) * model1->getContactStiffness(0)); 
00097     ff->setContacts((float)distance, (float)stiffness, &outputs, true);
00098 #endif
00099     // Update mappings
00100     mapper1.update();
00101     mapper2.update();
00102 }
00103 
00104 template <>
00105 void BarycentricPenalityContact<CudaSphereModel,CudaRigidDistanceGridCollisionModel,CudaVec3fTypes>::setDetectionOutputs(OutputVector* o)
00106 {
00107     TOutputVector& outputs = *static_cast<TOutputVector*>(o);
00108     //const bool printLog = this->f_printLog.getValue();
00109     if (ff==NULL)
00110     {
00111         MechanicalState1* mstate1 = mapper1.createMapping("contactPointsCUDA");
00112         MechanicalState2* mstate2 = mapper2.createMapping("contactPointsCUDA");
00113         ff = new ResponseForceField(mstate1,mstate2); ff->setName( getName());
00114     }
00115     
00116     mapper1.setPoints1(&outputs);
00117     mapper2.setPoints2(&outputs);
00118     const double d0 = intersectionMethod->getContactDistance() + model1->getProximity() + model2->getProximity(); // - 0.001;
00119 #if 0
00120     int insize = outputs.size();
00121     int size = insize;
00122     ff->clear(size);
00123     //int i = 0;
00124     for (int i=0; i<insize; i++)
00125     {
00126         int index = i; //oldIndex[i];
00127         if (index < 0) continue; // this contact is ignored
00128         //DetectionOutput* o = &outputs[i];
00129         //CollisionElement1 elem1(o->elem.first);
00130         //CollisionElement2 elem2(o->elem.second);
00131         //int index1 = elem1.getIndex();
00132         //int index2 = elem2.getIndex();
00133         int index1 = index;
00134         int index2 = index;
00136         //index1 = mapper1.addPoint(o->point[0], index1);
00138         //index2 = mapper2.addPoint(o->point[1], index2);
00139         double distance = d0 + outputs.get(i)->distance; // + mapper1.radius(elem1) + mapper2.radius(elem2);
00140         double stiffness = (model1->getContactStiffness(0) * model1->getContactStiffness(0))/distance;
00141         double mu_v = (model1->getContactFriction(0) + model1->getContactFriction(0));
00142         ff->addContact(index1, index2, outputs.get(i)->normal, (float)distance, (float)stiffness, (float)mu_v, (float)mu_v, index);
00143     }
00144 #else
00145     double distance = d0; // + mapper1.radius(elem1) + mapper2.radius(elem2);
00146     double stiffness = (model1->getContactStiffness(0) * model1->getContactStiffness(0)); 
00147     ff->setContacts((float)distance, (float)stiffness, &outputs, true);
00148 #endif
00149     // Update mappings
00150     mapper1.update();
00151     mapper2.update();
00152 }
00153 
00154 //ContactMapperCreator< ContactMapper<CudaSphereModel> > CudaSphereContactMapperClass("default",true);
00155 ContactMapperCreator< ContactMapper<CudaSphereModel, CudaVec3fTypes> > CudaSphereCudaContactMapperClass("default",true);
00156 
00157 template<>
00158 void DefaultPickingManager<CudaVec3fTypes,forcefield::StiffSpringForceField<CudaVec3fTypes> >::addContact(forcefield::StiffSpringForceField<CudaVec3fTypes>* ff, int index1, int index2, double stiffness, double mu_v, double length, const Vector3& /*p1*/, const Vector3& /*p2*/)
00159 {
00160     ff->addSpring(index1, index2, stiffness, mu_v, length);
00161 }
00162     
00163 template class DefaultPickingManager< CudaVec3fTypes, forcefield::StiffSpringForceField<CudaVec3fTypes> >;
00164 
00165 
00166 helper::Creator<BasePickingManager::PickingManagerFactory, DefaultPickingManager< CudaVec3fTypes, forcefield::StiffSpringForceField<CudaVec3fTypes> > > PickingVectorSpringCudaClass ("VectorSpringCUDA",true);
00167 
00168 } //namespace collision
00169 
00170 
00171 } //namespace component
00172 
00173 
00174 namespace gpu
00175 {
00176 
00177 namespace cuda
00178 {
00179 
00180 SOFA_DECL_CLASS(CudaCollision)
00181 
00182 using namespace sofa::component::collision;
00183 
00184 class CudaProximityIntersection : public sofa::component::collision::NewProximityIntersection
00185 {
00186 public:
00187 
00188     virtual void init()
00189     {
00190         sofa::component::collision::NewProximityIntersection::init();
00191         intersectors.add<RayModel,        CudaSphereModel,   DiscreteIntersection>(this);
00192         //intersectors.add<CudaSphereModel, PointModel,        DiscreteIntersection>(this);
00193         intersectors.add<CudaSphereModel, CudaSphereModel,   DiscreteIntersection>(this);
00194         //intersectors.add<LineModel,       CudaSphereModel,   CudaProximityIntersection>(this);
00195         intersectors.add<TriangleModel,   CudaSphereModel,   CudaProximityIntersection>(this);
00196     }
00197 
00198 };
00199 
00200 
00201 int CudaProximityIntersectionClass = core::RegisterObject("GPGPU Proximity Intersection based on CUDA")
00202 .add< CudaProximityIntersection >()
00203 ;
00204 
00205 sofa::helper::Creator<core::componentmodel::collision::Contact::Factory, component::collision::RayContact<CudaSphereModel> > RayCudaSphereContactClass("ray",true);
00206 
00207 
00208 //sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaRigidDistanceGridCollisionModel, CudaRigidDistanceGridCollisionModel,CudaVec3fTypes> > CudaDistanceGridCudaDistanceGridContactClass("default", true);
00209 sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaPointModel, CudaRigidDistanceGridCollisionModel,CudaVec3fTypes> > CudaPointCudaDistanceGridContactClass("default", true);
00210 sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaSphereModel, CudaRigidDistanceGridCollisionModel,CudaVec3fTypes> > CudaSphereCudaDistanceGridContactClass("default", true);
00211 //sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaRigidDistanceGridCollisionModel, sofa::component::collision::RigidDistanceGridCollisionModel> > CudaDistanceGridDistanceGridContactClass("default", true);
00212 //sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaRigidDistanceGridCollisionModel, sofa::component::collision::PointModel> > CudaDistanceGridPointContactClass("default", true);
00213 //sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaRigidDistanceGridCollisionModel, sofa::component::collision::SphereModel> > CudaDistanceGridSphereContactClass("default", true);
00214 //sofa::helper::Creator<sofa::core::componentmodel::collision::Contact::Factory, sofa::component::collision::BarycentricPenalityContact<CudaRigidDistanceGridCollisionModel, sofa::component::collision::TriangleModel> > CudaDistanceGridTriangleContactClass("default", true);
00215 
00216 
00217 } // namespace cuda
00218 
00219 } // namespace gpu
00220 
00221 } // namespace sofa

Generated on Sun Nov 23 03:57:23 2008 for Sofa by  doxygen 1.5.7.1