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

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

Merge r3611:3618 from trunk

  • Property svn:eol-style set to native
File size: 2.9 KB
RevLine 
[2798]1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
[379]2/*
3 * ----------------------------------------------------------------------
4 * ColorMap.h: color map class contains an array of (RGBA) values
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
[379]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
[830]17#include <memory.h>
[973]18#include <assert.h>
[379]19
[3492]20#include <vrmath/Vector3f.h>
21
22#include "TransferFunction.h"
23
[4889]24using namespace nv;
[3492]25using namespace vrmath;
26
[3568]27TransferFunction::TransferFunction(const char *name, int size, float *data) :
28    _name(name)
[830]29{
30    // _size : # of slot, 4 : rgba
[973]31    _size = size * 4;
32    _data = new float[_size];
33    memcpy(_data, data, sizeof(float) * _size);
[2831]34
35    _tex = new Texture1D(size, GL_FLOAT, GL_LINEAR, 4, data);
[2857]36    _id = _tex->id();
[379]37}
38
[830]39TransferFunction::~TransferFunction()
40{ 
[973]41    delete [] _data;
42    delete _tex; 
[830]43}
[379]44
[2831]45void
46TransferFunction::update(float *data)
[830]47{
[973]48    memcpy(_data, data, sizeof(float) * _size);
[2831]49    _tex->update(_data);
[973]50}
[830]51
[2831]52void
[973]53TransferFunction::update(int size, float *data)
54{
[1475]55    // TBD..
56    //assert((size*4) == _size);
[973]57    update(data);
[380]58}
[379]59
[2820]60void
[4819]61TransferFunction::sample(float fraction, float *keys, Vector3f *keyValues, int count, Vector3f *ret)
[2820]62{
63    int limit = count - 1;
[4819]64    if (fraction <= keys[0]) {
65        *ret = keyValues[0];
66    } else if (fraction >= keys[limit]) {
67        *ret = keyValues[limit];
[2820]68    } else {
69        int n;
[4819]70        for (n = 0; n < limit; n++) {
71            if (fraction >= keys[n] && fraction < keys[n+1]) break;
[2820]72        }
73        if (n >= limit) {
[4819]74            *ret = keyValues[limit];
[2820]75        } else {
[4819]76            float inter = (fraction - keys[n]) / (keys[n + 1] - keys[n]);
77            ret->set(inter * (keyValues[n + 1].x - keyValues[n].x) + keyValues[n].x,
78                     inter * (keyValues[n + 1].y - keyValues[n].y) + keyValues[n].y,
79                     inter * (keyValues[n + 1].z - keyValues[n].z) + keyValues[n].z);
[2820]80        }
81    }
82}
83
84void
[4819]85TransferFunction::sample(float fraction, float *keys, float *keyValues, int count, float *ret)
[2820]86{
87    int limit = count - 1;
[4819]88    if (fraction <= keys[0]) {
89        *ret = keyValues[0];
90    } else if (fraction >= keys[limit]) {
91        *ret = keyValues[limit];
[2820]92    } else {
93        int n;
[4819]94        for (n = 0; n < limit; n++) {
95            if (fraction >= keys[n] && fraction < keys[n+1]) break;
[2820]96        }
97        if (n >= limit) {
[4819]98            *ret = keyValues[limit];
[2820]99        } else {
[4819]100            float inter = (fraction - keys[n]) / (keys[n + 1] - keys[n]);
101            *ret = inter * (keyValues[n + 1] - keyValues[n]) + keyValues[n];
[2820]102        }
103    }
104}
Note: See TracBrowser for help on using the repository browser.