source: trunk/packages/vizservers/nanovis/VtkDataSetReader.cpp @ 3870

Last change on this file since 3870 was 3870, checked in by ldelgass, 6 years ago

Add VTK reader/resampler to nanovis

File size: 4.3 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (C) 2004-2013  HUBzero Foundation, LLC
4 *
5 */
6
7#include <iostream>
8#include <float.h>
9
10#include <vtkSmartPointer.h>
11#include <vtkDataSet.h>
12#include <vtkImageData.h>
13#include <vtkDataSetReader.h>
14#include <vtkCharArray.h>
15
16#include <RpOutcome.h>
17
18#include <vrmath/Vector3f.h>
19
20#include "ReaderCommon.h"
21#include "DataSetResample.h"
22
23#include "config.h"
24#include "nanovis.h"
25#include "VtkDataSetReader.h"
26#include "Volume.h"
27#include "Trace.h"
28
29using namespace nv;
30
31Volume *
32nv::load_vtk_volume_stream(Rappture::Outcome& result, const char *tag, const char *bytes, int nBytes)
33{
34    TRACE("Enter tag:%s", tag);
35
36    vtkSmartPointer<vtkImageData> resampledDataSet;
37    {
38        vtkSmartPointer<vtkDataSet> dataSet;
39        {
40            vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();
41            vtkSmartPointer<vtkCharArray> dataSetString = vtkSmartPointer<vtkCharArray>::New();
42
43            dataSetString->SetArray(const_cast<char *>(bytes), nBytes, 1);
44            reader->SetInputArray(dataSetString);
45            reader->ReadFromInputStringOn();
46            //reader->ReadAllNormalsOn();
47            //reader->ReadAllTCoordsOn();
48            reader->ReadAllScalarsOn();
49            //reader->ReadAllColorScalarsOn();
50            reader->ReadAllVectorsOn();
51            //reader->ReadAllTensorsOn();
52            //reader->ReadAllFieldsOn();
53            reader->SetLookupTableName("");
54            reader->Update();
55
56            dataSet = reader->GetOutput();
57        }
58
59        if (dataSet == NULL)
60            return NULL;
61
62        int maxDim = 64;
63
64        resampledDataSet = vtkImageData::SafeDownCast(dataSet.GetPointer());
65        if (resampledDataSet != NULL) {
66            // Have a uniform grid, check if we need to resample
67#ifdef DOWNSAMPLE_DATA
68            if (resampledDataSet->GetDimensions()[0] > maxDim ||
69                resampledDataSet->GetDimensions()[1] > maxDim ||
70                resampledDataSet->GetDimensions()[2] > maxDim) {
71                resampledDataSet = resampleVTKDataSet(dataSet, maxDim);
72            }
73#endif
74        } else {
75            resampledDataSet = resampleVTKDataSet(dataSet, maxDim);
76        }
77    }
78
79    int nx, ny, nz, npts;
80    // origin
81    double x0, y0, z0;
82    // deltas (cell dimensions)
83    double dx, dy, dz;
84    // length of volume edges
85    double lx, ly, lz;
86
87    nx = resampledDataSet->GetDimensions()[0];
88    ny = resampledDataSet->GetDimensions()[1];
89    nz = resampledDataSet->GetDimensions()[2];
90    npts = nx * ny * nz;
91    resampledDataSet->GetSpacing(dx, dy, dz);
92    resampledDataSet->GetOrigin(x0, y0, z0);
93
94    lx = (nx - 1) * dx;
95    ly = (ny - 1) * dy;
96    lz = (nz - 1) * dz;
97
98    Volume *volume = NULL;
99    double vmin = DBL_MAX;
100    double nzero_min = DBL_MAX;
101    double vmax = -DBL_MAX;
102
103    float *data = new float[npts * 4];
104    memset(data, 0, npts * 4);
105
106    int ix = 0;
107    int iy = 0;
108    int iz = 0;
109    for (int p = 0; p < npts; p++) {
110        int nindex = p * 4;
111        double val = resampledDataSet->GetScalarComponentAsDouble(ix, iy, iz, 0);
112        data[nindex] = (float)val;
113        if (val < vmin) {
114            vmin = val;
115        } else if (val > vmax) {
116            vmax = val;
117        }
118        if (val != 0.0 && val < nzero_min) {
119            nzero_min = val;
120        }
121
122        if (++ix >= nx) {
123            ix = 0;
124            if (++iy >= ny) {
125                iy = 0;
126                ++iz;
127            }
128        }
129    }
130
131    // scale all values [0-1], -1 => out of bounds
132    normalizeScalar(data, npts, 4, vmin, vmax);
133    computeSimpleGradient(data, nx, ny, nz,
134                          dx, dy, dz);
135
136    TRACE("nx = %i ny = %i nz = %i", nx, ny, nz);
137    TRACE("x0 = %lg y0 = %lg z0 = %lg", x0, y0, z0);
138    TRACE("lx = %lg ly = %lg lz = %lg", lx, ly, lz);
139    TRACE("dx = %lg dy = %lg dz = %lg", dx, dy, dz);
140    TRACE("dataMin = %lg dataMax = %lg nzero_min = %lg",
141          vmin, vmax, nzero_min);
142
143    volume = NanoVis::loadVolume(tag, nx, ny, nz, 4, data,
144                                 vmin, vmax, nzero_min);
145    volume->xAxis.setRange(x0, x0 + lx);
146    volume->yAxis.setRange(y0, y0 + ly);
147    volume->zAxis.setRange(z0, z0 + lz);
148    volume->updatePending = true;
149
150    delete [] data;
151
152    TRACE("Leave");
153    return volume;
154}
Note: See TracBrowser for help on using the repository browser.