Changeset 587 for trunk/gui/vizservers/nanovis/ParticleSystem.cpp
- Timestamp:
- Feb 22, 2007, 8:44:10 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/vizservers/nanovis/ParticleSystem.cpp
r467 r587 23 23 24 24 ParticleSystem::ParticleSystem(int w, int h, CGcontext context, NVISid volume, float scale_x, 25 float scale_y, float scale_z){ 26 27 fprintf(stderr, "%f, %f, %f\n", scale_x, scale_y, scale_z); 28 scale = Vector3(scale_x, scale_y, scale_z); 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); 29 30 30 31 psys_width = w; … … 64 65 65 66 //load related shaders 67 /* 66 68 m_g_context = context; 67 69 … … 73 75 cgGLSetTextureParameter(m_vel_tex_param, volume); 74 76 cgGLSetParameter3f(m_scale_param, scale_x, scale_y, scale_z); 77 */ 78 _advectionShader = new NvParticleAdvectionShader(scale); 75 79 76 80 fprintf(stderr, "init_psys\n"); 77 81 } 78 82 79 80 ParticleSystem::~ParticleSystem(){ 81 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[0]); 82 glDeleteTextures(1, psys_tex); 83 84 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[1]); 85 glDeleteTextures(1, psys_tex+1); 86 87 glDeleteFramebuffersEXT(2, psys_fbo); 88 89 free(data); 90 } 91 92 93 void ParticleSystem::initialize(Particle* p){ 94 //also store the data on main memory for next initialization 95 memcpy(data, p, psys_width*psys_height*sizeof(Particle)); 96 97 glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]); 98 glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, (float*)p); 99 100 assert(glGetError()==0); 101 102 flip = true; 103 reborn = false; 104 105 //fprintf(stderr, "init particles\n"); 106 } 107 108 void ParticleSystem::reset(){ 109 glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]); 110 glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, psys_width, psys_height, 0, GL_RGBA, GL_FLOAT, (float*)data); 111 112 assert(glGetError()==0); 113 114 flip = true; 115 reborn = false; 116 psys_frame = 0; 117 } 118 119 120 void ParticleSystem::advect(){ 121 if(reborn) reset(); 122 123 glDisable(GL_BLEND); 83 ParticleSystem::~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 96 void 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 112 void 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 125 void ParticleSystem::advect() 126 { 127 if (reborn) 128 reset(); 129 130 glDisable(GL_BLEND); 124 131 125 if(flip){ 126 127 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[1]); 128 glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[0]); 129 130 glClear(GL_COLOR_BUFFER_BIT); 131 132 glViewport(0, 0, psys_width, psys_height); 133 glMatrixMode(GL_PROJECTION); 134 glLoadIdentity(); 135 gluOrtho2D(0, psys_width, 0, psys_height); 136 glMatrixMode(GL_MODELVIEW); 137 glLoadIdentity(); 138 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 /* 139 148 cgGLBindProgram(m_pos_fprog); 140 149 cgGLSetParameter1f(m_pos_timestep_param, 0.05); … … 144 153 145 154 cgGLEnableProfile(CG_PROFILE_FP30); 146 draw_quad(psys_width, psys_height, psys_width, psys_height); 155 */ 156 draw_quad(psys_width, psys_height, psys_width, psys_height); 157 /* 147 158 cgGLDisableProfile(CG_PROFILE_FP30); 148 149 159 cgGLDisableTextureParameter(m_vel_tex_param); 150 160 cgGLDisableTextureParameter(m_pos_tex_param); 161 */ 151 162 } 152 163 else 153 164 { 154 155 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, psys_fbo[0]); 156 glBindTexture(GL_TEXTURE_RECTANGLE_NV, psys_tex[1]); 157 158 glClear(GL_COLOR_BUFFER_BIT); 159 160 glViewport(0, 0, psys_width, psys_height); 161 glMatrixMode(GL_PROJECTION); 162 glLoadIdentity(); 163 gluOrtho2D(0, psys_width, 0, psys_height); 164 glMatrixMode(GL_MODELVIEW); 165 glLoadIdentity(); 166 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 /* 167 180 cgGLBindProgram(m_pos_fprog); 168 181 cgGLSetParameter1f(m_pos_timestep_param, 0.05); … … 170 183 cgGLSetTextureParameter(m_pos_tex_param, psys_tex[1]); 171 184 cgGLEnableTextureParameter(m_pos_tex_param); 172 173 185 cgGLEnableProfile(CG_PROFILE_FP30); 174 draw_quad(psys_width, psys_height, psys_width, psys_height); 186 */ 187 188 draw_quad(psys_width, psys_height, psys_width, psys_height); 189 190 /* 175 191 cgGLDisableProfile(CG_PROFILE_FP30); 176 177 192 cgGLDisableTextureParameter(m_vel_tex_param); 178 193 cgGLDisableTextureParameter(m_pos_tex_param); 179 } 194 */ 195 196 } 197 198 _advectionShader->unbind(); 180 199 181 200 assert(glGetError()==0); … … 184 203 update_vertex_buffer(); 185 204 186 flip = (!flip); 187 188 psys_frame++; 189 if(psys_frame==max_life){ 190 psys_frame=0; 191 reborn = true; 192 } 205 flip = (!flip); 206 207 psys_frame++; 208 if(psys_frame==max_life) 209 { 210 psys_frame=0; 211 reborn = true; 212 } 193 213 194 214 //fprintf(stderr, "advect: %d ", psys_frame); 195 215 } 196 216 197 198 void ParticleSystem::update_vertex_buffer(){199 m_vertex_array->Read(psys_width, psys_height);217 void ParticleSystem::update_vertex_buffer() 218 { 219 m_vertex_array->Read(psys_width, psys_height); 200 220 //m_vertex_array->LoadData(vert); //does not work?? 201 assert(glGetError()==0); 202 } 203 204 205 void ParticleSystem::render(){ display_vertices(); } 206 207 void ParticleSystem::display_vertices(){ 208 glDisable(GL_TEXTURE_2D); 209 glDisable(GL_BLEND); 210 glEnable(GL_DEPTH_TEST); 211 212 glPointSize(1.2); 213 glColor4f(.2,.2,.8,1.); 214 215 glPushMatrix(); 216 glScaled(1./scale.x, 1./scale.y, 1./scale.z); 217 218 m_vertex_array->SetPointer(0); 219 //glEnableVertexAttribArray(0); 220 glEnableClientState(GL_VERTEX_ARRAY); 221 glDrawArrays(GL_POINTS, 0, psys_width*psys_height); 222 //glDisableVertexAttribArray(0); 223 glDisableClientState(GL_VERTEX_ARRAY); 224 225 glPopMatrix(); 226 227 glDisable(GL_DEPTH_TEST); 228 assert(glGetError()==0); 229 } 230 231 221 assert(glGetError()==0); 222 } 223 224 void ParticleSystem::render() 225 { 226 display_vertices(); 227 } 228 229 void 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 TracChangeset
for help on using the changeset viewer.