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