Bomberman-OverlordEngine-x64 / BombermanGame / Prefabs / Bomberman / Bomb.cpp
Bomb.cpp
Raw
#include "stdafx.h"
#include "Bomb.h"
#include "Bush.h"

#include "Materials/DiffuseMaterial.h"
#include "Materials/DiffuseAnimatedMaterial.h"
#include "Materials/DiffuseOpacityMaterial.h"
#include "Player.h"

int Bomb::m_Count = 0;
std::vector<UINT> Bomb::m_MaterialIds = {};
PxMaterial* Bomb::m_pPxMaterial{ nullptr };

Bomb::Bomb(GameObject* pPlayer, const XMFLOAT3& startPos, const XMFLOAT4& cameraRot, int power)
	: m_pPlayer{ pPlayer }
	, m_StartPos{ startPos }
	, m_BaseRotation{ cameraRot }
	, m_Power{ power }
{
	if (m_Count++ == 0)
	{
		m_pPxMaterial = PxGetPhysics().createMaterial(.5f, .5f, .5f);

		auto pMat = MaterialManager::Get()->CreateMaterial<DiffuseMaterial>();
		pMat->SetDiffuseTexture(L"Textures/Bomberman/Bomb/o001e.png");
		m_MaterialIds.push_back(pMat->GetMaterialId());

		auto pMat2 = MaterialManager::Get()->CreateMaterial<DiffuseOpacityMaterial>();
		pMat2->SetDiffuseTexture(L"Textures/Bomberman/Levels/shadow.png");
		pMat2->SetOpacityTexture(L"Textures/Bomberman/Levels/shadow_opacity.png");
		m_MaterialIds.push_back(pMat2->GetMaterialId());
	}

	m_pAnimatedMaterial = MaterialManager::Get()->CreateMaterial<DiffuseAnimatedMaterial>();
	m_pAnimatedMaterial->SetDiffuseTexture(L"Textures/Bomberman/Bomb/Explosion/e102_transparent.png");
	m_pAnimatedMaterial->SetVariable_Scalar(L"gNrSprites", 16);
	m_pAnimatedMaterial->SetVariable_Scalar(L"gAnimSpeed", 32);

	m_pAnimatedMaterial2 = MaterialManager::Get()->CreateMaterial<DiffuseAnimatedMaterial>();
	m_pAnimatedMaterial2->SetDiffuseTexture(L"Textures/Bomberman/Bomb/Explosion/e101_transparent.png");
	m_pAnimatedMaterial2->SetVariable_Scalar(L"gNrSprites", 16);
	m_pAnimatedMaterial2->SetVariable_Scalar(L"gAnimSpeed", 32);

	m_pAnimatedMaterial3 = MaterialManager::Get()->CreateMaterial<DiffuseAnimatedMaterial>();
	m_pAnimatedMaterial3->SetDiffuseTexture(L"Textures/Bomberman/Bomb/Explosion/explosion_transparent.png");
	m_pAnimatedMaterial3->SetVariable_Scalar(L"gNrSprites", 1);
	m_pAnimatedMaterial3->SetVariable_Scalar(L"gAnimSpeed", 1);

	m_SquishTimer = m_SquishDuration * 2;
}

void Bomb::DrawImGui()
{

}

