载入中...
搜索中...
未找到
ParticleEffect.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4#include "common/Result.h"
5#include "common/Time.h"
6
7#include <span>
8#include <string>
9#include <unordered_map>
10#include <vector>
11
12namespace eve::particles {
13
14class ParticleEmitter;
15
23 std::string from;
24 std::string on = "death";
25 std::string to;
26 float inheritVelocity = 0.f;
27};
28
37 float time = 0.f;
38 std::string action;
39 std::string emitter;
40 std::string parameter;
41 float value = 0.f;
42 int count = 0;
43};
44
53 float duration = 0.f;
54 bool looping = false;
55 std::vector<ParticleEffectTimelineCue> cues;
56};
57
69public:
71 static constexpr int kMaxSupportedVersion = 2;
73 static constexpr int kMinSupportedVersion = 1;
74
77
80
85 static ParticleEffect* fromText(const std::string& json, const std::string& sourcePath,
86 std::string* error = nullptr);
91 static ParticleEffect* fromFile(const std::string& path, std::string* error = nullptr);
92
94 [[nodiscard]] static Result<ParticleEffect*> tryFromText(const std::string& json,
95 const std::string& sourcePath = {});
97 [[nodiscard]] static Result<ParticleEffect*> tryFromFile(const std::string& path);
98
100 int getVersion() const { return version_; }
102 std::string getSourcePath() const { return sourcePath_; }
104 int getEmitterCount() const;
106 std::string getEmitterName(int index) const;
108 ParticleEmitter* getEmitter(int index) const;
110 ParticleEmitter* getEmitterByName(const std::string& name) const;
111
113 [[nodiscard]] std::span<const ParticleEffectEventRoute> eventRoutes() const;
115 [[nodiscard]] const ParticleEffectTimeline& timeline() const { return timeline_; }
117 [[nodiscard]] float getTimelineSeconds() const { return static_cast<float>(timelineSeconds_); }
119 [[nodiscard]] bool isTimelinePlaying() const { return timelinePlaying_ && !timelinePaused_; }
120
127 [[nodiscard]] Result<Duration> naturalDuration() const;
128
134 [[nodiscard]] Result<void> reloadFromText(const std::string& json);
139 [[nodiscard]] Result<void> reloadFromFile(const std::string& path = {});
140
145 [[nodiscard]] Result<void> advanceTimeline(const SimulationStep& step);
150 void updateTimeline(float dt);
152 static void tickRegisteredTimelines(float dt);
154 [[nodiscard]] static Result<void> advanceRegisteredTimelines(const SimulationStep& step);
155
157 void setPosition(float x, float y);
159 float getX() const { return x_; }
161 float getY() const { return y_; }
163 void setRotation(float radians);
165 float getRotation() const { return rotation_; }
167 void setScale(float scale);
169 float getScale() const { return scale_; }
171 void setLayer(int layer);
173 int getLayer() const { return layer_; }
175 void setVisible(bool visible);
177 bool isVisible() const { return visible_; }
178
180 void start();
182 void stop();
184 void pause();
186 void reset();
188 bool emit(const std::string& emitterName, int count);
189
191 void setFloatParameter(const std::string& name, float value);
193 float getFloatParameter(const std::string& name) const;
195 bool hasFloatParameter(const std::string& name) const;
196
197private:
198 struct Layer {
199 std::string name;
200 ParticleEmitter* emitter = nullptr;
201 float offsetX = 0.f;
202 float offsetY = 0.f;
203 float baseDirection = 0.f;
204 int baseLayer = 0;
205 bool enabled = true;
206 };
207 struct RuntimeCue {
208 ParticleEffectTimelineCue cue;
209 bool fired = false;
210 };
211
212 ParticleEffect() = default;
213 [[nodiscard]] static Result<ParticleEffect*> parse(const std::string& json,
214 const std::string& sourcePath);
215 void syncTransform();
216 void syncLayer();
217 void wireEventRoutes();
218 void rewindTimelineClock();
219 void registerForTimelineTicks();
220 void unregisterFromTimelineTicks();
221 [[nodiscard]] Result<void> fireDueCues(double previousSeconds, double currentSeconds);
222 [[nodiscard]] Result<void> applyCue(const ParticleEffectTimelineCue& cue);
223 void adoptParsed(ParticleEffect&& other, bool preserveWorldState);
224
225 int version_ = 1;
226 std::string sourcePath_;
227 std::vector<Layer> layers_;
228 std::unordered_map<std::string, float> parameters_;
229 std::vector<ParticleEffectEventRoute> eventRoutes_;
230 ParticleEffectTimeline timeline_;
231 std::vector<RuntimeCue> runtimeCues_;
232 double timelineSeconds_ = 0.0;
233 bool timelinePlaying_ = false;
234 bool timelinePaused_ = false;
235 bool timelineRegistered_ = false;
236 float x_ = 0.f;
237 float y_ = 0.f;
238 float rotation_ = 0.f;
239 float scale_ = 1.f;
240 int layer_ = 0;
241 bool visible_ = true;
242};
243
244} // namespace eve::particles
double value
Duration start
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::array< float, 3 > scale
std::string name
std::string error
Definition Package.cpp:60
TileLayer * layer
std::string path
Definition PlayHost.cpp:110
Move-only, checked operation results for the common layer.
std::uint32_t count
std::unique_ptr< TrailEmitter > emitter
float offsetX
float offsetY
std::string sourcePath
bool visible
Common time values and an injectable deterministic simulation clock.
float step
Definition TreeMesh.cpp:314
uint32_t index
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Runtime instance of a versioned, multi-emitter particle effect asset.
std::string getSourcePath() const
Return the source file path, or empty text for an in-memory asset.
float getY() const
Return the group origin Y coordinate.
int getLayer() const
Return the group render-layer offset.
ParticleEffect & operator=(const ParticleEffect &)=delete
int getVersion() const
Return the asset schema version.
float getTimelineSeconds() const
Return the current effect-local timeline clock in seconds.
const ParticleEffectTimeline & timeline() const
Return authored timeline controls.
ParticleEffect(const ParticleEffect &)=delete
bool isTimelinePlaying() const
Return true while the effect timeline is advancing.
float getRotation() const
Return the group rotation in radians.
bool isVisible() const
Return the group visibility state.
float getX() const
Return the group origin X coordinate.
float getScale() const
Return the local-offset scale.
ECS emitter entity. Script configures components; ParticleSimSystem / ParticleRenderSystem drive per-...
bool enabled
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
One authored cross-emitter event route inside a particle effect asset.
One effect-local timeline cue evaluated against the effect clock.
Effect-level timeline controls (schema v2, optional on v1).
std::vector< ParticleEffectTimelineCue > cues