3#include "mc/_HeaderOutputPredefine.h"
6#include "mc/client/particlesystem/particle/ActorBindInfo.h"
7#include "mc/client/particlesystem/particle/ComponentAccessParticleEmitter.h"
8#include "mc/client/particlesystem/particle/ParticleRenderData.h"
9#include "mc/deps/core/container/slot_map_handle.h"
10#include "mc/deps/core/math/Matrix.h"
11#include "mc/deps/core/math/Vec3.h"
12#include "mc/deps/core/string/HashedString.h"
13#include "mc/deps/core/utility/buffer_span.h"
14#include "mc/deps/minecraft_renderer/renderer/MaterialPtr.h"
15#include "mc/deps/minecraft_renderer/resources/MERSUniformData.h"
16#include "mc/deps/minecraft_renderer/resources/PBRTexturePtrs.h"
17#include "mc/util/MolangVariableIndex.h"
18#include "mc/util/MolangVariableMap.h"
19#include "mc/world/actor/RenderParams.h"
20#include "mc/world/level/BlockPos.h"
21#include "mc/world/level/block/BlockType.h"
22#include "mc/world/phys/AABB.h"
43namespace mce {
class Color; }
46namespace ParticleSystem {
60 ::ll::TypedStorage<8, 24, ::std::vector<::AABB>> mAABBList;
61 ::ll::TypedStorage<4, 4, uint> mLastAccessedFrame;
67 MCAPI ~AABBCacheElement();
80 ::ll::TypedStorage<8, 48, ::HashedString> mEffectName;
81 ::ll::TypedStorage<8, 16, ::std::weak_ptr<::ParticleSystem::ParticleEffect>> mEffectDataWeakPtr;
82 ::ll::TypedStorage<8, 24, ::std::vector<::ParticleSystem::CommonParticle>> mParticles;
83 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mEmitterCurrentLoopAge;
84 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mSleepDuration;
85 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mEmissionDuration;
86 ::ll::TypedStorage<8, 8, ::std::chrono::nanoseconds> mTickDeltaTimeAccumulator;
87 ::ll::TypedStorage<4, 4, float> mEmitterCurrentTravelDistance;
88 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterPosition;
89 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterWorldPosition;
90 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterLastWorldPosition;
91 ::ll::TypedStorage<4, 12, ::Vec3> mEmitterWorldVelocity;
92 uint mEnableRender : 1;
93 uint mEnableUpdate : 1;
94 uint mManualParticleEmission : 1;
96 uint mEmitterExpired : 1;
97 uint mFirstUpdate : 1;
98 uint mUseActorPosition : 1;
99 uint mUseActorRotation : 1;
100 uint mUseEmitterVelocity : 1;
101 uint mBlockListInitialized : 1;
102 uint mAreParticlesFromActorButWorldRelative : 1;
103 ::ll::TypedStorage<4, 4, int> mEmitterDynamicsFrameCounter;
104 ::ll::TypedStorage<4, 4, int> mParticlesDynamicsFrameCounter;
105 ::ll::TypedStorage<4, 4, int> mEmitterRenderingFrameCounter;
106 ::ll::TypedStorage<4, 4, int> mParticlesRenderingFrameCounter;
107 ::ll::TypedStorage<4, 4, int> mNumberOfFramesToInterpolate;
108 ::ll::TypedStorage<8, 512, ::RenderParams> mRenderParams;
109 ::ll::TypedStorage<8, 56, ::MolangVariableMap> mMolangVariableMap;
110 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterLifetimeVariableIndex;
111 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterAgeVariableIndex;
112 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mEmitterEntityScaleVariableIndex;
113 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleLifetimeMolangVariableIndex;
114 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleAgeMolangVariableIndex;
115 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom1VariableIndex;
116 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom2VariableIndex;
117 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom3VariableIndex;
118 ::ll::TypedStorage<2, 2, ::MolangVariableIndex> mParticleRandom4VariableIndex;
119 ::ll::TypedStorage<4, 64, ::Matrix> mEmitterTransform;
120 ::ll::TypedStorage<8, 88, ::ParticleSystem::ActorBindInfo> mActorBindInfo;
121 ::ll::TypedStorage<4, 24, ::AABB> mAABB;
122 ::ll::TypedStorage<4, 4, float> mCullingBufferDistance;
123 ::ll::TypedStorage<8, 8, uint64> mMaxNumParticles;
124 ::ll::TypedStorage<8, 8, uint64> mNumParticlesEmitted;
125 ::ll::TypedStorage<8, 16, ::mce::MaterialPtr> mMaterial;
126 ::ll::TypedStorage<8, 112, ::PBRTexturePtrs> mTexture;
127 ::ll::TypedStorage<4, 20, ::std::optional<::MERSUniformData>> mMERSUniforms;
128 ::ll::TypedStorage<8, 8, ::std::array<::std::array<::mce::Color, 16>, 16>
const&> mLightTextureData;
129 ::ll::TypedStorage<4, 4, ::ParticleRenderData::FaceCameraMode> mFaceCameraMode;
130 ::ll::TypedStorage<8, 8, ::BlockSource&> mBlockSource;
131 ::ll::TypedStorage<8, 64, ::std::unordered_set<::BlockType const*>> mBlocksToCheckAgainst;
132 ::ll::TypedStorage<8, 16, ::std::weak_ptr<::LightPropagation::LightVolumeManager>> mLightVolumeManager;
134 TypedStorage<8, 64, ::std::unordered_map<::BlockPos, ::ParticleSystem::ParticleEmitterActual::AABBCacheElement>>
136 ::ll::TypedStorage<4, 4, uint> mCurrentCacheFrame;
137 ::ll::TypedStorage<8, 24, ::std::vector<::AABB>> mCollisionAabbList;
138 ::ll::TypedStorage<8, 24, ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::CollisionHelper>>
140 ::ll::TypedStorage<8, 8, ::ParticleSystemEngine&> mParticleSystemEngine;
144 ::std::unordered_map<
146 ::Bedrock::slot_map_handle<::std::unique_ptr<::ParticleSystem::ParticleEmitter>, 64, 32>>>
147 mSpawnedParticleEmitterList;
152 ParticleEmitterActual& operator=(ParticleEmitterActual
const&);
153 ParticleEmitterActual(ParticleEmitterActual
const&);
154 ParticleEmitterActual();
159 virtual ~ParticleEmitterActual() ;
161 virtual void setActorBindInfo(
162 ::Dimension* dimension,
163 ::ActorUniqueID actorId,
164 ::HashedString
const& locator,
169 setActorBindInfo(::WeakEntityRef actorRef, ::HashedString
const& locator, ::Vec3
const& offset) ;
171 virtual void setActorBindInfo(::Actor* actor, ::HashedString
const& locator, ::Vec3
const& offset) ;
173 virtual void setEnableUpdate(
bool enable) ;
175 virtual void setEnableRender(
bool enable) ;
177 virtual void runInitializationScript(::ExpressionNode
const& initializationScript) ;
179 virtual void onBlockChanged(::BlockPos
const& blockPosition) ;
181 virtual void expire() ;
183 virtual bool isValid() const ;
185 virtual
bool isManualEmitter() const ;
187 virtual
bool expirationRequested() const ;
189 virtual
bool hasExpired() const ;
191 virtual ::AABB const& getAABB() const ;
193 virtual ::HashedString const& getEffectName() const ;
195 virtual uint64 getParticleCount() const ;
197 virtual uint64 getEffectEmitterCount() const ;
199 virtual uint64 getEffectParticleCount() const ;
201 virtual uint64 getTotalEmitterCount() const ;
203 virtual uint64 getTotalParticleCount() const ;
205 virtual
bool getAreParticlesFromActorButWorldRelative() const ;
207 virtual
void tick(::std::chrono::nanoseconds const& dtIn,
float const a) ;
209 virtual
void frameUpdate(::ClientFrameUpdateContext& clientFrameUpdateContext) ;
211 virtual
void extractForRendering(::ParticleRenderData& particleRenderData,
float a) ;
213 virtual
void setManualParticleEmission(
bool manualParticleEmission) ;
216 emitParticleManually(::Vec3 const& particlePosition, ::Vec3 const& velocityAdd,
float const scaleMult) ;
218 virtual ::ParticleSystem::ActorBindInfo getActorBindInfo() const ;
220 virtual ::Vec3 const& getPosition() const ;
222 virtual ::Matrix const& getTransform() const ;
224 virtual ::Vec3 const& getWorldPosition() const ;
226 virtual ::Vec3 const& getWorldVelocity() const ;
228 virtual
void setMaxNumParticles(uint64 num) ;
230 virtual uint64 getMaxNumParticles() const ;
232 virtual uint64 getNumParticles() const ;
234 virtual uint64 getNumParticlesEmitted() const ;
237 setActorFrameOfReference(
bool useActorPosition,
bool useActorRotation,
bool useEmitterVelocity) ;
239 virtual
void setEmissionDuration(
float activeTime) ;
241 virtual
void setSleepDuration(
float sleepTime) ;
243 virtual
void setFacing(::HashedString const& facing) ;
245 virtual
bool blockListInitialized() ;
247 virtual
void initializeBlockList(::buffer_span<::std::
string> blockList) ;
249 virtual
bool blockAtPositionIsInList(::BlockPos const& blockPos) ;
251 virtual ::BrightnessPair getBrightnessPairAtBlock(::BlockPos const& blockPosition) const ;
253 virtual ::std::pair<::BrightnessPair, ::BlockPos>
254 getBrightestNeighbor(::BlockPos const& blockPosition, ::ParticleSystem::CommonParticle const& particle) const
257 virtual
bool getVisibilityAtBlock(::BlockPos const& blockPosition) const ;
259 virtual ::mce::Color getGameplayLightForParticle(::ParticleSystem::CommonParticle const& particle) const
262 virtual ::BrightnessPair getBrightnessPairForParticle(::ParticleSystem::CommonParticle const& particle) const
265 virtual ::std::vector<::AABB> const&
266 getCollisionShapesForBlockPosition(::BlockPos const& blockPosition) ;
268 virtual ::std::vector<::AABB>& getCollisionAabbList() ;
270 virtual ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::
CollisionHelper>&
271 getCollisionSweepList() ;
274 fireEvent(::HashedString const& eventName, ::Vec3 const& position, ::Vec3 const& velocity) ;
277 fireEvent(::HashedString const& eventName, ::Matrix const& transform, ::Vec3 const& velocity) ;
279 virtual
bool getUseActorPosition() const ;
281 virtual
bool getUseActorRotation() const ;
283 virtual
void getParticleWorldPositionAndVelocity(
284 ::ParticleSystem::CommonParticle& particle,
285 ::Vec3& particleWorldPosition,
286 ::Vec3& particleWorldVelocity
293 MCAPI ParticleEmitterActual(
294 ::ParticleSystemEngine& particleSystemEngine,
295 ::HashedString const& effectName,
296 ::std::array<::std::array<::mce::Color, 16>, 16> const& lightTextureData,
297 ::BlockSource& region,
298 ::std::weak_ptr<::LightPropagation::LightVolumeManager> lightVolumeManager,
299 ::Matrix const& transform,
300 ::MolangVariableMap molangVariableMap,
301 int framesToInterpolate
304 MCAPI
void _checkForExpiration();
306 MCAPI
bool _computeActorTransformAndReturnIfAttachedToLocator(
308 ::Matrix& actorTransform,
309 bool useActorPosition,
310 bool useActorRotation
313 MCAPI
void _createBoundEmitterFromEvent(::ParticleSystem::ParticleVisualEffectEvent const& event);
316 _createEmitterFromEvent(::ParticleSystem::ParticleVisualEffectEvent const& event, ::Matrix const& transform);
318 MCAPI
void _emitNewParticle(
319 ::ParticleSystem::ParticleEffect const& effect,
320 ::Vec3 const& particleOriginOffset,
321 ::Vec3 const& velocityAdd,
326 MCAPI
void _executeEventNode(
327 ::ParticleSystem::ParticleEventNode const& eventNode,
328 ::HashedString const& eventName,
329 ::Matrix const& transform,
330 ::Vec3 const& velocity
333 MCAPI
void _executeSpecificEvent(
334 ::ParticleSystem::ParticleEvent const& event,
335 ::HashedString const& eventName,
336 ::Matrix const& transform,
337 ::Vec3 const& velocity
340 MCAPI
void _extractParticleRenderingData(::ParticleRenderData& particleRenderData,
float a);
342 MCAPI ::mce::Color _getLightColorForParticle(
343 ::ParticleSystem::CommonParticle const& particle,
344 ::std::shared_ptr<::LightPropagation::LightVolumeManager const> lightVolumeManager
347 MCAPI ::std::shared_ptr<::ParticleSystem::ParticleEffect> _lockEffect();
349 MCAPI
bool _prepareEmitterRenderParams();
351 MCAPI
void _prepareParticleForRendering(
352 ::ParticleSystem::ParticleEffect const& effect,
353 ::ParticleSystem::CommonParticle& particle
356 MCAPI
void _prepareParticlesForRendering(
bool particlesRenderFrame);
358 MCAPI
bool _replaceParticleEffectPointer();
360 MCAPI
void _resetParticleEffectProperties(
bool firstTime);
362 MCAPI
void _setGracefullyExpire();
364 MCAPI
void _updateRenderParamsForParticle(
365 ::ParticleSystem::ParticleEffect const& effect,
366 ::ParticleSystem::CommonParticle const& particle
373 MCAPI static ::mce::Color& mParticleInitialColor();
380 ::ParticleSystemEngine& particleSystemEngine,
381 ::HashedString const& effectName,
382 ::std::array<::std::array<::mce::Color, 16>, 16> const& lightTextureData,
383 ::BlockSource& region,
384 ::std::weak_ptr<::LightPropagation::LightVolumeManager> lightVolumeManager,
385 ::Matrix const& transform,
386 ::MolangVariableMap molangVariableMap,
387 int framesToInterpolate
400 MCAPI
void $setActorBindInfo(
401 ::Dimension* dimension,
402 ::ActorUniqueID actorId,
403 ::HashedString const& locator,
407 MCAPI
void $setActorBindInfo(::WeakEntityRef actorRef, ::HashedString const& locator, ::Vec3 const& offset);
409 MCAPI
void $setActorBindInfo(::Actor* actor, ::HashedString const& locator, ::Vec3 const& offset);
411 MCAPI
void $setEnableUpdate(
bool enable);
413 MCAPI
void $setEnableRender(
bool enable);
415 MCAPI
void $runInitializationScript(::ExpressionNode const& initializationScript);
417 MCAPI
void $onBlockChanged(::BlockPos const& blockPosition);
419 MCAPI
void $expire();
421 MCAPI
bool $isValid() const;
423 MCAPI
bool $isManualEmitter() const;
425 MCAPI
bool $expirationRequested() const;
427 MCAPI
bool $hasExpired() const;
429 MCFOLD ::AABB const& $getAABB() const;
431 MCFOLD ::HashedString const& $getEffectName() const;
433 MCFOLD uint64 $getParticleCount() const;
435 MCAPI uint64 $getEffectEmitterCount() const;
437 MCAPI uint64 $getEffectParticleCount() const;
439 MCAPI uint64 $getTotalEmitterCount() const;
441 MCAPI uint64 $getTotalParticleCount() const;
443 MCAPI
bool $getAreParticlesFromActorButWorldRelative() const;
445 MCAPI
void $tick(::std::chrono::nanoseconds const& dtIn,
float const a);
447 MCAPI
void $frameUpdate(::ClientFrameUpdateContext& clientFrameUpdateContext);
449 MCAPI
void $extractForRendering(::ParticleRenderData& particleRenderData,
float a);
451 MCAPI
void $setManualParticleEmission(
bool manualParticleEmission);
453 MCAPI
void $emitParticleManually(::Vec3 const& particlePosition, ::Vec3 const& velocityAdd,
float const scaleMult);
455 MCAPI ::ParticleSystem::ActorBindInfo $getActorBindInfo() const;
457 MCAPI ::Vec3 const& $getPosition() const;
459 MCAPI ::Matrix const& $getTransform() const;
461 MCFOLD ::Vec3 const& $getWorldPosition() const;
463 MCFOLD ::Vec3 const& $getWorldVelocity() const;
465 MCAPI
void $setMaxNumParticles(uint64 num);
467 MCAPI uint64 $getMaxNumParticles() const;
469 MCFOLD uint64 $getNumParticles() const;
471 MCFOLD uint64 $getNumParticlesEmitted() const;
473 MCAPI
void $setActorFrameOfReference(
bool useActorPosition,
bool useActorRotation,
bool useEmitterVelocity);
475 MCAPI
void $setEmissionDuration(
float activeTime);
477 MCAPI
void $setSleepDuration(
float sleepTime);
479 MCAPI
void $setFacing(::HashedString const& facing);
481 MCAPI
bool $blockListInitialized();
483 MCAPI
void $initializeBlockList(::buffer_span<::std::
string> blockList);
485 MCAPI
bool $blockAtPositionIsInList(::BlockPos const& blockPos);
487 MCAPI ::BrightnessPair $getBrightnessPairAtBlock(::BlockPos const& blockPosition) const;
489 MCAPI ::std::pair<::BrightnessPair, ::BlockPos>
490 $getBrightestNeighbor(::BlockPos const& blockPosition, ::ParticleSystem::CommonParticle const& particle) const;
492 MCAPI
bool $getVisibilityAtBlock(::BlockPos const& blockPosition) const;
494 MCAPI ::mce::Color $getGameplayLightForParticle(::ParticleSystem::CommonParticle const& particle) const;
496 MCAPI ::BrightnessPair $getBrightnessPairForParticle(::ParticleSystem::CommonParticle const& particle) const;
498 MCAPI ::std::vector<::AABB> const& $getCollisionShapesForBlockPosition(::BlockPos const& blockPosition);
500 MCAPI ::std::vector<::AABB>& $getCollisionAabbList();
502 MCAPI ::std::vector<::ParticleSystem::ComponentAccessParticleEmitter::
CollisionHelper>& $getCollisionSweepList();
504 MCAPI
void $fireEvent(::HashedString const& eventName, ::Vec3 const& position, ::Vec3 const& velocity);
506 MCAPI
void $fireEvent(::HashedString const& eventName, ::Matrix const& transform, ::Vec3 const& velocity);
508 MCAPI
bool $getUseActorPosition() const;
510 MCAPI
bool $getUseActorRotation() const;
512 MCAPI
void $getParticleWorldPositionAndVelocity(
513 ::ParticleSystem::CommonParticle& particle,
514 ::Vec3& particleWorldPosition,
515 ::Vec3& particleWorldVelocity
Definition BlockSource.h:71
Definition ClientFrameUpdateContext.h:5
Definition Dimension.h:86
Definition ExpressionNode.h:34
Definition LightVolumeManager.h:7
Definition ParticleRenderData.h:5
Definition ParticleSystemEngine.h:5
Definition ParticleEffect.h:7
Definition ParticleEmitterActual.h:7
static MCAPI void ** $vftable()
Definition ParticleEmitter.h:7
Definition ParticleEventNode.h:7
Definition ParticleEvent.h:7
Definition ParticleVisualEffectEvent.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