void Bomb::Initialize(const SceneContext&)
{
	GetTransform()->Translate(m_StartPos);
	GetTransform()->Scale(1 + m_Amplitude * 2);

	m_ModelsContainer = new GameObject();
	AddChild(m_ModelsContainer);

	m_pShadow = new GameObject();
	ModelComponent* pShadowModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Bomb_Shadow.ovm", false);
	pShadowModel->SetMaterial(m_MaterialIds[1]);
	m_pShadow->AddComponent(pShadowModel);

	m_ModelsContainer->AddChild(m_pShadow);

	m_pBase = new GameObject();
	m_pBase->GetTransform()->Translate(0, 7.9f /*8.4f*/, 0);
	m_pBase->GetTransform()->Rotate(XMLoadFloat4(&m_BaseRotation));
	ModelComponent* pBaseModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Bomb_Base.ovm", false);
	pBaseModel->SetMaterial(m_MaterialIds[0]);
	m_pBase->AddComponent(pBaseModel);

	m_ModelsContainer->AddChild(m_pBase);

	m_pFuse = new GameObject();
	ModelComponent* pFuseModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Bomb_Top.ovm", false);
	pFuseModel->SetMaterial(m_MaterialIds[0]);
	m_pFuse->AddComponent(pFuseModel);

	m_ModelsContainer->AddChild(m_pFuse);

	// Flash Particle System
	ParticleEmitterSettings settings{};
	settings.velocity = { 0.f,0.f,0.f };
	settings.minSize = 22.f;
	settings.maxSize = 22.f;
	settings.minEnergy = 0.f;
	settings.maxEnergy = 0.1f;
	settings.minScale = 1.f;
	settings.maxScale = 2.f;
	settings.minEmitterRadius = 0.f;
	settings.maxEmitterRadius = 0.f;
	settings.color = { 1.f,1.f,1.f,.3f };

	GameObject* pFlashContainer = new GameObject();
	m_pFuse->AddChild(pFlashContainer);
	pFlashContainer->GetTransform()->Translate(1.4f, 23.8f, -2.596f);
	pFlashContainer->AddComponent(new ParticleEmitterComponent(L"Textures/Bomberman/Bomb/flash_particle.png", settings, 7));

	// Flame Particle System #1
	settings.velocity = { 0.f,0.f,0.f };
	settings.minSize = 8.f;
	settings.maxSize = 8.f;
	settings.minEnergy = 0.f;
	settings.maxEnergy = 0.1f;
	settings.minScale = 1.f;
	settings.maxScale = 2.f;
	settings.minEmitterRadius = 0.f;
	settings.maxEmitterRadius = 0.f;
	settings.color = { 1.f,1.f,1.f,.7f };

	GameObject* pFlameContainer = new GameObject();
	m_pFuse->AddChild(pFlameContainer);
	pFlameContainer->GetTransform()->Translate(1.4f, 23.8f, -1.55f);
	pFlameContainer->AddComponent(new ParticleEmitterComponent(L"Textures/Bomberman/Bomb/flame01_particle.png", settings, 5));

	// Flame Particle System #2
	settings.velocity = { 0.f,0.f,0.f };
	settings.minSize = 8.f;
	settings.maxSize = 8.f;
	settings.minEnergy = 0.f;
	settings.maxEnergy = 0.5f;
	settings.minScale = 2.f;
	settings.maxScale = 1.f;
	settings.minEmitterRadius = 0.f;
	settings.maxEmitterRadius = 0.f;
	settings.color = { 1.f,1.f,1.f,.35f };

	GameObject* pFlame2Container = new GameObject();
	m_pFuse->AddChild(pFlame2Container);
	pFlame2Container->GetTransform()->Translate(1.4f, 23.8f, -1.55f);
	pFlame2Container->AddComponent(new ParticleEmitterComponent(L"Textures/Bomberman/Bomb/flame02_particle.png", settings, 1));

	// Collider
	m_pActor = AddComponent(new RigidBodyComponent(true));
	m_pActor->SetCollisionGroup(CollisionGroup::SpawnedBombs);
	//m_pActor->SetCollisionIgnoreGroups(CollisionGroup::Player0);
	const auto pPxConvexMesh = ContentManager::Load<PxConvexMesh>(L"Meshes/Bomberman/Tile_Collision.ovpc");
	m_pActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ 1.f, 1.f, 1.f })), *m_pPxMaterial);

	//Kill Trigger
	PhysicsCallback killTrigger = [this](GameObject* pTriggerObject, GameObject* pOtherObject, PxTriggerAction action)
	{
		pTriggerObject;

		if (action == PxTriggerAction::ENTER)
		{
			Player* pPlayer = dynamic_cast<Player*>(pOtherObject);
			if (pPlayer != nullptr)
			{
				//PlaySFX
				/*
				FMOD::Sound* sound;
				auto fmodSystem = SoundManager::Get()->GetSystem();
				fmodSystem->createSound("Resources/Sounds/explosion.wav", FMOD_DEFAULT, 0, &sound);
				fmodSystem->playSound(sound, 0, false, 0);
				*/

				//Add points
				if (pPlayer->GetState() != Player::State::WIN && pPlayer->GetState() != Player::State::DEAD)
					pPlayer->Kill();
			}
		}
	};


	SetOnTriggerCallBack(killTrigger);
}

