Commit e4760f45 authored by Hossain Mahmud's avatar Hossain Mahmud
Browse files

rebased and replaced raycasterfactory

parent fb61a770
...@@ -9,11 +9,11 @@ LIST(APPEND CampvisModulesHeaders ...@@ -9,11 +9,11 @@ LIST(APPEND CampvisModulesHeaders
modulesapi.h modulesapi.h
gen_pipelineregistration.h gen_pipelineregistration.h
pipelinefactory.h pipelinefactory.h
raycasterfactory.h processorfactory.h
) )
LIST(APPEND CampvisModulesSources LIST(APPEND CampvisModulesSources
pipelinefactory.cpp pipelinefactory.cpp
raycasterfactory.cpp processorfactory.cpp
) )
......
// ================================================================================================
//
// This file is part of the CAMPVis Software Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
// Christian Schulte zu Berge <christian.szb@in.tum.de>
// Chair for Computer Aided Medical Procedures
// Technische Universitaet Muenchen
// Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
//
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
//
// ================================================================================================
#include "raycasterfactory.h"
#include <sstream>
namespace campvis {
// declare one single symbol for the RaycasterFactory singleton
tbb::atomic<RaycasterFactory*> RaycasterFactory::_singleton;
RaycasterFactory& RaycasterFactory::getRef() {
if (_singleton == 0) {
std::cout << "creating RaycasterFactory...\n";
RaycasterFactory* tmp = new RaycasterFactory();
if (_singleton.compare_and_swap(tmp, 0) != 0) {
delete tmp;
}
}
return *_singleton;
}
void RaycasterFactory::deinit() {
delete _singleton;
_singleton = nullptr;
}
std::vector<std::string> RaycasterFactory::getRegisteredRaycasters() const {
tbb::spin_mutex::scoped_lock lock(_mutex);
std::vector<std::string> toReturn;
toReturn.reserve(_raycasterMap.size());
for (auto it = _raycasterMap.begin(); it != _raycasterMap.end(); ++it)
toReturn.push_back(it->first);
return toReturn;
}
RaycastingProcessor* RaycasterFactory::createRaycaster(const std::string& id, IVec2Property* viewportSizeProp) const {
tbb::spin_mutex::scoped_lock lock(_mutex);
auto it = _raycasterMap.find(id);
if (it == _raycasterMap.end())
return nullptr;
else
return (it->second)(viewportSizeProp);
}
}
// ================================================================================================
//
// This file is part of the CAMPVis Software Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
// Christian Schulte zu Berge <christian.szb@in.tum.de>
// Chair for Computer Aided Medical Procedures
// Technische Universitaet Muenchen
// Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
//
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
//
// ================================================================================================
#ifndef RAYCASTERFACTORY_H__
#define RAYCASTERFACTORY_H__
#include "cgt/logmanager.h"
#include "cgt/singleton.h"
#include <tbb/atomic.h>
#include <tbb/spin_mutex.h>
#include "core/properties/numericproperty.h"
#include "modules/modulesapi.h"
#include <map>
#include <string>
#include <vector>
#include <functional>
namespace campvis {
class RaycastingProcessor;
/**
* Factory for creating raycasters by their name.
* Using some template-magic, RaycasterFactory is able to register raycasters during static
* initialization in cooperation with the RaycasterRegistrar.
*
* \note RaycasterFactory is a thread-safe lazy-instantiated singleton.
*/
class CAMPVIS_MODULES_API RaycasterFactory {
public:
/**
* Returns a reference to the RaycasterFactory singleton.
* Creates the singleton if necessary
* \return *_singleton
*/
static RaycasterFactory& getRef();
static void deinit();
std::vector<std::string> getRegisteredRaycasters() const;
RaycastingProcessor* createRaycaster(const std::string& id, IVec2Property* viewportSizeProp) const;
/**
* Statically registers the raycaster of type T using \a callee as factory method.
* \note The template instantiation of RaycasterRegistrar takes care of calling this method.
* \param callee Factory method to call to create an instance of type T
* \return The registration index.
*/
template<typename T>
size_t registerRaycaster(std::function<RaycastingProcessor*(IVec2Property*)> callee) {
tbb::spin_mutex::scoped_lock lock(_mutex);
auto it = _raycasterMap.lower_bound(T::getId());
if (it == _raycasterMap.end() || it->first != T::getId()) {
_raycasterMap.insert(it, std::make_pair(T::getId(), callee));
}
else {
cgtAssert(false, "Registered two raycasters with the same ID.");
}
return _raycasterMap.size();
}
private:
mutable tbb::spin_mutex _mutex;
static tbb::atomic<RaycasterFactory*> _singleton; ///< the singleton object
std::map< std::string, std::function<RaycastingProcessor*(IVec2Property*)> > _raycasterMap;
};
// ================================================================================================
template<typename T>
class RaycasterRegistrar {
public:
/**
* Static factory method for creating the raycaster of type T.
* \param viewportSizeProp IVec2Property for the created raycaster to work on.
* \return A newly created raycaster of type T. Caller has to take ownership of the pointer.
*/
static RaycastingProcessor* create(IVec2Property* viewportSizeProp) {
return new T(viewportSizeProp);
}
private:
/// static helper field to ensure registration at static initialization time.
static const size_t _factoryId;
};
template<typename T>
const size_t RaycasterRegistrar<T>::_factoryId = RaycasterFactory::getRef().registerRaycaster<T>(&RaycasterRegistrar<T>::create);
}
#endif // RAYCASTERFACTORY_H__
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include "core/classification/simpletransferfunction.h" #include "core/classification/simpletransferfunction.h"
#include "../../raycasterfactory.h"
#include "cgt/opengljobprocessor.h" #include "cgt/opengljobprocessor.h"
namespace campvis { namespace campvis {
...@@ -77,7 +76,7 @@ namespace campvis { ...@@ -77,7 +76,7 @@ namespace campvis {
_eepGenerator.p_exitImageID.setVisible(false); _eepGenerator.p_exitImageID.setVisible(false);
addProperty(p_eepProps, AbstractProcessor::VALID); addProperty(p_eepProps, AbstractProcessor::VALID);
const std::vector<std::string>& raycasters = RaycasterFactory::getRef().getRegisteredRaycasters(); const std::vector<std::string>& raycasters = ProcessorFactory::getRef().getRegisteredProcessors();
for (int i = 0; i < raycasters.size(); i++) { for (int i = 0; i < raycasters.size(); i++) {
p_raycastingProcSelector.addOption(GenericOption<std::string>(raycasters[i], raycasters[i])); p_raycastingProcSelector.addOption(GenericOption<std::string>(raycasters[i], raycasters[i]));
} }
...@@ -224,7 +223,9 @@ namespace campvis { ...@@ -224,7 +223,9 @@ namespace campvis {
p_raycasterProps.clearProperties(); p_raycasterProps.clearProperties();
currentRaycaster->s_invalidated.disconnect(this); currentRaycaster->s_invalidated.disconnect(this);
_raycaster = RaycasterFactory::getRef().createRaycaster(p_raycastingProcSelector.getOptionId(), _viewportSizeProperty); _raycaster = dynamic_cast<RaycastingProcessor*>(ProcessorFactory::getRef().createProcessor(p_raycastingProcSelector.getOptionId(), _viewportSizeProperty));
cgtAssert(_raycaster != 0, "Raycaster must not be 0.");
p_raycasterProps.addPropertyCollection(*_raycaster); p_raycasterProps.addPropertyCollection(*_raycaster);
//_raycaster->p_lqMode.setVisible(false); //_raycaster->p_lqMode.setVisible(false);
//_raycaster->p_camera.setVisible(false); //_raycaster->p_camera.setVisible(false);
...@@ -246,7 +247,7 @@ namespace campvis { ...@@ -246,7 +247,7 @@ namespace campvis {
_raycaster->p_exitImageID.setValue(currentRaycaster->p_exitImageID.getValue()); _raycaster->p_exitImageID.setValue(currentRaycaster->p_exitImageID.getValue());
_raycaster->p_targetImageID.setValue(currentRaycaster->p_targetImageID.getValue()); _raycaster->p_targetImageID.setValue(currentRaycaster->p_targetImageID.getValue());
_raycaster->p_camera.setValue(currentRaycaster->p_camera.getValue()); _raycaster->p_camera.setValue(currentRaycaster->p_camera.getValue());
//_raycaster->p_transferFunction.replaceTF(currentRaycaster->p_transferFunction.getTF()); _raycaster->p_transferFunction.replaceTF(currentRaycaster->p_transferFunction.getTF()->clone());
_raycaster->p_jitterStepSizeMultiplier.setValue(currentRaycaster->p_jitterStepSizeMultiplier.getValue()); _raycaster->p_jitterStepSizeMultiplier.setValue(currentRaycaster->p_jitterStepSizeMultiplier.getValue());
_raycaster->p_samplingRate.setValue(currentRaycaster->p_samplingRate.getValue()); _raycaster->p_samplingRate.setValue(currentRaycaster->p_samplingRate.getValue());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment