source: trunk/packages/vizservers/nanovis/PointSetRenderer.cpp @ 3459

Last change on this file since 3459 was 3452, checked in by ldelgass, 12 years ago

Remove XINETD define from nanovis. We only support server mode now, no glut
interaction loop with mouse/keyboard handlers. Fixes for trace logging to make
output closer to vtkvis: inlcude function name for trace messages, remove
newlines from format strings in macros since newlines get added by syslog.

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2#include <GL/glew.h>
3
4#include <Image.h>
5#include <ImageLoaderFactory.h>
6#include <ImageLoader.h>
7#include <R2/R2FilePath.h>
8
9#include "PointSetRenderer.h"
10#include "PCASplit.h"
11
12#define USE_TEXTURE
13//#define USE_SHADER
14#define POINT_SIZE 5
15
16PointSetRenderer::PointSetRenderer()
17{
18    _shader = new PointShader();
19    std::string path = R2FilePath::getInstance()->getPath("particle2.bmp");
20    if (path.empty()) {
21        ERROR("Particle image not found");
22        return;
23    }
24
25    ImageLoader *loader = ImageLoaderFactory::getInstance()->createLoader("bmp");
26    Image *image = loader->load(path.c_str(), Image::IMG_RGBA);
27    unsigned char *bytes = (unsigned char *)image->getImageBuffer();
28    if (bytes) {
29        for (unsigned int y = 0; y < image->getHeight(); ++y) {
30            for (unsigned int x = 0; x < image->getWidth(); ++x, bytes += 4) {
31                bytes[3] = (bytes[0] == 0) ? 0 : 255;
32            }
33        }
34    }
35
36    if (image) {
37        _pointTexture = new Texture2D(image->getWidth(), image->getHeight(),
38                                      GL_UNSIGNED_BYTE, GL_LINEAR,   
39                                      4, image->getImageBuffer());
40    } else {
41        ERROR("Failed to load particle image");
42    }
43
44    delete loader;
45    delete image;
46    _bucketSort = new PCA::BucketSort(1024);
47}
48
49PointSetRenderer::~PointSetRenderer()
50{
51}
52
53void PointSetRenderer::renderPoints(PCA::Point *points, int length)
54{
55    PCA::Point *p = points;
56    for (int i = 0; i < length; ++i, ++p) {
57        glColor4f(p->color.x, p->color.y, p->color.z, p->color.w);
58        glVertex3f(p->position.x, p->position.y, p->position.z);
59    }
60}
61
62void PointSetRenderer::renderCluster(PCA::ClusterList** bucket, int size, int level)
63{
64    float quadratic[] = { 1.0f, 0.0f, 0.01f };
65
66    glEnable(GL_POINT_SPRITE_ARB);
67    glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);
68    glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 60.0f);
69    glPointParameterfARB(GL_POINT_SIZE_MIN_ARB, 1.0f);
70    glPointParameterfARB(GL_POINT_SIZE_MAX_ARB, 100);
71#ifdef USE_TEXTURE
72    glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
73#endif
74
75    bool setSize = false;
76    glBegin(GL_POINTS);
77
78    PCA::ClusterList *p;
79    for (int i = size - 1; i >= 0; --i) {
80        p = bucket[i];
81        if (p) {
82            if (!setSize) {
83#ifdef USE_SHADER
84                _shader->setScale(p->data->points[0].size);
85#endif
86                setSize = true;
87            }
88        }
89
90        while (p) {
91            renderPoints(p->data->points, p->data->numOfPoints);
92
93            p = p->next;
94        }
95    }
96
97    glEnd();
98
99    glDisable(GL_POINT_SPRITE_ARB);
100    glPointSize(1);
101}
102
103void PointSetRenderer::render(PCA::ClusterAccel *cluster, const Mat4x4& mat,
104                              int sortLevel, const Vector3& scale, const Vector3& origin)
105{
106    _bucketSort->init();
107    _bucketSort->sort(cluster, mat, sortLevel);
108
109    glDisable(GL_TEXTURE_2D);
110
111#ifdef USE_TEXTURE
112    _pointTexture->activate();
113    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
114#endif
115
116    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
117    //glBlendFunc(GL_SRC_ALPHA, GL_ONE);
118    glEnable(GL_BLEND);
119
120    glDisable(GL_LIGHTING);
121    glEnable(GL_COLOR_MATERIAL);
122
123    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
124    glPushMatrix();
125    float s = 1.0f / scale.x;
126    Vector3 shift(origin.x + scale.x * 0.5, origin.x + scale.x * 0.5, origin.x + scale.x * 0.5);
127    glScalef(s, scale.y / scale.x * s, scale.z / scale.x * s);
128
129    //glTranslatef(-shift.x, -shift.y, -shift.z);
130
131#ifdef USE_SHADER
132    _shader->bind();
133#else
134    glPointSize(POINT_SIZE);
135#endif
136    renderCluster(_bucketSort->getBucket(), _bucketSort->getSize(), 4);
137#ifdef USE_SHADER
138    _shader->unbind();
139#else
140    glPointSize(1.0f);
141#endif
142
143    glPopMatrix();
144
145    glDisable(GL_COLOR_MATERIAL);
146    glEnable(GL_LIGHTING);
147    glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
148    glDisable(GL_BLEND);
149
150#ifdef USE_TEXTURE
151    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
152    _pointTexture->deactivate();
153#endif
154}
Note: See TracBrowser for help on using the repository browser.