VizAccessor is now private and renamed to VizStorage

This commit is contained in:
Anatoly Baksheev 2013-11-24 20:06:32 +04:00
parent d970d58308
commit b88fdc73d6
5 changed files with 78 additions and 103 deletions

View File

@ -63,9 +63,12 @@ namespace cv
//! constructs camera pose from position, focal_point and up_vector (see gluLookAt() for more infromation) //! 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); 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); 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 //! checks float value for Nan
inline bool isNan(float x) inline bool isNan(float x)
{ {
@ -88,32 +91,6 @@ namespace cv
template<typename _Tp> inline bool isNan(const Point3_<_Tp>& p) template<typename _Tp> inline bool isNan(const Point3_<_Tp>& p)
{ return isNan(p.x) || isNan(p.y) || isNan(p.z); } { 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 viz */
} /* namespace cv */ } /* namespace cv */

View File

@ -121,6 +121,8 @@ namespace cv
void create(const String &window_name); void create(const String &window_name);
void release(); void release();
friend class VizStorage;
}; };
} /* namespace viz */ } /* namespace viz */

View File

@ -135,20 +135,35 @@ namespace cv
namespace viz namespace viz
{ {
typedef std::map<String, vtkSmartPointer<vtkProp> > WidgetActorMap; 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 "interactor_style.h"
#include "viz3d_impl.hpp" #include "viz3d_impl.hpp"
namespace cv
{
namespace viz
{
typedef std::map<String, Viz3d> VizMap;
typedef std::pair<String, Viz3d> VizPair;
}
}
#endif #endif

View File

@ -107,70 +107,46 @@ namespace cv { namespace viz
}} }}
/////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////
/// 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; String name = generateWindowName(window_name);
}; VizMap::iterator vm_itr = storage.find(name);
CV_Assert(vm_itr != storage.end());
cv::viz::VizAccessor::VizAccessor() { impl_ = new cv::viz::VizAccessor::VizAccessorImpl;} return vm_itr->second;
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() void cv::viz::VizStorage::add(Viz3d window)
{
if (instance_)
{
delete instance_;
instance_ = 0;
}
}
cv::viz::Viz3d cv::viz::VizAccessor::get(const String & window_name)
{
// 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);
}
void cv::viz::VizAccessor::add(Viz3d window)
{ {
String window_name = window.getWindowName(); String window_name = window.getWindowName();
VizMap::iterator vm_itr = impl_->viz_map.find(window_name); VizMap::iterator vm_itr = storage.find(window_name);
if (vm_itr == impl_->viz_map.end()) CV_Assert(vm_itr == storage.end());
impl_->viz_map.insert(VizPair(window_name, window)); storage.insert(VizPair(window_name, window));
} }
void cv::viz::VizAccessor::remove(const String &window_name) bool cv::viz::VizStorage::windowExists(const String &window_name)
{ {
// Add the prefix Viz String name = generateWindowName(window_name);
String name; return storage.find(name) != storage.end();
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);
} }
void cv::viz::VizAccessor::generateWindowName(const String &window_name, String &output) void cv::viz::VizStorage::removeUnreferenced()
{ {
output = "Viz"; for(VizMap::iterator pos = storage.begin(); pos != storage.end(); ++pos)
if(pos->second.impl_->ref_counter == 1)
storage.erase(pos);
}
cv::String cv::viz::VizStorage::generateWindowName(const String &window_name)
{
String output = "Viz";
// Already is Viz // Already is Viz
if (window_name == output) if (window_name == output)
return; return output;
String prefixed = output + " - "; String prefixed = output + " - ";
if (window_name.substr(0, prefixed.length()) == prefixed) if (window_name.substr(0, prefixed.length()) == prefixed)
@ -179,9 +155,9 @@ void cv::viz::VizAccessor::generateWindowName(const String &window_name, String
output = prefixed + window_name; // Doesn't have prefix output = prefixed + window_name; // Doesn't have prefix
else else
output = (window_name == "" ? output : prefixed + window_name); output = (window_name == "" ? output : prefixed + window_name);
return output;
} }
cv::viz::Viz3d cv::viz::get(const String &window_name) cv::viz::Viz3d cv::viz::get(const String &window_name) { return Viz3d(window_name); }
{ void cv::viz::unregisterAllWindows() { VizStorage::unregisterAll(); }
return cv::viz::VizAccessor::getInstance().get(window_name);
}

View File

@ -52,7 +52,8 @@ cv::viz::Viz3d::Viz3d(const String& window_name) : impl_(0) { create(window_name
cv::viz::Viz3d::Viz3d(const Viz3d& other) : impl_(other.impl_) 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) cv::viz::Viz3d& cv::viz::Viz3d::operator=(const Viz3d& other)
@ -70,24 +71,28 @@ cv::viz::Viz3d::~Viz3d() { release(); }
void cv::viz::Viz3d::create(const String &window_name) void cv::viz::Viz3d::create(const String &window_name)
{ {
if (impl_) release(); if (impl_)
impl_ = new VizImpl(window_name); release();
impl_->ref_counter = 1;
// Register the window if (VizStorage::windowExists(window_name))
cv::viz::VizAccessor::getInstance().add(*this); *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() void cv::viz::Viz3d::release()
{ {
// If the current referene count is equal to 2, we can delete it if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 1)
// - 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());
delete impl_; delete impl_;
impl_ = 0;
} impl_ = 0;
VizStorage::removeUnreferenced();
} }
void cv::viz::Viz3d::spin() { impl_->spin(); } void cv::viz::Viz3d::spin() { impl_->spin(); }