TombEngine/TR5Main/Game/spark.cpp

88 lines
2.5 KiB
C++
Raw Normal View History

2020-05-28 22:17:55 +02:00
#pragma once
#include "framework.h"
#include "spark.h"
#include <array>
#include <Game\trmath.h>
using namespace DirectX::SimpleMath;
namespace T5M {
namespace Effects {
namespace Spark {
std::array<SparkParticle, 64> SparkParticles;
void UpdateSparkParticles()
{
for (int i = 0; i < SparkParticles.size(); i++) {
SparkParticle& s = SparkParticles[i];
if (!s.active)continue;
s.age += 1;
if (s.age > s.life) {
s.active = false;
continue;
}
s.velocity.y += s.gravity;
s.velocity *= s.friction;
s.pos += s.velocity;
float normalizedLife = s.age / s.life;
s.height = lerp(s.width / 0.15625, 0, normalizedLife);
s.color = DirectX::SimpleMath::Vector4::Lerp(s.sourceColor, s.destinationColor, normalizedLife);
}
}
SparkParticle& getFreeSparkParticle()
{
for (int i = 0; i < SparkParticles.size(); i++)
{
if (!SparkParticles[i].active) {
return SparkParticles[i];
}
}
return SparkParticles[0];
}
void TriggerFlareSparkParticles(PHD_VECTOR* pos, PHD_VECTOR* vel, CVECTOR* color,int room)
{
SparkParticle& s = getFreeSparkParticle();
s = {};
s.age = 0;
s.life = frand() * 10 + 10;
s.friction = 0.98f;
s.gravity = 1.2f;
s.width = 8;
s.room = room;
s.pos = Vector3(pos->x, pos->y, pos->z);
Vector3 v = Vector3(vel->x, vel->y, vel->z);
v += Vector3(frandMinMax(-64, 64), frandMinMax(-64, 64), frandMinMax(-64, 64));
v.Normalize(v);
s.velocity = v *frandMinMax(17,24);
s.sourceColor = Vector4(1, 1, 1, 1);
s.destinationColor = Vector4(color->r/255.0f,color->g/255.0f,color->b/255.0f,1);
s.active = true;
}
2020-05-28 23:03:53 +02:00
void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num)
{
2020-06-16 19:13:41 +02:00
for (int i = 0; i < num; i++) {
SparkParticle& s = getFreeSparkParticle();
s = {};
s.age = 0;
s.life = frand() * 10 + 10;
s.friction = 0.98f;
s.gravity = 1.2f;
s.width = 8;
s.room = pos->roomNumber;
s.pos = Vector3(pos->x, pos->y, pos->z);
float ang = TO_RAD(angle);
Vector3 v = Vector3(sin(ang + frandMinMax(-PI / 2, PI / 2)), frandMinMax(-1, 1), cos(ang + frandMinMax(-PI / 2, PI / 2)));
v += Vector3(frandMinMax(-64, 64), frandMinMax(-64, 64), frandMinMax(-64, 64));
v.Normalize(v);
s.velocity = v * frandMinMax(17, 24);
s.sourceColor = Vector4(1, 0.8, 0.2f, 1) * 3;
s.destinationColor = Vector4(0, 0, 0, 0);
s.active = true;
}
2020-05-28 23:03:53 +02:00
}
2020-05-28 22:17:55 +02:00
}
}
}