123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- import { FactorGradient, ColorGradient } from '../Util/Gradient'
- import CustomParticle from '../index'
- const xrFrameSystem = wx.getXrFrameSystem();
- // 粒子实例,代表每一个粒子的具体属性
- export default class ParticleInstance {
- public static count: number = 0;
- public id: number;
- public position: xrFrameSystem.Vector3;
- public direction: xrFrameSystem.Vector3;
- public speed: number;
- public color: xrFrameSystem.Vector4;
- public colorStep: xrFrameSystem.Vector4;
- public rampPos: xrFrameSystem.Vector4;
- // 粒子生命周期
- public lifeTime: number;
- public age: number;
- public drag: number;
- public size: number;
- public startSize: number;
- public sizeGradientFactor: number;
- public scale: xrFrameSystem.Vector2;
- public angle: number;
- public angularSpeed: number;
- public particleSystem: CustomParticle;
- public currentSize: number;
- public currentSize2: number;
- public currentSizeGradient: FactorGradient;
- public currentColor: xrFrameSystem.Vector4;
- public currentColor2: xrFrameSystem.Vector4;
- public currentColorGradient: ColorGradient;
- public currentAlpha: number;
- public currentAlpha2: number;
- public currentAlphaGradient: FactorGradient;
- public currentSpeedScale: number;
- public currentSpeedScale2: number;
- public currentSpeedScaleGradient: FactorGradient;
- public currentLimitSpeed: number;
- public currentLimitSpeed2: number;
- public currentLimitSpeedGradient: FactorGradient;
- public currentDrag: number;
- public currentDrag2: number;
- public currentDragGradient: FactorGradient;
- public subEmitterMuster;
- public startSpriteCellIndex: number;
- public endSpriteCellIndex: number;
- public cellIndex: number = 0;
- public randomCellOffset;
- constructor(particle: CustomParticle) {
- this.particleSystem = particle;
- this.position = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);
- this.direction = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);
- this.speed = 0;
- this.color = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);
- this.colorStep = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);
- this.rampPos = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 1);
- this.currentSize = 0;
- this.currentSize2 = 0;
- this.currentColor = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);
- this.currentColor2 = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 1);
- this.currentAlpha = 0;
- this.currentAlpha2 = 0;
- this.startSpriteCellIndex = 0;
- this.endSpriteCellIndex = 0;
- this.lifeTime = 1.0;
- this.age = 0;
- this.drag = 0;
- this.size = 1;
- this.startSize = 1;
- this.sizeGradientFactor = 1;
- this.scale = xrFrameSystem.Vector2.createFromNumber(0, 0);
- this.angle = 0;
- this.angularSpeed = 0;
- this.id = ParticleInstance.count++;
- }
- /**
- * 重置粒子实例的状态。
- */
- public reset() {
- this.age = 0;
- this.id = ParticleInstance.count++;
- this.randomCellOffset = undefined;
- this.cellIndex = this.startSpriteCellIndex;
- }
- /**
- * 将当前粒子实例的状态拷贝到目标实例。
- * @param {ParticleInstance} other 目标粒子实例
- */
- public copyTo(other: ParticleInstance) {
- other.position.set(this.position);
- other.direction.set(this.direction);
- other.color.set(this.color);
- other.colorStep.set(this.colorStep);
- other.rampPos.set(this.rampPos);
- other.speed = this.speed;
- other.lifeTime = this.lifeTime;
- other.size = this.size;
- other.scale.set(this.scale);
- other.angle = this.angle;
- other.angularSpeed = this.angularSpeed;
- other.particleSystem = this.particleSystem;
- other.id = this.id;
- other.age = this.age;
- other.subEmitterMuster = this.subEmitterMuster;
- // 判断是否使用了颜色渐变
- if (this.currentColorGradient) {
- other.currentColorGradient = this.currentColorGradient;
- other.currentColor = this.currentColor.clone();
- other.currentColor2 = this.currentColor2.clone();
- }
- // 判断是否使用了大小渐变
- if (this.currentSizeGradient) {
- other.currentSizeGradient = this.currentSizeGradient;
- other.currentSize = this.currentSize;
- other.currentSize2 = this.currentSize2;
- }
- // 判断是否使用了透明度渐变
- if (this.currentAlphaGradient) {
- other.currentAlphaGradient = this.currentAlphaGradient;
- other.currentAlpha = this.currentAlpha;
- other.currentAlpha2 = this.currentAlpha2;
- }
- // 判断是否使用了速度渐变
- if (this.currentSpeedScaleGradient) {
- other.currentSpeedScaleGradient = this.currentSpeedScaleGradient;
- other.currentSpeedScale = this.currentSpeedScale;
- other.currentSpeedScale2 = this.currentSpeedScale2;
- }
- // 判断是否使用了限速渐变
- if (this.currentLimitSpeedGradient) {
- other.currentLimitSpeedGradient = this.currentLimitSpeedGradient;
- other.currentLimitSpeed = this.currentLimitSpeed;
- other.currentLimitSpeed2 = this.currentLimitSpeed2;
- }
- // 判断是否使用了阻力渐变
- if (this.currentDragGradient) {
- other.currentDragGradient = this.currentDragGradient;
- other.currentDrag = this.currentDrag;
- other.currentDrag2 = this.currentDrag2;
- }
- // 判断是否使用了动画图集
- if (this.particleSystem.useSpriteCellLoop) {
- other.randomCellOffset = this.randomCellOffset;
- other.startSpriteCellIndex = this.startSpriteCellIndex;
- other.endSpriteCellIndex = this.endSpriteCellIndex;
- }
- }
- /**
- * 更新从动画图集采样的帧序号
- */
- public updateCellIndex() {
- var offset = this.age;
- // 设置图集变化的速度
- var changeSpeed = this.particleSystem.spriteChangeSpeed;
- if (this.particleSystem.useRandomSpriteCellIndex) {
- if (this.randomCellOffset == undefined) {
- //随机给图集中的一帧作为初始帧
- this.randomCellOffset = Math.random() * this.lifeTime;
- }
- if (changeSpeed == 0) {
- // 如果播放速度为0,则不会播放到下一动画帧
- changeSpeed = 1;
- offset = this.randomCellOffset;
- } else {
- offset += this.randomCellOffset;
- }
- }
- var ratio;
- var loopDist = this.endSpriteCellIndex - this.startSpriteCellIndex;
- if (this.particleSystem.useSpriteCellLoop) {
- // 粒子将循环播放动画图集
- ratio = this.clamp((offset * changeSpeed) % this.lifeTime / this.lifeTime);
- } else {
- ratio = this.clamp(offset * changeSpeed / this.lifeTime);
- }
- //round
- this.cellIndex = (this.startSpriteCellIndex + ratio * loopDist) | 0;
- }
- /**
- * 限制num的值在left与right的区间内
- */
- public clamp(num, left = 0, right = 1) {
- if (num < left)
- return left;
- if (num > right)
- return right;
- return num;
- }
- };
|