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 ;
283 MCAPI
bool _computeEntityTransformAndReturnIfAttachedToLocator(
285 ::Matrix& actorTransform,
286 bool useActorPosition,
287 bool useActorRotation
290 MCAPI
void _emitNewParticle(
291 ::ParticleSystem::ParticleEffect const& effect,
292 ::Vec3 const& particleOriginOffset,
293 ::Vec3 const& velocityAdd,
298 MCAPI
void _executeEventNode(
299 ::ParticleSystem::ParticleEventNode const& eventNode,
300 ::HashedString const& eventName,
301 ::Matrix const& transform,
302 ::Vec3 const& velocity
305 MCAPI ::mce::Color _getLightColorForParticle(
306 ::ParticleSystem::CommonParticle const& particle,
307 ::std::shared_ptr<::LightPropagation::LightVolumeManager const> lightVolumeManager
310 MCAPI ::std::shared_ptr<::ParticleSystem::ParticleEffect> _lockEffect();
312 MCAPI
bool _prepareEmitterRenderParams();
314 MCAPI
void _prepareParticleForRendering(
315 ::ParticleSystem::ParticleEffect const& effect,
316 ::ParticleSystem::CommonParticle& particle
319 MCAPI
void _prepareParticlesForRendering(
bool particlesRenderFrame);
321 MCAPI
void _resetParticleEffectProperties(
bool firstTime);
323 MCAPI
void _setGracefullyExpire();
325 MCAPI
void _updateRenderParamsForParticle(
326 ::ParticleSystem::ParticleEffect const& effect,
327 ::ParticleSystem::CommonParticle const& particle
334 MCAPI static ::mce::Color& mParticleInitialColor();
340 MCAPI
void $setEntityBindInfo(
341 ::Dimension* dimension,
342 ::ActorUniqueID actorId,
343 ::HashedString const& locator,
347 MCAPI
void $setEntityBindInfo(::WeakEntityRef entityRef, ::HashedString const& locator, ::Vec3 const& offset);
349 MCAPI
void $setEntityBindInfo(::Actor* actor, ::HashedString const& locator, ::Vec3 const& offset);
351 MCAPI
void $setEnableUpdate(
bool enable);
353 MCAPI
void $setEnableRender(
bool enable);
355 MCAPI
void $runInitializationScript(::ExpressionNode const& initializationScript);
357 MCAPI
void $onBlockChanged(::BlockPos const& blockPosition);
359 MCAPI
void $expire();
361 MCAPI
bool $isValid() const;
363 MCAPI
bool $isManualEmitter() const;
365 MCAPI
bool $expirationRequested() const;
367 MCAPI
bool $hasExpired() const;
369 MCAPI ::AABB const& $getAABB() const;
371 MCFOLD ::HashedString const& $getEffectName() const;
373 MCAPI uint64 $getParticleCount() const;
375 MCAPI uint64 $getEffectEmitterCount() const;
377 MCAPI uint64 $getEffectParticleCount() const;
379 MCAPI uint64 $getTotalEmitterCount() const;
381 MCAPI uint64 $getTotalParticleCount() const;
383 MCAPI ::Vec3 const& $getLastCameraPosition() const;
385 MCAPI
bool $getAreParticlesFromActorButWorldRelative() const;
387 MCAPI
void $tick(::std::chrono::nanoseconds const& dtIn,
float const a);
389 MCAPI
void $frameUpdate(::ClientFrameUpdateContext& clientFrameUpdateContext);
391 MCAPI
void $extractForRendering(::ParticleRenderData& particleRenderData,
float a);
393 MCAPI
void $setManualParticleEmission(
bool manualParticleEmission);
395 MCAPI
void $emitParticleManually(::Vec3 const& particlePosition, ::Vec3 const& velocityAdd,
float const scaleMult);
397 MCAPI ::ParticleSystem::EntityBindInfo $getEntityBindInfo() const;
399 MCAPI ::Vec3 const& $getPosition() const;
401 MCAPI ::Matrix const& $getTransform() const;
403 MCAPI ::Vec3 const& $getWorldPosition() const;
405 MCFOLD ::Vec3 const& $getWorldVelocity() const;
407 MCAPI
void $setMaxNumParticles(uint64 num);
409 MCFOLD uint64 $getMaxNumParticles() const;
411 MCAPI uint64 $getNumParticles() const;
413 MCAPI uint64 $getNumParticlesEmitted() const;
415 MCAPI
void $setActorFrameOfReference(
bool useActorPosition,
bool useActorRotation,
bool useEmitterVelocity);
417 MCAPI
void $setEmissionDuration(
float activeTime);
419 MCAPI
void $setSleepDuration(
float sleepTime);
421 MCAPI
void $setFacing(::HashedString const& facing);
423 MCAPI
bool $blockListInitialized();
425 MCAPI
void $initializeBlockList(::buffer_span<::std::
string> blockList);
427 MCAPI
bool $blockAtPositionIsInList(::BlockPos const& blockPos);
429 MCAPI ::BrightnessPair $getBrightnessPairAtBlock(::BlockPos const& blockPosition) const;
431 MCAPI ::std::pair<::BrightnessPair, ::BlockPos>
432 $getBrightestNeighbor(::BlockPos const& blockPosition, ::ParticleSystem::CommonParticle const& particle) const;
434 MCAPI
bool $getVisibilityAtBlock(::BlockPos const& blockPosition) const;
436 MCAPI ::mce::Color $getGameplayLightForParticle(::ParticleSystem::CommonParticle const& particle) const;
438 MCAPI ::BrightnessPair $getBrightnessPairForParticle(::ParticleSystem::CommonParticle const& particle) const;
440 MCAPI ::std::vector<::AABB> const& $getCollisionShapesForBlockPosition(::BlockPos const& blockPosition);
442 MCAPI ::std::vector<::AABB>& $getCollisionAabbList();
444 MCAPI ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::
CollisionHelper>& $getCollisionSweepList();
446 MCAPI
void $fireEvent(::HashedString const& eventName, ::Vec3 const& position, ::Vec3 const& velocity);
448 MCAPI
void $fireEvent(::HashedString const& eventName, ::Matrix const& transform, ::Vec3 const& velocity);
450 MCAPI
bool $getUseActorPosition() const;
452 MCAPI
bool $getUseActorRotation() const;
454 MCAPI
void $getParticleWorldPositionAndVelocity(
455 ::ParticleSystem::CommonParticle& particle,
456 ::Vec3& particleWorldPosition,
457 ::Vec3& particleWorldVelocity
460 MCAPI ::AABB $getEntityAABB() const;
Definition BlockSource.h:71
Definition ClientFrameUpdateContext.h:5
Definition Dimension.h:86
Definition ExpressionNode.h:35
Definition LightVolumeManager.h:7
Definition ParticleRenderData.h:5
Definition ParticleSystemEngine.h:5
Definition ParticleEffect.h:7
Definition ParticleEmitterActual.h:7
Definition ParticleEventNode.h:7
Definition WeakEntityRef.h:14
Definition ActorUniqueID.h:5
Definition BrightnessPair.h:8
Definition CommonParticle.h:7
Definition ComponentAccessParticleEmitter.h:15
Definition ParticleEmitterActual.h:15