Example #1
0
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));
	}
}
Example #2
0
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);
	}
}