TombEngine/TR5Main/Game/smoke.cpp

75 lines
2.1 KiB
C++
Raw Normal View History

2020-05-23 14:26:06 +02:00
#include "framework.h"
#include "trmath.h"
#include "smoke.h"
#include "room.h"
#include "control.h"
#include "level.h"
std::array<SmokeParticle, 128> SmokeParticles;
void UpdateSmokeParticles()
{
for (int i = 0; i < SmokeParticles.size(); i++) {
SmokeParticle& s = SmokeParticles[i];
if (!s.active)continue;
s.age += 1;
if (s.age > s.life) {
s.active = false;
continue;
}
s.velocity.y + s.gravity;
if (s.terminalVelocity != 0) {
float velocityLength = s.velocity.Length();
if (velocityLength > s.terminalVelocity) {
s.velocity *= (s.terminalVelocity / velocityLength);
}
}
s.position += s.velocity;
if (s.affectedByWind) {
if (Rooms[s.room].flags & ENV_FLAG_WIND) {
s.position.x += SmokeWindX/2;
s.position.z += SmokeWindZ/2;
}
}
float normalizedLife = s.age / s.life;
s.size = lerp(s.sourceSize, s.destinationSize, normalizedLife);
s.angularVelocity *= s.angularDrag;
s.rotation += s.angularVelocity;
s.color = DirectX::SimpleMath::Vector4::Lerp(s.sourceColor, s.destinationColor, normalizedLife);
}
}
void TriggerFlareSmoke(const DirectX::SimpleMath::Vector3& pos, DirectX::SimpleMath::Vector3& direction,int age,int room) {
using namespace DirectX::SimpleMath;
SmokeParticle& const s = getFreeSmokeParticle();
s = {};
s.position = pos;
s.age = 0;
constexpr float d = 0.2f;
Vector3 randomDir = Vector3(frandMinMax(-d, d), frandMinMax(-d, d), frandMinMax(-d, d));
Vector3 dir;
(direction + randomDir).Normalize(dir);
s.velocity = dir *frandMinMax(7,9);
s.gravity = 1;
s.friction = frandMinMax(0.7f,0.85f);
s.sourceColor = Vector4(1, 131/255.0f, 100/255.0f, 1);
s.destinationColor = Vector4(0, 0, 0, 0);
s.life = frandMinMax(25, 35);
s.angularVelocity = frandMinMax(-0.3f, 0.3f);
s.angularDrag = 0.98f;
s.sourceSize = age > 4 ? frandMinMax(16, 24) : frandMinMax(100 , 128);
s.destinationSize = age > 4 ? frandMinMax(160, 200) : frandMinMax(256, 300);
s.affectedByWind = true;
s.active = true;
s.room = room;
}
SmokeParticle& getFreeSmokeParticle()
{
for (int i = 0; i < SmokeParticles.size(); i++) {
if (!SmokeParticles[i].active)
return SmokeParticles[i];
}
return SmokeParticles[0];
}