source: nanovis/branches/1.1/Volume.cpp @ 4889

Last change on this file since 4889 was 4889, checked in by ldelgass, 5 years ago

Merge r3611:3618 from trunk

  • Property svn:eol-style set to native
File size: 3.9 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * ----------------------------------------------------------------------
4 * Volume.cpp: 3d volume class
5 *
6 * ======================================================================
7 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
8 *           Purdue Rendering and Perceptualization Lab (PURPL)
9 *
10 *  Copyright (c) 2004-2013  HUBzero Foundation, LLC
11 *
12 *  See the file "license.terms" for information on usage and
13 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 * ======================================================================
15 */
16#include <memory.h>
17#include <assert.h>
18#include <float.h>
19
20#include <vrmath/Vector4f.h>
21#include <vrmath/Matrix4x4d.h>
22
23#include "Volume.h"
24#include "Trace.h"
25
26using namespace nv;
27using namespace vrmath;
28
29bool Volume::updatePending = false;
30double Volume::valueMin = 0.0;
31double Volume::valueMax = 1.0;
32
33Volume::Volume(float x, float y, float z,
34               int w, int h, int d,
35               int n, float *data,
36               double v0, double v1, double nonZeroMin) :
37    _id(0),
38    _width(w),
39    _height(h),
40    _depth(d),
41    _transferFunc(NULL),
42    _ambient(0.6f),
43    _diffuse(0.4f),
44    _specular(0.3f),
45    _specularExp(90.0f),
46    _lightTwoSide(false),
47    _opacityScale(0.5f),
48    _data(NULL),
49    _numComponents(n),
50    _nonZeroMin(nonZeroMin),
51    _cutplanesVisible(true),
52    _tex(NULL),
53    _location(x, y, z),
54    _numSlices(512),
55    _enabled(true),
56    _dataEnabled(true),
57    _outlineEnabled(true),
58    _volumeType(CUBIC),
59    _isosurface(0)
60{
61    TRACE("Enter: %dx%dx%d", _width, _height, _depth);
62
63    _outlineColor[0] = _outlineColor[1] = _outlineColor[2] = 1.0f;
64
65    _tex = new Texture3D(_width, _height, _depth, GL_FLOAT, GL_LINEAR, n);
66    int fcount = _width * _height * _depth * _numComponents;
67    _data = new float[fcount];
68    if (data != NULL) {
69        TRACE("data is copied");
70        memcpy(_data, data, fcount * sizeof(float));
71        _tex->initialize(_data);
72    } else {
73        TRACE("data is null");
74        memset(_data, 0, sizeof(_width * _height * _depth * _numComponents * 
75                                sizeof(float)));
76        _tex->initialize(_data);
77    }
78
79    _id = _tex->id();
80
81    wAxis.setRange(v0, v1);
82
83    //Add cut planes. We create 3 default cut planes facing x, y, z directions.
84    //The default location of cut plane is in the middle of the data.
85    _plane.clear();
86    addCutplane(1, 0.5f);
87    addCutplane(2, 0.5f);
88    addCutplane(3, 0.5f);
89
90    TRACE("Leave");
91}
92
93Volume::~Volume()
94{
95    TRACE("Enter");
96
97    delete [] _data;
98    delete _tex;
99}
100
101void Volume::getWorldSpaceBounds(Vector3f& bboxMin, Vector3f& bboxMax) const
102{
103    Vector3f scale = getPhysicalScaling();
104
105    Matrix4x4d mat;
106    mat.makeTranslation(_location);
107    Matrix4x4d mat2;
108    mat2.makeScale(scale);
109
110    mat.multiply(mat2);
111
112    bboxMin.set(FLT_MAX, FLT_MAX, FLT_MAX);
113    bboxMax.set(-FLT_MAX, -FLT_MAX, -FLT_MAX);
114
115    Vector3f modelMin(0, 0, 0);
116    Vector3f modelMax(1, 1, 1);
117
118    Vector4f bvert[8];
119    bvert[0] = Vector4f(modelMin.x, modelMin.y, modelMin.z, 1);
120    bvert[1] = Vector4f(modelMax.x, modelMin.y, modelMin.z, 1);
121    bvert[2] = Vector4f(modelMin.x, modelMax.y, modelMin.z, 1);
122    bvert[3] = Vector4f(modelMin.x, modelMin.y, modelMax.z, 1);
123    bvert[4] = Vector4f(modelMax.x, modelMax.y, modelMin.z, 1);
124    bvert[5] = Vector4f(modelMax.x, modelMin.y, modelMax.z, 1);
125    bvert[6] = Vector4f(modelMin.x, modelMax.y, modelMax.z, 1);
126    bvert[7] = Vector4f(modelMax.x, modelMax.y, modelMax.z, 1);
127
128    for (int i = 0; i < 8; i++) {
129        Vector4f worldVert = mat.transform(bvert[i]);
130        if (worldVert.x < bboxMin.x) bboxMin.x = worldVert.x;
131        if (worldVert.x > bboxMax.x) bboxMax.x = worldVert.x;
132        if (worldVert.y < bboxMin.y) bboxMin.y = worldVert.y;
133        if (worldVert.y > bboxMax.y) bboxMax.y = worldVert.y;
134        if (worldVert.z < bboxMin.z) bboxMin.z = worldVert.z;
135        if (worldVert.z > bboxMax.z) bboxMax.z = worldVert.z;
136    }
137}
Note: See TracBrowser for help on using the repository browser.