void Scene::RenderParticle(Particle* particle) { Emitter* parent = particle->m_parent; vec3 norm_dir = parent->GetDirection(); norm_dir = norm_dir.Normalize(); vec3 new_force; if (!parent->GetDirection().Length()) new_force = vec3( particle->m_velocity.x * particle->m_speed.x, particle->m_velocity.y * particle->m_speed.y) * DELTA_TIME; else new_force = vec3( particle->m_speed.x * norm_dir.x + norm_dir.x, particle->m_speed.y * norm_dir.y + norm_dir.y) * DELTA_TIME; // Update position by velocity and direction particle->SetPosition(vec3( particle->GetPosition().x + new_force.x, particle->GetPosition().y + new_force.y, parent->GetPosition().z)); // Set new fade float new_fade = particle->m_fade * new_force.Length() / parent->GetBoundary(); // Reduce particle's life particle->m_life -= new_fade; // Update rotation particle->SetRotation(particle->GetRotation() + parent->GetSpeed()); // Color effect // Change color from inside noe to outside one if (parent->GetEdgeColor().Length()) { vec3 colorOffset = parent->GetEdgeColor() - parent->GetColor(); particle->SetColor(vec4( particle->GetColor() + colorOffset * new_fade, particle->m_life)); } }
void Scene::RefreshParticle(Particle* particle) { Emitter* parent = particle->m_parent; // If the emitter mode is explosion, // there is no more refreshing precess if (parent->GetExplosionToggle()) { // Reset the original position if (parent->GetMode() == FIRE) { parent->SetDirection(vec3(0.f, 1.f)); float repos_offset = 3.f / 5.f; float new_pos = parent->GetBoundary() * repos_offset; particle->SetPosition(parent->GetPosition() + vec3( Random::GetInstance().GetRandomFloat(-new_pos, new_pos), Random::GetInstance().GetRandomFloat(-new_pos, new_pos))); } else if (parent->GetMode() == SNOW) { particle->SetPosition(parent->GetPosition() + vec3( Random::GetInstance().GetRandomFloat(parent->GetSnowStartingPoint().x, parent->GetSnowEndingPoint().x), Random::GetInstance().GetRandomFloat(parent->GetSnowStartingPoint().y, parent->GetSnowEndingPoint().y))); } else particle->SetPosition(parent->GetPosition()); // Rescale? if (parent->GetRandomScaleToggle()) { float randomSize = Random::GetInstance().GetRandomFloat(parent->GetRandomScaleRange().x, parent->GetRandomScaleRange().y); particle->SetScale(vec3(randomSize, randomSize)); } // Reset life particle->m_life = 1.f; // Reset color particle->SetColor(vec4( parent->GetColor().x, parent->GetColor().y, parent->GetColor().z, particle->m_life)); // Set Velocity; if (!parent->GetDirection().Length()) { particle->m_velocity = vec3( Random::GetInstance().GetRandomFloat(-1.f, 1.f), Random::GetInstance().GetRandomFloat(-1.f, 1.f)); particle->m_velocity = particle->m_velocity.Normalize(); } // Set speed particle->m_speed = parent->GetSpeed() * vec3( Random::GetInstance().GetRandomFloat(0.f, 1.f), Random::GetInstance().GetRandomFloat(0.f, 1.f)); // Reset vanishing speed particle->m_fade = Random::GetInstance().GetRandomFloat(DELTA_TIME, 1.f); if (parent->GetMode() == EXPLOSION && parent->GetRefreshingToggle()) parent->ActivateExplosion(false); } }