1 /*
2  * Copyright (c) 2024 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 #include "particle_modifier.h"
16 
17 #include "base/geometry/dimension.h"
18 #include "core/components_ng/pattern/particle/particle_model_ng.h"
19 
20 namespace OHOS::Ace::NG {
21 namespace {
SetDisturbanceField(ArkUINodeHandle node,const ArkUIInt32orFloat32 * values,ArkUI_Int32 length)22 void SetDisturbanceField(ArkUINodeHandle node, const ArkUIInt32orFloat32* values, ArkUI_Int32 length)
23 {
24     auto* frameNode = reinterpret_cast<FrameNode*>(node);
25     CHECK_NULL_VOID(frameNode);
26     std::vector<ParticleDisturbance> dataArray;
27     for (ArkUI_Int32 i = 0; i < length / 10; i++) {
28         ParticleDisturbance disturbanceField;
29         disturbanceField.strength = values[i*10].f32;
30         disturbanceField.shape = static_cast<ParticleDisturbanceShapeType>(values[i*10+1].i32);
31         disturbanceField.size[0] = values[i*10+2].i32, disturbanceField.size[1] = values[i*10+3].i32,
32         disturbanceField.position[0] = values[i*10+4].i32, disturbanceField.position[1] = values[i*10+5].i32,
33         disturbanceField.feather = values[i*10+6].i32;
34         disturbanceField.noiseScale = values[i*10+7].f32;
35         disturbanceField.noiseFrequency = values[i*10+8].f32;
36         disturbanceField.noiseAmplitude = values[i*10+9].f32;
37         dataArray.push_back(disturbanceField);
38     }
39     ParticleModelNG::DisturbanceField(dataArray, frameNode);
40 }
41 
ResetDisturbanceField(ArkUINodeHandle node)42 void ResetDisturbanceField(ArkUINodeHandle node)
43 {
44     auto* frameNode = reinterpret_cast<FrameNode*>(node);
45     CHECK_NULL_VOID(frameNode);
46     std::vector<ParticleDisturbance> dataArray;
47     ParticleModelNG::DisturbanceField(dataArray, frameNode);
48 }
49 
setEmitter(ArkUINodeHandle node,const ArkUIInt32orFloat32 * values,ArkUI_Int32 length)50 void setEmitter(ArkUINodeHandle node, const ArkUIInt32orFloat32* values, ArkUI_Int32 length)
51 {
52     auto* frameNode = reinterpret_cast<FrameNode*>(node);
53     CHECK_NULL_VOID(frameNode);
54     std::vector<EmitterProperty> emitterProperties;
55     for (ArkUI_Int32 i = 0; i < length / 9; i++) {
56         EmitterProperty prop;
57 
58         //The numbers 0-9 represent each attribute in the object, corresponding to index,hasEmitRate,emitRate,
59         //hasPosition,positionX,positionY,hasSize,sizeX,sizeY. Among them, index 1, 3, and 6 are marker values,
60         // indicating whether the attributes following the markers exist.
61         prop.index = values[i * 9].i32;
62         if (values[i * 9 + 1].i32 == 1) {
63             prop.emitRate = values[i * 9 + 2].i32;
64         }
65         if (values[i * 9 + 3].i32 == 1) {
66             prop.position = VectorF(values[i * 9 + 4].f32, values[i * 9 + 5].f32);
67         }
68         if (values[i * 9 + 6].i32 == 1) {
69             prop.size = VectorF(values[i * 9 + 7].f32, values[i * 9 + 8].f32);
70         }
71         emitterProperties.push_back(prop);
72     }
73     ParticleModelNG::updateEmitter(emitterProperties, frameNode);
74 }
75 
resetEmitter(ArkUINodeHandle node)76 void resetEmitter(ArkUINodeHandle node)
77 {
78     auto* frameNode = reinterpret_cast<FrameNode*>(node);
79     CHECK_NULL_VOID(frameNode);
80     std::vector<EmitterProperty> dataArray;
81     ParticleModelNG::updateEmitter(dataArray, frameNode);
82 }
83 } // namespace
84 
85 namespace NodeModifier {
GetParticleModifier()86 const ArkUIParticleModifier* GetParticleModifier()
87 {
88     static const ArkUIParticleModifier modifier = { SetDisturbanceField, ResetDisturbanceField, setEmitter,
89         resetEmitter };
90     return &modifier;
91 }
92 
GetCJUIParticleModifier()93 const CJUIParticleModifier* GetCJUIParticleModifier()
94 {
95     static const CJUIParticleModifier modifier = {
96         SetDisturbanceField, ResetDisturbanceField, setEmitter, resetEmitter
97     };
98     return &modifier;
99 }
100 } // namespace NodeModifier
101 } // namespace OHOS::Ace::NG