void Bomb::Explode(const SceneContext&)
{
	//sfx
	FMOD::Sound* sound;
	auto fmodSystem = SoundManager::Get()->GetSystem();
	fmodSystem->createSound("Resources/Sounds/explosion.wav", FMOD_DEFAULT, 0, &sound);
	fmodSystem->playSound(sound, 0, false, 0);

	// Explosion Particle System
	ParticleEmitterSettings settings{};
	settings.velocity = { 0.f,0.f,0.f };
	settings.minSize = 2.f;
	settings.maxSize = 2.f;
	settings.minEnergy = 0.5f;
	settings.maxEnergy = 0.5f;
	settings.minScale = 20.f;
	settings.maxScale = 20.f;
	settings.minEmitterRadius = 0.f;
	settings.maxEmitterRadius = 0.f;
	settings.color = { 1.f,1.f,1.f,1.f };

	GameObject* pExplosionContainer = new GameObject();
	AddChild(pExplosionContainer);
	pExplosionContainer->GetTransform()->Translate(0, 10.f, 0);
	pExplosionContainer->AddComponent(new ParticleEmitterComponent(L"Textures/Bomberman/Bomb/Explosion/center_particle.png", settings, 1));

	settings.minScale = 22.5f;
	settings.maxScale = 22.5f;
	settings.minEnergy = .25f;
	settings.maxEnergy = .25f;

	// Explosion Particle System
	pExplosionContainer->AddComponent(new ParticleEmitterComponent(L"Textures/Bomberman/Bomb/Explosion/sharpnel_particle.png", settings, 1));

	//Ray casts
	XMFLOAT3 pos = GetTransform()->GetWorldPosition();
	PxQueryFilterData filterData{};
	filterData.data.word0 = ~PxU32(CollisionGroup::SpawnedBombs | CollisionGroup::Bombs);

	float distanceLeft{ m_Power * 20.f };
	PxRaycastBuffer hit{};
	if (GetScene()->GetPhysxProxy()->Raycast(PxVec3{ pos.x - 10, 3, pos.z }, PxVec3{ -1, 0, 0 }, distanceLeft, hit, PxHitFlag::eDEFAULT, filterData))
	{
		distanceLeft = hit.block.distance;

		GameObject* pHitGo = reinterpret_cast<BaseComponent*>(hit.block.actor->userData)->GetGameObject();

		Bush* pBush = dynamic_cast<Bush*>(pHitGo);
		if (pBush != nullptr) pBush->Explode(); //GetScene()->RemoveChild(pHitGo, true);
	}
	float nrLeftTiles{ std::floor(distanceLeft / 20.0f) };

	float distanceRight{ m_Power * 20.f };
	hit = {};
	if (GetScene()->GetPhysxProxy()->Raycast(PxVec3{ pos.x + 10, 3, pos.z }, PxVec3{ 1, 0, 0 }, distanceRight, hit, PxHitFlag::eDEFAULT, filterData))
	{
		distanceRight = hit.block.distance;
		GameObject* pHitGo = reinterpret_cast<BaseComponent*>(hit.block.actor->userData)->GetGameObject();

		Bush* pBush = dynamic_cast<Bush*>(pHitGo);
		if (pBush != nullptr) pBush->Explode(); //GetScene()->RemoveChild(pHitGo, true);
	}
	float nrRightTiles{ std::floor(distanceRight / 20.0f) };

	float distanceUp{ m_Power * 20.f };
	hit = {};
	if (GetScene()->GetPhysxProxy()->Raycast(PxVec3{ pos.x, 3, pos.z + 10 }, PxVec3{ 0, 0, 1 }, distanceUp, hit, PxHitFlag::eDEFAULT, filterData))
	{
		distanceUp = hit.block.distance;

		GameObject* pHitGo = reinterpret_cast<BaseComponent*>(hit.block.actor->userData)->GetGameObject();

		Bush* pBush = dynamic_cast<Bush*>(pHitGo);
		if (pBush != nullptr) pBush->Explode(); //GetScene()->RemoveChild(pHitGo, true);
	}
	float nrUpTiles{ std::floor(distanceUp / 20.0f) };

	float distanceDown{ m_Power * 20.f };
	hit = {};
	if (GetScene()->GetPhysxProxy()->Raycast(PxVec3{ pos.x, 3, pos.z - 10 }, PxVec3{ 0, 0, -1 }, distanceDown, hit, PxHitFlag::eDEFAULT, filterData))
	{
		distanceDown = hit.block.distance;
			
		GameObject* pHitGo = reinterpret_cast<BaseComponent*>(hit.block.actor->userData)->GetGameObject();

		Bush* pBush = dynamic_cast<Bush*>(pHitGo);
		if (pBush != nullptr) pBush->Explode(); //GetScene()->RemoveChild(pHitGo, true);
	}
	float nrDownTiles{ std::floor(distanceDown / 20.0f) };

	//std::cout << "distanceLeft = " << distanceLeft << ", NrTiles = " << nrLeftTiles << std::endl;
	//std::cout << "distanceRight = " << distanceRight << ", NrTiles = " << nrRightTiles << std::endl;
	//std::cout << "distanceUp = " << distanceUp << ", NrTiles = " << nrUpTiles << std::endl;
	//std::cout << "distanceDown = " << distanceDown << ", NrTiles = " << nrDownTiles << std::endl << std::endl;

	// Explosion Fire Animated materials
	//Base
	GameObject* pExplosionQuad = new GameObject();
	AddChild(pExplosionQuad);
	pExplosionQuad->GetTransform()->Translate(0, 3.5f, 0);
	ModelComponent* pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_Quad.ovm", false);
	pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial3);
	pExplosionQuad->AddComponent(pExplosionQuadModel);

	// Center Kill Trigger
	auto pKillTriggerActor = AddComponent(new RigidBodyComponent(true));
	const auto pPxConvexMesh = ContentManager::Load<PxConvexMesh>(L"Meshes/Bomberman/Tile_Collision.ovpc");
	pKillTriggerActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ 1.f, 1.f, 1.f })), *m_pPxMaterial, true, { 0, 0, 0 });

	//Lines & Kill Trigger Colliders
	for (int i{ 1 }; i <= nrDownTiles; i++)
	{
		//Line
		if (i < nrDownTiles)
		{
			pExplosionQuad = new GameObject();
			AddChild(pExplosionQuad);
			pExplosionQuad->GetTransform()->Translate(0, 0, 7.5f + -20.f * i);
			pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_022.ovm", false);
			pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial);
			pExplosionQuad->AddComponent(pExplosionQuadModel);

			m_pExplosionLines.emplace_back(pExplosionQuad);
		}

		// Kill Trigger
		pKillTriggerActor = AddComponent(new RigidBodyComponent(true));
		pKillTriggerActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ .7f, 1.f, 1.f })), *m_pPxMaterial, true, { 0, 0, -20.f * i });
	}

	for (int i{ 1 }; i <= nrLeftTiles; i++)
	{
		//Line
		if (i < nrLeftTiles)
		{
			pExplosionQuad = new GameObject();
			AddChild(pExplosionQuad);
			pExplosionQuad->GetTransform()->Translate(-20.f * i + 7.5f, 0, 0);
			pExplosionQuad->GetTransform()->Rotate(0, 90, 0);
			pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_022.ovm", false);
			pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial);
			pExplosionQuad->AddComponent(pExplosionQuadModel);

			m_pExplosionLines.emplace_back(pExplosionQuad);
		}

		// Kill Trigger
		pKillTriggerActor = AddComponent(new RigidBodyComponent(true));
		pKillTriggerActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ 1.f, 1.f, .7f })), *m_pPxMaterial, true, { -20.f * i, 0, 0 });
	}

	for (int i{ 1 }; i <= nrUpTiles; i++)
	{
		//Line
		if (i < nrUpTiles)
		{
			pExplosionQuad = new GameObject();
			AddChild(pExplosionQuad);
			pExplosionQuad->GetTransform()->Translate(0, 0, 20.f * i - 7.5f);
			pExplosionQuad->GetTransform()->Rotate(0, 180, 0);
			pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_022.ovm", false);
			pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial);
			pExplosionQuad->AddComponent(pExplosionQuadModel);

			m_pExplosionLines.emplace_back(pExplosionQuad);
		}

		// Kill Trigger
		pKillTriggerActor = AddComponent(new RigidBodyComponent(true));
		pKillTriggerActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ .7f, 1.f, 1.f })), *m_pPxMaterial, true, { 0, 0, 20.f * i });
	}

	for (int i{ 1 }; i <= nrRightTiles; i++)
	{
		//Line
		if (i < nrRightTiles)
		{
			pExplosionQuad = new GameObject();
			AddChild(pExplosionQuad);
			pExplosionQuad->GetTransform()->Translate(-7.5f + 20.f * i, 0, 0);
			pExplosionQuad->GetTransform()->Rotate(0, 270, 0);
			pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_022.ovm", false);
			pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial);
			pExplosionQuad->AddComponent(pExplosionQuadModel);

			m_pExplosionLines.emplace_back(pExplosionQuad);
		}

		// Kill Trigger
		pKillTriggerActor = AddComponent(new RigidBodyComponent(true));
		pKillTriggerActor->AddCollider(PxConvexMeshGeometry(pPxConvexMesh, PxMeshScale({ 1.f, 1.f, .7f })), *m_pPxMaterial, true, { 20.f * i, 0, 0 });
	}

	//Bases & Lines - Ends
	if (nrDownTiles > 0)
	{
		// Base End
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionBase.emplace_back(pExplosionQuad);

		// Line End
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Translate(0, 0, (nrDownTiles - 1) * -20.f);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionEnds.emplace_back(pExplosionQuad);
	}

	if (nrLeftTiles > 0)
	{
		// Base
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Rotate(0, 90, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionBase.emplace_back(pExplosionQuad);

		// End
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Translate((nrLeftTiles - 1) * -20.f, 0, 0);
		pExplosionQuad->GetTransform()->Rotate(0, 90, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionEnds.emplace_back(pExplosionQuad);
	}

	if (nrUpTiles > 0)
	{
		// Base
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Rotate(0, 180, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionBase.emplace_back(pExplosionQuad);

		// End
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Translate(0, 0, (nrUpTiles - 1) * 20.f);
		pExplosionQuad->GetTransform()->Rotate(0, 180, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionEnds.emplace_back(pExplosionQuad);
	}

	if (nrRightTiles > 0)
	{
		// Base
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Rotate(0, 270, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionBase.emplace_back(pExplosionQuad);

		// End
		pExplosionQuad = new GameObject();
		AddChild(pExplosionQuad);
		pExplosionQuad->GetTransform()->Translate((nrRightTiles - 1) * 20.f, 0, 0);
		pExplosionQuad->GetTransform()->Rotate(0, 270, 0);
		pExplosionQuadModel = new ModelComponent(L"Meshes/Bomberman/Bomb/Explosion_021.ovm", false);
		pExplosionQuadModel->SetMaterial(m_pAnimatedMaterial2);
		pExplosionQuad->AddComponent(pExplosionQuadModel);

		m_pExplosionEnds.emplace_back(pExplosionQuad);
	}
}

void Bomb::Update(const SceneContext& sceneContext)
{
	//check if player is outside of bomb collider bounds to enable collision with bomb
	if (m_pPlayer != nullptr)
	{
		XMFLOAT3 playerPos = m_pPlayer->GetTransform()->GetWorldPosition();
		XMFLOAT3 bombPos = GetTransform()->GetWorldPosition();

		if (std::fabs(playerPos.x - bombPos.x) > 14.5f)
		{
			m_pActor->SetCollisionGroup(CollisionGroup::Bombs);
			m_pPlayer = nullptr;
		}
		else if (std::fabs(playerPos.z - bombPos.z) > 14.5f)
		{
			m_pActor->SetCollisionGroup(CollisionGroup::Bombs);
			m_pPlayer = nullptr;
		}
	}

	const float elapsedSec = sceneContext.pGameTime->GetElapsed();

	m_pAnimatedMaterial->SetVariable_Scalar(L"gTotalSec", sceneContext.pGameTime->GetTotal());
	m_pAnimatedMaterial2->SetVariable_Scalar(L"gTotalSec", sceneContext.pGameTime->GetTotal());
	m_pAnimatedMaterial3->SetVariable_Scalar(L"gTotalSec", sceneContext.pGameTime->GetTotal());

	if (m_SquishTimer >= m_SquishDuration / 2)
	{
		m_SquishTimer -= elapsedSec * 2;
		m_ScaleStep = sinf(-(m_SquishTimer + (1 - m_SquishDuration * 2) + 0.5f) * XM_PI * 2) * 0.5f;

		auto mTransform = m_ModelsContainer->GetTransform();
		auto mScale = mTransform->GetScale();
		mTransform->Scale(mScale.x, (1 - m_Amplitude) + m_ScaleStep, mScale.z);
	}
	else
	{
		if (m_Lifetime <= 0)
		{
			if (m_ModelsContainer != nullptr)
			{
				RemoveChild(m_ModelsContainer, true);
				m_ModelsContainer = nullptr;

				Explode(sceneContext);
			}

			if (m_ExplosionTime > 0)
			{
				m_ExplosionTime -= elapsedSec;

				for (GameObject* pGo : m_pExplosionLines)
				{
					pGo->GetTransform()->Scale(1 / 1.5f + m_ExplosionTime / 1.5f, 1, 1);
				}

				for (GameObject* pGo : m_pExplosionEnds)
				{
					pGo->GetTransform()->Scale(1 / 1.5f + m_ExplosionTime / 1.5f, 1, 1);
				}

				for (GameObject* pGo : m_pExplosionBase)
				{
					pGo->GetTransform()->Scale(1 / 1.5f + m_ExplosionTime / 1.5f, 1, 1 / 1.5f + m_ExplosionTime / 1.5f);
				}

				m_pAnimatedMaterial3->SetVariable_Scalar(L"gOpacityAmount", m_ExplosionTime * 2);

				if (m_ExplosionTime < 0.25f)
				{
					m_pAnimatedMaterial->SetVariable_Scalar(L"gOpacityAmount", m_ExplosionTime * 4);
					m_pAnimatedMaterial2->SetVariable_Scalar(L"gOpacityAmount", m_ExplosionTime * 4);
					
				}
			}
			else
			{
				GetScene()->RemoveChild(this, true);
			}
		}
		else
		{
			m_ScaleStep = sinf(-(m_Lifetime + (1 - m_SquishDuration * 2) + 0.5f) * XM_PI * m_Frequency) * m_Amplitude;

			auto mTransform = m_ModelsContainer->GetTransform();
			mTransform->Scale((1 - m_Amplitude) + m_ScaleStep, (1 - m_Amplitude) + m_ScaleStep, (1 - m_Amplitude) + m_ScaleStep);

			auto sTransform = m_pShadow->GetTransform();
			auto sScale = sTransform->GetScale();
			sTransform->Scale((1 - m_Amplitude / 2) + m_ScaleStep / 2, sScale.y, (1 - m_Amplitude / 2) + m_ScaleStep / 2);

			//Lifetime timer
			m_Lifetime -= elapsedSec;
		}
	}
}