source: trunk/vizservers/nanovis/ParticleSystem.cpp @ 750

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