Tom,  <br><br>Yea sorry for the confusion.  I was eliding the #ifdefs sections and showing what was working to condense the code.  Here&#39;s was latest hack attack as of Friday minus commented out / unused code.  I wil not have a chance to look at this until Monday and there is no need to respond back until then.  I am sure mxArrayTovtkArray will work and I will try that first chance I get.  I did check for this this function but obviously did not have enough coffee in the afternoon and overlooked it.  Thanks for the insight.   When I get it working I will post again the modified working code.  <br>
<br>This next bit is a little off topic, but applies to vtkMatlabMexAdapter:<br><br>There is however the next part I want to accomplish and that is to take the mex or vtk data and put it in shared memory using Boost.Process <a href="http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess.html">http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess.html</a> specifically Shared Memory <a href="http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_a_simple_example">http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_a_simple_example</a>.  This way I can send the data to another process which stays running so that the visualization is still available after the mex function exits.  What I am also after is not having gobs of copies of data sure I have 16GB of memory on the dev machine, but I would like to be as efficient as possible so I can still develop on my 8GB laptop.  Is there a way to use vtkMatlabMexAdapter and send data through shared memory without a large number of duplicate copies?  Maybe there is a way to put it in the vtkPipeline and utilize shared memory?<br>
<br><br>/*<br> * volume_render.cpp<br> *<br> *  Created on: May 12, 2010<br> *      Author: bdavis<br> */<br><br>#include &quot;vtkPolyDataMapper.h&quot;<br>#include &quot;vtkActor.h&quot;<br>#include &quot;vtkRenderWindow.h&quot;<br>
#include &quot;vtkRenderer.h&quot;<br>#include &quot;vtkRenderWindowInteractor.h&quot;<br>#include &quot;vtkDICOMImageReader.h&quot;<br>#include &quot;vtkVolume.h&quot;<br>#include &quot;vtkVolumeMapper.h&quot;<br>#include &lt;vtkVolumeTextureMapper3D.h&gt;<br>
#include &lt;vtkConeSource.h&gt;<br>#include &quot;vtkImageActor.h&quot;<br>#include &lt;vtkImageCast.h&gt;<br>//#include &lt;vtkVolumeRayCastMapper.h&gt;<br>#include &quot;vtkVolumeRayCastMIPFunction.h&quot;<br>#include &lt;vtkFixedPointVolumeRayCastMapper.h&gt;<br>
#include &lt;vtkFixedPointVolumeRayCastMIPHelper.h&gt;<br>#include &quot;vtkFiniteDifferenceGradientEstimator.h&quot;<br>#include &quot;vtkPiecewiseFunction.h&quot;<br>#include &quot;vtkColorTransferFunction.h&quot;<br>#include &lt;vtkVolumeProperty.h&gt;<br>
<br>#include &lt;vtkKWEGPUInfo.h&gt;<br>#include &lt;vtkKWEGPUInfoList.h&gt;<br>#include &lt;vtkIndent.h&gt;<br><br>// bjd - includes for VTKEdge<br>#include &lt;vtkKWEGPUVolumeRayCastMapper.h&gt;<br>#include &lt;vtkSmartPointer.h&gt;<br>
//#include &lt;vtkDataArray.h&gt;<br>//#include &lt;vtkDenseArray.h&gt;<br>#include &lt;vtkDoubleArray.h&gt;<br>#include &lt;vtkImageData.h&gt;<br>#include &lt;vtkMatlabMexAdapter.h&gt;<br>#include &lt;vtkPointData.h&gt;    <br>
#include &lt;vtkDataArray.h&gt;<br><br>#include &lt;volume_render.h&gt;<br><br><br>// Boost includes<br>#include &lt;boost/numeric/conversion/cast.hpp&gt;  <br><br><br>#include &lt;matrix.h&gt;<br><br><br>#define USE_GPU_RENDER_DEMO_COLORMAP<br>
#define GPU_RENDER_VOLUME<br>#define USE_VTKMATLABMEXADAPTER<br><br>using boost::numeric_cast;<br><br>using boost::numeric::bad_numeric_cast;<br>using boost::numeric::positive_overflow;<br>using boost::numeric::negative_overflow;<br>
<br><br>void DllImportExport volume_render::renderVolumeData( int nrhs, const mxArray *prhs[] )<br>{<br>    #ifndef USE_VTKMATLABMEXADAPTER<br>    double *volumeData;<br>    #else<br>    vtkSmartPointer&lt;vtkDataArray&gt; volumeData;<br>
<br>    #endif<br>    size_t y_dim;<br>    size_t x_dim;<br>    size_t z_dim;<br><br>    if( nrhs &gt; 1 )<br>    {<br>        mexErrMsgTxt(&quot;Render volume can only accept one 3D array to render&quot;);<br>        return;<br>
    }<br><br><br><br>    for (int i = 0; i &lt; nrhs; i++)<br>    {<br><br>        if( mxGetNumberOfDimensions( prhs[i] ) != 3 )<br>        {<br>            mexErrMsgTxt(&quot;Render volume can only accept matrix of 3 dimensions&quot;);<br>
            return;<br>        }<br><br>        // Get the dimensions<br>        const mwSize* matDimensions = mxGetDimensions( prhs[i] );<br><br>        y_dim = matDimensions[0];<br>        x_dim = matDimensions[1];<br>        z_dim = matDimensions[2];<br>
<br>        mexPrintf( &quot;y_dim = %d, x_dim = %d, z_dim = %d \n&quot;, y_dim, x_dim, z_dim );<br><br>        // Get the data <br>        #ifndef USE_VTKMATLABMEXADAPTER<br>        volumeData = mxGetPr(prhs[i]);<br>        #else<br>
<br>        vtkSmartPointer&lt;vtkMatlabMexAdapter&gt; matlabMexAdapter = vtkMatlabMexAdapter::New();<br>        volumeData =<br>            (vtkDataArray*) matlabMexAdapter-&gt;mxArrayTovtkDataArray(prhs[i]);<br>        #endif<br>
    }<br><br><br><br><br><br>    // Create a transfer function mapping scalar value to opacity<br>    vtkPiecewiseFunction *oTFun = vtkPiecewiseFunction::New();<br>    oTFun-&gt;AddSegment(10, 0.0, 255, 0.3);<br><br>    vtkPiecewiseFunction *oTFun2 = vtkPiecewiseFunction::New();<br>
    oTFun2-&gt;AddSegment(  0, 0.0, 128, 1.0);<br>    oTFun2-&gt;AddSegment(128, 1.0, 255, 0.0);<br><br>    // Create a transfer function mapping scalar value to color (grey)<br>    vtkPiecewiseFunction *gTFun = vtkPiecewiseFunction::New();<br>
    #ifndef USE_GPU_RENDER_DEMO_COLORMAP<br>    gTFun-&gt;AddSegment(0, 1.0, 255, 1.0);<br>    #endif<br><br>    // Create a transfer function mapping scalar value to color (color)<br>    vtkColorTransferFunction *cTFun = vtkColorTransferFunction::New();<br>
    #ifndef USE_GPU_RENDER_DEMO_COLORMAP<br>    cTFun-&gt;AddRGBPoint(   0, 1.0, 0.0, 0.0 );<br>    cTFun-&gt;AddRGBPoint(  64, 1.0, 1.0, 0.0 );<br>    cTFun-&gt;AddRGBPoint( 128, 0.0, 1.0, 0.0 );<br>    cTFun-&gt;AddRGBPoint( 192, 0.0, 1.0, 1.0 );<br>
    cTFun-&gt;AddRGBPoint( 255, 0.0, 0.0, 1.0 );<br>    #endif<br>    // Create a transfer function mapping magnitude of gradient to opacity<br>    vtkPiecewiseFunction *goTFun = vtkPiecewiseFunction::New();<br>    #ifndef USE_GPU_RENDER_DEMO_COLORMAP<br>
    goTFun-&gt;AddPoint(   0, 0.0 );<br>    goTFun-&gt;AddPoint(  30, 0.0 );<br>    goTFun-&gt;AddPoint(  40, 1.0 );<br>    goTFun-&gt;AddPoint( 255, 1.0 );<br>    #endif<br><br>    #ifdef USE_GPU_RENDER_DEMO_COLORMAP<br>
    double opacityWindow = 4096;<br>    double opacityLevel = 2048;<br>    cTFun-&gt;AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0 );<br>    goTFun-&gt;AddSegment( opacityLevel - 0.5*opacityWindow, 0.0,<br>                            opacityLevel + 0.5*opacityWindow, 1.0 );<br>
