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

Last change on this file since 2921 was 2870, checked in by ldelgass, 12 years ago

remove global.h header. Move global Cg context handle into NvShader? as a
static member. Move LoadCgSourceProgram? to NvShader?.cpp, but make shader
classes use the methods NvShader::loadVertex/FragmentProgram instead.
There are still some users of LoadCgSourceProgram? left that need the context
handle.

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