diff --git a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankDraw.h b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankDraw.h index e052b4e99a..cb830d119c 100644 --- a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankDraw.h +++ b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankDraw.h @@ -93,10 +93,10 @@ class W3DTankDraw : public W3DModelDraw Int m_treadCount; Coord3D m_lastDirection; ///< orientation of tank last time it was drawn. - void createEmitters( void ); ///< Create particle effects. - void tossEmitters( void ); ///< Create particle effects. + void createTreadEmitters( void ); ///< Create particle effects for treads. + void tossTreadEmitters( void ); ///< Destroy particle effects for treads. - void stopMoveDebris( void ); ///< stop creating debris from the tank treads - void updateTreadObjects(void); ///< update pointers to sub-objects like treads. - void updateTreadPositions(Real uvDelta); ///< update uv coordinates on each tread + void stopMoveDebris( void ); ///< Stop creating debris from the tank treads. + void updateTreadObjects(void); ///< Update pointers to sub-objects like treads. + void updateTreadPositions(Real uvDelta); ///< Update uv coordinates on each tread. }; diff --git a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankTruckDraw.h b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankTruckDraw.h index 0b0bd03f8e..55993697c1 100644 --- a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankTruckDraw.h +++ b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTankTruckDraw.h @@ -38,6 +38,8 @@ #include "WW3D2/rendobj.h" #include "WW3D2/part_emt.h" +//------------------------------------------------------------------------------------------------- +// TheSuperHackers @fix xezon 01/02/2026 The Tread Effects are now usable in W3DTankTruckDraw. //------------------------------------------------------------------------------------------------- class W3DTankTruckDrawModuleData : public W3DModelDrawModuleData { @@ -139,12 +141,15 @@ class W3DTankTruckDraw : public W3DModelDraw RenderObjClass *m_prevRenderObj; - void createEmitters( void ); ///< Create particle effects. - void tossEmitters( void ); ///< Create particle effects. - void enableEmitters( Bool enable ); ///< stop creating debris from the tank treads + void createTreadEmitters( void ); ///< Create particle effects for treads. + void tossTreadEmitters( void ); ///< Destroy particle effects for treads. + + void createWheelEmitters( void ); ///< Create particle effects for wheels. + void tossWheelEmitters( void ); ///< Destroy particle effects for wheels. + void enableWheelEmitters( Bool enable ); ///< Start or stop creating effects from the wheels. void updateBones( void ); - void stopMoveDebris( void ); ///< stop creating debris from the tank treads - void updateTreadObjects(void); ///< update pointers to sub-objects like treads. - void updateTreadPositions(Real uvDelta); ///< update uv coordinates on each tread + void stopMoveDebris( void ); ///< Stop creating debris from the tank treads. + void updateTreadObjects(void); ///< Update pointers to sub-objects like treads. + void updateTreadPositions(Real uvDelta); ///< Update uv coordinates on each tread. }; diff --git a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTruckDraw.h b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTruckDraw.h index d51dd586f0..c62dea04d4 100644 --- a/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTruckDraw.h +++ b/Core/GameEngineDevice/Include/W3DDevice/GameClient/Module/W3DTruckDraw.h @@ -133,8 +133,8 @@ class W3DTruckDraw : public W3DModelDraw RenderObjClass *m_prevRenderObj; - void createEmitters( void ); ///< Create particle effects. - void tossEmitters( void ); ///< Create particle effects. - void enableEmitters( Bool enable ); ///< stop creating debris from the tank treads + void createWheelEmitters( void ); ///< Create particle effects for wheels. + void tossWheelEmitters( void ); ///< Destroy particle effects for wheels. + void enableWheelEmitters( Bool enable ); ///< Start or stop creating effects from the wheels. void updateBones( void ); }; diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTankDraw.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTankDraw.cpp index 81fab341fa..810cbb20aa 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTankDraw.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTankDraw.cpp @@ -51,14 +51,20 @@ class Matrix3D; +// TheSuperHackers @info Is enabled by default and therefore compatible with the Retail INI setups. +#define SHOW_DEFAULT_TANK_DEBRIS (1) + //------------------------------------------------------------------------------------------------- -W3DTankDrawModuleData::W3DTankDrawModuleData() : - m_treadDebrisNameLeft("TrackDebrisDirtLeft"), - m_treadDebrisNameRight("TrackDebrisDirtRight"), - m_treadAnimationRate(0.0f), - m_treadPivotSpeedFraction(0.6f), - m_treadDriveSpeedFraction(0.3f) +W3DTankDrawModuleData::W3DTankDrawModuleData() + : m_treadAnimationRate(0.0f) + , m_treadPivotSpeedFraction(0.6f) + , m_treadDriveSpeedFraction(0.3f) { + if constexpr (SHOW_DEFAULT_TANK_DEBRIS) + { + m_treadDebrisNameLeft = "TrackDebrisDirtLeft"; // TheSuperHackers @todo Remove data particle names from code + m_treadDebrisNameRight = "TrackDebrisDirtRight"; + } } //------------------------------------------------------------------------------------------------- @@ -100,12 +106,12 @@ W3DTankDraw::W3DTankDraw( Thing *thing, const ModuleData* moduleData ) m_lastDirection.y=0.0f; m_lastDirection.z=0.0f; - createEmitters(); + createTreadEmitters(); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -void W3DTankDraw::tossEmitters( void ) +void W3DTankDraw::tossTreadEmitters( void ) { for (size_t i = 0; i < ARRAY_SIZE(m_treadDebrisIDs); ++i) { @@ -120,7 +126,7 @@ void W3DTankDraw::tossEmitters( void ) //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -void W3DTankDraw::createEmitters( void ) +void W3DTankDraw::createTreadEmitters( void ) { const AsciiString *treadDebrisNames[2]; static_assert(ARRAY_SIZE(treadDebrisNames) == ARRAY_SIZE(m_treadDebrisIDs), "Array size must match"); @@ -150,7 +156,7 @@ void W3DTankDraw::createEmitters( void ) W3DTankDraw::~W3DTankDraw() { // TheSuperHackers @fix Mauller 16/04/2025 Delete particle systems - tossEmitters(); + tossTreadEmitters(); for (Int i=0; im_treadDebrisNameLeft; - treadDebrisNames[1] = &getW3DTankTruckDrawModuleData()->m_treadDebrisNameRight; - - for (size_t i = 0; i < ARRAY_SIZE(m_treadDebrisIDs); ++i) - { - if (m_treadDebrisIDs[i] == INVALID_PARTICLE_SYSTEM_ID) - { - if (const ParticleSystemTemplate *sysTemplate = TheParticleSystemManager->findTemplate(*treadDebrisNames[i])) - { - ParticleSystem *particleSys = TheParticleSystemManager->createParticleSystem( sysTemplate ); - particleSys->attachToDrawable(getDrawable()); - DEBUG_CRASH(("test me, may not work (srj)")); - // important: mark it as do-not-save, since we'll just re-create it when we reload. - particleSys->setSaveable(FALSE); - // they come into being stopped. - //particleSys->stop(); - m_treadDebrisIDs[i] = particleSys->getSystemID(); - } - } - } - } -#endif + createTreadEmitters(); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- W3DTankTruckDraw::~W3DTankTruckDraw() { - tossEmitters(); + tossWheelEmitters(); + tossTreadEmitters(); for (Int i=0; im_treadDebrisNameLeft; + treadDebrisNames[1] = &getW3DTankTruckDrawModuleData()->m_treadDebrisNameRight; + + for (size_t i = 0; i < ARRAY_SIZE(m_treadDebrisIDs); ++i) + { + if (m_treadDebrisIDs[i] == INVALID_PARTICLE_SYSTEM_ID) + { + if (const ParticleSystemTemplate *sysTemplate = TheParticleSystemManager->findTemplate(*treadDebrisNames[i])) + { + ParticleSystem *particleSys = TheParticleSystemManager->createParticleSystem( sysTemplate ); + particleSys->attachToDrawable(getDrawable()); + // important: mark it as do-not-save, since we'll just re-create it when we reload. + particleSys->setSaveable(FALSE); + // they come into being stopped. + particleSys->stop(); + m_treadDebrisIDs[i] = particleSys->getSystemID(); + } + } + } + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DTankTruckDraw::tossTreadEmitters( void ) +{ + for (size_t i = 0; i < ARRAY_SIZE(m_treadDebrisIDs); ++i) + { + if (ParticleSystem *particleSys = TheParticleSystemManager->findParticleSystem(m_treadDebrisIDs[i])) + { + particleSys->attachToObject(nullptr); + particleSys->destroy(); + } + m_treadDebrisIDs[i] = INVALID_PARTICLE_SYSTEM_ID; + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DTankTruckDraw::createWheelEmitters( void ) { if (getDrawable()->isDrawableEffectivelyHidden()) return; @@ -241,16 +265,13 @@ void W3DTankTruckDraw::createEmitters( void ) //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -/** - * Stop creating debris from the tank treads - */ -void W3DTankTruckDraw::enableEmitters( Bool enable ) +void W3DTankTruckDraw::enableWheelEmitters( Bool enable ) { // don't check... if we are hidden the first time thru, then we'll never create the emitters. // eg, if we are loading a game and the unit is in a tunnel, he'll never get emitteres even when he exits. //if (!m_effectsInitialized) { - createEmitters(); + createWheelEmitters(); m_effectsInitialized=true; } @@ -349,10 +370,8 @@ void W3DTankTruckDraw::setHidden(Bool h) W3DModelDraw::setHidden(h); if (h) { - enableEmitters(false); -#ifdef SHOW_TANK_DEBRIS + enableWheelEmitters(false); stopMoveDebris(); -#endif } } @@ -573,7 +592,7 @@ void W3DTankTruckDraw::doDrawModule(const Matrix3D* transformMtx) Bool wasPowersliding = m_isPowersliding; m_isPowersliding = false; if (physics->isMotive() && !obj->isSignificantlyAboveTerrain()) { - enableEmitters(true); + enableWheelEmitters(true); Coord3D accel = *physics->getAcceleration(); accel.z = 0; // ignore gravitational force. Bool accelerating = accel.length()>ACCEL_THRESHOLD; @@ -615,7 +634,7 @@ void W3DTankTruckDraw::doDrawModule(const Matrix3D* transformMtx) } } else - enableEmitters(false); + enableWheelEmitters(false); m_wasAirborne = obj->isSignificantlyAboveTerrain(); @@ -628,7 +647,6 @@ void W3DTankTruckDraw::doDrawModule(const Matrix3D* transformMtx) } //Tank update -#ifdef SHOW_TANK_DEBRIS const Real DEBRIS_THRESHOLD = 0.00001f; // if tank is moving, kick up dust and debris @@ -663,7 +681,7 @@ void W3DTankTruckDraw::doDrawModule(const Matrix3D* transformMtx) particleSys->setBurstCountMultiplier( velMult.z ); } } -#endif + //Update movement of treads if (m_treadCount) { @@ -740,7 +758,11 @@ void W3DTankTruckDraw::loadPostProcess( void ) // extend base class W3DModelDraw::loadPostProcess(); - // toss any existing ones (no need to re-create; we'll do that on demand) - tossEmitters(); + // toss any existing wheel emitters (no need to re-create; we'll do that on demand) + tossWheelEmitters(); + + // toss any existing tread emitters and re-create 'em (since this module expects 'em to always be around) + tossTreadEmitters(); + createTreadEmitters(); } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTruckDraw.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTruckDraw.cpp index 1b7bcdacef..8af8b16779 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTruckDraw.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Drawable/Draw/W3DTruckDraw.cpp @@ -121,12 +121,12 @@ m_midMidRightTireBone(0), m_midMidLeftTireBone(0), m_prevRenderObj(nullptr) //------------------------------------------------------------------------------------------------- W3DTruckDraw::~W3DTruckDraw() { - tossEmitters(); + tossWheelEmitters(); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -void W3DTruckDraw::tossEmitters() +void W3DTruckDraw::tossWheelEmitters() { for (size_t i = 0; i < ARRAY_SIZE(m_truckEffectIDs); ++i) { @@ -145,19 +145,16 @@ void W3DTruckDraw::setFullyObscuredByShroud(Bool fullyObscured) if (fullyObscured != getFullyObscuredByShroud()) { if (fullyObscured) - tossEmitters(); + tossWheelEmitters(); else - createEmitters(); + createWheelEmitters(); } W3DModelDraw::setFullyObscuredByShroud(fullyObscured); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -/** - * Start creating debris from the tank treads - */ -void W3DTruckDraw::createEmitters( void ) +void W3DTruckDraw::createWheelEmitters( void ) { if (getDrawable()->isDrawableEffectivelyHidden()) return; @@ -195,16 +192,13 @@ void W3DTruckDraw::createEmitters( void ) //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- -/** - * Stop creating debris from the tank treads - */ -void W3DTruckDraw::enableEmitters( Bool enable ) +void W3DTruckDraw::enableWheelEmitters( Bool enable ) { // don't check... if we are hidden the first time thru, then we'll never create the emitters. // eg, if we are loading a game and the unit is in a tunnel, he'll never get emitteres even when he exits. //if (!m_effectsInitialized) { - createEmitters(); + createWheelEmitters(); m_effectsInitialized=true; } @@ -325,7 +319,7 @@ void W3DTruckDraw::setHidden(Bool h) W3DModelDraw::setHidden(h); if (h) { - enableEmitters(false); + enableWheelEmitters(false); } } @@ -543,7 +537,7 @@ void W3DTruckDraw::doDrawModule(const Matrix3D* transformMtx) Bool wasPowersliding = m_isPowersliding; m_isPowersliding = false; if (physics->isMotive() && !obj->isSignificantlyAboveTerrain()) { - enableEmitters(true); + enableWheelEmitters(true); Coord3D accel = *physics->getAcceleration(); accel.z = 0; // ignore gravitational force. Bool accelerating = accel.length()>ACCEL_THRESHOLD; @@ -585,7 +579,7 @@ void W3DTruckDraw::doDrawModule(const Matrix3D* transformMtx) } } else - enableEmitters(false); + enableWheelEmitters(false); m_wasAirborne = obj->isSignificantlyAboveTerrain(); @@ -639,7 +633,7 @@ void W3DTruckDraw::loadPostProcess( void ) // extend base class W3DModelDraw::loadPostProcess(); - // toss any existing ones (no need to re-create; we'll do that on demand) - tossEmitters(); + // toss any existing wheel emitters (no need to re-create; we'll do that on demand) + tossWheelEmitters(); }