<br>    #endif<br>    vtkVolumeProperty* volumeProperty = vtkVolumeProperty::New();<br>    volumeProperty-&gt;SetColor( cTFun );<br>    volumeProperty-&gt;SetColor( gTFun );<br>    //    volumeProperty-&gt;SetShade(k);<br>
    volumeProperty-&gt;SetAmbient(0.3);<br>    volumeProperty-&gt;SetDiffuse(1.0);<br>    volumeProperty-&gt;SetSpecular(0.2);<br>    volumeProperty-&gt;SetSpecularPower(50.0);<br>    volumeProperty-&gt;SetScalarOpacity(oTFun);<br>
<br>    vtkConeSource *cone = vtkConeSource::New();<br>    cone-&gt;SetHeight( 3.0 );<br>    cone-&gt;SetRadius( 1.0 );<br>    cone-&gt;SetResolution( 10 );<br>    vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();<br>
    coneMapper-&gt;SetInputConnection( cone-&gt;GetOutputPort() );<br>    vtkActor *coneActor = vtkActor::New();<br>    coneActor-&gt;SetMapper( coneMapper );<br><br><br>    // a renderer and render window<br>    vtkRenderer *ren1 = vtkRenderer::New();<br>
    vtkRenderWindow *renWin = vtkRenderWindow::New();<br><br>    // Add the cone.<br>    ren1-&gt;AddActor( coneActor );<br><br><br>    // an interactor<br>    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br>
    iren-&gt;SetRenderWindow(renWin);<br><br>    vtkVolume *volume = vtkVolume::New();<br>    volume-&gt;SetProperty(volumeProperty);<br><br>    #ifndef GPU_RENDER_VOLUME<br>    vtkFixedPointVolumeRayCastMapper * volumeMapper  = vtkFixedPointVolumeRayCastMapper::New();<br>
