source: trunk/packages/vizservers/nanovis/PointSet.cpp @ 3612

Last change on this file since 3612 was 3612, checked in by ldelgass, 7 years ago

Remove Nv prefix from shader classes now that they are in nv namespace.

  • Property svn:eol-style set to native
File size: 1.9 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#include <stdlib.h>
7#include <stdio.h>
8
9#include <vrmath/Vector3f.h>
10#include <vrmath/Vector4f.h>
11
12#include "PointSet.h"
13#include "PCASplit.h"
14
15using namespace nv;
16
17void 
18PointSet::initialize(vrmath::Vector4f *values, const unsigned int count, 
19                     const vrmath::Vector3f& scale, const vrmath::Vector3f& origin, 
20                     float min, float max)
21{
22    PCA::PCASplit pcaSplit;
23
24    _scale = scale;
25    _origin = origin;
26    _min = min;
27    _max = max;
28
29    PCA::Point *points = (PCA::Point *)malloc(sizeof(PCA::Point) * count);
30    for (unsigned int i = 0; i < count; ++i) {
31        points[i].position.set(values[i].x, values[i].y, values[i].z);
32        points[i].color.set(1.0f, 1.0f, 1.0f, 0.2f);
33        points[i].value = values[i].w;
34        points[i].size = 0.001;
35    }
36
37    if (_cluster != 0) {
38        delete _cluster;
39    }
40   
41    pcaSplit.setMinDistance(scale.length() / 3.0f);
42    _cluster = pcaSplit.doIt(points, count);
43}
44
45void 
46PointSet::updateColor(float *color, int colorCount)
47{
48    if (_cluster == 0) {
49        return;
50    }
51    int level = 4;
52
53    PCA::Cluster *cluster = _cluster->startPointerCluster[level - 1];
54    PCA::Cluster *c = &(cluster[0]);
55    PCA::Cluster *end = &(cluster[_cluster->numOfClusters[level - 1] - 1]);
56
57    vrmath::Vector3f pos;
58
59    PCA::Point *points;
60    vrmath::Vector4f *colors = (vrmath::Vector4f *)color;
61    int numOfPoints;
62    int index;
63    float d = _max - _min;
64    for (; c <= end; c = (PCA::Cluster *)((char *)c + sizeof(PCA::Cluster))) {
65        points = c->points;
66        numOfPoints = c->numOfPoints;
67
68        for (int i = 0; i < numOfPoints; ++i) {
69            index = (int)((points[i].value - _min) / d  * (colorCount - 1));
70            if (index >= colorCount) {
71                index = colorCount - 1;
72            }
73            points[i].color = colors[index];
74        }
75    }
76}
Note: See TracBrowser for help on using the repository browser.