TombEngine/TR5Main/Game/particle/SimpleParticle.cpp

83 lines
2.2 KiB
C++
Raw Normal View History

2020-09-15 08:10:38 +02:00
#include "framework.h"
2021-12-22 16:23:57 +03:00
#include "Game/particle/SimpleParticle.h"
2021-12-24 03:32:19 +03:00
2021-12-22 16:23:57 +03:00
#include "Game/items.h"
2021-09-25 16:00:30 +03:00
#include "Specific/trmath.h"
#include "Specific/setup.h"
#include "Specific/prng.h"
2021-09-25 11:27:47 +02:00
2021-08-30 18:03:21 +03:00
using namespace TEN::Math::Random;
2020-09-15 08:10:38 +02:00
namespace TEN::Effects
{
2020-09-15 08:10:38 +02:00
std::array<SimpleParticle, 15> simpleParticles;
SimpleParticle& getFreeSimpleParticle()
{
for (auto& p : simpleParticles)
if (!p.active)
2020-09-15 08:10:38 +02:00
return p;
2020-09-15 08:10:38 +02:00
return simpleParticles[0];
}
2020-09-15 08:10:38 +02:00
void TriggerSnowmobileSnow(ITEM_INFO* snowMobile)
{
float angle = TO_RAD(snowMobile->Position.yRot);
2021-09-17 16:07:53 +03:00
const float angleVariation = GenerateFloat(-10, 10) * RADIAN;
2020-09-15 08:10:38 +02:00
float x = std::sin(angle + angleVariation);
float z = std::cos(angle + angleVariation);
x = x* -500 + snowMobile->Position.xPos;
z = z* -500 + snowMobile->Position.zPos;
2020-09-15 08:10:38 +02:00
SimpleParticle& p = getFreeSimpleParticle();
p = {};
p.active = true;
2021-09-17 16:07:53 +03:00
p.life = GenerateFloat(8, 14);
p.room = snowMobile->RoomNumber;
2021-09-17 16:07:53 +03:00
p.ageRate = GenerateFloat(0.9, 1.3);
float size = GenerateFloat(96, 128);
p.worldPosition = {x, float(snowMobile->Position.yPos) - size / 2 , z};
2020-09-15 08:10:38 +02:00
p.sequence = ID_SKIDOO_SNOW_TRAIL_SPRITES;
2021-09-17 16:07:53 +03:00
p.size = GenerateFloat(256, 512);
2020-09-15 08:10:38 +02:00
}
void TriggerSpeedboatFoam(ITEM_INFO* boat)
{
for (float i = -0.5; i < 1; i += 1)
{
float angle = TO_RAD(boat->Position.yRot);
float angleVariation = i*2*10 * RADIAN;
float x = std::sin(angle + angleVariation);
float z = std::cos(angle + angleVariation);
x = x * -700 + boat->Position.xPos;
z = z * -700 + boat->Position.zPos;
SimpleParticle& p = getFreeSimpleParticle();
p = {};
p.active = true;
2021-09-17 16:07:53 +03:00
p.life = GenerateFloat(5, 9);
p.room = boat->RoomNumber;
2021-09-17 16:07:53 +03:00
p.ageRate = GenerateFloat(0.9, 1.3);
float size = GenerateFloat(96, 128);
p.worldPosition = { x, float(boat->Position.yPos) - size / 2, z };
p.sequence = ID_MOTOR_BOAT_FOAM_SPRITES;
2021-09-17 16:07:53 +03:00
p.size = GenerateFloat(256, 512);
}
2020-09-15 08:10:38 +02:00
}
void updateSimpleParticles()
{
for (auto& p : simpleParticles)
{
if (!p.active)
2020-09-15 08:10:38 +02:00
continue;
2020-09-15 08:10:38 +02:00
p.age+= p.ageRate;
if (p.life < p.age)
2020-09-15 08:10:38 +02:00
p.active = false;
2020-09-15 08:10:38 +02:00
int numSprites = -Objects[p.sequence].nmeshes - 1;
float normalizedAge = p.age / p.life;
p.sprite = lerp(0, numSprites, normalizedAge);
}
}
}