<br>    vtkFixedPointVolumeRayCastMIPHelper * fixedPointVolumeRayCastMIPHelper = volumeMapper-&gt;GetMIPHelper();<br>    #endif<br><br><br>    #ifndef GPU_RENDER_VOLUME<br><br>    // Create mip ray functions<br>    vtkVolumeRayCastMIPFunction *MIPFunction1 = vtkVolumeRayCastMIPFunction::New();<br>
<br>    MIPFunction1-&gt;SetMaximizeMethodToOpacity();<br><br><br>    vtkFiniteDifferenceGradientEstimator *gradest =<br>        vtkFiniteDifferenceGradientEstimator::New();<br><br><br>    vtkVolumeRayCastMIPFunction *MIPFunction2 =<br>
            vtkVolumeRayCastMIPFunction::New();<br>    MIPFunction2-&gt;SetMaximizeMethodToOpacity();<br>    #else<br>    std::cout &lt;&lt; &quot;performing GPU Rendering&quot; &lt;&lt; std::endl;<br>    // Create and initialize the mapper<br>
    vtkKWEGPUVolumeRayCastMapper *volumeMapper = vtkKWEGPUVolumeRayCastMapper::New();<br><br>    #endif<br><br>    #ifdef USE_GPU_RENDER_DEMO_COLORMAP<br>    volumeMapper-&gt;SetBlendModeToMaximumIntensity();<br>    #endif<br>
