source: trunk/vizservers/nanovis/NvParticleRenderer.cpp @ 828

Last change on this file since 828 was 755, checked in by dkearney, 17 years ago

added -p option to nanovis so we can add paths in a colon separated string.
removed all references to hard coded paths in /opt/nanovis
updated start_vis.sh script to include nanovis' -p flag and what a call to pymol might look like

File size: 7.4 KB
Line 
1/*
2 * ----------------------------------------------------------------------
3 * NvParticleRenderer.cpp: particle system class
4 *
5 * ======================================================================
6 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
7 *           Purdue Rendering and Perceptualization Lab (PURPL)
8 *
9 *  Copyright (c) 2004-2006  Purdue Research Foundation
10 *
11 *  See the file "license.terms" for information on usage and
12 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13 * ======================================================================
14 */
15
16#include <stdio.h>
17#include <assert.h>
18#include <malloc.h>
19#include <string.h>
20
21#include <R2/R2FilePath.h>
22#include "NvParticleRenderer.h"
23
24
25NvParticleRenderer::NvParticleRenderer(int w, int h, CGcontext context, NVISid volume, float scale_x,
26                float scale_y, float scale_z)
27{
28
29    fprintf(stderr, "%f, %f, %f\n", scale_x, scale_y, scale_z);
30    scale = Vector3(scale_x, scale_y, scale_z);
31 
32  psys_width = w;
33  psys_height = h;
34
35  psys_frame = 0;
36  reborn = true;
37  flip = true;
38  max_life = 500;
39
40  data = (Particle*) malloc(w*h*sizeof(Particle));
41
42  m_vertex_array = new RenderVertexArray(psys_width*psys_height, 3, GL_FLOAT);
43  assert(glGetError()==0);
44
45  glGenFramebuffersEXT(2, psys_fbo);
46  glGenTextures(2, psys_tex);
47
48  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[0]);
49
50  glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]);
51  glTexParameterf(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
52  glTexParameterf(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
53  glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, NULL);
54  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, psys_tex[0], 0);
55
56  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[1]);
57
58  glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[1]);
59  glTexParameterf(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
60  glTexParameterf(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
61  glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, NULL);
62  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, psys_tex[1], 0);
63
64  CHECK_FRAMEBUFFER_STATUS();
65  assert(glGetError()==0);
66
67  //load related shaders
68  /*
69  m_g_context = context;
70
71  R2string path = R2FilePath::getInstance()->getPath("update_pos.cg");
72  m_pos_fprog = loadProgram(m_g_context, CG_PROFILE_FP30, CG_SOURCE, path);
73  m_pos_timestep_param  = cgGetNamedParameter(m_pos_fprog, "timestep");
74  m_vel_tex_param = cgGetNamedParameter(m_pos_fprog, "vel_tex");
75  m_pos_tex_param = cgGetNamedParameter(m_pos_fprog, "pos_tex");
76  m_scale_param = cgGetNamedParameter(m_pos_fprog, "scale");
77  cgGLSetTextureParameter(m_vel_tex_param, volume);
78  cgGLSetParameter3f(m_scale_param, scale_x, scale_y, scale_z);
79  */
80  _advectionShader = new NvParticleAdvectionShader(scale);
81
82  fprintf(stderr, "init_psys\n");
83}
84
85NvParticleRenderer::~NvParticleRenderer()
86{
87    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[0]);
88    glDeleteTextures(1, psys_tex);
89
90    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[1]);
91    glDeleteTextures(1, psys_tex+1);
92
93    glDeleteFramebuffersEXT(2, psys_fbo);
94
95    free(data);
96}
97
98void NvParticleRenderer::initialize(Particle* p)
99{
100    //also store the data on main memory for next initialization
101    memcpy(data, p, psys_width*psys_height*sizeof(Particle));
102
103    glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]);
104    glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, (float*)p);
105 
106    assert(glGetError()==0);
107
108    flip = true;
109    reborn = false;
110
111    //fprintf(stderr, "init particles\n");
112}
113
114void NvParticleRenderer::reset()
115{
116    glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]);
117    glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, (float*)data);
118 
119    assert(glGetError()==0);
120
121    flip = true;
122    reborn = false;
123    psys_frame = 0;
124}
125
126
127void NvParticleRenderer::advect()
128{
129    if (reborn)
130        reset();
131
132    glDisable(GL_BLEND);
133   
134    if(flip){
135        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[1]);
136        glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]);
137
138        glClear(GL_COLOR_BUFFER_BIT);
139
140        glViewport(0, 0, psys_width, psys_height);
141        glMatrixMode(GL_PROJECTION);
142        glLoadIdentity();
143        gluOrtho2D(0, psys_width, 0, psys_height);
144        glMatrixMode(GL_MODELVIEW);
145        glLoadIdentity();
146
147        _advectionShader->bind(psys_tex[0]);
148     
149     /*
150     cgGLBindProgram(m_pos_fprog);
151     cgGLSetParameter1f(m_pos_timestep_param, 0.05);
152     cgGLEnableTextureParameter(m_vel_tex_param);
153     cgGLSetTextureParameter(m_pos_tex_param, psys_tex[0]);
154     cgGLEnableTextureParameter(m_pos_tex_param);
155
156     cgGLEnableProfile(CG_PROFILE_FP30);
157     */
158        draw_quad(psys_width, psys_height, psys_width, psys_height);
159     /*
160     cgGLDisableProfile(CG_PROFILE_FP30);
161     cgGLDisableTextureParameter(m_vel_tex_param);
162     cgGLDisableTextureParameter(m_pos_tex_param);
163     */
164   }
165   else
166   {
167        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[0]);
168        glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[1]);
169
170        glClear(GL_COLOR_BUFFER_BIT);
171
172        glViewport(0, 0, psys_width, psys_height);
173        glMatrixMode(GL_PROJECTION);
174        glLoadIdentity();
175        gluOrtho2D(0, psys_width, 0, psys_height);
176        glMatrixMode(GL_MODELVIEW);
177        glLoadIdentity();
178
179        _advectionShader->bind(psys_tex[1]);
180
181     /*
182     cgGLBindProgram(m_pos_fprog);
183     cgGLSetParameter1f(m_pos_timestep_param, 0.05);
184     cgGLEnableTextureParameter(m_vel_tex_param);
185     cgGLSetTextureParameter(m_pos_tex_param, psys_tex[1]);
186     cgGLEnableTextureParameter(m_pos_tex_param);
187     cgGLEnableProfile(CG_PROFILE_FP30);
188     */
189
190        draw_quad(psys_width, psys_height, psys_width, psys_height);
191
192     /*
193     cgGLDisableProfile(CG_PROFILE_FP30);
194     cgGLDisableTextureParameter(m_vel_tex_param);
195     cgGLDisableTextureParameter(m_pos_tex_param);
196     */
197
198    }
199
200    _advectionShader->unbind();
201
202   assert(glGetError()==0);
203
204   //soft_read_verts();
205   update_vertex_buffer();
206
207    flip = (!flip);
208
209    psys_frame++;
210    if(psys_frame==max_life)
211    {
212        psys_frame=0;
213        reborn = true;
214    }
215
216   //fprintf(stderr, "advect: %d ", psys_frame);
217}
218
219void NvParticleRenderer::update_vertex_buffer()
220{
221    m_vertex_array->Read(psys_width, psys_height);
222  //m_vertex_array->LoadData(vert);     //does not work??
223    assert(glGetError()==0);
224}
225
226void NvParticleRenderer::render()
227{
228    display_vertices();
229}
230
231void NvParticleRenderer::display_vertices()
232{
233    glDisable(GL_TEXTURE_2D);
234    glDisable(GL_BLEND);
235    glEnable(GL_DEPTH_TEST);
236
237    glPointSize(1.2);
238    glColor4f(.2,.2,.8,1.);
239 
240    glPushMatrix();
241    glScaled(1./scale.x, 1./scale.y, 1./scale.z);
242
243    m_vertex_array->SetPointer(0);
244    glEnableClientState(GL_VERTEX_ARRAY);
245    glDrawArrays(GL_POINTS, 0, psys_width*psys_height);
246    glDisableClientState(GL_VERTEX_ARRAY);
247
248    glPopMatrix();
249 
250    glDisable(GL_DEPTH_TEST);
251    assert(glGetError()==0);
252}
253
254
Note: See TracBrowser for help on using the repository browser.