//! constructs camera pose from position, focal_point and up_vector (see gluLookAt() for more infromation)
CV_EXPORTS Affine3f makeCameraPose(const Vec3f& position, const Vec3f& focal_point, const Vec3f& y_dir);
- //! retrieves a window by its name
+ //! retrieves a window by its name. If no window with such name, then it creates new.
CV_EXPORTS Viz3d get(const String &window_name);
+ //! Unregisters all Viz windows from internal database. After it 'get()' will create new windows instead getting existing from the database.
+ CV_EXPORTS void unregisterAllWindows();
+
//! checks float value for Nan
inline bool isNan(float x)
{
template<typename _Tp> inline bool isNan(const Point3_<_Tp>& p)
{ return isNan(p.x) || isNan(p.y) || isNan(p.z); }
- //! helper class that provides access by name infrastructure
- class CV_EXPORTS VizAccessor
- {
- public:
- static VizAccessor & getInstance();
- static void release();
-
- Viz3d get(const String &window_name);
-
- //! window names automatically have Viz - prefix even though not provided by the users
- static void generateWindowName(const String &window_name, String &output);
-
- private:
- VizAccessor(); // Singleton
- ~VizAccessor();
-
- void add(Viz3d window);
- void remove(const String &window_name);
-
- static VizAccessor * instance_;
-
- struct VizAccessorImpl;
- VizAccessorImpl * impl_;
-
- friend class Viz3d;
- };
} /* namespace viz */
} /* namespace cv */
void create(const String &window_name);
void release();
+
+ friend class VizStorage;
};
} /* namespace viz */
namespace viz
{
typedef std::map<String, vtkSmartPointer<vtkProp> > WidgetActorMap;
+ typedef std::map<String, Viz3d> VizMap;
+ typedef std::pair<String, Viz3d> VizPair;
+
+ class VizStorage
+ {
+ public:
+ static void unregisterAll();
+
+ //! window names automatically have Viz - prefix even though not provided by the users
+ static String generateWindowName(const String &window_name);
+
+ private:
+ VizStorage(); // Static
+ ~VizStorage();
+
+ static void add(Viz3d window);
+ static Viz3d get(const String &window_name);
+ static void remove(const String &window_name);
+ static bool windowExists(const String &window_name);
+ static void removeUnreferenced();
+
+ static VizMap storage;
+ friend class Viz3d;
+ };
}
}
#include "interactor_style.h"
#include "viz3d_impl.hpp"
-namespace cv
-{
- namespace viz
- {
- typedef std::map<String, Viz3d> VizMap;
- typedef std::pair<String, Viz3d> VizPair;
- }
-}
-
#endif
}}
///////////////////////////////////////////////////////////////////////////////////////////////
-/// Viz accessor implementation
+/// VizStorage implementation
-cv::viz::VizAccessor * cv::viz::VizAccessor::instance_ = 0;
+cv::viz::VizMap cv::viz::VizStorage::storage;
+void cv::viz::VizStorage::unregisterAll() { storage.clear(); }
-struct cv::viz::VizAccessor::VizAccessorImpl
+cv::viz::Viz3d cv::viz::VizStorage::get(const String &window_name)
{
- cv::viz::VizMap viz_map;
-};
-
-cv::viz::VizAccessor::VizAccessor() { impl_ = new cv::viz::VizAccessor::VizAccessorImpl;}
-cv::viz::VizAccessor::~VizAccessor() { delete impl_; }
-
-cv::viz::VizAccessor & cv::viz::VizAccessor::getInstance()
-{
- if (!instance_)
- instance_ = new VizAccessor();
-
- return *instance_;
-}
-
-void cv::viz::VizAccessor::release()
-{
- if (instance_)
- {
- delete instance_;
- instance_ = 0;
- }
+ String name = generateWindowName(window_name);
+ VizMap::iterator vm_itr = storage.find(name);
+ CV_Assert(vm_itr != storage.end());
+ return vm_itr->second;
}
-cv::viz::Viz3d cv::viz::VizAccessor::get(const String & window_name)
+void cv::viz::VizStorage::add(Viz3d window)
{
- // Add the prefix Viz
- String name;
- generateWindowName(window_name, name);
-
- VizMap::iterator vm_itr = impl_->viz_map.find(name);
- return vm_itr != impl_->viz_map.end() ? vm_itr->second : Viz3d(window_name);
+ String window_name = window.getWindowName();
+ VizMap::iterator vm_itr = storage.find(window_name);
+ CV_Assert(vm_itr == storage.end());
+ storage.insert(VizPair(window_name, window));
}
-void cv::viz::VizAccessor::add(Viz3d window)
+bool cv::viz::VizStorage::windowExists(const String &window_name)
{
- String window_name = window.getWindowName();
- VizMap::iterator vm_itr = impl_->viz_map.find(window_name);
- if (vm_itr == impl_->viz_map.end())
- impl_->viz_map.insert(VizPair(window_name, window));
+ String name = generateWindowName(window_name);
+ return storage.find(name) != storage.end();
}
-void cv::viz::VizAccessor::remove(const String &window_name)
+void cv::viz::VizStorage::removeUnreferenced()
{
- // Add the prefix Viz
- String name;
- generateWindowName(window_name, name);
-
- VizMap::iterator vm_itr = impl_->viz_map.find(name);
- if (vm_itr != impl_->viz_map.end())
- impl_->viz_map.erase(vm_itr);
+ for(VizMap::iterator pos = storage.begin(); pos != storage.end(); ++pos)
+ if(pos->second.impl_->ref_counter == 1)
+ storage.erase(pos);
}
-void cv::viz::VizAccessor::generateWindowName(const String &window_name, String &output)
+cv::String cv::viz::VizStorage::generateWindowName(const String &window_name)
{
- output = "Viz";
+ String output = "Viz";
// Already is Viz
if (window_name == output)
- return;
+ return output;
String prefixed = output + " - ";
if (window_name.substr(0, prefixed.length()) == prefixed)
output = prefixed + window_name; // Doesn't have prefix
else
output = (window_name == "" ? output : prefixed + window_name);
-}
-cv::viz::Viz3d cv::viz::get(const String &window_name)
-{
- return cv::viz::VizAccessor::getInstance().get(window_name);
+ return output;
}
+
+cv::viz::Viz3d cv::viz::get(const String &window_name) { return Viz3d(window_name); }
+void cv::viz::unregisterAllWindows() { VizStorage::unregisterAll(); }
cv::viz::Viz3d::Viz3d(const Viz3d& other) : impl_(other.impl_)
{
- if (impl_) CV_XADD(&impl_->ref_counter, 1);
+ if (impl_)
+ CV_XADD(&impl_->ref_counter, 1);
}
cv::viz::Viz3d& cv::viz::Viz3d::operator=(const Viz3d& other)
void cv::viz::Viz3d::create(const String &window_name)
{
- if (impl_) release();
- impl_ = new VizImpl(window_name);
- impl_->ref_counter = 1;
- // Register the window
- cv::viz::VizAccessor::getInstance().add(*this);
+ if (impl_)
+ release();
+
+ if (VizStorage::windowExists(window_name))
+ *this = VizStorage::get(window_name);
+ else
+ {
+ impl_ = new VizImpl(window_name);
+ impl_->ref_counter = 1;
+
+ // Register the window
+ VizStorage::add(*this);
+ }
}
void cv::viz::Viz3d::release()
{
- // If the current referene count is equal to 2, we can delete it
- // - 2 : because minimum there will be two instances, one of which is in the map
- if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 2)
- {
- // Erase the window
- cv::viz::VizAccessor::getInstance().remove(getWindowName());
+ if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 1)
delete impl_;
- impl_ = 0;
- }
+
+ impl_ = 0;
+ VizStorage::removeUnreferenced();
}
void cv::viz::Viz3d::spin() { impl_->spin(); }