@rzmps/rzmps 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1048 -0
- package/build/EmissionShape.d.ts +33 -0
- package/build/EmissionShape.js +129 -0
- package/build/Emitter.d.ts +58 -0
- package/build/Emitter.js +166 -0
- package/build/GpuModule.d.ts +28 -0
- package/build/GpuModule.js +28 -0
- package/build/Module.d.ts +19 -0
- package/build/Module.js +31 -0
- package/build/Particle.d.ts +60 -0
- package/build/Particle.js +52 -0
- package/build/ParticleForceField.d.ts +39 -0
- package/build/ParticleForceField.js +101 -0
- package/build/ParticleForceFieldHelper.d.ts +18 -0
- package/build/ParticleForceFieldHelper.js +103 -0
- package/build/ParticleSystem.d.ts +122 -0
- package/build/ParticleSystem.js +609 -0
- package/build/Renderer.d.ts +15 -0
- package/build/Renderer.js +11 -0
- package/build/assets/images/default.png +0 -0
- package/build/collision/ThreeCollisionBackend.d.ts +47 -0
- package/build/collision/ThreeCollisionBackend.js +340 -0
- package/build/enums/Axis.d.ts +6 -0
- package/build/enums/Axis.js +7 -0
- package/build/enums/DynamicValueType.d.ts +6 -0
- package/build/enums/DynamicValueType.js +7 -0
- package/build/enums/EmissionSource copy.d.ts +7 -0
- package/build/enums/EmissionSource copy.js +7 -0
- package/build/enums/EmissionSource.d.ts +7 -0
- package/build/enums/EmissionSource.js +7 -0
- package/build/enums/EndBehavior.d.ts +6 -0
- package/build/enums/EndBehavior.js +7 -0
- package/build/enums/SimulationSpace.d.ts +5 -0
- package/build/enums/SimulationSpace.js +6 -0
- package/build/enums/SpriteMaterialType.d.ts +5 -0
- package/build/enums/SpriteMaterialType.js +6 -0
- package/build/enums/TagSelectionMethod.d.ts +6 -0
- package/build/enums/TagSelectionMethod.js +7 -0
- package/build/enums/TrailMode copy.d.ts +5 -0
- package/build/enums/TrailMode copy.js +7 -0
- package/build/enums/TrailMode.d.ts +5 -0
- package/build/enums/TrailMode.js +7 -0
- package/build/enums/TrailTextureMode.d.ts +7 -0
- package/build/enums/TrailTextureMode.js +9 -0
- package/build/gpu/GpuDynamicValue.d.ts +9 -0
- package/build/gpu/GpuDynamicValue.js +113 -0
- package/build/gpu/GpuMath.d.ts +3 -0
- package/build/gpu/GpuMath.js +12 -0
- package/build/gpu/GpuParticleContext.d.ts +63 -0
- package/build/gpu/GpuParticleContext.js +291 -0
- package/build/helpers/acceptMultiple.d.ts +2 -0
- package/build/helpers/acceptMultiple.js +6 -0
- package/build/helpers/evaluateDynamic.d.ts +2 -0
- package/build/helpers/evaluateDynamic.js +18 -0
- package/build/helpers/evaluateDynamicColor.d.ts +3 -0
- package/build/helpers/evaluateDynamicColor.js +5 -0
- package/build/helpers/evaluateDynamicNumber.d.ts +2 -0
- package/build/helpers/evaluateDynamicNumber.js +4 -0
- package/build/helpers/evaluateDynamicVector3.d.ts +3 -0
- package/build/helpers/evaluateDynamicVector3.js +5 -0
- package/build/helpers/isPointInMesh.d.ts +2 -0
- package/build/helpers/isPointInMesh.js +8 -0
- package/build/helpers/particleRatio.d.ts +2 -0
- package/build/helpers/particleRatio.js +13 -0
- package/build/helpers/tagsIntersect.d.ts +2 -0
- package/build/helpers/tagsIntersect.js +4 -0
- package/build/index.d.ts +37 -0
- package/build/index.js +34 -0
- package/build/interfaces/ICollisionBackend.d.ts +21 -0
- package/build/interfaces/ICollisionBackend.js +1 -0
- package/build/interfaces/IParticleForceField.d.ts +5 -0
- package/build/interfaces/IParticleForceField.js +1 -0
- package/build/interfaces/InitialParticleValues.d.ts +18 -0
- package/build/interfaces/InitialParticleValues.js +1 -0
- package/build/materials/BasicSprite.d.ts +21 -0
- package/build/materials/BasicSprite.js +46 -0
- package/build/materials/UnlitSprite.d.ts +13 -0
- package/build/materials/UnlitSprite.js +31 -0
- package/build/materials/WebGPUBasicSprite.d.ts +8 -0
- package/build/materials/WebGPUBasicSprite.js +65 -0
- package/build/materials/WebGPUUnlitSprite.d.ts +8 -0
- package/build/materials/WebGPUUnlitSprite.js +49 -0
- package/build/modules/Audio.d.ts +60 -0
- package/build/modules/Audio.js +181 -0
- package/build/modules/Collision.d.ts +40 -0
- package/build/modules/Collision.js +162 -0
- package/build/modules/ColorBySpeed.d.ts +18 -0
- package/build/modules/ColorBySpeed.js +26 -0
- package/build/modules/ColorOverLifetime.d.ts +12 -0
- package/build/modules/ColorOverLifetime.js +17 -0
- package/build/modules/ExternalForces.d.ts +21 -0
- package/build/modules/ExternalForces.js +61 -0
- package/build/modules/ForceOverLifetime.d.ts +11 -0
- package/build/modules/ForceOverLifetime.js +12 -0
- package/build/modules/LimitVelocityOverLifetime.d.ts +16 -0
- package/build/modules/LimitVelocityOverLifetime.js +34 -0
- package/build/modules/MassOverLifetime.d.ts +11 -0
- package/build/modules/MassOverLifetime.js +15 -0
- package/build/modules/NoiseModule.d.ts +23 -0
- package/build/modules/NoiseModule.js +45 -0
- package/build/modules/RotationBySpeed.d.ts +14 -0
- package/build/modules/RotationBySpeed.js +19 -0
- package/build/modules/RotationOverLifetime.d.ts +11 -0
- package/build/modules/RotationOverLifetime.js +12 -0
- package/build/modules/ScaleBySpeed.d.ts +14 -0
- package/build/modules/ScaleBySpeed.js +19 -0
- package/build/modules/ScaleOverLifetime.d.ts +11 -0
- package/build/modules/ScaleOverLifetime.js +11 -0
- package/build/modules/TransformByNoise.d.ts +17 -0
- package/build/modules/TransformByNoise.js +32 -0
- package/build/modules/VelocityOverLifetime.d.ts +15 -0
- package/build/modules/VelocityOverLifetime.js +32 -0
- package/build/renderers/LightRenderer.d.ts +54 -0
- package/build/renderers/LightRenderer.js +141 -0
- package/build/renderers/MeshRenderer.d.ts +27 -0
- package/build/renderers/MeshRenderer.js +70 -0
- package/build/renderers/SpriteRenderer.d.ts +95 -0
- package/build/renderers/SpriteRenderer.js +456 -0
- package/build/renderers/TrailRenderer.d.ts +71 -0
- package/build/renderers/TrailRenderer.js +400 -0
- package/build/shaders/BasicSprite.frag.js +1 -0
- package/build/shaders/BasicSprite.vert.js +1 -0
- package/build/shaders/UnlitSprite.frag.js +1 -0
- package/build/shaders/UnlitSprite.vert.js +1 -0
- package/build/types/DynamicValue.d.ts +2 -0
- package/build/types/DynamicValue.js +1 -0
- package/build/types/EnumStringLiteral.d.ts +1 -0
- package/build/types/EnumStringLiteral.js +1 -0
- package/build/types/Multiple.d.ts +2 -0
- package/build/types/Multiple.js +1 -0
- package/build/types/Tag.d.ts +1 -0
- package/build/types/Tag.js +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Module from '../Module';
|
|
3
|
+
import evaluateDynamicNumber from '../helpers/evaluateDynamicNumber';
|
|
4
|
+
import evaluateDynamicVector from '../helpers/evaluateDynamicVector3';
|
|
5
|
+
import NoiseModule from './NoiseModule';
|
|
6
|
+
class TransformByNoise extends Module {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
const key = `transformByNoise-${Math.random().toString(36).slice(2)}`;
|
|
9
|
+
const noiseX = new NoiseModule(`${key}-x`, Object.assign(Object.assign({}, options), { offset: new THREE.Vector3(0, 0, 0) }));
|
|
10
|
+
const noiseY = new NoiseModule(`${key}-y`, Object.assign(Object.assign({}, options), { offset: new THREE.Vector3(31.416, 0, 0) }));
|
|
11
|
+
const noiseZ = new NoiseModule(`${key}-z`, Object.assign(Object.assign({}, options), { offset: new THREE.Vector3(0, 31.416, 0) }));
|
|
12
|
+
super((particle, deltaTime) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const scrollSpeed = evaluateDynamicNumber((_a = this.options.scrollSpeed) !== null && _a !== void 0 ? _a : 0, particle.time, particle.id);
|
|
15
|
+
const time = (particle.realtime / 1000) * scrollSpeed;
|
|
16
|
+
this.noiseX.time = time;
|
|
17
|
+
this.noiseY.time = time;
|
|
18
|
+
this.noiseZ.time = time;
|
|
19
|
+
const strength = evaluateDynamicVector(this.options.strength, particle.time, particle.id);
|
|
20
|
+
if (this.options.damping)
|
|
21
|
+
strength.multiplyScalar(1 / Math.max((_b = this.options.frequency) !== null && _b !== void 0 ? _b : 1, 1));
|
|
22
|
+
const force = new THREE.Vector3((particle.noise[this.noiseX.key].noise4d * 2 - 1) * strength.x, (particle.noise[this.noiseY.key].noise4d * 2 - 1) * strength.y, (particle.noise[this.noiseZ.key].noise4d * 2 - 1) * strength.z);
|
|
23
|
+
particle.velocity.addScaledVector(force, deltaTime);
|
|
24
|
+
}, options);
|
|
25
|
+
this.options = options;
|
|
26
|
+
this.noiseX = noiseX;
|
|
27
|
+
this.noiseY = noiseY;
|
|
28
|
+
this.noiseZ = noiseZ;
|
|
29
|
+
this.dependents.push(noiseX, noiseY, noiseZ);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default TransformByNoise;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Module, { ModuleOptions } from '../Module';
|
|
3
|
+
import { DynamicValue } from '../types/DynamicValue';
|
|
4
|
+
export interface VelocityOverLifetimeOptions extends Partial<ModuleOptions> {
|
|
5
|
+
linear: DynamicValue<THREE.Vector3>;
|
|
6
|
+
orbital: DynamicValue<THREE.Vector3>;
|
|
7
|
+
orbitOffset: DynamicValue<THREE.Vector3>;
|
|
8
|
+
radial: DynamicValue<number>;
|
|
9
|
+
speedModifier: DynamicValue<number>;
|
|
10
|
+
}
|
|
11
|
+
declare class VelocityOverLifetime extends Module {
|
|
12
|
+
options: Partial<VelocityOverLifetimeOptions>;
|
|
13
|
+
constructor(options?: Partial<VelocityOverLifetimeOptions>);
|
|
14
|
+
}
|
|
15
|
+
export default VelocityOverLifetime;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Module from '../Module';
|
|
3
|
+
import evaluateDynamicNumber from '../helpers/evaluateDynamicNumber';
|
|
4
|
+
import evaluateDynamicVector from '../helpers/evaluateDynamicVector3';
|
|
5
|
+
class VelocityOverLifetime extends Module {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super((particle) => {
|
|
8
|
+
var _a;
|
|
9
|
+
const { time } = particle;
|
|
10
|
+
const velocity = particle.start.velocity.clone();
|
|
11
|
+
if (this.options.linear !== undefined) {
|
|
12
|
+
velocity.add(evaluateDynamicVector(this.options.linear, time, particle.id).clone());
|
|
13
|
+
}
|
|
14
|
+
const offset = evaluateDynamicVector((_a = this.options.orbitOffset) !== null && _a !== void 0 ? _a : new THREE.Vector3(), time, particle.id).clone();
|
|
15
|
+
const center = particle.start.position.clone().add(offset);
|
|
16
|
+
const fromCenter = particle.position.clone().sub(center);
|
|
17
|
+
if (this.options.orbital !== undefined && fromCenter.lengthSq() > 0) {
|
|
18
|
+
const angularVelocity = evaluateDynamicVector(this.options.orbital, time, particle.id).clone();
|
|
19
|
+
velocity.add(angularVelocity.cross(fromCenter.clone().normalize()));
|
|
20
|
+
}
|
|
21
|
+
if (this.options.radial !== undefined && fromCenter.lengthSq() > 0) {
|
|
22
|
+
velocity.add(fromCenter.normalize().multiplyScalar(evaluateDynamicNumber(this.options.radial, time, particle.id)));
|
|
23
|
+
}
|
|
24
|
+
particle.velocity = velocity;
|
|
25
|
+
if (this.options.speedModifier !== undefined) {
|
|
26
|
+
particle.speed = particle.start.speed * evaluateDynamicNumber(this.options.speedModifier, time, particle.id);
|
|
27
|
+
}
|
|
28
|
+
}, options);
|
|
29
|
+
this.options = options;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default VelocityOverLifetime;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Renderer, { RendererOptions } from '../Renderer';
|
|
3
|
+
import ParticleSystem from '../ParticleSystem';
|
|
4
|
+
import Particle from '../Particle';
|
|
5
|
+
import { DynamicValue } from '../types/DynamicValue';
|
|
6
|
+
export interface PointLightOptions {
|
|
7
|
+
color?: THREE.Color | string | number;
|
|
8
|
+
intensity?: number;
|
|
9
|
+
distance?: number;
|
|
10
|
+
decay?: number;
|
|
11
|
+
power?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface LightRendererOptions extends RendererOptions {
|
|
14
|
+
brightness: DynamicValue<number>;
|
|
15
|
+
rangeMultiplier: DynamicValue<number>;
|
|
16
|
+
groupingRadiusRatio: number;
|
|
17
|
+
decay: number;
|
|
18
|
+
count: number;
|
|
19
|
+
ratio: number;
|
|
20
|
+
randomDistribution: boolean;
|
|
21
|
+
inheritParticleColor: boolean;
|
|
22
|
+
sizeAffectsRange: boolean;
|
|
23
|
+
alphaAffectsIntensity: boolean;
|
|
24
|
+
lightOptions: PointLightOptions;
|
|
25
|
+
}
|
|
26
|
+
declare class LightRenderer extends Renderer {
|
|
27
|
+
lights: THREE.PointLight[];
|
|
28
|
+
groupingRadiusRatio: number;
|
|
29
|
+
brightness: DynamicValue<number>;
|
|
30
|
+
rangeMultiplier: DynamicValue<number>;
|
|
31
|
+
decay: number;
|
|
32
|
+
ratio: number;
|
|
33
|
+
randomDistribution: boolean;
|
|
34
|
+
inheritParticleColor: boolean;
|
|
35
|
+
sizeAffectsRange: boolean;
|
|
36
|
+
alphaAffectsIntensity: boolean;
|
|
37
|
+
lightOptions: PointLightOptions;
|
|
38
|
+
private lightContainer;
|
|
39
|
+
private _count;
|
|
40
|
+
get count(): number;
|
|
41
|
+
set count(value: number);
|
|
42
|
+
constructor(options?: Partial<LightRendererOptions>);
|
|
43
|
+
setup(system: ParticleSystem): void;
|
|
44
|
+
_update(particles: Particle[]): void;
|
|
45
|
+
private _createLight;
|
|
46
|
+
private _getIntensity;
|
|
47
|
+
private _getDistance;
|
|
48
|
+
private _getLightParticles;
|
|
49
|
+
private _getParticleGroups;
|
|
50
|
+
private _getGroupingRadius;
|
|
51
|
+
private _syncLightCount;
|
|
52
|
+
destroy(): void;
|
|
53
|
+
}
|
|
54
|
+
export default LightRenderer;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Renderer from '../Renderer';
|
|
3
|
+
import evaluateDynamicNumber from '../helpers/evaluateDynamicNumber';
|
|
4
|
+
import particleRatio from '../helpers/particleRatio';
|
|
5
|
+
class LightRenderer extends Renderer {
|
|
6
|
+
get count() {
|
|
7
|
+
return this._count;
|
|
8
|
+
}
|
|
9
|
+
set count(value) {
|
|
10
|
+
const next = Number.isFinite(value)
|
|
11
|
+
? Math.max(0, Math.floor(value))
|
|
12
|
+
: 0;
|
|
13
|
+
if (next === this._count)
|
|
14
|
+
return;
|
|
15
|
+
this._count = next;
|
|
16
|
+
this._syncLightCount();
|
|
17
|
+
}
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
20
|
+
super(options);
|
|
21
|
+
this.lights = [];
|
|
22
|
+
this.lightContainer = new THREE.Object3D();
|
|
23
|
+
this._count = 0;
|
|
24
|
+
this.brightness = (_a = options.brightness) !== null && _a !== void 0 ? _a : 1;
|
|
25
|
+
this.rangeMultiplier = (_b = options.rangeMultiplier) !== null && _b !== void 0 ? _b : 1;
|
|
26
|
+
this.groupingRadiusRatio = (_c = options.groupingRadiusRatio) !== null && _c !== void 0 ? _c : 0.25;
|
|
27
|
+
this.lightOptions = (_d = options.lightOptions) !== null && _d !== void 0 ? _d : {};
|
|
28
|
+
this.decay = (_f = (_e = options.decay) !== null && _e !== void 0 ? _e : this.lightOptions.decay) !== null && _f !== void 0 ? _f : 2;
|
|
29
|
+
this.count = (_g = options.count) !== null && _g !== void 0 ? _g : 50;
|
|
30
|
+
this.ratio = Math.min(Math.max((_h = options.ratio) !== null && _h !== void 0 ? _h : 1, 0), 1);
|
|
31
|
+
this.randomDistribution = (_j = options.randomDistribution) !== null && _j !== void 0 ? _j : true;
|
|
32
|
+
this.inheritParticleColor = (_k = options.inheritParticleColor) !== null && _k !== void 0 ? _k : true;
|
|
33
|
+
this.sizeAffectsRange = (_l = options.sizeAffectsRange) !== null && _l !== void 0 ? _l : false;
|
|
34
|
+
this.alphaAffectsIntensity = (_m = options.alphaAffectsIntensity) !== null && _m !== void 0 ? _m : false;
|
|
35
|
+
}
|
|
36
|
+
setup(system) {
|
|
37
|
+
system.addRendererObject(this.lightContainer);
|
|
38
|
+
}
|
|
39
|
+
_update(particles) {
|
|
40
|
+
const lightParticles = this._getLightParticles(particles);
|
|
41
|
+
const groups = this._getParticleGroups(lightParticles).slice(0, this.count);
|
|
42
|
+
if (groups.length < this.lights.length) {
|
|
43
|
+
// To reduce initialization lag, just turn intensity to 0
|
|
44
|
+
[...this.lights].splice(groups.length).forEach((light) => { light.intensity = 0; });
|
|
45
|
+
}
|
|
46
|
+
groups.forEach((group, index) => {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
const light = this.lights[index];
|
|
49
|
+
if (!light)
|
|
50
|
+
return;
|
|
51
|
+
const position = group.reduce((sum, value) => sum.add(value.position), new THREE.Vector3(0, 0, 0)).divideScalar(group.length);
|
|
52
|
+
light.position.set(position.x, position.y, position.z);
|
|
53
|
+
const color = new THREE.Color((_a = this.lightOptions.color) !== null && _a !== void 0 ? _a : 0xffffff);
|
|
54
|
+
if (this.inheritParticleColor) {
|
|
55
|
+
color.multiply(group.reduce((sum, value) => sum.add(value.color), new THREE.Color(0x000000)).multiplyScalar(1 / group.length));
|
|
56
|
+
}
|
|
57
|
+
light.color = color;
|
|
58
|
+
light.decay = (_b = this.lightOptions.decay) !== null && _b !== void 0 ? _b : this.decay;
|
|
59
|
+
light.distance = this._getDistance(group);
|
|
60
|
+
light.intensity = group.reduce((sum, value) => sum + this._getIntensity(value), 0) / group.length;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
_createLight() {
|
|
64
|
+
var _a, _b;
|
|
65
|
+
const light = new THREE.PointLight((_a = this.lightOptions.color) !== null && _a !== void 0 ? _a : 0xffffff, 0, (_b = this.lightOptions.distance) !== null && _b !== void 0 ? _b : 0, this.decay);
|
|
66
|
+
if (this.lightOptions.power !== undefined)
|
|
67
|
+
light.power = this.lightOptions.power;
|
|
68
|
+
return light;
|
|
69
|
+
}
|
|
70
|
+
_getIntensity(particle) {
|
|
71
|
+
var _a;
|
|
72
|
+
let intensity = ((_a = this.lightOptions.intensity) !== null && _a !== void 0 ? _a : 1)
|
|
73
|
+
* evaluateDynamicNumber(this.brightness, particle.time, particle.id);
|
|
74
|
+
if (this.alphaAffectsIntensity) {
|
|
75
|
+
intensity *= particle.alpha;
|
|
76
|
+
}
|
|
77
|
+
return intensity;
|
|
78
|
+
}
|
|
79
|
+
_getDistance(group) {
|
|
80
|
+
var _a;
|
|
81
|
+
const distance = (_a = this.lightOptions.distance) !== null && _a !== void 0 ? _a : 0;
|
|
82
|
+
if (distance === 0)
|
|
83
|
+
return 0;
|
|
84
|
+
return group.reduce((sum, particle) => {
|
|
85
|
+
let range = distance * evaluateDynamicNumber(this.rangeMultiplier, particle.time, particle.id);
|
|
86
|
+
if (this.sizeAffectsRange) {
|
|
87
|
+
range *= (particle.scale.x + particle.scale.y + particle.scale.z) / 3;
|
|
88
|
+
}
|
|
89
|
+
return sum + range;
|
|
90
|
+
}, 0) / group.length;
|
|
91
|
+
}
|
|
92
|
+
_getLightParticles(particles) {
|
|
93
|
+
if (this.ratio <= 0)
|
|
94
|
+
return [];
|
|
95
|
+
if (this.ratio >= 1)
|
|
96
|
+
return particles;
|
|
97
|
+
if (this.randomDistribution) {
|
|
98
|
+
return particles.filter((particle) => particleRatio(particle, this.ratio));
|
|
99
|
+
}
|
|
100
|
+
const step = Math.max(1, Math.round(1 / this.ratio));
|
|
101
|
+
return particles.filter((particle, index) => index % step === 0);
|
|
102
|
+
}
|
|
103
|
+
_getParticleGroups(particles) {
|
|
104
|
+
if (particles.length === 0)
|
|
105
|
+
return [];
|
|
106
|
+
// Group particle
|
|
107
|
+
let particlesCopy = [...particles];
|
|
108
|
+
const radius = this._getGroupingRadius(particles);
|
|
109
|
+
const groups = [[particlesCopy[0]]];
|
|
110
|
+
particlesCopy.splice(0, 1);
|
|
111
|
+
while (particlesCopy.length > 0) {
|
|
112
|
+
// Get group
|
|
113
|
+
const group = particlesCopy.filter((p) => particlesCopy[0].position.distanceTo(p.position) <= radius);
|
|
114
|
+
// Remove group from particlesCopy
|
|
115
|
+
particlesCopy = particlesCopy.filter((p) => particlesCopy[0].position.distanceTo(p.position) > radius);
|
|
116
|
+
groups.push(group);
|
|
117
|
+
}
|
|
118
|
+
return groups;
|
|
119
|
+
}
|
|
120
|
+
_getGroupingRadius(particles) {
|
|
121
|
+
const range = particles.reduce((highest, next) => (highest > next.position.length() ? highest : next.position.length()), 0) * 2;
|
|
122
|
+
return this.groupingRadiusRatio * range;
|
|
123
|
+
}
|
|
124
|
+
_syncLightCount() {
|
|
125
|
+
while (this.lights.length < this._count) {
|
|
126
|
+
const light = this._createLight();
|
|
127
|
+
this.lights.push(light);
|
|
128
|
+
this.lightContainer.add(light);
|
|
129
|
+
}
|
|
130
|
+
if (this.lights.length > this._count) {
|
|
131
|
+
const removed = this.lights.splice(this._count);
|
|
132
|
+
removed.forEach((light) => {
|
|
133
|
+
light.removeFromParent();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
destroy() {
|
|
138
|
+
this.lightContainer.removeFromParent();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export default LightRenderer;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Renderer, { RendererOptions } from '../Renderer';
|
|
3
|
+
import ParticleSystem from '../ParticleSystem';
|
|
4
|
+
import Particle from '../Particle';
|
|
5
|
+
export interface MeshRendererOptions extends RendererOptions {
|
|
6
|
+
mesh: THREE.Mesh;
|
|
7
|
+
maxParticles: number;
|
|
8
|
+
geometry: THREE.BufferGeometry;
|
|
9
|
+
material: THREE.MeshStandardMaterial;
|
|
10
|
+
materialOptions: THREE.MeshStandardMaterialParameters;
|
|
11
|
+
castShadow: boolean;
|
|
12
|
+
receiveShadow: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare class MeshRenderer extends Renderer {
|
|
15
|
+
mesh: THREE.Mesh;
|
|
16
|
+
instances: THREE.InstancedMesh;
|
|
17
|
+
castShadow: boolean;
|
|
18
|
+
receiveShadow: boolean;
|
|
19
|
+
private _alphaAttr;
|
|
20
|
+
private dummy;
|
|
21
|
+
constructor(options?: Partial<MeshRendererOptions>);
|
|
22
|
+
setup(system: ParticleSystem): void;
|
|
23
|
+
_update(particles: Particle[]): void;
|
|
24
|
+
destroy(): void;
|
|
25
|
+
private preprocessMaterial;
|
|
26
|
+
}
|
|
27
|
+
export default MeshRenderer;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { attribute } from 'three/src/nodes/core/AttributeNode.js';
|
|
3
|
+
import Renderer from '../Renderer';
|
|
4
|
+
class MeshRenderer extends Renderer {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
7
|
+
super(options);
|
|
8
|
+
this.castShadow = false;
|
|
9
|
+
this.receiveShadow = false;
|
|
10
|
+
this.mesh = (_a = options.mesh) !== null && _a !== void 0 ? _a : new THREE.Mesh((_b = options.geometry) !== null && _b !== void 0 ? _b : new THREE.SphereGeometry(), (_c = options.material) !== null && _c !== void 0 ? _c : new THREE.MeshStandardMaterial(options.materialOptions));
|
|
11
|
+
this.instances = new THREE.InstancedMesh(this.mesh.geometry, this.mesh.material, (_d = options.maxParticles) !== null && _d !== void 0 ? _d : 10000);
|
|
12
|
+
this.instances.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
|
|
13
|
+
this.instances.frustumCulled = false;
|
|
14
|
+
this.instances.setColorAt(0, new THREE.Color(1, 1, 1));
|
|
15
|
+
this.castShadow = (_e = options.castShadow) !== null && _e !== void 0 ? _e : this.castShadow;
|
|
16
|
+
this.receiveShadow = (_f = options.receiveShadow) !== null && _f !== void 0 ? _f : this.receiveShadow;
|
|
17
|
+
this._alphaAttr = new THREE.InstancedBufferAttribute(new Float32Array((_g = options.maxParticles) !== null && _g !== void 0 ? _g : 10000), 1);
|
|
18
|
+
this.mesh.geometry.setAttribute('instanceAlpha', this._alphaAttr);
|
|
19
|
+
this.dummy = new THREE.Object3D();
|
|
20
|
+
this.preprocessMaterial(this.mesh.material);
|
|
21
|
+
}
|
|
22
|
+
setup(system) {
|
|
23
|
+
system.addRendererObject(this.instances);
|
|
24
|
+
}
|
|
25
|
+
_update(particles) {
|
|
26
|
+
this.instances.count = particles.length;
|
|
27
|
+
this.instances.castShadow = this.castShadow;
|
|
28
|
+
this.instances.receiveShadow = this.receiveShadow;
|
|
29
|
+
particles.forEach((particle, i) => {
|
|
30
|
+
this.dummy.position.set(...particle.position.toArray());
|
|
31
|
+
this.dummy.rotation.set(...particle.rotation.toArray());
|
|
32
|
+
this.dummy.scale.set(...particle.scale.toArray());
|
|
33
|
+
this.dummy.updateMatrix();
|
|
34
|
+
this.instances.setMatrixAt(i, this.dummy.matrix);
|
|
35
|
+
this.instances.setColorAt(i, particle.color);
|
|
36
|
+
this._alphaAttr.setX(i, particle.alpha);
|
|
37
|
+
});
|
|
38
|
+
if (this.instances.instanceColor)
|
|
39
|
+
this.instances.instanceColor.needsUpdate = true;
|
|
40
|
+
this.instances.instanceMatrix.needsUpdate = true;
|
|
41
|
+
this._alphaAttr.needsUpdate = true;
|
|
42
|
+
}
|
|
43
|
+
destroy() {
|
|
44
|
+
this.instances.removeFromParent();
|
|
45
|
+
}
|
|
46
|
+
preprocessMaterial(material) {
|
|
47
|
+
if (Array.isArray(material))
|
|
48
|
+
return material.forEach((mat) => this.preprocessMaterial(mat));
|
|
49
|
+
material.transparent = true;
|
|
50
|
+
material.opacityNode =
|
|
51
|
+
attribute('instanceAlpha', 'float');
|
|
52
|
+
material.onBeforeCompile = (shader) => {
|
|
53
|
+
shader.vertexShader = `
|
|
54
|
+
attribute float instanceAlpha;
|
|
55
|
+
varying float vInstanceAlpha;
|
|
56
|
+
${shader.vertexShader}
|
|
57
|
+
`.replace('#include <begin_vertex>', `
|
|
58
|
+
#include <begin_vertex>
|
|
59
|
+
vInstanceAlpha = instanceAlpha;`);
|
|
60
|
+
shader.fragmentShader = `
|
|
61
|
+
varying float vInstanceAlpha;
|
|
62
|
+
${shader.fragmentShader}
|
|
63
|
+
`.replace('#include <opaque_fragment>', `
|
|
64
|
+
#include <opaque_fragment>
|
|
65
|
+
gl_FragColor.a *= vInstanceAlpha;`);
|
|
66
|
+
};
|
|
67
|
+
material.needsUpdate = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export default MeshRenderer;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import Renderer, { RendererOptions } from '../Renderer';
|
|
3
|
+
import Particle from '../Particle';
|
|
4
|
+
import ParticleSystem from '../ParticleSystem';
|
|
5
|
+
import { UnlitSpriteOptions } from '../materials/UnlitSprite';
|
|
6
|
+
import { BasicSpriteOptions } from '../materials/BasicSprite';
|
|
7
|
+
import { DynamicValue } from '../types/DynamicValue';
|
|
8
|
+
import { SpriteMaterialType } from '../enums/SpriteMaterialType';
|
|
9
|
+
export declare const SPRITE_RENDERER_USER_DATA_KEY = "__rzmps_spriteRenderer";
|
|
10
|
+
export declare const SCENE_DEPTH_DATA_USER_DATA_KEY = "__rzmps_sceneDepthData";
|
|
11
|
+
export declare const WEBGPU_SCENE_DEPTH_DATA_USER_DATA_KEY = "__rzmps_webgpuSceneDepthData";
|
|
12
|
+
export declare const WEBGPU_SCENE_DEPTH_TEXTURE: THREE.DepthTexture<THREE.DepthTextureImageData>;
|
|
13
|
+
export interface SpriteRendererOptions extends RendererOptions {
|
|
14
|
+
fps: DynamicValue<number>;
|
|
15
|
+
tileSize: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
};
|
|
19
|
+
tileMargin: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
};
|
|
23
|
+
gridSize: {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
};
|
|
27
|
+
frames: number;
|
|
28
|
+
randomStartFrame: boolean;
|
|
29
|
+
alphaMap: string | THREE.Texture;
|
|
30
|
+
material: SpriteMaterialType | `${SpriteMaterialType}`;
|
|
31
|
+
materialOptions: BasicSpriteOptions | UnlitSpriteOptions;
|
|
32
|
+
castShadow: boolean;
|
|
33
|
+
softParticleDistance: number;
|
|
34
|
+
}
|
|
35
|
+
declare class SpriteRenderer extends Renderer {
|
|
36
|
+
texture: THREE.Texture;
|
|
37
|
+
frames: number;
|
|
38
|
+
alphaMap?: THREE.Texture;
|
|
39
|
+
materialType: SpriteMaterialType;
|
|
40
|
+
tileSize: THREE.Vector2;
|
|
41
|
+
tileMargin: THREE.Vector2;
|
|
42
|
+
gridSize: THREE.Vector2;
|
|
43
|
+
fps: DynamicValue<number>;
|
|
44
|
+
randomStartFrame: boolean;
|
|
45
|
+
castShadow: boolean;
|
|
46
|
+
softParticleDistance: number;
|
|
47
|
+
private material;
|
|
48
|
+
private webgpuMaterial;
|
|
49
|
+
private readonly hiddenMaterial;
|
|
50
|
+
private _materialOptions;
|
|
51
|
+
get materialOptions(): BasicSpriteOptions | UnlitSpriteOptions | undefined;
|
|
52
|
+
set materialOptions(value: BasicSpriteOptions | UnlitSpriteOptions | undefined);
|
|
53
|
+
private environmentSource?;
|
|
54
|
+
private environmentRenderer?;
|
|
55
|
+
private environmentRenderTarget?;
|
|
56
|
+
private readonly geometry;
|
|
57
|
+
private readonly points;
|
|
58
|
+
private readonly webgpuGeometry;
|
|
59
|
+
private readonly webgpuMesh;
|
|
60
|
+
private webgpuFrameAttribute;
|
|
61
|
+
private webgpuAlphaAttribute;
|
|
62
|
+
private webgpuCapacity;
|
|
63
|
+
private readonly matrix;
|
|
64
|
+
private readonly quaternion;
|
|
65
|
+
private readonly cameraQuaternion;
|
|
66
|
+
private readonly rollQuaternion;
|
|
67
|
+
private readonly rollAxis;
|
|
68
|
+
private readonly scaleVector;
|
|
69
|
+
private readonly color;
|
|
70
|
+
constructor(texture?: string | THREE.Texture, options?: Partial<SpriteRendererOptions>);
|
|
71
|
+
setup(system: ParticleSystem): void;
|
|
72
|
+
_update(particles: Particle[], system: ParticleSystem): void;
|
|
73
|
+
private updateAttributes;
|
|
74
|
+
destroy(): void;
|
|
75
|
+
private loadMaterial;
|
|
76
|
+
private loadWebGPUMaterial;
|
|
77
|
+
private isWebGPURenderer;
|
|
78
|
+
private setActiveRenderer;
|
|
79
|
+
private updateWebGPUInstances;
|
|
80
|
+
private getWebGPUWorldScale;
|
|
81
|
+
private getParticleFrame;
|
|
82
|
+
private updateWebGPUEnvironmentMap;
|
|
83
|
+
private updateWebGPUSoftParticles;
|
|
84
|
+
private updateEnvironmentMap;
|
|
85
|
+
private setEnvironmentMap;
|
|
86
|
+
private setUniformValue;
|
|
87
|
+
private getUniformValue;
|
|
88
|
+
private getSceneDepth;
|
|
89
|
+
private getWebGPUSceneDepth;
|
|
90
|
+
private hideSpriteRenderers;
|
|
91
|
+
private hideParticleRenderers;
|
|
92
|
+
private restoreSpriteRenderers;
|
|
93
|
+
private restoreParticleRenderers;
|
|
94
|
+
}
|
|
95
|
+
export default SpriteRenderer;
|