OpenWalnut 1.2.5
|
00001 //--------------------------------------------------------------------------- 00002 // 00003 // Project: OpenWalnut ( http://www.openwalnut.org ) 00004 // 00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS 00006 // For more information see http://www.openwalnut.org/copying 00007 // 00008 // This file is part of OpenWalnut. 00009 // 00010 // OpenWalnut is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // OpenWalnut is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>. 00022 // 00023 //--------------------------------------------------------------------------- 00024 00025 #include <vector> 00026 00027 #include <osg/Matrix> 00028 00029 #include "../common/math/WLinearAlgebraFunctions.h" 00030 #include "../graphicsEngine/WGEViewer.h" 00031 #include "../graphicsEngine/WGEZoomTrackballManipulator.h" 00032 #include "../graphicsEngine/WGraphicsEngine.h" 00033 #include "WKernel.h" 00034 #include "WSelectionManager.h" 00035 00036 00037 WSelectionManager::WSelectionManager() : 00038 m_paintMode( PAINTMODE_NONE ), 00039 m_textureOpacity( 1.0 ), 00040 m_useTexture( false ) 00041 { 00042 m_crosshair = boost::shared_ptr< WCrosshair >( new WCrosshair() ); 00043 00044 m_sliceGroup = boost::shared_ptr< WProperties >( new WProperties( "Slice Properties", 00045 "Properties relating to the Axial,Coronal and Sagittal Slices." ) ); 00046 00047 // create dummy properties for slices. Get updated by modules. 00048 m_axialPos = m_sliceGroup->addProperty( "Axial Position", "Slice X position.", 0.0, true ); 00049 m_coronalPos = m_sliceGroup->addProperty( "Coronal Position", "Slice Y position.", 0.0, true ); 00050 m_sagittalPos = m_sliceGroup->addProperty( "Sagittal Position", "Slice Z position.", 0.0, true ); 00051 00052 // visibility flags 00053 m_axialShow = m_sliceGroup->addProperty( "Show Axial Slice", "Slice visible?", true, true ); 00054 m_coronalShow = m_sliceGroup->addProperty( "Show Coronal Slice", "Slice visible?", true, true ); 00055 m_sagittalShow = m_sliceGroup->addProperty( "Show Sagittal Slice", "Slice visible?", true, true ); 00056 00057 // until now, no bbox information is available. 00058 m_axialPos->setMin( 0.0 ); 00059 m_coronalPos->setMin( 0.0 ); 00060 m_sagittalPos->setMin( 0.0 ); 00061 m_axialPos->setMax( 0.0 ); 00062 m_coronalPos->setMax( 0.0 ); 00063 m_sagittalPos->setMax( 0.0 ); 00064 00065 m_axialUpdateConnection = m_axialPos->getUpdateCondition()->subscribeSignal( 00066 boost::bind( &WSelectionManager::updateCrosshairPosition, this ) 00067 ); 00068 m_coronalUpdateConnection = m_coronalPos->getUpdateCondition()->subscribeSignal( 00069 boost::bind( &WSelectionManager::updateCrosshairPosition, this ) 00070 ); 00071 m_sagittalUpdateConnection = m_sagittalPos->getUpdateCondition()->subscribeSignal( 00072 boost::bind( &WSelectionManager::updateCrosshairPosition, this ) 00073 ); 00074 } 00075 00076 WSelectionManager::~WSelectionManager() 00077 { 00078 } 00079 00080 boost::shared_ptr< WCrosshair >WSelectionManager::getCrosshair() 00081 { 00082 return m_crosshair; 00083 } 00084 00085 int WSelectionManager::getFrontSector() 00086 { 00087 boost::shared_ptr< WGEViewer > viewer; 00088 viewer = WKernel::getRunningKernel()->getGraphicsEngine()->getViewerByName( "main" ); 00089 viewer->getCamera()->getViewMatrix(); 00090 osg::Matrix rm = viewer->getCamera()->getViewMatrix(); 00091 00092 WMatrix< double > rotMat( 4, 4 ); 00093 for( size_t i = 0; i < 4; ++i ) 00094 { 00095 for( size_t j = 0; j < 4; ++j ) 00096 { 00097 rotMat( i, j ) = rm( i, j ); 00098 } 00099 } 00100 WPosition v1( 0, 0, 1 ); 00101 WPosition view; 00102 view = transformPosition3DWithMatrix4D( rotMat, v1 ); 00103 00104 std::vector<float> dots( 8 ); 00105 WPosition v2( 1, 1, 1 ); 00106 dots[0] = dot( v2, view ); 00107 00108 v2[2] = -1; 00109 dots[1] = dot( v2, view ); 00110 00111 v2[1] = -1; 00112 dots[2] = dot( v2, view ); 00113 00114 v2[2] = 1; 00115 dots[3] = dot( v2, view ); 00116 00117 v2[0] = -1; 00118 dots[4] = dot( v2, view ); 00119 00120 v2[2] = -1; 00121 dots[5] = dot( v2, view ); 00122 00123 v2[1] = 1; 00124 dots[6] = dot( v2, view ); 00125 00126 v2[2] = 1; 00127 dots[7] = dot( v2, view ); 00128 00129 float max = 0.0; 00130 int quadrant = 0; 00131 for( int i = 0; i < 8; ++i ) 00132 { 00133 if( dots[i] > max ) 00134 { 00135 max = dots[i]; 00136 quadrant = i; 00137 } 00138 } 00139 return quadrant; 00140 } 00141 00142 void WSelectionManager::setPaintMode( WPaintMode mode ) 00143 { 00144 m_paintMode = mode; 00145 00146 osg::static_pointer_cast<WGEZoomTrackballManipulator>( 00147 WKernel::getRunningKernel()->getGraphicsEngine()->getViewer()->getCameraManipulator() )->setPaintMode( mode ); 00148 WKernel::getRunningKernel()->getGraphicsEngine()->getViewer()->getPickHandler()->setPaintMode( mode ); 00149 } 00150 00151 WPaintMode WSelectionManager::getPaintMode() 00152 { 00153 return m_paintMode; 00154 } 00155 00156 void WSelectionManager::setTexture( osg::ref_ptr< osg::Texture3D > texture, boost::shared_ptr< WGridRegular3D >grid ) 00157 { 00158 m_texture = texture; 00159 m_textureGrid = grid; 00160 } 00161 00162 00163 boost::shared_ptr< WGridRegular3D >WSelectionManager::getGrid() 00164 { 00165 return m_textureGrid; 00166 } 00167 00168 void WSelectionManager::setUseTexture( bool flag ) 00169 { 00170 m_useTexture = flag; 00171 } 00172 00173 bool WSelectionManager::getUseTexture() 00174 { 00175 return m_useTexture; 00176 } 00177 00178 00179 float WSelectionManager::getTextureOpacity() 00180 { 00181 return m_textureOpacity; 00182 } 00183 00184 void WSelectionManager::setTextureOpacity( float value ) 00185 { 00186 if( value < 0.0 ) 00187 { 00188 value = 0.0; 00189 } 00190 if( value > 1.0 ) 00191 { 00192 value = 1.0; 00193 } 00194 m_textureOpacity = value; 00195 } 00196 00197 WPropDouble WSelectionManager::getPropAxialPos() 00198 { 00199 return m_axialPos; 00200 } 00201 00202 WPropDouble WSelectionManager::getPropCoronalPos() 00203 { 00204 return m_coronalPos; 00205 } 00206 00207 WPropDouble WSelectionManager::getPropSagittalPos() 00208 { 00209 return m_sagittalPos; 00210 } 00211 00212 WPropBool WSelectionManager::getPropAxialShow() 00213 { 00214 return m_axialShow; 00215 } 00216 00217 WPropBool WSelectionManager::getPropCoronalShow() 00218 { 00219 return m_coronalShow; 00220 } 00221 00222 WPropBool WSelectionManager::getPropSagittalShow() 00223 { 00224 return m_sagittalShow; 00225 } 00226 00227 void WSelectionManager::setShader( int shader ) 00228 { 00229 m_shader = shader; 00230 } 00231 00232 int WSelectionManager::getShader() 00233 { 00234 return m_shader; 00235 } 00236 00237 void WSelectionManager::updateCrosshairPosition() 00238 { 00239 m_crosshair->setPosition( WPosition( m_sagittalPos->get(), m_coronalPos->get(), m_axialPos->get() ) ); 00240 } 00241