From ac01f61e615d457b87f50e3e0bb68bd05e4d18eb Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Tue, 2 Feb 2010 11:03:38 +0000 Subject: [PATCH] Filters performance improved --- src/fgt/filter_physics/MeshSubFilter.cpp | 2 +- src/fgt/filter_physics/ODEFacade.cpp | 15 +++++---------- src/fgt/filter_physics/ODEFacade.h | 1 - src/fgt/filter_physics/RandomFillFilter.cpp | 6 +++--- src/fgt/filter_physics/filter_physics.cpp | 4 ++-- src/fgt/filter_physics/filter_physics.h | 2 +- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/fgt/filter_physics/MeshSubFilter.cpp b/src/fgt/filter_physics/MeshSubFilter.cpp index 60cee61a9..dfcd5d8ba 100644 --- a/src/fgt/filter_physics/MeshSubFilter.cpp +++ b/src/fgt/filter_physics/MeshSubFilter.cpp @@ -7,7 +7,7 @@ MeshSubFilter::MeshSubFilter(){ void MeshSubFilter::initParameterSet(QAction* action,MeshDocument& md, RichParameterSet & par){ par.addParam(new RichInt("fps", 100, "Frames per second", "The number of times per second the physics simulation is updated")); - par.addParam(new RichInt("iterations", 10, "Physics method iterations", "Number of iterations of the physics iterative method for equation solving")); + par.addParam(new RichInt("iterations", 20, "Physics method iterations", "Number of iterations of the physics iterative method for equation solving")); par.addParam(new RichInt("contacts", 20, "Max contacts", "Maximum number of contact points to generate per object pair")); par.addParam(new RichFloat("bounciness", 0.1f, "Bounciness", "The amount of bounciness of a collision: 0 means the surfaces are not bouncy at all, 1 is the maximum bounciness")); } diff --git a/src/fgt/filter_physics/ODEFacade.cpp b/src/fgt/filter_physics/ODEFacade.cpp index 96d9ef73a..e4599598c 100644 --- a/src/fgt/filter_physics/ODEFacade.cpp +++ b/src/fgt/filter_physics/ODEFacade.cpp @@ -9,7 +9,6 @@ using namespace std; using namespace vcg; bool ODEFacade::m_initialized; -int ODEFacade::m_maxIterations = 10; float ODEFacade::m_bounciness = 0.1f; dSpaceID ODEFacade::m_space; @@ -110,17 +109,14 @@ void ODEFacade::setAsRigidBody(MeshModel& mesh, bool isRigidBody){ m_registeredMeshes[index()].second->body = dBodyCreate(m_world); dGeomSetBody(m_registeredMeshes[index()].second->geom, m_registeredMeshes[index()].second->body); - tri::Inertia inertia; - inertia.Compute(m_registeredMeshes[index()].first->cm); - dMass* mass = &m_registeredMeshes[index()].second->mass; dMassSetTrimesh(mass, 1.0f, m_registeredMeshes[index()].second->geom); - mass->mass = 10; + mass->mass = 5; dReal centerOfMass[3] = { mass->c[0], mass->c[1], mass->c[2] }; dMassTranslate(&m_registeredMeshes[index()].second->mass, -centerOfMass[0], -centerOfMass[1], -centerOfMass[2]); dBodySetMass(m_registeredMeshes[index()].second->body, &m_registeredMeshes[index()].second->mass); - dBodySetPosition(m_registeredMeshes[index()].second->body, inertia.CenterOfMass()[0], inertia.CenterOfMass()[1], inertia.CenterOfMass()[2]); + dBodySetPosition(m_registeredMeshes[index()].second->body, m_registeredMeshes[index()].second->centerOfMass[0], m_registeredMeshes[index()].second->centerOfMass[1], m_registeredMeshes[index()].second->centerOfMass[2]); } } @@ -162,7 +158,7 @@ void ODEFacade::updateTransform(){ void ODEFacade::integrate(float step){ dSpaceCollide(m_space, this, collisionCallback); - dWorldStepFast1(m_world, step, m_maxIterations); + dWorldQuickStep(m_world, step); dJointGroupEmpty(m_contactGroup); } @@ -176,11 +172,10 @@ void ODEFacade::collisionCallback(dGeomID o1, dGeomID o2){ dBodyID body2 = dGeomGetBody(o2); for(int i = 0; i < m_contacts.size(); i++){ - m_contacts[i].surface.mode = dContactBounce | dContactSoftCFM; + m_contacts[i].surface.mode = dContactBounce; m_contacts[i].surface.mu = 0.5; m_contacts[i].surface.bounce = m_bounciness; m_contacts[i].surface.bounce_vel = 0.1; - m_contacts[i].surface.soft_cfm = 0.01; } int collisions = dCollide(o1, o2, m_contacts.size(), &m_contacts[0].geom, sizeof(dContact)); @@ -232,7 +227,7 @@ vcg::Matrix44f ODEFacade::getTransformationMatrix(MeshModel& mesh){ } void ODEFacade::setIterations(int iterations){ - m_maxIterations = iterations; + dWorldSetQuickStepNumIterations(m_world, iterations); } void ODEFacade::setMaxContacts(int contacts){ diff --git a/src/fgt/filter_physics/ODEFacade.h b/src/fgt/filter_physics/ODEFacade.h index 5a9ab1a6e..f2a6505d5 100644 --- a/src/fgt/filter_physics/ODEFacade.h +++ b/src/fgt/filter_physics/ODEFacade.h @@ -64,7 +64,6 @@ protected: //This class is a monostate static bool m_initialized; - static int m_maxIterations; static float m_bounciness; static dWorldID m_world; diff --git a/src/fgt/filter_physics/RandomFillFilter.cpp b/src/fgt/filter_physics/RandomFillFilter.cpp index 82d175f54..414a88bc2 100644 --- a/src/fgt/filter_physics/RandomFillFilter.cpp +++ b/src/fgt/filter_physics/RandomFillFilter.cpp @@ -80,9 +80,9 @@ bool RandomFillFilter::applyFilter(QAction* filter, MeshDocument &md, RichParame } vcg::Point3 RandomFillFilter::getRandomOrigin(RichParameterSet& par){ - int randomFace = static_cast(rand())/RAND_MAX*(par.getMesh("container")->cm.face.size() - 1); - CFaceO& face = par.getMesh("container")->cm.face[randomFace]; - return face.P(0) + (face.N() * par.getMesh("filler")->cm.bbox.Diag()); + int randomVertex = static_cast(rand())/RAND_MAX*(par.getMesh("container")->cm.vert.size() - 1); + CVertexO& vertex = par.getMesh("container")->cm.vert[randomVertex]; + return vertex.P() + (vertex.N() * par.getMesh("filler")->cm.bbox.Diag()); } void RandomFillFilter::addRandomObject(MeshDocument& md, MeshModel* filler, const vcg::Point3& origin, int meshID){ diff --git a/src/fgt/filter_physics/filter_physics.cpp b/src/fgt/filter_physics/filter_physics.cpp index b5373ab8b..c823df4aa 100644 --- a/src/fgt/filter_physics/filter_physics.cpp +++ b/src/fgt/filter_physics/filter_physics.cpp @@ -25,9 +25,9 @@ FilterPhysics::~FilterPhysics(){ case FP_PHYSICS_GRAVITY: return QString("Physics gravity simulation"); case FP_PHYSICS_RNDDROP: - return QString("Physics random drop simulation"); + return QString("Physics random drop"); case FP_PHYSICS_RNDFILL: - return QString("Physics random fill simulation"); + return QString("Physics random fill"); default: assert(0); break; diff --git a/src/fgt/filter_physics/filter_physics.h b/src/fgt/filter_physics/filter_physics.h index a94454cdf..c677da399 100644 --- a/src/fgt/filter_physics/filter_physics.h +++ b/src/fgt/filter_physics/filter_physics.h @@ -31,7 +31,7 @@ class FilterPhysics : public QObject, public MeshFilterInterface virtual QString filterName(FilterIDType filter) const; virtual QString filterInfo(FilterIDType filter) const; - virtual int getRequirements(QAction*){return MeshModel::MM_FACEVERT | MeshModel::MM_FACENORMAL;} + virtual int getRequirements(QAction*){return MeshModel::MM_FACEVERT | MeshModel::MM_FACENORMAL | MeshModel::MM_VERTNORMAL; } virtual int postCondition( QAction* ) const{return MeshModel::MM_FACENORMAL; /*MeshModel::MM_TRANSFMATRIX; */} virtual bool autoDialog(QAction*) {return true;}