From ae0aa7962db76e370f5126b4dec4e8b017c6c1b4 Mon Sep 17 00:00:00 2001 From: ChenMo Date: Tue, 5 Nov 2024 16:07:59 +0800 Subject: [PATCH] fix(particle): texture sheet and gravity bug (#2422) --- packages/core/src/particle/ParticleGenerator.ts | 16 ++++++++++++---- packages/core/src/particle/modules/MainModule.ts | 10 ++-------- .../core/src/shaderlib/extra/particle.vs.glsl | 2 +- .../particle/texture_sheet_animation_module.glsl | 2 +- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/core/src/particle/ParticleGenerator.ts b/packages/core/src/particle/ParticleGenerator.ts index f7e74dad4..744dde9bc 100644 --- a/packages/core/src/particle/ParticleGenerator.ts +++ b/packages/core/src/particle/ParticleGenerator.ts @@ -14,6 +14,7 @@ import { SetDataOptions } from "../graphic/enums/SetDataOptions"; import { VertexAttribute } from "../mesh"; import { ShaderData } from "../shader"; import { Buffer } from "./../graphic/Buffer"; +import { ParticleBufferUtils } from "./ParticleBufferUtils"; import { ParticleRenderer, ParticleUpdateFlags } from "./ParticleRenderer"; import { ParticleCurveMode } from "./enums/ParticleCurveMode"; import { ParticleGradientMode } from "./enums/ParticleGradientMode"; @@ -23,12 +24,11 @@ import { ParticleStopMode } from "./enums/ParticleStopMode"; import { ColorOverLifetimeModule } from "./modules/ColorOverLifetimeModule"; import { EmissionModule } from "./modules/EmissionModule"; import { MainModule } from "./modules/MainModule"; +import { ParticleCompositeCurve } from "./modules/ParticleCompositeCurve"; import { RotationOverLifetimeModule } from "./modules/RotationOverLifetimeModule"; import { SizeOverLifetimeModule } from "./modules/SizeOverLifetimeModule"; import { TextureSheetAnimationModule } from "./modules/TextureSheetAnimationModule"; import { VelocityOverLifetimeModule } from "./modules/VelocityOverLifetimeModule"; -import { ParticleBufferUtils } from "./ParticleBufferUtils"; -import { ParticleCompositeCurve } from "./modules/ParticleCompositeCurve"; /** * Particle Generator. @@ -758,8 +758,16 @@ export class ParticleGenerator { // Start speed instanceVertices[offset + 18] = startSpeed; - // Unused, Color, size, rotation, - // instanceVertices[offset + 19] = rand.random(); + // Gravity, unused, size, rotation + switch (main.gravityModifier.mode) { + case ParticleCurveMode.Constant: + instanceVertices[offset + 19] = main.gravityModifier.constant; + break; + case ParticleCurveMode.TwoConstants: + instanceVertices[offset + 19] = main.gravityModifier.evaluate(undefined, main._gravityModifierRand.random()); + break; + } + const colorOverLifetime = this.colorOverLifetime; if (colorOverLifetime.enabled && colorOverLifetime.color.mode === ParticleGradientMode.TwoGradients) { instanceVertices[offset + 20] = colorOverLifetime._colorGradientRand.random(); diff --git a/packages/core/src/particle/modules/MainModule.ts b/packages/core/src/particle/modules/MainModule.ts index 0349aec31..0dd474e0f 100644 --- a/packages/core/src/particle/modules/MainModule.ts +++ b/packages/core/src/particle/modules/MainModule.ts @@ -1,4 +1,5 @@ import { Color, Rand, Vector3, Vector4 } from "@galacean/engine-math"; +import { TransformModifyFlags } from "../../Transform"; import { deepClone, ignoreClone } from "../../clone/CloneManager"; import { ICustomClone } from "../../clone/ComponentCloner"; import { ShaderData } from "../../shader/ShaderData"; @@ -9,7 +10,6 @@ import { ParticleScaleMode } from "../enums/ParticleScaleMode"; import { ParticleSimulationSpace } from "../enums/ParticleSimulationSpace"; import { ParticleCompositeCurve } from "./ParticleCompositeCurve"; import { ParticleCompositeGradient } from "./ParticleCompositeGradient"; -import { TransformModifyFlags } from "../../Transform"; export class MainModule implements ICustomClone { private static _tempVector40 = new Vector4(); @@ -96,8 +96,6 @@ export class MainModule implements ICustomClone { private _simulationSpace = ParticleSimulationSpace.Local; @ignoreClone private _generator: ParticleGenerator; - @ignoreClone - private _gravity = new Vector3(); /** * The initial lifetime of particles when emitted. @@ -322,11 +320,7 @@ export class MainModule implements ICustomClone { break; } - const particleGravity = this._gravity; - const gravityModifierValue = this.gravityModifier.evaluate(undefined, this._gravityModifierRand.random()); - Vector3.scale(renderer.scene.physics.gravity, gravityModifierValue, particleGravity); - - shaderData.setVector3(MainModule._gravity, particleGravity); + shaderData.setVector3(MainModule._gravity, renderer.scene.physics.gravity); shaderData.setInt(MainModule._simulationSpace, this.simulationSpace); shaderData.setFloat(MainModule._startRotation3D, +this.startRotation3D); shaderData.setInt(MainModule._scaleMode, this.scalingMode); diff --git a/packages/core/src/shaderlib/extra/particle.vs.glsl b/packages/core/src/shaderlib/extra/particle.vs.glsl index e41918c78..dfdf5723f 100644 --- a/packages/core/src/shaderlib/extra/particle.vs.glsl +++ b/packages/core/src/shaderlib/extra/particle.vs.glsl @@ -74,7 +74,7 @@ void main() { lifeVelocity = computeParticleLifeVelocity(normalizedAge); #endif - vec3 gravityVelocity = renderer_Gravity * age; + vec3 gravityVelocity = renderer_Gravity * a_Random0.x * age; vec4 worldRotation; if (renderer_SimulationSpace == 0) { diff --git a/packages/core/src/shaderlib/particle/texture_sheet_animation_module.glsl b/packages/core/src/shaderlib/particle/texture_sheet_animation_module.glsl index 42fb287d7..7187dfcb2 100644 --- a/packages/core/src/shaderlib/particle/texture_sheet_animation_module.glsl +++ b/packages/core/src/shaderlib/particle/texture_sheet_animation_module.glsl @@ -20,7 +20,7 @@ vec2 computeParticleUV(in vec2 uv, in float normalizedAge) { float frame = floor(normalizedFrame * renderer_TSATillingParams.z); float tileRow = frame * renderer_TSATillingParams.x; - float floorTotalULength = floor(tileRow); + float tileRowIndex = floor(tileRow); uv.x += tileRow - tileRowIndex; uv.y += tileRowIndex * renderer_TSATillingParams.y; #endif