The expiration time for new job artifacts in CI/CD pipelines is now 30 days (GitLab default). Previously generated artifacts in already completed jobs will not be affected by the change. The latest artifacts for all jobs in the latest successful pipelines will be kept. More information: https://gitlab.lrz.de/help/user/admin_area/settings/continuous_integration.html#default-artifacts-expiration

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
modulesapi.h
gen_pipelineregistration.h
pipelinefactory.h
raycasterfactory.h
processorfactory.h
)
LIST(APPEND CampvisModulesSources
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 @@
#include "core/classification/simpletransferfunction.h"
#include "../../raycasterfactory.h"
#include "cgt/opengljobprocessor.h"
namespace campvis {
......@@ -77,7 +76,7 @@ namespace campvis {
_eepGenerator.p_exitImageID.setVisible(false);
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++) {
p_raycastingProcSelector.addOption(GenericOption<std::string>(raycasters[i], raycasters[i]));
}
......@@ -224,7 +223,9 @@ namespace campvis {
p_raycasterProps.clearProperties();
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);
//_raycaster->p_lqMode.setVisible(false);
//_raycaster->p_camera.setVisible(false);
......@@ -246,7 +247,7 @@ namespace campvis {
_raycaster->p_exitImageID.setValue(currentRaycaster->p_exitImageID.getValue());
_raycaster->p_targetImageID.setValue(currentRaycaster->p_targetImageID.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_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