Skip to content

Instantly share code, notes, and snippets.

@hallamrear
Created March 29, 2023 16:56
#include "ParticleGenerator.h"
#include <random>
#include "Application.h"
#include <iostream>
ParticleGenerator::ParticleGenerator(Vector3D generatorPosition, Particle * particleBase, UINT particleCount)
{
mTransform = new Transform(Vector3D(1.0f, 1.0f, 1.0f), Vector3D(), generatorPosition);
mBaseParticle = particleBase;
mGenerationLocation = generatorPosition;
mParticleMaxCount = particleCount;
srand(GetTickCount());
UINT timeAlive = particleBase->GetTimeLeftAlive();
for (int i = 0; i <= (((int)rand() % particleCount)); i++)
{
mParticleVector.push_back(new Particle(
Vector3D(0.0f, 0.5f, 0.0f),
particleBase->GetParticleMass(),
particleBase->GetParticleAppearance(),
(rand() % ((int)particleBase->GetTimeLeftAlive())
)));
mParticleVector.back()->GetTransform()->SetParent(mTransform);
srand(i * GetTickCount() * GetTickCount64());
mParticleVector[i]->GetParticleModel()->ApplyForce
(
Vector3D(((rand() % 750) - 375), ((rand() % 500) + 250), ((rand() % 750) - 375))
);
srand(0x1827831 * GetTickCount());
}
mParticleCount = mParticleVector.size();
}
ParticleGenerator::~ParticleGenerator()
{
}
void ParticleGenerator::Update(float deltaTime)
{
for (int i = 0; i < mParticleMaxCount; i++)
{
if (i >= mParticleCount && i < mParticleMaxCount)
{
mParticleVector.push_back(new Particle(
Vector3D(0.0f, 0.5f, 0.0f),
mBaseParticle->GetParticleMass(),
mBaseParticle->GetParticleAppearance(),
(rand() % ((int)mBaseParticle->GetTimeLeftAlive())
)));
mParticleVector.back()->GetTransform()->SetParent(mTransform);
srand(i * GetTickCount() * GetTickCount64());
mParticleVector.back()->GetParticleModel()->ApplyForce
(
Vector3D(((rand() % 750) - 375), ((rand() % 500) + 250), ((rand() % 750) - 375))
);
mParticleCount = mParticleVector.size();
}
else
{
if (!mParticleVector[i]->GetIsAlive())
{
if (mParticleVector[i])
{
delete mParticleVector[i];
mParticleVector[i] = nullptr;
}
if (i < mParticleCount)
{
mParticleVector[i] = new Particle(
Vector3D(0.0f, 0.5f, 0.0f),
mBaseParticle->GetParticleMass(),
mBaseParticle->GetParticleAppearance(),
(rand() % ((int)mBaseParticle->GetTimeLeftAlive())
));
mParticleVector[i]->GetTransform()->SetParent(mTransform);
srand(i * GetTickCount() * GetTickCount64());
mParticleVector[i]->GetParticleModel()->ApplyForce
(
Vector3D(((rand() % 750) - 375), ((rand() % 500) + 250), ((rand() % 750) - 375))
);
}
}
}
}
for (int i = 0; i < mParticleVector.size(); i++)
{
mParticleVector[i]->Update(deltaTime);
}
mTransform->Update(deltaTime);
for (int i = 0; i < mParticleCount; i++)
{
if (mParticleVector[i]->GetTransform()->GetPosition().y <= 0)
{
mParticleVector[i]->GetParticleModel()->SetVelocity(
Vector3D(mParticleVector[i]->GetParticleModel()->GetVelocity().x, -mParticleVector[i]->GetParticleModel()->GetVelocity().y, mParticleVector[i]->GetParticleModel()->GetVelocity().z)
);
}
}
}
void ParticleGenerator::Draw(ID3D11DeviceContext * pImmediateContext)
{
for (int i = 0; i < mParticleVector.size(); i++)
{
mParticleVector[i]->Draw(pImmediateContext);
}
}
void ParticleGenerator::Draw(ID3D11DeviceContext * pImmediateContext, ID3D11Buffer* constantBuffer, ConstantBuffer CB)
{
for (int i = 0; i < mParticleVector.size(); i++)
{
if (mParticleVector[i]->GetIsAlive())
{
// Get render material
Material material = mParticleVector[i]->GetParticleAppearance()->GetMaterial();
// Copy material to shader
CB.surface.AmbientMtrl = material.mAmbient;
CB.surface.DiffuseMtrl = material.mDiffuse;
CB.surface.SpecularMtrl = material.mSpecular;
// Set world matrix
CB.World = XMMatrixTranspose(mParticleVector[i]->GetParticleModel()->GetTransform()->GetObjectMatrix());
// Set texture
if (mParticleVector[i]->GetParticleAppearance()->HasTexture())
{
ID3D11ShaderResourceView * textureRV = mParticleVector[i]->GetParticleAppearance()->GetTextureRV();
pImmediateContext->PSSetShaderResources(0, 1, &textureRV);
CB.HasTexture = 1.0f;
}
else
{
CB.HasTexture = 0.0f;
}
// Set world matrix
CB.World = XMMatrixTranspose(mParticleVector[i]->GetTransform()->GetObjectMatrix());
pImmediateContext->UpdateSubresource(constantBuffer, 0, nullptr, &CB, 0, 0);
mParticleVector[i]->Draw(pImmediateContext);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment