diff --git a/OpenSim/Simulation/Model/Geometry.cpp b/OpenSim/Simulation/Model/Geometry.cpp index 244ac99b35..137546f57b 100644 --- a/OpenSim/Simulation/Model/Geometry.cpp +++ b/OpenSim/Simulation/Model/Geometry.cpp @@ -237,6 +237,11 @@ void Mesh::extendFinalizeFromProperties() { std::cout << "Mesh " << get_mesh_file() << " not connected to model..ignoring" << std::endl; return; // Orphan Mesh not descendant of a model } + const Model* ownerModel = dynamic_cast(rootModel); + + //No visualization don't try to load meshes + if (!ownerModel->visualizationIsEnabled()) + return; // Current interface to Visualizer calls generateDecorations on every // frame. On first time through, load file and create DecorativeMeshFile diff --git a/OpenSim/Simulation/Model/Model.h b/OpenSim/Simulation/Model/Model.h index cefb73258b..b468c89d9e 100644 --- a/OpenSim/Simulation/Model/Model.h +++ b/OpenSim/Simulation/Model/Model.h @@ -328,7 +328,20 @@ OpenSim_OBJECT_NONTEMPLATE_DEFS(Model, ModelComponent); ModelVisualizer that provides visualization and interaction with the %Model as it is executing. The default is no visualization. @see getModelVisualizer() **/ - void setUseVisualizer(bool visualize) {_useVisualizer=visualize;} + void setUseVisualizer(bool visualize) { + _useVisualizer=visualize; + enableVisualization(visualize); + } + // Enable visualization overall, loading mesh files etc. + void enableVisualization(bool enable) { + // Propagate flag so that meshes are loaded (or not) + upd_ModelVisualPreferences().setVisualize(enable); + finalizeFromProperties(); + } + // Return status if visualize flag (different from useVisualizer) + bool visualizationIsEnabled() const { + return get_ModelVisualPreferences().visualize(); + } /** Return the current setting of the "use visualizer" flag, which will take effect at the next call to initSystem() on this %Model. **/ bool getUseVisualizer() const {return _useVisualizer;} @@ -1064,7 +1077,7 @@ OpenSim_OBJECT_NONTEMPLATE_DEFS(Model, ModelComponent); SimTK::Array_& appendToThis) const override; /**@}**/ - + //-------------------------------------------------------------------------- private: diff --git a/OpenSim/Simulation/Model/ModelVisualPreferences.h b/OpenSim/Simulation/Model/ModelVisualPreferences.h index 156ae6f99f..9ed6724da2 100644 --- a/OpenSim/Simulation/Model/ModelVisualPreferences.h +++ b/OpenSim/Simulation/Model/ModelVisualPreferences.h @@ -53,7 +53,6 @@ class OSIMSIMULATION_API ModelVisualPreferences : public Object { //========================================================================== OpenSim_DECLARE_UNNAMED_PROPERTY(ModelDisplayHints, "Model display preferences"); - //-------------------------------------------------------------------------- // CONSTRUCTION //-------------------------------------------------------------------------- @@ -63,10 +62,17 @@ class OSIMSIMULATION_API ModelVisualPreferences : public Object { } virtual ~ModelVisualPreferences() {}; + bool visualize() const { + return _visualize; + } + void setVisualize(bool visualizationStatus) { + _visualize = visualizationStatus; + } private: void constructProperties() { constructProperty_ModelDisplayHints(ModelDisplayHints()); } + bool _visualize; //============================================================================= }; // END of class ModelVisualPreferences //============================================================================= diff --git a/OpenSim/Tools/Test/testVisualization.cpp b/OpenSim/Tools/Test/testVisualization.cpp index 4d16832c00..c706ea541f 100644 --- a/OpenSim/Tools/Test/testVisualization.cpp +++ b/OpenSim/Tools/Test/testVisualization.cpp @@ -121,14 +121,16 @@ int main() LoadOpenSimLibrary("osimActuators"); Model testModel("BuiltinGeometry.osim"); + testModel.enableVisualization(true); testVisModel(testModel, "vis_BuiltinGeometry.txt"); std::cout << "BuiltinGeometry Passed" << std::endl; Model testModel2 = createModel4AppearanceTest(); + testModel2.enableVisualization(true); testVisModel(testModel2, "vis_AppearanceTest.txt"); std::cout << "Appearance test Passed" << std::endl; // Load Model in 3.3 format that had transforms attached to Geometry Model testModel3("double_pendulum33.osim"); - + testModel3.enableVisualization(true); SimTK::Array_ standard; testModel3.updDisplayHints().set_show_frames(true); populate_doublePendulumPrimitives(standard); @@ -138,17 +140,20 @@ int main() // Now a model from 3.3 where both GeometrySet and individual DisplayGeometry // have a non-trivial transform. Model composedTransformsModel("doubletransform33.osim"); + composedTransformsModel.enableVisualization(true); composedTransformsModel.updDisplayHints().set_show_frames(true); populate_composedTransformPrimitives(standard); testVisModelAgainstStandard(composedTransformsModel, standard); // Model with contacts Model modelWithContacts("visualize_contacts.osim"); + modelWithContacts.enableVisualization(true); modelWithContacts.updDisplayHints().set_show_frames(true); populate_contactModelPrimitives(standard); testVisModelAgainstStandard(modelWithContacts, standard); // Model with WrapObjects Model modelWithWrap("test_wrapAllVis.osim"); + modelWithWrap.enableVisualization(true); modelWithWrap.updDisplayHints().set_show_frames(true); populate_wrapModelPrimitives(standard); modelWithWrap.updDisplayHints().set_show_frames(false);