10.12., 9:00 - 11:00: Due to updates GitLab may be unavailable for some minutes between 09:00 and 11:00.

Commit e3cb6c9c authored by Hossain Mahmud's avatar Hossain Mahmud

Issue543: changing raycaster in volumeexplorer: added raycasterfactory,...

Issue543: changing raycaster in volumeexplorer: added raycasterfactory, something is going wrong while replacing

Conflicts:
	modules/vis/processors/drrraycaster.h
	modules/vis/processors/simpleraycaster.h

Conflicts:
	modules/vis/processors/volumerenderer.cpp
	modules/vis/processors/volumerenderer.h
parent 5fd1f6ab
......@@ -122,7 +122,12 @@ namespace campvis {
* \param viewportSizeProp Pointer to the property defining the viewport size, must not be 0.
*/
virtual void setViewportSizeProperty(IVec2Property* viewportSizeProp);
/**
* Returns the effective viewport size considering LQ mode.
* \return lqMode ? _viewportSize/2 : _viewportSize
*/
cgt::ivec2 getEffectiveViewportSize() const;
BoolProperty p_lqMode; ///< Flag whether to enable LQ mode (halfsamples effective viewport size)
......@@ -155,12 +160,6 @@ namespace campvis {
*/
void createAndAttachDepthTexture();
/**
* Returns the effective viewport size considering LQ mode.
* \return lqMode ? _viewportSize/2 : _viewportSize
*/
cgt::ivec2 getEffectiveViewportSize() const;
/**
* Returns the current viewport size as ivec3.
* \return cgt::ivec3(getEffectiveViewportSize(), 1)
......
......@@ -10,10 +10,12 @@ LIST(APPEND CampvisModulesHeaders
gen_pipelineregistration.h
pipelinefactory.h
processorfactory.h
raycasterfactory.h
)
LIST(APPEND CampvisModulesSources
pipelinefactory.cpp
processorfactory.cpp
raycasterfactory.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,9 +33,13 @@
#include "core/classification/simpletransferfunction.h"
#include "../../raycasterfactory.h"
namespace campvis {
const std::string VolumeRenderer::loggerCat_ = "CAMPVis.modules.vis.VolumeRenderer";
//static const std::string* raycastingProcessorName = &RaycasterFactory::getRef().getRegisteredRaycasters()[0];
VolumeRenderer::VolumeRenderer(IVec2Property* viewportSizeProp, RaycastingProcessor* raycaster)
: VisualizationProcessor(viewportSizeProp)
, p_inputVolume("InputVolume", "Input Volume", "", DataNameProperty::READ)
......@@ -72,6 +76,15 @@ namespace campvis {
_eepGenerator.p_exitImageID.setVisible(false);
addProperty(p_eepProps, AbstractProcessor::VALID);
const std::vector<std::string>& raycasters = RaycasterFactory::getRef().getRegisteredRaycasters();
for (int i = 0; i < raycasters.size(); i++) {
p_raycastingProcSelector.addOption(GenericOption<std::string>(raycasters[i], raycasters[i]));
}
if (_raycaster != nullptr) {
p_raycastingProcSelector.selectByOption(_raycaster->getName());
}
addProperty(p_raycastingProcSelector);
p_raycasterProps.addPropertyCollection(*_raycaster);
_raycaster->p_lqMode.setVisible(false);
_raycaster->p_camera.setVisible(false);
......@@ -189,6 +202,37 @@ namespace campvis {
_raycaster->p_targetImageID.setValue(p_outputImage.getValue() + ".raycasted");
_orientationOverlay.p_passThroughImageId.setValue(p_outputImage.getValue() + ".raycasted");
}
if (prop == &p_raycastingProcSelector) {
// Change to previous raycaster if "Select Processor" is selected
if (p_raycastingProcSelector.getOptionId() == p_raycastingProcSelector.getOptions()[0]._id) {
p_raycastingProcSelector.selectById(_raycaster->getName());
return;
}
if (p_raycastingProcSelector.getOptionId() == _raycaster->getName()) {
return;
}
RaycastingProcessor *currentRaycaster = _raycaster;
removeProperty(p_raycasterProps);
//p_raycasterProps.deinitAllProperties();
p_raycasterProps.clearProperties();
_raycaster = RaycasterFactory::getRef().createRaycaster(p_raycastingProcSelector.getOptionId(), p_viewportSizeProp);
p_raycasterProps.addPropertyCollection(*_raycaster);
//_raycaster->p_lqMode.setVisible(false);
//_raycaster->p_camera.setVisible(false);
//_raycaster->p_sourceImageID.setVisible(false);
//_raycaster->p_entryImageID.setVisible(false);
//_raycaster->p_exitImageID.setVisible(false);
//_raycaster->p_targetImageID.setVisible(false);
addProperty(p_raycasterProps, AbstractProcessor::VALID);
delete currentRaycaster;
invalidate(RAYCASTER_INVALID);
}
VisualizationProcessor::onPropertyChanged(prop);
}
......
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