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

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

Merge serveral changes from trunk. Does not include threading, world space
changes, etc.

  • Property svn:eol-style set to native
File size: 4.0 KB
RevLine 
[2798]1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
[835]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 *
[3502]10 *  Copyright (c) 2004-2013  HUBzero Foundation, LLC
[835]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 */
[1053]16#include <memory.h>
[835]17#include <assert.h>
[3492]18#include <float.h>
[2844]19
[3492]20#include <vrmath/Vector4f.h>
21#include <vrmath/Matrix4x4d.h>
22
[835]23#include "Volume.h"
[884]24#include "Trace.h"
[835]25
[4889]26using namespace nv;
[3492]27using namespace vrmath;
28
[2877]29bool Volume::updatePending = false;
[932]30double Volume::valueMin = 0.0;
31double Volume::valueMax = 1.0;
[835]32
[2816]33Volume::Volume(float x, float y, float z,
[4904]34               int width, int height, int depth,
35               int numComponents, float *data,
36               double vmin, double vmax, double nonZeroMin) :
[3362]37    _id(0),
[4904]38    _width(width),
39    _height(height),
40    _depth(depth),
[4612]41    _transferFunc(NULL),
[3362]42    _ambient(0.6f),
43    _diffuse(0.4f),
44    _specular(0.3f),
45    _specularExp(90.0f),
46    _lightTwoSide(false),
47    _opacityScale(0.5f),
[2844]48    _data(NULL),
[4904]49    _numComponents(numComponents),
[2877]50    _nonZeroMin(nonZeroMin),
[4818]51    _cutplanesVisible(true),
[2844]52    _tex(NULL),
[4904]53    _position(x, y, z),
54    _scale(1, 1, 1),
[2877]55    _numSlices(512),
[1478]56    _enabled(true),
[2877]57    _dataEnabled(true),
58    _outlineEnabled(true),
59    _volumeType(CUBIC),
60    _isosurface(0)
[835]61{
[3452]62    TRACE("Enter: %dx%dx%d", _width, _height, _depth);
[3362]63
[3492]64    _outlineColor[0] = _outlineColor[1] = _outlineColor[2] = 1.0f;
65
[4904]66    _tex = new Texture3D(_width, _height, _depth, GL_FLOAT, GL_LINEAR, _numComponents);
[3362]67    int fcount = _width * _height * _depth * _numComponents;
[900]68    _data = new float[fcount];
[1429]69    if (data != NULL) {
[900]70        memcpy(_data, data, fcount * sizeof(float));
[932]71    } else {
[4904]72        TRACE("data is NULL");
73        memset(_data, 0, fcount * sizeof(float));
[884]74    }
[4904]75    _tex->initialize(_data);
[3362]76    _id = _tex->id();
[2816]77
[4904]78    wAxis.setRange(vmin, vmax);
[929]79
[835]80    //Add cut planes. We create 3 default cut planes facing x, y, z directions.
81    //The default location of cut plane is in the middle of the data.
[1478]82    _plane.clear();
[4904]83    addCutplane(CutPlane::X_AXIS, 0.5f);
84    addCutplane(CutPlane::Y_AXIS, 0.5f);
85    addCutplane(CutPlane::Z_AXIS, 0.5f);
[2816]86
[3452]87    TRACE("Leave");
[835]88}
89
90Volume::~Volume()
[3362]91{
[3452]92    TRACE("Enter");
[884]93
94    delete [] _data;
[2816]95    delete _tex;
[835]96}
[3492]97
98void Volume::getWorldSpaceBounds(Vector3f& bboxMin, Vector3f& bboxMax) const
99{
100    Vector3f scale = getPhysicalScaling();
101
102    Matrix4x4d mat;
[4904]103    mat.makeTranslation(_position);
[3492]104    Matrix4x4d mat2;
105    mat2.makeScale(scale);
106
107    mat.multiply(mat2);
108
109    bboxMin.set(FLT_MAX, FLT_MAX, FLT_MAX);
110    bboxMax.set(-FLT_MAX, -FLT_MAX, -FLT_MAX);
111
112    Vector3f modelMin(0, 0, 0);
113    Vector3f modelMax(1, 1, 1);
114
115    Vector4f bvert[8];
116    bvert[0] = Vector4f(modelMin.x, modelMin.y, modelMin.z, 1);
117    bvert[1] = Vector4f(modelMax.x, modelMin.y, modelMin.z, 1);
118    bvert[2] = Vector4f(modelMin.x, modelMax.y, modelMin.z, 1);
119    bvert[3] = Vector4f(modelMin.x, modelMin.y, modelMax.z, 1);
120    bvert[4] = Vector4f(modelMax.x, modelMax.y, modelMin.z, 1);
121    bvert[5] = Vector4f(modelMax.x, modelMin.y, modelMax.z, 1);
122    bvert[6] = Vector4f(modelMin.x, modelMax.y, modelMax.z, 1);
123    bvert[7] = Vector4f(modelMax.x, modelMax.y, modelMax.z, 1);
124
125    for (int i = 0; i < 8; i++) {
126        Vector4f worldVert = mat.transform(bvert[i]);
127        if (worldVert.x < bboxMin.x) bboxMin.x = worldVert.x;
128        if (worldVert.x > bboxMax.x) bboxMax.x = worldVert.x;
129        if (worldVert.y < bboxMin.y) bboxMin.y = worldVert.y;
130        if (worldVert.y > bboxMax.y) bboxMax.y = worldVert.y;
131        if (worldVert.z < bboxMin.z) bboxMin.z = worldVert.z;
132        if (worldVert.z > bboxMax.z) bboxMax.z = worldVert.z;
133    }
134}
Note: See TracBrowser for help on using the repository browser.