• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
16/// <reference path='./import.ts' />
17class ArkParticleComponent extends ArkComponent implements ParticleAttribute {
18  constructor(nativePtr: KNode, classType?: ModifierType) {
19    super(nativePtr, classType);
20  }
21  disturbanceFields(value: Array<DisturbanceFieldOptions>): this {
22    modifierWithKey(this._modifiersWithKeys, ParticleModifier.identity, ParticleModifier, value);
23    return this;
24  }
25
26  emitter(value: Array<EmitterProperty>): this {
27    modifierWithKey(this._modifiersWithKeys, ParticleEmitterModifier.identity, ParticleEmitterModifier, value);
28    return this;
29  }
30}
31
32class ParticleModifier extends ModifierWithKey<Array<DisturbanceFieldOptions>> {
33  constructor(value: Array<DisturbanceFieldOptions>) {
34    super(value);
35  }
36  static identity: Symbol = Symbol('disturbanceFields');
37  applyPeer(node: KNode, reset: boolean): void {
38    if (reset) {
39      getUINativeModule().particle.resetDisturbanceField(node);
40    } else {
41      let dataArray = [];
42      if (Array.isArray(this.value)) {
43        return;
44      }
45      for (let i = 0; i < this.value.length; i++) {
46        let data = this.value[i];
47        dataArray.push(parseWithDefaultNumber(data.strength, 0));
48        dataArray.push(parseWithDefaultNumber(data.shape, 0));
49        if (isObject(data.size)) {
50          dataArray.push(parseWithDefaultNumber(data.size.width, 0));
51          dataArray.push(parseWithDefaultNumber(data.size.height, 0));
52        }
53        else {
54          dataArray.push(0);
55          dataArray.push(0);
56        }
57        if (isObject(data.position)) {
58          dataArray.push(parseWithDefaultNumber(data.position.x, 0));
59          dataArray.push(parseWithDefaultNumber(data.position.y, 0));
60        }
61        else {
62          dataArray.push(0);
63          dataArray.push(0);
64        }
65        dataArray.push(parseWithDefaultNumber(data.feather, 0));
66        dataArray.push(parseWithDefaultNumber(data.noiseScale, 1));
67        dataArray.push(parseWithDefaultNumber(data.noiseFrequency, 1));
68        dataArray.push(parseWithDefaultNumber(data.noiseAmplitude, 1));
69      }
70      getUINativeModule().particle.setDisturbanceField(node, dataArray);
71    }
72  }
73
74  checkObjectDiff(): boolean {
75    if (isString(this.stageValue) && isString(this.value)) {
76      return this.stageValue !== this.value;
77    } else {
78      return true;
79    }
80  }
81}
82
83class ParticleEmitterModifier extends ModifierWithKey<Array<EmitterProperty>> {
84  constructor(value: Array<EmitterProperty>) {
85    super(value);
86  }
87
88  static identity: Symbol = Symbol('emitter');
89  applyPeer(node, reset): void {
90    let emitRatePlaceHolder;
91    let positionXPlaceHolder;
92    let positionYPlaceHolder;
93    let sizeXPlaceHolder;
94    let sizeYPlaceHolder;
95    if (reset) {
96      getUINativeModule().particle.resetEmitter(node);
97    }
98    else {
99      let dataArray = [];
100      if (!Array.isArray(this.value)) {
101        return;
102      }
103      for (let i = 0; i < this.value.length; i++) {
104        let data = this.value[i];
105        let indexValue = 0;
106        if (data.index > 0) {
107          indexValue = data.index;
108        }
109        dataArray.push(indexValue);
110
111        let emitRateValue = 5;
112        if (isNumber(data.emitRate)) {
113          dataArray.push(1);
114          if (data.emitRate >= 0) {
115            emitRateValue = data.emitRate;
116          }
117          dataArray.push(emitRateValue);
118        } else {
119          dataArray.push(0);
120          dataArray.push(emitRatePlaceHolder);
121        }
122
123        if (isObject(data.position)) {
124          if (isNumber(data.position.x) && isNumber(data.position.y)) {
125            dataArray.push(1);
126            dataArray.push(data.position.x);
127            dataArray.push(data.position.y);
128          } else {
129            dataArray.push(0);
130            dataArray.push(positionXPlaceHolder);
131            dataArray.push(positionYPlaceHolder);
132          }
133        } else {
134          dataArray.push(0);
135          dataArray.push(positionXPlaceHolder);
136          dataArray.push(positionYPlaceHolder);
137        }
138
139        if (isObject(data.size)) {
140          if (data.size.width > 0 && data.size.height > 0) {
141            dataArray.push(1);
142            dataArray.push(data.size.width);
143            dataArray.push(data.size.height);
144          } else {
145            dataArray.push(0);
146            dataArray.push(sizeXPlaceHolder);
147            dataArray.push(sizeYPlaceHolder);
148          }
149        }
150        else {
151          dataArray.push(0);
152          dataArray.push(sizeXPlaceHolder);
153          dataArray.push(sizeYPlaceHolder);
154        }
155      }
156      getUINativeModule().particle.setEmitter(node, dataArray);
157    }
158  }
159
160  checkObjectDiff(): boolean {
161    if (isString(this.stageValue) && isString(this.value)) {
162      return this.stageValue !== this.value;
163    } else {
164      return true;
165    }
166  }
167}
168
169// @ts-ignore
170globalThis.Particle.attributeModifier = function (modifier: ArkComponent): void {
171  attributeModifierFunc.call(this, modifier, (nativePtr: KNode) => {
172    return new ArkParticleComponent(nativePtr);
173  }, (nativePtr: KNode, classType: ModifierType, modifierJS: ModifierJS) => {
174    return new modifierJS.PathModifier(nativePtr, classType);
175  });
176};
177