3#include "mc/_HeaderOutputPredefine.h"
6#include "mc/client/particlesystem/particle/ComponentAccessParticleEmitter.h"
7#include "mc/client/particlesystem/particle/EntityBindInfo.h"
8#include "mc/client/particlesystem/particle/ParticleEmitter.h"
9#include "mc/client/particlesystem/particle/ParticleRenderData.h"
10#include "mc/deps/core/container/slot_map_handle.h"
11#include "mc/deps/core/math/Matrix.h"
12#include "mc/deps/core/math/Vec3.h"
13#include "mc/deps/core/string/HashedString.h"
14#include "mc/deps/core/utility/buffer_span.h"
15#include "mc/deps/minecraft_renderer/renderer/MaterialPtr.h"
16#include "mc/deps/minecraft_renderer/resources/MERSUniformData.h"
17#include "mc/deps/minecraft_renderer/resources/PBRTexturePtrs.h"
18#include "mc/util/MolangVariableIndex.h"
19#include "mc/util/MolangVariableMap.h"
20#include "mc/world/actor/RenderParams.h"
21#include "mc/world/level/BlockPos.h"
22#include "mc/world/level/block/BlockType.h"
23#include "mc/world/phys/AABB.h"
41namespace mce {
class Color; }
44namespace ParticleSystem {
58 ::ll::TypedStorage<8, 24, ::std::vector<::AABB>> mAABBList;
59 ::ll::TypedStorage<4, 4, uint> mLastAccessedFrame;
66 ::ll::TypedStorage<8, 48, ::HashedString> mEffectName;
67 ::ll::TypedStorage<8, 16, ::std::weak_ptr<::ParticleSystem::ParticleEffect>> mEffectDataWeakPtr;
68 ::ll::TypedStorage<8, 24, ::std::vector<::ParticleSystem::CommonParticle>> mParticles;
69 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mEmitterCurrentLoopAge;
70 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mSleepDuration;
71 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mEmissionDuration;
72 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mTickDeltaTimeAccumulator;
73 ::ll::TypedStorage<4, 4, float> mEmitterCurrentTravelDistance;
74 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterPosition;
75 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterWorldPosition;
76 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterLastWorldPosition;
77 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterWorldVelocity;
78 uint mEnableRender : 1;
79 uint mEnableUpdate : 1;
80 uint mManualParticleEmission : 1;
82 uint mEmitterExpired : 1;
83 uint mFirstUpdate : 1;
84 uint mUseActorPosition : 1;
85 uint mUseActorRotation : 1;
86 uint mUseEmitterVelocity : 1;
87 uint mBlockListInitialized : 1;
88 uint mAreParticlesFromActorButWorldRelative : 1;
89 ::ll::TypedStorage<4, 4, int> mEmitterDynamicsFrameCounter;
90 ::ll::TypedStorage<4, 4, int> mParticlesDynamicsFrameCounter;
91 ::ll::TypedStorage<4, 4, int> mEmitterRenderingFrameCounter;
92 ::ll::TypedStorage<4, 4, int> mParticlesRenderingFrameCounter;
93 ::ll::TypedStorage<4, 4, int> mNumberOfFramesToInterpolate;
94 ::ll::TypedStorage<8, 520, ::RenderParams> mRenderParams;
95 ::ll::TypedStorage<8, 56, ::MolangVariableMap> mMolangVariableMap;
96 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterLifetimeVariableIndex;
97 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterAgeVariableIndex;
98 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterEntityScaleVariableIndex;
99 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleLifetimeMolangVariableIndex;
100 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleAgeMolangVariableIndex;
101 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom1VariableIndex;
102 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom2VariableIndex;
103 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom3VariableIndex;
104 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom4VariableIndex;
105 ::ll::TypedStorage<4, 64, ::Matrix> mEmitterTransform;
106 ::ll::TypedStorage<8, 88, ::ParticleSystem::EntityBindInfo> mEntityBindInfo;
107 ::ll::TypedStorage<4, 24, ::AABB> mAABB;
108 ::ll::TypedStorage<4, 4, float> mCullingBufferDistance;
109 ::ll::TypedStorage<8, 8, uint64> mMaxNumParticles;
110 ::ll::TypedStorage<8, 8, uint64> mNumParticlesEmitted;
111 ::ll::TypedStorage<8, 16, ::mce::MaterialPtr> mMaterial;
112 ::ll::TypedStorage<8, 112, ::PBRTexturePtrs> mTexture;
113 ::ll::TypedStorage<4, 20, ::std::optional<::MERSUniformData>> mMERSUniforms;
114 ::ll::TypedStorage<8, 8, ::std::array<::std::array<::mce::Color, 16>, 16>
const&> mLightTextureData;
115 ::ll::TypedStorage<4, 4, ::ParticleRenderData::FaceCameraMode> mFaceCameraMode;
116 ::ll::TypedStorage<8, 8, ::BlockSource&> mBlockSource;
117 ::ll::TypedStorage<8, 64, ::std::unordered_set<::BlockType const*>> mBlocksToCheckAgainst;
118 ::ll::TypedStorage<8, 16, ::std::weak_ptr<::LightPropagation::LightVolumeManager>> mLightVolumeManager;
120 TypedStorage<8, 64, ::std::unordered_map<::BlockPos, ::ParticleSystem::ParticleEmitterActual::AABBCacheElement>>
122 ::ll::TypedStorage<4, 4, uint> mCurrentCacheFrame;
123 ::ll::TypedStorage<8, 24, ::std::vector<::AABB>> mCollisionAabbList;
124 ::ll::TypedStorage<8, 24, ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::CollisionHelper>>
126 ::ll::TypedStorage<8, 8, ::ParticleSystemEngine&> mParticleSystemEngine;
130 ::std::unordered_map<
132 ::Bedrock::slot_map_handle<::std::unique_ptr<::ParticleSystem::ParticleEmitter>, 64, 32>>>
133 mSpawnedParticleEmitterList;
138 ParticleEmitterActual& operator=(ParticleEmitterActual
const&);
139 ParticleEmitterActual(ParticleEmitterActual
const&);
140 ParticleEmitterActual();
145 virtual ~ParticleEmitterActual() =
default;
147 virtual void setEntityBindInfo(
148 ::Dimension* dimension,
149 ::ActorUniqueID actorId,
150 ::HashedString
const& locator,
155 setEntityBindInfo(::WeakEntityRef entityRef, ::HashedString
const& locator, ::Vec3
const& offset) ;
157 virtual void setEntityBindInfo(::Actor* actor, ::HashedString
const& locator, ::Vec3
const& offset) ;
159 virtual void setEnableUpdate(
bool enable) ;
161 virtual void setEnableRender(
bool enable) ;
163 virtual void runInitializationScript(::ExpressionNode
const& initializationScript) ;
165 virtual void onBlockChanged(::BlockPos
const& blockPosition) ;
167 virtual void expire() ;
169 virtual bool isValid() const ;
171 virtual
bool isManualEmitter() const ;
173 virtual
bool expirationRequested() const ;
175 virtual
bool hasExpired() const ;
177 virtual ::AABB const& getAABB() const ;
179 virtual ::HashedString const& getEffectName() const ;
181 virtual uint64 getParticleCount() const ;
183 virtual uint64 getEffectEmitterCount() const ;
185 virtual uint64 getEffectParticleCount() const ;
187 virtual uint64 getTotalEmitterCount() const ;
189 virtual uint64 getTotalParticleCount() const ;
191 virtual ::Vec3 const& getLastCameraPosition() const ;
193 virtual
bool getAreParticlesFromActorButWorldRelative() const ;
195 virtual
void tick(::std::chrono::nanoseconds const& dtIn,
float const a) ;
197 virtual
void frameUpdate(::ClientFrameUpdateContext& clientFrameUpdateContext) ;
199 virtual
void extractForRendering(::ParticleRenderData& particleRenderData,
float a) ;
201 virtual
void setManualParticleEmission(
bool manualParticleEmission) ;
204 emitParticleManually(::Vec3 const& particlePosition, ::Vec3 const& velocityAdd,
float const scaleMult) ;
206 virtual ::ParticleSystem::EntityBindInfo getEntityBindInfo() const ;
208 virtual ::Vec3 const& getPosition() const ;
210 virtual ::Matrix const& getTransform() const ;
212 virtual ::Vec3 const& getWorldPosition() const ;
214 virtual ::Vec3 const& getWorldVelocity() const ;
216 virtual
void setMaxNumParticles(uint64 num) ;
218 virtual uint64 getMaxNumParticles() const ;
220 virtual uint64 getNumParticles() const ;
222 virtual uint64 getNumParticlesEmitted() const ;
225 setActorFrameOfReference(
bool useActorPosition,
bool useActorRotation,
bool useEmitterVelocity) ;
227 virtual
void setEmissionDuration(
float activeTime) ;
229 virtual
void setSleepDuration(
float sleepTime) ;
231 virtual
void setFacing(::HashedString const& facing) ;
233 virtual
bool blockListInitialized() ;
235 virtual
void initializeBlockList(::buffer_span<::std::
string> blockList) ;
237 virtual
bool blockAtPositionIsInList(::BlockPos const& blockPos) ;
239 virtual ::BrightnessPair getBrightnessPairAtBlock(::BlockPos const& blockPosition) const ;
241 virtual ::std::pair<::BrightnessPair, ::BlockPos>
242 getBrightestNeighbor(::BlockPos const& blockPosition, ::ParticleSystem::CommonParticle const& particle) const
245 virtual
bool getVisibilityAtBlock(::BlockPos const& blockPosition) const ;
247 virtual ::mce::Color getGameplayLightForParticle(::ParticleSystem::CommonParticle const& particle) const
250 virtual ::BrightnessPair getBrightnessPairForParticle(::ParticleSystem::CommonParticle const& particle) const
253 virtual ::std::vector<::AABB> const&
254 getCollisionShapesForBlockPosition(::BlockPos const& blockPosition) ;
256 virtual ::std::vector<::AABB>& getCollisionAabbList() ;
258 virtual ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::
CollisionHelper>&
259 getCollisionSweepList() ;
262 fireEvent(::HashedString const& eventName, ::Vec3 const& position, ::Vec3 const& velocity) ;
265 fireEvent(::HashedString const& eventName, ::Matrix const& transform, ::Vec3 const& velocity) ;
267 virtual
bool getUseActorPosition() const ;
269 virtual
bool getUseActorRotation() const ;
271 virtual
void getParticleWorldPositionAndVelocity(
272 ::ParticleSystem::CommonParticle& particle,
273 ::Vec3& particleWorldPosition,
274 ::Vec3& particleWorldVelocity
277 virtual ::AABB getEntityAABB() const ;
286 bool useActorPosition,
287 bool useActorRotation
290 MCAPI
void _emitNewParticle(
292 ::
Vec3 const& particleOriginOffset,
293 ::
Vec3 const& velocityAdd,
301 ::
Matrix const& transform,
302 ::
Vec3 const& velocity
307 ::
std::shared_ptr<::LightPropagation::LightVolumeManager const> lightVolumeManager
387 MCAPI
void $tick(::
std::chrono::nanoseconds const& dtIn,
float const a);
395 MCAPI
void $emitParticleManually(::
Vec3 const& particlePosition, ::
Vec3 const& velocityAdd,
float const scaleMult);
456 ::
Vec3& particleWorldPosition,
457 ::
Vec3& particleWorldVelocity
Definition BlockSource.h:72
Definition ClientFrameUpdateContext.h:5
Definition Dimension.h:86
Definition ExpressionNode.h:35
Definition HashedString.h:5
Definition LightVolumeManager.h:7
Definition ParticleRenderData.h:5
Definition ParticleSystemEngine.h:5
Definition ComponentAccessParticleEmitter.h:7
Definition ParticleEffect.h:7
Definition ParticleEmitterActual.h:7
MCAPI void $setActorFrameOfReference(bool useActorPosition, bool useActorRotation, bool useEmitterVelocity)
MCAPI::BrightnessPair $getBrightnessPairAtBlock(::BlockPos const &blockPosition) const
MCAPI bool $blockListInitialized()
MCAPI uint64 $getEffectParticleCount() const
MCAPI::AABB const & $getAABB() const
MCAPI bool _computeEntityTransformAndReturnIfAttachedToLocator(float a, ::Matrix &actorTransform, bool useActorPosition, bool useActorRotation) const
MCAPI void _prepareParticleForRendering(::ParticleSystem::ParticleEffect const &effect, ::ParticleSystem::CommonParticle &particle)
MCAPI::Vec3 const & $getLastCameraPosition() const
MCAPI void $setEntityBindInfo(::Dimension *dimension, ::ActorUniqueID actorId, ::HashedString const &locator, ::Vec3 const &offset)
MCAPI void $getParticleWorldPositionAndVelocity(::ParticleSystem::CommonParticle &particle, ::Vec3 &particleWorldPosition, ::Vec3 &particleWorldVelocity)
MCAPI::Vec3 const & $getWorldPosition() const
MCAPI::mce::Color _getLightColorForParticle(::ParticleSystem::CommonParticle const &particle, ::std::shared_ptr<::LightPropagation::LightVolumeManager const > lightVolumeManager) const
MCAPI ::std::vector<::AABB > const & $getCollisionShapesForBlockPosition(::BlockPos const &blockPosition)
static MCAPI ::mce::Color & mParticleInitialColor()
MCAPI ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::CollisionHelper > & $getCollisionSweepList()
MCAPI void _resetParticleEffectProperties(bool firstTime)
MCAPI uint64 $getEffectEmitterCount() const
MCAPI void $setFacing(::HashedString const &facing)
MCAPI::Vec3 const & $getWorldVelocity() const
MCAPI void _setGracefullyExpire()
MCAPI bool _prepareEmitterRenderParams()
MCAPI bool $isManualEmitter() const
MCAPI void $frameUpdate(::ClientFrameUpdateContext &clientFrameUpdateContext)
MCAPI ::std::shared_ptr<::ParticleSystem::ParticleEffect > _lockEffect()
MCAPI::HashedString const & $getEffectName() const
MCAPI::mce::Color $getGameplayLightForParticle(::ParticleSystem::CommonParticle const &particle) const
MCAPI::BrightnessPair $getBrightnessPairForParticle(::ParticleSystem::CommonParticle const &particle) const
MCAPI::Vec3 const & $getPosition() const
MCAPI void $setEnableUpdate(bool enable)
MCAPI uint64 $getTotalEmitterCount() const
MCAPI void $initializeBlockList(::buffer_span<::std::string > blockList)
MCAPI::AABB $getEntityAABB() const
MCAPI bool $getVisibilityAtBlock(::BlockPos const &blockPosition) const
MCAPI ::std::vector<::AABB > & $getCollisionAabbList()
MCAPI bool $hasExpired() const
MCAPI::ParticleSystem::EntityBindInfo $getEntityBindInfo() const
MCAPI void $setSleepDuration(float sleepTime)
MCAPI uint64 $getTotalParticleCount() const
MCAPI bool $expirationRequested() const
MCAPI ::std::pair<::BrightnessPair, ::BlockPos > $getBrightestNeighbor(::BlockPos const &blockPosition, ::ParticleSystem::CommonParticle const &particle) const
MCAPI void $onBlockChanged(::BlockPos const &blockPosition)
MCAPI::Matrix const & $getTransform() const
MCAPI uint64 $getNumParticles() const
MCAPI bool $blockAtPositionIsInList(::BlockPos const &blockPos)
MCAPI void $setManualParticleEmission(bool manualParticleEmission)
MCAPI bool $getUseActorRotation() const
MCAPI void $setEmissionDuration(float activeTime)
MCAPI uint64 $getNumParticlesEmitted() const
MCAPI void _executeEventNode(::ParticleSystem::ParticleEventNode const &eventNode, ::HashedString const &eventName, ::Matrix const &transform, ::Vec3 const &velocity)
MCAPI void $setMaxNumParticles(uint64 num)
MCAPI void $fireEvent(::HashedString const &eventName, ::Vec3 const &position, ::Vec3 const &velocity)
MCAPI void _updateRenderParamsForParticle(::ParticleSystem::ParticleEffect const &effect, ::ParticleSystem::CommonParticle const &particle)
MCAPI bool $isValid() const
MCAPI uint64 $getParticleCount() const
MCAPI uint64 $getMaxNumParticles() const
MCAPI void $setEnableRender(bool enable)
MCAPI bool $getUseActorPosition() const
MCAPI bool $getAreParticlesFromActorButWorldRelative() const
MCAPI void $runInitializationScript(::ExpressionNode const &initializationScript)
MCAPI void _prepareParticlesForRendering(bool particlesRenderFrame)
Definition ParticleEventNode.h:7
Definition WeakEntityRef.h:14
Definition buffer_span.h:6
Definition ActorUniqueID.h:5
Definition BrightnessPair.h:8
Definition CommonParticle.h:7
Definition ComponentAccessParticleEmitter.h:15
Definition EntityBindInfo.h:7
Definition ParticleEmitterActual.h:15