Ignore:
Timestamp:
Feb 22, 2007 8:44:10 PM (17 years ago)
Author:
vrinside
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/vizservers/nanovis/ParticleSystem.cpp

    r467 r587  
    2323
    2424ParticleSystem::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);
    2930 
    3031  psys_width = w;
     
    6465
    6566  //load related shaders
     67  /*
    6668  m_g_context = context;
    6769
     
    7375  cgGLSetTextureParameter(m_vel_tex_param, volume);
    7476  cgGLSetParameter3f(m_scale_param, scale_x, scale_y, scale_z);
     77  */
     78  _advectionShader = new NvParticleAdvectionShader(scale);
    7579
    7680  fprintf(stderr, "init_psys\n");
    7781}
    7882
    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);
     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);
    124131   
    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     /*
    139148     cgGLBindProgram(m_pos_fprog);
    140149     cgGLSetParameter1f(m_pos_timestep_param, 0.05);
     
    144153
    145154     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     /*
    147158     cgGLDisableProfile(CG_PROFILE_FP30);
    148    
    149159     cgGLDisableTextureParameter(m_vel_tex_param);
    150160     cgGLDisableTextureParameter(m_pos_tex_param);
     161     */
    151162   }
    152163   else
    153164   {
    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     /*
    167180     cgGLBindProgram(m_pos_fprog);
    168181     cgGLSetParameter1f(m_pos_timestep_param, 0.05);
     
    170183     cgGLSetTextureParameter(m_pos_tex_param, psys_tex[1]);
    171184     cgGLEnableTextureParameter(m_pos_tex_param);
    172 
    173185     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     /*
    175191     cgGLDisableProfile(CG_PROFILE_FP30);
    176    
    177192     cgGLDisableTextureParameter(m_vel_tex_param);
    178193     cgGLDisableTextureParameter(m_pos_tex_param);
    179    }
     194     */
     195
     196    }
     197
     198    _advectionShader->unbind();
    180199
    181200   assert(glGetError()==0);
     
    184203   update_vertex_buffer();
    185204
    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    }
    193213
    194214   //fprintf(stderr, "advect: %d ", psys_frame);
    195215}
    196216
    197 
    198 void ParticleSystem::update_vertex_buffer(){
    199   m_vertex_array->Read(psys_width, psys_height);
     217void ParticleSystem::update_vertex_buffer()
     218{
     219    m_vertex_array->Read(psys_width, psys_height);
    200220  //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
     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 TracChangeset for help on using the changeset viewer.