<br>    vtkActor * volumeActor = vtkActor::New();<br>/*<br>    std::string fileName = &quot;C:\\data\\343_512recon\\volume\\343_.XA.NEURO_VARIABLE.2.6.2009.10.06.15.19.19.62500.5825682.IMA&quot;;<br>    // Create a dicom reader object.<br>
    //          vtkDICOMImageReader* vtk_dicom_reader = vtkDICOMImageReader::New();<br>    vtkDICOMImageReader * vtk_dicom_reader = vtkDICOMImageReader::New();<br><br>    if( vtk_dicom_reader-&gt;CanReadFile( fileName.c_str() ) )<br>
    {<br>        printf( &quot;VTK is able to open file: %s\n&quot;, fileName.c_str() );<br>    }<br>    else<br>    {<br>        printf( &quot;VTK unable to read file %s\n&quot;, fileName.c_str() );<br>    }<br><br><br>    vtk_dicom_reader-&gt;SetDirectoryName( &quot;C:\\data\\343\\reconstructed 256x256&quot;);<br>
<br><br>    printf( &quot;Setting volume mapper input connection\n&quot; );<br>    // Set the volume mapper to read from the DICOM reader.<br>    volumeMapper-&gt;SetInputConnection( vtk_dicom_reader-&gt;GetOutputPort() );<br>
*/<br><br><br><br>    // vtkDenseArray&lt;double&gt;* vtkArray = vtkDenseArray&lt;double&gt;::New();<br>    // vtkSmartPointer&lt;vtkDenseArray&lt;double&gt;&gt; vtkArray = vtkSmartPointer&lt;vtkDenseArray&lt;double&gt;&gt;::New)();<br>
<br>//    vtkSmartPointer&lt;vtkDoubleArray&gt; dataArray = vtkSmartPointer&lt;vtkDoubleArray&gt;::New();<br><br>    #ifndef USE_VTKMATLABMEXADAPTER<br>    vtkDoubleArray* dataArray = vtkDoubleArray::New();<br><br>    // Set the array to point to data<br>
<br>    dataArray-&gt;SetVoidArray( (void *) volumeData, y_dim*x_dim*z_dim , 1);<br><br><br>    #else<br><br>    #endif<br>    <br>//    vtkSmartPointer&lt;vtkImageData&gt; image = vtkSmartPointer&lt;vtkImageData&gt;::New();    <br>
    vtkImageData* image = vtkImageData::New();<br><br>    image-&gt;SetDimensions( numeric_cast&lt;int&gt;(y_dim) , numeric_cast&lt;int&gt;(x_dim), numeric_cast&lt;int&gt;(z_dim) );<br>//    image-&gt;SetSpacing(1.0, 1.0, 1.0);<br>
    image-&gt;SetOrigin(0.0, 0.0, 0.0);<br><br><br>//    vtkSmartPointer&lt;vtkDataArray&gt; dataArray = vtkSmartPointer&lt;vtkDataArray&gt;::New();<br>//    vtkDataArray* dataArray = vtkDataArray::New();<br><br>//    dataArray-&gt;DeepCopy( vtkArray );<br>
    #ifndef USE_VTKMATLABMEXADAPTER<br>    image-&gt;GetPointData()-&gt;SetScalars(dataArray);<br>    #else<br>    image-&gt;GetPointData()-&gt;SetScalars(volumeData);<br>    #endif<br>//    image-&gt;GetPointData()-&gt;SetScalars(dataArray);<br>
<br><br><br>    volumeMapper-&gt;SetInput( image );<br><br>    // set the volume mapper.<br>    volume-&gt;SetMapper( volumeMapper );<br><br>    #ifdef GPU_RENDER_VOLUME<br><br>    volumeMapper-&gt;SetBlendModeToComposite();<br>
<br>//    volume-&gt;SetMapper(volumeMapper);<br><br>    #endif<br><br><br>    printf( &quot;Adding volume to render\n&quot; );<br>    // Add the volume to be rendered.<br>    ren1-&gt;AddVolume(volume);<br><br>    renWin-&gt;SetSize( 1024, 1024 );<br>
    // render an image (lights and cameras are created automatically)<br>    renWin-&gt;Render();<br><br>    renWin-&gt;AddRenderer(ren1);<br><br>    // begin mouse interaction<br>    iren-&gt;Start();<br><br><br>    // Clean up<br>
//    vtk_dicom_reader-&gt;Delete();<br>    volumeActor-&gt;Delete();<br>    #ifndef GPU_RENDER_VOLUME<br>    MIPFunction1-&gt;Delete();<br>    gradest-&gt;Delete();<br>    MIPFunction2-&gt;Delete();<br>    #endif<br>    volumeMapper-&gt;Delete();<br>
    volume-&gt;Delete();<br>    image-&gt;Delete();<br>    #ifndef USE_VTKMATLABMEXADAPTER<br>    dataArray-&gt;Delete();<br>    #endif<br>    iren-&gt;Delete();<br>    renWin-&gt;Delete();<br>    ren1-&gt;Delete();<br>    coneActor-&gt;Delete();<br>
    coneMapper-&gt;Delete();<br>    cone-&gt;Delete();<br>    volumeProperty-&gt;Delete();<br>    cTFun-&gt;Delete();<br>    gTFun-&gt;Delete();<br>    oTFun2-&gt;Delete();<br>    oTFun-&gt;Delete();<br><br><br>}<br><br><br>
<br><br><br>