From 828bf0260493fd66e1194cef4fb98bb1fe7ef47b Mon Sep 17 00:00:00 2001 From: LHoG <1476261+lhog@users.noreply.github.com> Date: Sun, 8 Sep 2024 00:54:32 +0200 Subject: [PATCH] Add SmokeParticleGenerator2. Unverified and crashes because of the lack of Init() --- rts/Rendering/CMakeLists.txt | 1 + .../Classes/GeoThermSmokeProjectile.cpp | 9 ++++++- .../Env/Particles/Classes/SmokeProjectile.h | 3 ++- .../Particles/Classes/SmokeProjectile2.cpp | 24 +++++++++++++++++++ .../Env/Particles/Classes/SmokeProjectile2.h | 2 ++ .../Generators/ParticleGeneratorHandler.h | 4 +++- 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/rts/Rendering/CMakeLists.txt b/rts/Rendering/CMakeLists.txt index 997b3fd1a7..eb4a1b16a1 100644 --- a/rts/Rendering/CMakeLists.txt +++ b/rts/Rendering/CMakeLists.txt @@ -72,6 +72,7 @@ set(sources_engine_Rendering "${CMAKE_CURRENT_SOURCE_DIR}/Env/Particles/Generators/NanoParticleGenerator.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Env/Particles/Generators/SimpleParticleGenerator.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Env/Particles/Generators/SmokeParticleGenerator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Env/Particles/Generators/SmokeParticleGenerator2.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GL/FBO.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GL/StreamBuffer.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GL/GeometryBuffer.cpp" diff --git a/rts/Rendering/Env/Particles/Classes/GeoThermSmokeProjectile.cpp b/rts/Rendering/Env/Particles/Classes/GeoThermSmokeProjectile.cpp index dd99a915b4..6b1b7e2a9c 100644 --- a/rts/Rendering/Env/Particles/Classes/GeoThermSmokeProjectile.cpp +++ b/rts/Rendering/Env/Particles/Classes/GeoThermSmokeProjectile.cpp @@ -4,6 +4,7 @@ #include "GeoThermSmokeProjectile.h" #include "Sim/Features/Feature.h" #include "Sim/Projectiles/ProjectileHandler.h" +#include "Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h" #include "Sim/Misc/GlobalConstants.h" #include "Sim/Misc/Wind.h" @@ -43,8 +44,14 @@ void CGeoThermSmokeProjectile::Update() const float curSpeed = fastmath::sqrt_builtin(speed.SqLength()); const float newSpeed = speed.w * (speed.w / curSpeed); - CWorldObject::SetVelocity((dir = (speed / curSpeed)) * newSpeed); + dir = static_cast(speed) / curSpeed; + + CWorldObject::SetVelocity(dir * newSpeed); CSmokeProjectile::Update(); + + auto& pg = ParticleGeneratorHandler::GetInstance().GetGenerator(); + auto& data = pg.Get(pgOffset); + data.speed = speed; } void CGeoThermSmokeProjectile::UpdateDir() diff --git a/rts/Rendering/Env/Particles/Classes/SmokeProjectile.h b/rts/Rendering/Env/Particles/Classes/SmokeProjectile.h index f9aff8e350..4d108d5456 100644 --- a/rts/Rendering/Env/Particles/Classes/SmokeProjectile.h +++ b/rts/Rendering/Env/Particles/Classes/SmokeProjectile.h @@ -35,6 +35,8 @@ class CSmokeProjectile : public CProjectile public: float size; +protected: + size_t pgOffset; private: float color; float age; @@ -42,7 +44,6 @@ class CSmokeProjectile : public CProjectile float startSize; float sizeExpansion; int textureNum; - size_t pgOffset; }; #endif /* SMOKE_PROJECTILE_H */ diff --git a/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.cpp b/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.cpp index 250b03e6ad..bb9309eae3 100644 --- a/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.cpp +++ b/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.cpp @@ -9,6 +9,7 @@ #include "Rendering/GlobalRendering.h" #include "Rendering/Env/Particles/ProjectileDrawer.h" #include "Rendering/GL/RenderBuffers.h" +#include "Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h" #include "Rendering/Textures/TextureAtlas.h" #include "Sim/Misc/Wind.h" #include "Sim/Projectiles/ExpGenSpawnableMemberInfo.h" @@ -71,8 +72,31 @@ CSmokeProjectile2::CSmokeProjectile2( glowFalloff = 4.5f + guRNG.NextFloat() * 6; textureNum = (int)(guRNG.NextInt(projectileDrawer->NumSmokeTextures())); + + auto& pg = ParticleGeneratorHandler::GetInstance().GetGenerator(); + pgOffset = pg.Add({ + .pos = pos, + .size = size, + .wantedPos = wantedPos, + .startSize = startSize, + .sizeExpansion = sizeExpansion, + .ageRate = ageSpeed, + .glowFalloff = glowFalloff, + .speed = speed, + .createFrame = createFrame, + .animParams = animParams, + .color = SColor{color, color, color, 1.0f}, + .rotParams = rotParams, + .drawOrder = drawOrder, + .texCoord = *projectileDrawer->GetSmokeTexture(textureNum) + }); } +CSmokeProjectile2::~CSmokeProjectile2() +{ + auto& pg = ParticleGeneratorHandler::GetInstance().GetGenerator(); + pg.Del(pgOffset); +} void CSmokeProjectile2::Init(const CUnit* owner, const float3& offset) diff --git a/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.h b/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.h index e805b3ecba..24add913ac 100644 --- a/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.h +++ b/rts/Rendering/Env/Particles/Classes/SmokeProjectile2.h @@ -24,6 +24,7 @@ class CSmokeProjectile2 : public CProjectile float sizeExpansion, float color = 0.7f ); + ~CSmokeProjectile2() override; void Update() override; void Draw() override; @@ -43,6 +44,7 @@ class CSmokeProjectile2 : public CProjectile int textureNum; float3 wantedPos; float glowFalloff; + size_t pgOffset; }; #endif /* SMOKE_PROJECTILE_2_H */ diff --git a/rts/Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h b/rts/Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h index ba15c4bbe2..7343d37efc 100644 --- a/rts/Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h +++ b/rts/Rendering/Env/Particles/Generators/ParticleGeneratorHandler.h @@ -29,6 +29,7 @@ #include "NanoParticleGenerator.h" #include "SimpleParticleGenerator.h" #include "SmokeParticleGenerator.h" +#include "SmokeParticleGenerator2.h" namespace Shader { struct IProgramObject; @@ -105,7 +106,8 @@ class ParticleGeneratorHandler { NanoParticleGenerator, // skipped shields and repulsor SimpleParticleGenerator, - SmokeParticleGenerator + SmokeParticleGenerator, + SmokeParticleGenerator2 >; std::unique_ptr generators;