1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PROPERTIES_PARTICLE_PROPERTIES_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PROPERTIES_PARTICLE_PROPERTIES_H
18 #include <cstdint>
19 #include <list>
20 #include <optional>
21 #include <string>
22 #include <utility>
23 
24 #include "base/geometry/dimension.h"
25 #include "core/components/common/layout/constants.h"
26 #include "core/components/common/properties/color.h"
27 #include "core/components_ng/property/particle_property_animation.h"
28 namespace OHOS::Ace::NG {
29 namespace {
30 constexpr int32_t DEFAULT_PARTICLE_COUNT = 5;
31 }
32 enum ACE_EXPORT UpdaterType { NONE_UPDATER = 0, RANDOM, CURVE };
33 
34 enum ACE_EXPORT ParticleType { POINT = 0, IMAGE };
35 
36 enum ACE_EXPORT ParticleEmitterShape { RECTANGLE = 0, CIRCLE, ELLIPSE };
37 
38 enum ACE_EXPORT DistributionType { UNIFORM = 0, GAUSSIAN };
39 
40 struct PointParticleParameter {
41 public:
SetRadiusPointParticleParameter42     void SetRadius(float radius)
43     {
44         radius_ = radius;
45     }
46 
GetRadiusPointParticleParameter47     float GetRadius() const
48     {
49         return radius_;
50     }
51 
52     bool operator==(const PointParticleParameter& other) const
53     {
54         return NearEqual(radius_, other.GetRadius());
55     }
56 
ToStringPointParticleParameter57     std::string ToString() const
58     {
59         std::string str;
60         str.append("radius: [").append(std::to_string(radius_)).append("]");
61         return str;
62     }
63 
64 private:
65     float radius_ = 0.0f;
66 };
67 
68 struct ImageParticleParameter {
69 public:
GetImageSourceImageParticleParameter70     const std::string& GetImageSource() const
71     {
72         return imageSource_;
73     }
74 
SetImageSourceImageParticleParameter75     void SetImageSource(std::string& imageSource)
76     {
77         imageSource_ = imageSource;
78     }
79 
GetSizeImageParticleParameter80     const std::pair<Dimension, Dimension>& GetSize() const
81     {
82         return size_;
83     }
84 
SetSizeImageParticleParameter85     void SetSize(std::pair<Dimension, Dimension>& size)
86     {
87         size_ = size;
88     }
89 
GetImageFitImageParticleParameter90     std::optional<ImageFit> GetImageFit() const
91     {
92         return imageFit_;
93     }
94 
SetImageFitImageParticleParameter95     void SetImageFit(ImageFit& imageFit)
96     {
97         imageFit_ = imageFit;
98     }
99 
100     bool operator==(const ImageParticleParameter& other) const
101     {
102         return (imageSource_ == other.GetImageSource()) && (size_ == other.GetSize()) &&
103                (imageFit_ == other.GetImageFit());
104     }
105 
ToStringImageParticleParameter106     std::string ToString() const
107     {
108         std::string str;
109         str.append("imageSource: [").append(imageSource_).append("]");
110         str.append("size: [").append(size_.first.ToString()).append(",").append(size_.second.ToString()).append("]");
111         str.append("imageFit: [")
112             .append(imageFit_.has_value() ? std::to_string(static_cast<int32_t>(imageFit_.value())) : "NA")
113             .append("]");
114         return str;
115     }
116 
117 private:
118     std::string imageSource_;
119     std::pair<Dimension, Dimension> size_;
120     std::optional<ImageFit> imageFit_;
121 };
122 
123 struct ParticleConfig {
124 public:
SetPointParticleParameterParticleConfig125     void SetPointParticleParameter(const PointParticleParameter& pointParticleParameter)
126     {
127         pointParameter_ = pointParticleParameter;
128     }
GetPointParticleParameterParticleConfig129     const PointParticleParameter& GetPointParticleParameter() const
130     {
131         return pointParameter_;
132     }
SetImageParticleParameterParticleConfig133     void SetImageParticleParameter(const ImageParticleParameter& imageParticleParameter)
134     {
135         imageParameter_ = imageParticleParameter;
136     }
GetImageParticleParameterParticleConfig137     const ImageParticleParameter& GetImageParticleParameter() const
138     {
139         return imageParameter_;
140     }
141 
142     bool operator==(const ParticleConfig& other) const
143     {
144         return (pointParameter_ == other.GetPointParticleParameter()) &&
145                (imageParameter_ == other.GetImageParticleParameter());
146     }
147 
ToStringParticleConfig148     std::string ToString() const
149     {
150         std::string str;
151         str.append("pointParameter: [").append(pointParameter_.ToString()).append("]");
152         str.append("imageParameter: [").append(imageParameter_.ToString()).append("]");
153         return str;
154     }
155 
156 private:
157     PointParticleParameter pointParameter_;
158     ImageParticleParameter imageParameter_;
159 };
160 
161 struct Particle {
162 public:
GetParticleTypeParticle163     const ParticleType& GetParticleType() const
164     {
165         return particleType_;
166     }
SetParticleTypeParticle167     void SetParticleType(const ParticleType& particleType)
168     {
169         particleType_ = particleType;
170     }
GetConfigParticle171     const ParticleConfig& GetConfig() const
172     {
173         return config_;
174     }
SetConfigParticle175     void SetConfig(const ParticleConfig& config)
176     {
177         config_ = config;
178     }
GetCountParticle179     int32_t GetCount() const
180     {
181         return count_;
182     }
SetCountParticle183     void SetCount(int32_t count)
184     {
185         count_ = count;
186     }
SetLifeTimeParticle187     void SetLifeTime(int64_t lifetime)
188     {
189         lifeTime_ = lifetime;
190     }
191 
GetLifeTimeParticle192     const std::optional<int64_t>& GetLifeTime() const
193     {
194         return lifeTime_;
195     }
196 
SetLifeTimeRangeParticle197     void SetLifeTimeRange(int64_t lifetimeRange)
198     {
199         lifeTimeRange_ = lifetimeRange;
200     }
201 
GetLifeTimeRangeParticle202     const std::optional<int64_t>& GetLifeTimeRange() const
203     {
204         return lifeTimeRange_;
205     }
206 
207     bool operator==(const Particle& other) const
208     {
209         return (particleType_ == other.GetParticleType()) && (config_ == other.GetConfig()) &&
210                (count_ == other.GetCount()) && (lifeTime_ == other.GetLifeTime()) &&
211                (lifeTimeRange_ == other.GetLifeTimeRange());
212     }
213 
ToStringParticle214     std::string ToString() const
215     {
216         std::string str;
217         str.append("particleType: [").append(std::to_string(static_cast<int32_t>(particleType_))).append("]");
218         str.append("config: [").append(config_.ToString()).append("]");
219         str.append("count: [").append(std::to_string(count_)).append("]");
220         str.append("lifeTime: [").append(lifeTime_.has_value() ? std::to_string(lifeTime_.value()) : "NA").append("]");
221         str.append("lifeTimeRange: [")
222             .append(lifeTimeRange_.has_value() ? std::to_string(lifeTimeRange_.value()) : "NA")
223             .append("]");
224         return str;
225     }
226 
227 private:
228     ParticleType particleType_;
229     ParticleConfig config_;
230     int32_t count_ = DEFAULT_PARTICLE_COUNT;
231     std::optional<int64_t> lifeTime_;
232     std::optional<int64_t> lifeTimeRange_;
233 };
234 
235 struct EmitterOption {
236 public:
GetParticleEmitterOption237     const Particle& GetParticle() const
238     {
239         return particle_;
240     }
SetParticleEmitterOption241     void SetParticle(Particle& particle)
242     {
243         particle_ = particle;
244     }
SetEmitterRateEmitterOption245     void SetEmitterRate(int32_t emitterRate)
246     {
247         emitterRate_ = emitterRate;
248     }
249 
GetEmitterRateEmitterOption250     const std::optional<int32_t>& GetEmitterRate() const
251     {
252         return emitterRate_;
253     }
254 
SetPositionEmitterOption255     void SetPosition(std::pair<Dimension, Dimension>& point)
256     {
257         position_ = point;
258     }
259 
GetPositionEmitterOption260     const std::optional<std::pair<Dimension, Dimension>>& GetPosition() const
261     {
262         return position_;
263     }
264 
SetSizeEmitterOption265     void SetSize(std::pair<Dimension, Dimension>& size)
266     {
267         size_ = size;
268     }
269 
GetSizeEmitterOption270     const std::optional<std::pair<Dimension, Dimension>>& GetSize() const
271     {
272         return size_;
273     }
274 
SetShapeEmitterOption275     void SetShape(ParticleEmitterShape& shape)
276     {
277         shape_ = shape;
278     }
279 
GetShapeEmitterOption280     const std::optional<ParticleEmitterShape>& GetShape() const
281     {
282         return shape_;
283     }
284 
285     bool operator==(const EmitterOption& other) const
286     {
287         return particle_ == other.GetParticle() && emitterRate_ == other.GetEmitterRate() &&
288                position_ == other.GetPosition() && size_ == other.GetSize() && shape_ == other.GetShape();
289     }
290 
ToStringEmitterOption291     std::string ToString() const
292     {
293         std::string str;
294         str.append("particle: [").append(particle_.ToString()).append("]");
295         str.append("emitterRate: [")
296             .append(emitterRate_.has_value() ? std::to_string(emitterRate_.value()) : "NA")
297             .append("]");
298         if (position_.has_value()) {
299             str.append("position: [")
300                 .append(position_->first.ToString())
301                 .append(",")
302                 .append(position_->second.ToString())
303                 .append("]");
304         } else {
305             str.append("position: [").append("NA").append("]");
306         }
307         if (size_.has_value()) {
308             str.append("size: [")
309                 .append(size_->first.ToString())
310                 .append(",")
311                 .append(size_->second.ToString())
312                 .append("]");
313         } else {
314             str.append("size: [").append("NA").append("]");
315         }
316         str.append("shape: [")
317             .append(shape_.has_value() ? std::to_string(static_cast<int32_t>(shape_.value())) : "NA")
318             .append("]");
319         return str;
320     }
321 
322 private:
323     Particle particle_;
324     std::optional<int32_t> emitterRate_;
325     std::optional<std::pair<Dimension, Dimension>> position_;
326     std::optional<std::pair<Dimension, Dimension>> size_;
327     std::optional<ParticleEmitterShape> shape_;
328 };
329 
330 struct ParticleFloatPropertyUpdaterConfig {
331 public:
SetRandomConfigParticleFloatPropertyUpdaterConfig332     void SetRandomConfig(const std::pair<float, float>& randomConfig)
333     {
334         randomConfig_ = randomConfig;
335     }
336 
GetRandomConfigParticleFloatPropertyUpdaterConfig337     const std::pair<float, float>& GetRandomConfig() const
338     {
339         return randomConfig_;
340     }
341 
SetAnimationsParticleFloatPropertyUpdaterConfig342     void SetAnimations(const std::list<ParticlePropertyAnimation<float>>& animations)
343     {
344         animations_ = animations;
345     }
346 
GetAnimationsParticleFloatPropertyUpdaterConfig347     const std::list<ParticlePropertyAnimation<float>>& GetAnimations() const
348     {
349         return animations_;
350     }
351 
SetNullStrParticleFloatPropertyUpdaterConfig352     void SetNullStr(const std::string noneValue)
353     {
354         noneValue_ = noneValue;
355     }
356 
GetNullStrParticleFloatPropertyUpdaterConfig357     const std::string& GetNullStr() const
358     {
359         return noneValue_;
360     }
361 
362     bool operator==(const ParticleFloatPropertyUpdaterConfig& other) const
363     {
364         return (noneValue_ == other.GetNullStr()) && NearEqual(randomConfig_.first, other.GetRandomConfig().first) &&
365                NearEqual(randomConfig_.second, other.GetRandomConfig().second) &&
366                (animations_ == other.GetAnimations());
367     }
368 
ToStringParticleFloatPropertyUpdaterConfig369     std::string ToString() const
370     {
371         std::string str;
372         str.append("noneValue: [").append(noneValue_).append("]");
373         str.append("randomConfig: [")
374             .append(std::to_string(randomConfig_.first))
375             .append(",")
376             .append(std::to_string(randomConfig_.second))
377             .append("]");
378         if (animations_.size() > 0) {
379             str.append("animations: [");
380             for (auto& item : animations_) {
381                 str.append("{").append(item.ToString()).append("}");
382             }
383             str.append("]");
384         } else {
385             str.append("animations: [").append("]");
386         }
387         return str;
388     }
389 
390 private:
391     std::string noneValue_;
392     std::pair<float, float> randomConfig_;
393     std::list<ParticlePropertyAnimation<float>> animations_;
394 };
395 
396 struct ParticleFloatPropertyUpdater {
397 public:
GetUpdaterTypeParticleFloatPropertyUpdater398     const UpdaterType& GetUpdaterType() const
399     {
400         return updaterType_;
401     }
402 
SetUpdaterTypeParticleFloatPropertyUpdater403     void SetUpdaterType(const UpdaterType& updateType)
404     {
405         updaterType_ = updateType;
406     }
407 
GetConfigParticleFloatPropertyUpdater408     const ParticleFloatPropertyUpdaterConfig& GetConfig() const
409     {
410         return config_;
411     }
412 
SetConfigParticleFloatPropertyUpdater413     void SetConfig(const ParticleFloatPropertyUpdaterConfig& config)
414     {
415         config_ = config;
416     }
417 
418     bool operator==(const ParticleFloatPropertyUpdater& other) const
419     {
420         return (updaterType_ == other.GetUpdaterType()) && (config_ == other.GetConfig());
421     }
422 
ToStringParticleFloatPropertyUpdater423     std::string ToString() const
424     {
425         std::string str;
426         str.append("updaterType: [").append(std::to_string(static_cast<int32_t>(updaterType_))).append("]");
427         str.append("config: [").append(config_.ToString()).append("]");
428         return str;
429     }
430 
431 private:
432     UpdaterType updaterType_ = UpdaterType::NONE_UPDATER;
433     ParticleFloatPropertyUpdaterConfig config_;
434 };
435 
436 struct ParticleFloatPropertyOption {
437 public:
GetRangeParticleFloatPropertyOption438     const std::pair<float, float>& GetRange() const
439     {
440         return range_;
441     }
442 
SetRangeParticleFloatPropertyOption443     void SetRange(const std::pair<float, float>& range)
444     {
445         range_ = range;
446     }
447 
GetUpdaterParticleFloatPropertyOption448     const std::optional<ParticleFloatPropertyUpdater>& GetUpdater() const
449     {
450         return updater_;
451     }
452 
SetUpdaterParticleFloatPropertyOption453     void SetUpdater(const ParticleFloatPropertyUpdater& updater)
454     {
455         updater_ = updater;
456     }
457 
458     bool operator==(const ParticleFloatPropertyOption& other) const
459     {
460         return NearEqual(range_.first, other.GetRange().first) && NearEqual(range_.second, other.GetRange().second) &&
461                (updater_ == other.GetUpdater());
462     }
463 
ToStringParticleFloatPropertyOption464     std::string ToString() const
465     {
466         std::string str;
467         str.append("range: [")
468             .append(std::to_string(range_.first))
469             .append(",")
470             .append(std::to_string(range_.second))
471             .append("]");
472         str.append("updater: [").append(updater_.has_value() ? updater_->ToString() : "NA").append("]");
473         return str;
474     }
475 
476 private:
477     std::pair<float, float> range_;
478     std::optional<ParticleFloatPropertyUpdater> updater_;
479 };
480 
481 struct ColorParticleRandomUpdateConfig {
482 public:
GetRedRandomColorParticleRandomUpdateConfig483     const std::pair<float, float>& GetRedRandom() const
484     {
485         return redRandom_;
486     }
487 
SetRedRandomColorParticleRandomUpdateConfig488     void SetRedRandom(const std::pair<float, float>& redRandom)
489     {
490         redRandom_ = redRandom;
491     }
492 
GetGreenRandomColorParticleRandomUpdateConfig493     const std::pair<float, float>& GetGreenRandom() const
494     {
495         return greenRandom_;
496     }
497 
SetGreenRandomColorParticleRandomUpdateConfig498     void SetGreenRandom(const std::pair<float, float>& greenRandom)
499     {
500         greenRandom_ = greenRandom;
501     }
502 
GetBlueRandomColorParticleRandomUpdateConfig503     const std::pair<float, float>& GetBlueRandom() const
504     {
505         return blueRandom_;
506     }
507 
SetBlueRandomColorParticleRandomUpdateConfig508     void SetBlueRandom(const std::pair<float, float>& blueRandom)
509     {
510         blueRandom_ = blueRandom;
511     }
512 
GetAlphaRandomColorParticleRandomUpdateConfig513     const std::pair<float, float>& GetAlphaRandom() const
514     {
515         return alphaRandom_;
516     }
517 
SetAlphaRandomColorParticleRandomUpdateConfig518     void SetAlphaRandom(const std::pair<float, float>& alphaRandom)
519     {
520         alphaRandom_ = alphaRandom;
521     }
522 
523     bool operator==(const ColorParticleRandomUpdateConfig& other) const
524     {
525         return NearEqual(redRandom_.first, other.GetRedRandom().first) &&
526                NearEqual(redRandom_.second, other.GetRedRandom().second) &&
527                NearEqual(greenRandom_.first, other.GetGreenRandom().first) &&
528                NearEqual(greenRandom_.second, other.GetGreenRandom().second) &&
529                NearEqual(blueRandom_.first, other.GetBlueRandom().first) &&
530                NearEqual(blueRandom_.second, other.GetBlueRandom().second) &&
531                NearEqual(alphaRandom_.first, other.GetAlphaRandom().first) &&
532                NearEqual(alphaRandom_.second, other.GetAlphaRandom().second);
533     }
534 
ToStringColorParticleRandomUpdateConfig535     std::string ToString() const
536     {
537         std::string str;
538         str.append("redRandom: [")
539             .append(std::to_string(redRandom_.first))
540             .append(",")
541             .append(std::to_string(redRandom_.second))
542             .append("]");
543         str.append("greenRandom: [")
544             .append(std::to_string(greenRandom_.first))
545             .append(",")
546             .append(std::to_string(greenRandom_.second))
547             .append("]");
548         str.append("blueRandom: [")
549             .append(std::to_string(blueRandom_.first))
550             .append(",")
551             .append(std::to_string(blueRandom_.second))
552             .append("]");
553         str.append("alphaRandom: [")
554             .append(std::to_string(alphaRandom_.first))
555             .append(",")
556             .append(std::to_string(alphaRandom_.second))
557             .append("]");
558         return str;
559     }
560 
561 private:
562     std::pair<float, float> redRandom_;
563     std::pair<float, float> greenRandom_;
564     std::pair<float, float> blueRandom_;
565     std::pair<float, float> alphaRandom_;
566 };
567 
568 struct ParticleColorPropertyUpdaterConfig {
569 public:
SetInValidParticleColorPropertyUpdaterConfig570     void SetInValid(int32_t inValid)
571     {
572         inValid_ = inValid;
573     }
574 
GetInValidParticleColorPropertyUpdaterConfig575     int32_t GetInValid() const
576     {
577         return inValid_;
578     }
579 
SetRandomConfigParticleColorPropertyUpdaterConfig580     void SetRandomConfig(const ColorParticleRandomUpdateConfig& randomConfig)
581     {
582         random_ = randomConfig;
583     }
584 
GetRandomConfigParticleColorPropertyUpdaterConfig585     const ColorParticleRandomUpdateConfig& GetRandomConfig() const
586     {
587         return random_;
588     }
589 
SetAnimationArrayParticleColorPropertyUpdaterConfig590     void SetAnimationArray(const std::list<ParticlePropertyAnimation<Color>>& animationArray)
591     {
592         animationArray_ = animationArray;
593     }
594 
GetAnimationArrayParticleColorPropertyUpdaterConfig595     const std::list<ParticlePropertyAnimation<Color>>& GetAnimationArray() const
596     {
597         return animationArray_;
598     }
599 
600     bool operator==(const ParticleColorPropertyUpdaterConfig& other) const
601     {
602         return (inValid_ == other.GetInValid()) && (random_ == other.GetRandomConfig()) &&
603                (animationArray_ == other.GetAnimationArray());
604     }
605 
ToStringParticleColorPropertyUpdaterConfig606     std::string ToString() const
607     {
608         std::string str;
609         str.append("inValid: [").append(std::to_string(inValid_)).append("]");
610         str.append("random: [").append(random_.ToString()).append("]");
611         str.append("animationArray: [");
612         if (animationArray_.size() > 0) {
613             for (auto& item : animationArray_) {
614                 str.append("{").append(item.ToString()).append("}");
615             }
616         }
617         str.append("]");
618         return str;
619     }
620 
621 private:
622     int32_t inValid_ = 0;
623     ColorParticleRandomUpdateConfig random_;
624     std::list<ParticlePropertyAnimation<Color>> animationArray_;
625 };
626 
627 struct ParticleColorPropertyUpdater {
628 public:
GetUpdateTypeParticleColorPropertyUpdater629     const UpdaterType& GetUpdateType() const
630     {
631         return type_;
632     }
633 
SetUpdateTypeParticleColorPropertyUpdater634     void SetUpdateType(UpdaterType type)
635     {
636         type_ = type;
637     }
638 
GetConfigParticleColorPropertyUpdater639     const ParticleColorPropertyUpdaterConfig& GetConfig() const
640     {
641         return config_;
642     }
643 
SetConfigParticleColorPropertyUpdater644     void SetConfig(const ParticleColorPropertyUpdaterConfig& config)
645     {
646         config_ = config;
647     }
648 
649     bool operator==(const ParticleColorPropertyUpdater& other) const
650     {
651         return (type_ == other.GetUpdateType()) && (config_ == other.GetConfig());
652     }
653 
ToStringParticleColorPropertyUpdater654     std::string ToString() const
655     {
656         std::string str;
657         str.append("type: [").append(std::to_string(static_cast<int32_t>(type_))).append("]");
658         str.append("config: [").append(config_.ToString()).append("]");
659         return str;
660     }
661 
662 private:
663     UpdaterType type_ = UpdaterType::NONE_UPDATER;
664     ParticleColorPropertyUpdaterConfig config_;
665 };
666 
667 struct ParticleColorPropertyOption {
668 public:
GetRangeParticleColorPropertyOption669     const std::pair<Color, Color>& GetRange() const
670     {
671         return range_;
672     }
SetRangeParticleColorPropertyOption673     void SetRange(std::pair<Color, Color>& range)
674     {
675         range_ = range;
676     }
GetDistributionParticleColorPropertyOption677     const std::optional<DistributionType>& GetDistribution() const
678     {
679         return distribution_;
680     }
SetDistributionParticleColorPropertyOption681     void SetDistribution(DistributionType& distribution)
682     {
683         distribution_ = distribution;
684     }
GetUpdaterParticleColorPropertyOption685     const std::optional<ParticleColorPropertyUpdater>& GetUpdater() const
686     {
687         return updater_;
688     }
SetUpdaterParticleColorPropertyOption689     void SetUpdater(ParticleColorPropertyUpdater& updater)
690     {
691         updater_ = updater;
692     }
693 
694     bool operator==(const ParticleColorPropertyOption& other) const
695     {
696         return (range_ == other.GetRange()) && (updater_ == other.GetUpdater()) &&
697                (distribution_ == other.GetDistribution());
698     }
699 
ToStringParticleColorPropertyOption700     std::string ToString() const
701     {
702         std::string str;
703         str.append("range: [")
704             .append(range_.first.ColorToString())
705             .append(",")
706             .append(range_.second.ColorToString())
707             .append("]");
708         str.append("config: [").append(updater_.has_value() ? updater_->ToString() : "NA").append("]");
709         return str;
710     }
711 
712 private:
713     std::pair<Color, Color> range_;
714     std::optional<DistributionType> distribution_;
715     std::optional<ParticleColorPropertyUpdater> updater_;
716 };
717 
718 struct VelocityProperty {
719 public:
GetSpeedRangeVelocityProperty720     const std::pair<float, float>& GetSpeedRange() const
721     {
722         return speed_;
723     }
SetSpeedRangeVelocityProperty724     void SetSpeedRange(std::pair<float, float>& speed)
725     {
726         speed_ = speed;
727     }
GetAngleRangeVelocityProperty728     const std::pair<float, float>& GetAngleRange() const
729     {
730         return angle_;
731     }
SetAngleRangeVelocityProperty732     void SetAngleRange(std::pair<float, float>& angle)
733     {
734         angle_ = angle;
735     }
736 
737     bool operator==(const VelocityProperty& other) const
738     {
739         return NearEqual(speed_.first, other.GetSpeedRange().first) &&
740                NearEqual(speed_.second, other.GetSpeedRange().second) &&
741                NearEqual(angle_.first, other.GetAngleRange().first) &&
742                NearEqual(angle_.second, other.GetAngleRange().second);
743     }
744 
ToStringVelocityProperty745     std::string ToString() const
746     {
747         std::string str;
748         str.append("speed: [")
749             .append(std::to_string(speed_.first))
750             .append(",")
751             .append(std::to_string(speed_.second))
752             .append("]");
753         str.append("angle: [")
754             .append(std::to_string(angle_.first))
755             .append(",")
756             .append(std::to_string(angle_.second))
757             .append("]");
758         return str;
759     }
760 
761 private:
762     std::pair<float, float> speed_;
763     std::pair<float, float> angle_;
764 };
765 
766 struct AccelerationProperty {
767 public:
GetSpeedAccelerationProperty768     const std::optional<ParticleFloatPropertyOption>& GetSpeed() const
769     {
770         return speed_;
771     }
772 
SetSpeedAccelerationProperty773     void SetSpeed(const ParticleFloatPropertyOption& speed)
774     {
775         speed_ = speed;
776     }
777 
GetAngleAccelerationProperty778     const std::optional<ParticleFloatPropertyOption>& GetAngle() const
779     {
780         return angle_;
781     }
782 
SetAngleAccelerationProperty783     void SetAngle(ParticleFloatPropertyOption& angle)
784     {
785         angle_ = angle;
786     }
787 
788     bool operator==(const AccelerationProperty& other) const
789     {
790         return (speed_ == other.GetSpeed()) && (angle_ == other.GetAngle());
791     }
792 
ToStringAccelerationProperty793     std::string ToString() const
794     {
795         std::string str;
796         str.append("speed: [").append(speed_.has_value() ? speed_->ToString() : "NA").append("]");
797         str.append("angle: [").append(angle_.has_value() ? angle_->ToString() : "NA").append("]");
798         return str;
799     }
800 
801 private:
802     std::optional<ParticleFloatPropertyOption> speed_;
803     std::optional<ParticleFloatPropertyOption> angle_;
804 };
805 
806 struct ParticleOption {
807 public:
808 
GetEmitterOptionParticleOption809     const EmitterOption& GetEmitterOption() const
810     {
811         return emitter_;
812     }
813 
SetEmitterOptionParticleOption814     void SetEmitterOption(EmitterOption& emitter)
815     {
816         emitter_ = emitter;
817     }
818 
GetParticleColorOptionParticleOption819     const std::optional<ParticleColorPropertyOption>& GetParticleColorOption() const
820     {
821         return colorOption_;
822     }
823 
SetParticleColorOptionParticleOption824     void SetParticleColorOption(const ParticleColorPropertyOption& colorOption)
825     {
826         colorOption_ = colorOption;
827     }
828 
GetParticleOpacityOptionParticleOption829     const std::optional<ParticleFloatPropertyOption>& GetParticleOpacityOption() const
830     {
831         return opacityOption_;
832     }
833 
SetParticleOpacityOptionParticleOption834     void SetParticleOpacityOption(ParticleFloatPropertyOption& opacityOption)
835     {
836         opacityOption_ = opacityOption;
837     }
838 
GetParticleScaleOptionParticleOption839     const std::optional<ParticleFloatPropertyOption>& GetParticleScaleOption() const
840     {
841         return scaleOption_;
842     }
843 
SetParticleScaleOptionParticleOption844     void SetParticleScaleOption(ParticleFloatPropertyOption& scaleOption)
845     {
846         scaleOption_ = scaleOption;
847     }
848 
GetParticleVelocityOptionParticleOption849     const std::optional<VelocityProperty>& GetParticleVelocityOption() const
850     {
851         return velocityOption_;
852     }
853 
SetParticleVelocityOptionParticleOption854     void SetParticleVelocityOption(VelocityProperty& velocityOption)
855     {
856         velocityOption_ = velocityOption;
857     }
858 
GetParticleAccelerationOptionParticleOption859     const std::optional<AccelerationProperty>& GetParticleAccelerationOption() const
860     {
861         return accelerationOption_;
862     }
863 
SetParticleAccelerationOptionParticleOption864     void SetParticleAccelerationOption(AccelerationProperty& accelerationOption)
865     {
866         accelerationOption_ = accelerationOption;
867     }
868 
GetParticleSpinOptionParticleOption869     const std::optional<ParticleFloatPropertyOption>& GetParticleSpinOption() const
870     {
871         return spinOption_;
872     }
873 
SetParticleSpinOptionParticleOption874     void SetParticleSpinOption(ParticleFloatPropertyOption& spinOption)
875     {
876         spinOption_ = spinOption;
877     }
878 
879     bool operator==(const ParticleOption& other) const
880     {
881         return (emitter_ == other.GetEmitterOption()) && (colorOption_ == other.GetParticleColorOption()) &&
882                (opacityOption_ == other.GetParticleOpacityOption()) &&
883                (scaleOption_ == other.GetParticleScaleOption()) &&
884                (velocityOption_ == other.GetParticleVelocityOption()) &&
885                (accelerationOption_ == other.GetParticleAccelerationOption()) &&
886                (spinOption_ == other.GetParticleSpinOption());
887     }
888 
ToStringParticleOption889     std::string ToString() const
890     {
891         std::string str;
892         str.append("emitter: [").append(emitter_.ToString()).append("]");
893         str.append("colorOption: [").append(colorOption_.has_value() ? colorOption_->ToString() : "NA").append("]");
894         str.append("opacityOption: [")
895             .append(opacityOption_.has_value() ? opacityOption_->ToString() : "NA")
896             .append("]");
897         str.append("scaleOption: [").append(scaleOption_.has_value() ? scaleOption_->ToString() : "NA").append("]");
898         str.append("velocityOption: [")
899             .append(velocityOption_.has_value() ? velocityOption_->ToString() : "NA")
900             .append("]");
901         str.append("accelerationOption: [")
902             .append(accelerationOption_.has_value() ? accelerationOption_->ToString() : "NA")
903             .append("]");
904         str.append("spinOption: [").append(spinOption_.has_value() ? spinOption_->ToString() : "NA").append("]");
905         return str;
906     }
907 
908 private:
909     EmitterOption emitter_;
910     std::optional<ParticleColorPropertyOption> colorOption_;
911     std::optional<ParticleFloatPropertyOption> opacityOption_;
912     std::optional<ParticleFloatPropertyOption> scaleOption_;
913     std::optional<VelocityProperty> velocityOption_;
914     std::optional<AccelerationProperty> accelerationOption_;
915     std::optional<ParticleFloatPropertyOption> spinOption_;
916 };
917 } // namespace OHOS::Ace::NG
918 #endif