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