diff --git a/src/fgt/filter_physics/DynamicMeshSubFilter.cpp b/src/fgt/filter_physics/DynamicMeshSubFilter.cpp index 214510bd1..b32b52da1 100644 --- a/src/fgt/filter_physics/DynamicMeshSubFilter.cpp +++ b/src/fgt/filter_physics/DynamicMeshSubFilter.cpp @@ -1,5 +1,7 @@ #include "DynamicMeshSubFilter.h" +#include + DynamicMeshSubFilter::DynamicMeshSubFilter() : m_steps(-1), m_seconds(-1) { } @@ -20,10 +22,54 @@ bool DynamicMeshSubFilter::applyFilter(QAction* filter, MeshDocument &md, RichPa bool DynamicMeshSubFilter::configurationHasChanged(MeshDocument& md, RichParameterSet& par){ bool changed = m_seconds != par.getInt("seconds"); + + // Does not work because meshlab fails at restoring the original translation matrix in the preview checkbox logic + /* Dim: the transformation matrices should not change + for(int i = 0; i < md.size(); i++){ + for(int j = 0; j < 16; j++) std::cout << md.getMesh(i)->cm.Tr[j/4][j%4] <<" "; + std::cout<fileName; + else + changed = true; + + m_files.clear(); + for(int i = 0; i < md.size(); i++) + m_files.push_back(md.getMesh(i)->fileName);*/ + m_seconds = par.getInt("seconds"); return changed; } +bool DynamicMeshSubFilter::compareMesh(MeshModel* m1, MeshModel* m2){ + return m1->fileName == m2->fileName && m1->cm.Tr == m2->cm.Tr; +} + +void DynamicMeshSubFilter::saveMeshState(MeshDocument& md){ + m_state.clear(); + for(int i = 0; i < md.size(); i++){ + MeshModel* meshCopy = new MeshModel(); + vcg::tri::Append::Mesh(meshCopy->cm, md.getMesh(i)->cm, false, true); + meshCopy->fileName = md.getMesh(i)->fileName; + meshCopy->cm.Tr = md.getMesh(i)->cm.Tr; + m_state.push_back(meshCopy); + } +} + void DynamicMeshSubFilter::initialize(MeshDocument&, RichParameterSet&, vcg::CallBackPos* cb){ m_steps = m_seconds / m_stepSize; } diff --git a/src/fgt/filter_physics/DynamicMeshSubFilter.h b/src/fgt/filter_physics/DynamicMeshSubFilter.h index e4da68db7..f8311ef22 100644 --- a/src/fgt/filter_physics/DynamicMeshSubFilter.h +++ b/src/fgt/filter_physics/DynamicMeshSubFilter.h @@ -20,10 +20,16 @@ protected: virtual void initialize(MeshDocument&, RichParameterSet&, vcg::CallBackPos* cb); virtual bool configurationHasChanged(MeshDocument& md, RichParameterSet& par); + void saveMeshState(MeshDocument& md); int m_steps; int m_seconds; LayersTransformations m_layersTrans; + std::vector m_files; + std::vector m_state; + +private: + bool compareMesh(MeshModel* m1, MeshModel* m2); }; #endif // DYNAMICMESHSUBFILTER_H diff --git a/src/fgt/filter_physics/GravitySubFilter.cpp b/src/fgt/filter_physics/GravitySubFilter.cpp index dcb50c5bb..3a2edb653 100644 --- a/src/fgt/filter_physics/GravitySubFilter.cpp +++ b/src/fgt/filter_physics/GravitySubFilter.cpp @@ -1,6 +1,10 @@ #include "GravitySubFilter.h" +int GravitySubFilter::m_filterType = -1; + GravitySubFilter::GravitySubFilter() : m_scenery(0){ + MeshSubFilter::m_currentFilterType += 1; + m_filterType = MeshSubFilter::m_currentFilterType; } void GravitySubFilter::initParameterSet(QAction* action,MeshDocument& md, RichParameterSet& par){ @@ -24,8 +28,9 @@ bool GravitySubFilter::applyFilter(QAction* filter, MeshDocument &md, RichParame } bool GravitySubFilter::configurationHasChanged(MeshDocument& md, RichParameterSet& par){ - bool changed = DynamicMeshSubFilter::configurationHasChanged(md, par) || m_scenery != par.getMesh("scenery"); + bool changed = DynamicMeshSubFilter::configurationHasChanged(md, par) || m_scenery != par.getMesh("scenery") || m_currentFilterType != m_filterType; m_scenery = par.getMesh("scenery"); + m_currentFilterType = m_filterType; return changed; } diff --git a/src/fgt/filter_physics/GravitySubFilter.h b/src/fgt/filter_physics/GravitySubFilter.h index 937fe39b4..c00349666 100644 --- a/src/fgt/filter_physics/GravitySubFilter.h +++ b/src/fgt/filter_physics/GravitySubFilter.h @@ -22,6 +22,8 @@ protected: private: MeshModel* m_scenery; ODEFacade m_engine; + + static int m_filterType; }; #endif // GRAVITYSUBFILTER_H diff --git a/src/fgt/filter_physics/MeshSubFilter.cpp b/src/fgt/filter_physics/MeshSubFilter.cpp index 221239001..5192477bf 100644 --- a/src/fgt/filter_physics/MeshSubFilter.cpp +++ b/src/fgt/filter_physics/MeshSubFilter.cpp @@ -2,3 +2,5 @@ const float MeshSubFilter::m_stepSize = 0.02; const unsigned int MeshSubFilter::m_stepsPerSecond = 1.0f/m_stepSize; +//MeshSubFilter::FilterType MeshSubFilter::m_currentFilterType = FILTERTYPE_UNDEFINED; +int MeshSubFilter::m_currentFilterType = 0; diff --git a/src/fgt/filter_physics/MeshSubFilter.h b/src/fgt/filter_physics/MeshSubFilter.h index dc035d354..0404186f9 100644 --- a/src/fgt/filter_physics/MeshSubFilter.h +++ b/src/fgt/filter_physics/MeshSubFilter.h @@ -14,10 +14,11 @@ public: virtual bool applyFilter(QAction* filter, MeshDocument &md, RichParameterSet& par, vcg::CallBackPos* cb) = 0; protected: - enum SubType{ GRAVITY, RANDOMDROP, RANDOMFILL }; + enum FilterType{ FILTERTYPE_UNDEFINED, FILTERTYPE_GRAVITY, FILTERTYPE_RANDOMDROP, FILTERTYPE_RANDOMFILL }; static const float m_stepSize; static const unsigned int m_stepsPerSecond; + static int m_currentFilterType; }; #endif // MESHSUBFILTER_H diff --git a/src/fgt/filter_physics/ODEFacade.cpp b/src/fgt/filter_physics/ODEFacade.cpp index a967bc216..572a83303 100644 --- a/src/fgt/filter_physics/ODEFacade.cpp +++ b/src/fgt/filter_physics/ODEFacade.cpp @@ -103,7 +103,8 @@ void ODEFacade::setAsRigidBody(MeshModel& mesh, bool isRigidBody){ dMassSetParameters(&m_registeredMeshes[index()].second->mass, inertia.Mass() > 0.f ? inertia.Mass() : 1.f, inertia.CenterOfMass()[0], inertia.CenterOfMass()[1], inertia.CenterOfMass()[2], IT[0][0], IT[1][1], IT[2][2], IT[0][1], IT[0][2], IT[1][2]); - dBodySetMass(m_registeredMeshes[index()].second->body, &m_registeredMeshes[index()].second->mass); + //For now it is best to let ODE do the job automatically + //dBodySetMass(m_registeredMeshes[index()].second->body, &m_registeredMeshes[index()].second->mass); } diff --git a/src/fgt/filter_physics/RandomDropFilter.cpp b/src/fgt/filter_physics/RandomDropFilter.cpp index ae7fce526..ae79f3257 100644 --- a/src/fgt/filter_physics/RandomDropFilter.cpp +++ b/src/fgt/filter_physics/RandomDropFilter.cpp @@ -8,7 +8,11 @@ using namespace std; +int RandomDropFilter::m_filterType = -1; + RandomDropFilter::RandomDropFilter() : m_randomMesh(0), m_dropRate(-1), m_distance(-1){ + MeshSubFilter::m_currentFilterType += 1; + m_filterType = MeshSubFilter::m_currentFilterType; } void RandomDropFilter::initParameterSet(QAction* action,MeshDocument& md, RichParameterSet & par){ @@ -93,6 +97,11 @@ void RandomDropFilter::initialize(MeshDocument& md, RichParameterSet& par, vcg:: m_engine.integrate(m_stepSize); } + /* Was need for old correctness testing + m_files.clear(); + for(int i = 0; i < md.size(); i++) + m_files.push_back(md.getMesh(i)->fileName);*/ + if(cb != 0) (*cb)(99, "Physics pre-renderization of the scene completed..."); } @@ -116,11 +125,13 @@ bool RandomDropFilter::configurationHasChanged(MeshDocument& md, RichParameterSe bool changed = DynamicMeshSubFilter::configurationHasChanged(md, par) || m_randomMesh != par.getMesh("randomMesh") || m_distance != par.getFloat("distance") || - m_dropRate != par.getInt("dropRate"); + m_dropRate != par.getInt("dropRate") || + m_currentFilterType != m_filterType; m_randomMesh = par.getMesh("randomMesh"); m_distance = par.getFloat("distance"); m_dropRate = par.getInt("dropRate"); + m_currentFilterType = m_filterType; return changed; } diff --git a/src/fgt/filter_physics/RandomDropFilter.h b/src/fgt/filter_physics/RandomDropFilter.h index de89d792b..b1592db4b 100644 --- a/src/fgt/filter_physics/RandomDropFilter.h +++ b/src/fgt/filter_physics/RandomDropFilter.h @@ -25,6 +25,8 @@ private: int m_dropRate; float m_distance; ODEFacade m_engine; + + static int m_filterType; }; #endif // RANDOMDROPFILTER_H diff --git a/src/fgt/filter_physics/RandomFillFilter.cpp b/src/fgt/filter_physics/RandomFillFilter.cpp index 090b87366..8e94caa4f 100644 --- a/src/fgt/filter_physics/RandomFillFilter.cpp +++ b/src/fgt/filter_physics/RandomFillFilter.cpp @@ -8,6 +8,13 @@ using namespace std; using namespace vcg; +int RandomFillFilter::m_filterType = -1; + +RandomFillFilter::RandomFillFilter(){ + MeshSubFilter::m_currentFilterType += 1; + m_filterType = MeshSubFilter::m_currentFilterType; +} + void RandomFillFilter::initParameterSet(QAction* action,MeshDocument& md, RichParameterSet & par){ par.addParam(new RichMesh("container", 0, &md, "Container mesh", "This mesh will act as a container for the filling mesh")); par.addParam(new RichMesh("filler", 0, &md, "Filler mesh", "The container mesh will be filled with this mesh")); diff --git a/src/fgt/filter_physics/RandomFillFilter.h b/src/fgt/filter_physics/RandomFillFilter.h index 0c82ac835..3e86a347d 100644 --- a/src/fgt/filter_physics/RandomFillFilter.h +++ b/src/fgt/filter_physics/RandomFillFilter.h @@ -8,6 +8,8 @@ class RandomFillFilter : public MeshSubFilter{ public: + RandomFillFilter(); + virtual void initParameterSet(QAction* action,MeshDocument& md, RichParameterSet & par); virtual bool applyFilter(QAction* filter, MeshDocument &md, RichParameterSet& par, vcg::CallBackPos* cb); @@ -17,6 +19,8 @@ protected: private: int m_dropRate; ODEFacade m_engine; + + static int m_filterType; }; #endif // RANDOMFILLFILTER_H