fix(particle): texture sheet and gravity bug (#2422)

This commit is contained in:
ChenMo
2024-11-05 16:07:59 +08:00
committed by GitHub
parent 5d147ae4e6
commit ae0aa7962d
4 changed files with 16 additions and 14 deletions

View File

@@ -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();

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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