mirror of
https://github.com/galacean/engine.git
synced 2026-06-21 02:56:00 +08:00
fix(particle): texture sheet and gravity bug (#2422)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user