Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by Hollywood ( 15 years ago )
void Game::UpdateParticles()
{
 for ( unsigned int i = 0; i < PARTICLES/4; i++ ) if (m_Particle[i]->alive) // For each particle that is alive
 {                     // AKA: Loop 1. Update the positions
  for(unsigned int j = 0; j < 4; i++)
  {
   if (!((m_Particle[i]->x.m_Float[j] < (2 * SCRWIDTH)) && (m_Particle[i]->x.m_Float[j] > -SCRWIDTH) && 
      (m_Particle[i]->y.m_Float[j] < (2 * SCRHEIGHT)) && (m_Particle[i]->y.m_Float[j] > -SCRHEIGHT)))
   {
    SpawnParticle(i*4+j);
    continue;
   }
  }
  for ( unsigned int h = 0; h < HOLES; h++ )
  {
   float4 dx, dy, sd, dist;
   //float dx = m_Hole[h]->x - m_Particle[i]->x;
   dx.m_Float4 = _mm_sub_ps(_mm_set_ps1(m_Hole[h]->x), m_Particle[i]->x.m_Float4);
   
   //float dy = m_Hole[h]->y - m_Particle[i]->y;
   dy.m_Float4 = _mm_sub_ps(_mm_set_ps1(m_Hole[h]->y), m_Particle[i]->y.m_Float4);
   
   //float sd = dx * dx + dy * dy;
   sd.m_Float4 = _mm_add_ps(_mm_mul_ps(dx.m_Float4, dx.m_Float4), _mm_mul_ps(dy.m_Float4, dy.m_Float4));
   
   //float dist = 1.0f / sqrtf( sd );
   dist.m_Float4 = _mm_div_ps(_mm_set_ps1(1.0f), _mm_sqrt_ps(sd.m_Float4));
   
   //dx *= dist, dy *= dist;
   dx.m_Float4 = _mm_mul_ps(dx.m_Float4, dist.m_Float4), dy.m_Float4 = _mm_mul_ps(dy.m_Float4, dist.m_Float4);
  }
 }

 for ( unsigned int i = 0; i < PARTICLES/4; i++ ) if (m_Particle[i]->alive)
 {
  float4 g;
  //float g = (250.0f * m_Hole[h]->g * m_Particle[i]->m) / sd;
  g.m_Float4 = _mm_div_ps(_mm_set_ps1(250.0f * m_Hole[h]->g * m_Particle[i]->m), sd.m_Float4);
  
  for(unsigned int j = 0; j < 4; i++)
  {
   if (g[j] >= 1) 
   {
    SpawnParticle(i*4+j);
    break;
   }
  }
 }

 
 for ( unsigned int i = 0; i < PARTICLES/4; i++ ) if (m_Particle[i]->alive)
 {
  m_Particle[i]->vx += 0.5f * g * dx;
  m_Particle[i]->vy += 0.5f * g * dy;  
  int x = (int)m_Particle[i]->x, y = (int)m_Particle[i]->y;
  if ((x >= 0) && (x < SCRWIDTH) && (y >= 0) && (y < SCRHEIGHT))
  {
   Pixel* dst = m_Surface->GetBuffer();
   dst[x + y * m_Surface->GetPitch()] = m_Particle[i]->c;
  }
  m_Particle[i]->x += m_Particle[i]->vx;
  m_Particle[i]->y += m_Particle[i]->vy;
 }
}

 

Revise this Paste

Children: 30080
Your Name: Code Language: