sparcoon 0.0.7 → 0.1.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/dist/_virtual/2d.js +3 -0
- package/dist/_virtual/3d.js +3 -0
- package/dist/_virtual/4d.js +3 -0
- package/dist/_virtual/mod.js +5 -0
- package/dist/_virtual/mod2.js +3 -0
- package/dist/behaviorModules/FXBehaviorTorqueNoise.d.ts +1 -1
- package/dist/behaviorModules/FXBehaviorTorqueNoise.js +3 -1
- package/dist/behaviorModules/FXBehaviorVelocityNoise.d.ts +1 -1
- package/dist/behaviorModules/FXBehaviorVelocityNoise.js +8 -4
- package/dist/elements/FXEmitter.Internal.d.ts +6 -4
- package/dist/elements/FXEmitter.Internal.js +8 -1
- package/dist/elements/FXEmitter.d.ts +7 -0
- package/dist/elements/FXEmitter.js +12 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/instancedParticle/FXInstancedParticle.Internal.js +2 -1
- package/dist/instancedParticle/FXInstancedParticle.d.ts +4 -2
- package/dist/instancedParticle/FXInstancedParticle.js +10 -5
- package/dist/instancedParticle/FXParticleDepthMaterial.d.ts +2 -0
- package/dist/instancedParticle/FXParticleDepthMaterial.js +52 -0
- package/dist/instancedParticle/FXParticleLambertMaterial.d.ts +4 -0
- package/dist/instancedParticle/FXParticleLambertMaterial.js +152 -0
- package/dist/instancedParticle/FXParticleNormalsMode.d.ts +5 -0
- package/dist/instancedParticle/FXParticleNormalsMode.js +8 -0
- package/dist/instancedParticle/FXParticleRenderingMode.d.ts +4 -0
- package/dist/instancedParticle/FXParticleRenderingMode.js +7 -0
- package/dist/miscellaneous/miscellaneous.d.ts +0 -1
- package/dist/miscellaneous/miscellaneous.js +1 -5
- package/dist/node_modules/fast-simplex-noise/lib/2d.js +93 -0
- package/dist/node_modules/fast-simplex-noise/lib/3d.js +142 -0
- package/dist/node_modules/fast-simplex-noise/lib/4d.js +196 -0
- package/dist/node_modules/fast-simplex-noise/lib/mod.js +24 -0
- package/dist/renderingModules/FXRenderingShadow.d.ts +12 -0
- package/dist/shaders/FXRenderingAnimatedTexture.glsl.js +1 -1
- package/dist/shaders/FXRenderingColorOverLife.glsl.js +1 -1
- package/dist/shaders/FXRenderingColorOverVelocity.glsl.js +1 -1
- package/dist/shaders/FXRenderingTexture.glsl.js +1 -1
- package/package.json +7 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { FXRange, FXRangeConfig } from "../miscellaneous/miscellaneous";
|
|
2
2
|
import { FXBehaviorModule } from "./FXBehaviorModule";
|
|
3
3
|
/**
|
|
4
4
|
* Applies noise-based angular acceleration to particles.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { m as modExports } from '../_virtual/mod.js';
|
|
1
2
|
import { MathUtils } from 'three';
|
|
2
3
|
import { assertValidPositiveNumber, assertValidNonNegativeNumber } from '../miscellaneous/asserts.js';
|
|
3
|
-
import { resolveFXRangeConfig, BUILTIN_OFFSET_RANDOM_C,
|
|
4
|
+
import { resolveFXRangeConfig, BUILTIN_OFFSET_RANDOM_C, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_TORQUE } from '../miscellaneous/miscellaneous.js';
|
|
4
5
|
import { FXBehaviorModule } from './FXBehaviorModule.js';
|
|
5
6
|
|
|
7
|
+
const generateNoise3D = modExports.makeNoise3D();
|
|
6
8
|
/**
|
|
7
9
|
* Applies noise-based angular acceleration to particles.
|
|
8
10
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { FXRange, FXRangeConfig } from "../miscellaneous/miscellaneous";
|
|
2
2
|
import { FXBehaviorModule } from "./FXBehaviorModule";
|
|
3
3
|
/**
|
|
4
4
|
* Applies noise-based acceleration to particles.
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { m as modExports } from '../_virtual/mod.js';
|
|
1
2
|
import { MathUtils } from 'three';
|
|
2
3
|
import { assertValidPositiveNumber, assertValidNonNegativeNumber } from '../miscellaneous/asserts.js';
|
|
3
|
-
import { resolveFXRangeConfig, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_RANDOM_C, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_VELOCITY_X, BUILTIN_OFFSET_VELOCITY_Y, BUILTIN_OFFSET_VELOCITY_Z
|
|
4
|
+
import { resolveFXRangeConfig, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_RANDOM_C, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_VELOCITY_X, BUILTIN_OFFSET_VELOCITY_Y, BUILTIN_OFFSET_VELOCITY_Z } from '../miscellaneous/miscellaneous.js';
|
|
4
5
|
import { FXBehaviorModule } from './FXBehaviorModule.js';
|
|
5
6
|
|
|
7
|
+
const generateNoise3D0 = modExports.makeNoise3D();
|
|
8
|
+
const generateNoise3D1 = modExports.makeNoise3D();
|
|
9
|
+
const generateNoise3D2 = modExports.makeNoise3D();
|
|
6
10
|
/**
|
|
7
11
|
* Applies noise-based acceleration to particles.
|
|
8
12
|
*
|
|
@@ -56,9 +60,9 @@ class FXBehaviorVelocityNoise extends FXBehaviorModule {
|
|
|
56
60
|
// Constant over the life of a particle but different for each particle
|
|
57
61
|
const scaleT = array[itemOffset + BUILTIN_OFFSET_RANDOM_C];
|
|
58
62
|
const scale = MathUtils.lerp(this._private_scaleInternal.min, this._private_scaleInternal.max, scaleT);
|
|
59
|
-
const noiseX =
|
|
60
|
-
const noiseY =
|
|
61
|
-
const noiseZ =
|
|
63
|
+
const noiseX = generateNoise3D0(x * scale, y * scale, z * scale);
|
|
64
|
+
const noiseY = generateNoise3D1(x * scale, y * scale, z * scale);
|
|
65
|
+
const noiseZ = generateNoise3D2(x * scale, y * scale, z * scale);
|
|
62
66
|
// Constant over the life of a particle but different for each particle
|
|
63
67
|
const strengthT = array[itemOffset + BUILTIN_OFFSET_RANDOM_A];
|
|
64
68
|
const strength = MathUtils.lerp(this._private_strengthInternal.min, this._private_strengthInternal.max, strengthT);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
capacityStep: number;
|
|
4
|
-
}
|
|
1
|
+
import { FXParticleNormalsMode } from "../instancedParticle/FXParticleNormalsMode";
|
|
2
|
+
import { FXParticleRenderingMode } from "../instancedParticle/FXParticleRenderingMode";
|
|
5
3
|
export interface FXEmitterPlayOptions {
|
|
6
4
|
duration: number;
|
|
7
5
|
}
|
|
8
6
|
export declare const EMITTER_DEFAULT_EXPECTED_CAPACITY = 32;
|
|
9
7
|
export declare const EMITTER_DEFAULT_CAPACITY_STEP = 32;
|
|
10
8
|
export declare const EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES = true;
|
|
9
|
+
export declare const EMITTER_DEFAULT_CAST_SHADOW = false;
|
|
10
|
+
export declare const EMITTER_DEFAULT_RECEIVE_SHADOW = false;
|
|
11
|
+
export declare const EMITTER_DEFAULT_RENDERING_MODE = FXParticleRenderingMode.Unlit;
|
|
12
|
+
export declare const EMITTER_DEFAULT_NORMALS_MODE = FXParticleNormalsMode.Flat;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
import { FXParticleNormalsMode } from '../instancedParticle/FXParticleNormalsMode.js';
|
|
2
|
+
import { FXParticleRenderingMode } from '../instancedParticle/FXParticleRenderingMode.js';
|
|
3
|
+
|
|
1
4
|
const EMITTER_DEFAULT_EXPECTED_CAPACITY = 32;
|
|
2
5
|
const EMITTER_DEFAULT_CAPACITY_STEP = 32;
|
|
3
6
|
const EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES = true;
|
|
7
|
+
const EMITTER_DEFAULT_CAST_SHADOW = false;
|
|
8
|
+
const EMITTER_DEFAULT_RECEIVE_SHADOW = false;
|
|
9
|
+
const EMITTER_DEFAULT_RENDERING_MODE = FXParticleRenderingMode.Unlit;
|
|
10
|
+
const EMITTER_DEFAULT_NORMALS_MODE = FXParticleNormalsMode.Flat;
|
|
4
11
|
|
|
5
|
-
export { EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES, EMITTER_DEFAULT_CAPACITY_STEP, EMITTER_DEFAULT_EXPECTED_CAPACITY };
|
|
12
|
+
export { EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES, EMITTER_DEFAULT_CAPACITY_STEP, EMITTER_DEFAULT_CAST_SHADOW, EMITTER_DEFAULT_EXPECTED_CAPACITY, EMITTER_DEFAULT_NORMALS_MODE, EMITTER_DEFAULT_RECEIVE_SHADOW, EMITTER_DEFAULT_RENDERING_MODE };
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { Object3D, type Blending } from "three";
|
|
2
2
|
import type { FXBehaviorModule } from "../behaviorModules/FXBehaviorModule";
|
|
3
|
+
import { FXParticleNormalsMode } from "../instancedParticle/FXParticleNormalsMode";
|
|
4
|
+
import { FXParticleRenderingMode } from "../instancedParticle/FXParticleRenderingMode";
|
|
3
5
|
import type { FXRenderingModule } from "../renderingModules/FXRenderingModule";
|
|
4
6
|
import type { FXSpawnModule } from "../spawnModules/FXSpawnModule";
|
|
5
7
|
import type { FXEmitterPlayOptions } from "./FXEmitter.Internal";
|
|
8
|
+
export { FXParticleNormalsMode, FXParticleRenderingMode };
|
|
6
9
|
export interface FXEmitterOptions {
|
|
7
10
|
expectedCapacity: number;
|
|
8
11
|
capacityStep: number;
|
|
9
12
|
automaticallyDestroyModules: boolean;
|
|
10
13
|
blending: Blending;
|
|
11
14
|
useAlphaHashing: boolean;
|
|
15
|
+
castShadow: boolean;
|
|
16
|
+
receiveShadow: boolean;
|
|
17
|
+
renderingMode: FXParticleRenderingMode;
|
|
18
|
+
normalsMode: FXParticleNormalsMode;
|
|
12
19
|
}
|
|
13
20
|
export declare class FXEmitter extends Object3D {
|
|
14
21
|
private readonly spawnSequence;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { Object3D, NormalBlending } from 'three';
|
|
2
2
|
import { FXInstancedParticle } from '../instancedParticle/FXInstancedParticle.js';
|
|
3
3
|
import { collectProperties, collectUniforms } from '../instancedParticle/FXInstancedParticle.Internal.js';
|
|
4
|
+
import { buildParticleDepthMaterial } from '../instancedParticle/FXParticleDepthMaterial.js';
|
|
5
|
+
export { FXParticleNormalsMode } from '../instancedParticle/FXParticleNormalsMode.js';
|
|
6
|
+
export { FXParticleRenderingMode } from '../instancedParticle/FXParticleRenderingMode.js';
|
|
4
7
|
import { resolveGLSLTypeInfo } from '../instancedParticle/shared.js';
|
|
5
8
|
import { BUILTIN_OFFSET_AGE, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_VELOCITY_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_VELOCITY_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_VELOCITY_Z, BUILTIN_OFFSET_ROTATION, BUILTIN_OFFSET_TORQUE, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_RANDOM_B, BUILTIN_OFFSET_RANDOM_C } from '../miscellaneous/miscellaneous.js';
|
|
6
|
-
import { EMITTER_DEFAULT_EXPECTED_CAPACITY, EMITTER_DEFAULT_CAPACITY_STEP, EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES } from './FXEmitter.Internal.js';
|
|
9
|
+
import { EMITTER_DEFAULT_EXPECTED_CAPACITY, EMITTER_DEFAULT_CAPACITY_STEP, EMITTER_DEFAULT_RENDERING_MODE, EMITTER_DEFAULT_NORMALS_MODE, EMITTER_DEFAULT_CAST_SHADOW, EMITTER_DEFAULT_RECEIVE_SHADOW, EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES } from './FXEmitter.Internal.js';
|
|
7
10
|
|
|
8
11
|
const INSTANCES = new Array();
|
|
9
12
|
class FXEmitter extends Object3D {
|
|
@@ -80,7 +83,14 @@ class FXEmitter extends Object3D {
|
|
|
80
83
|
collectProperties(collectedProperties, _private_renderingSequence, "FXEmitter.constructor.renderingSequence");
|
|
81
84
|
const collectedUniforms = {};
|
|
82
85
|
collectUniforms(collectedUniforms, _private_renderingSequence, "FXEmitter.constructor.renderingSequence");
|
|
83
|
-
this._private_mesh = new FXInstancedParticle(
|
|
86
|
+
this._private_mesh = new FXInstancedParticle(_private_renderingSequence.map((module) => module.source), collectedUniforms, collectedProperties, options.expectedCapacity ?? EMITTER_DEFAULT_EXPECTED_CAPACITY, options.capacityStep ?? EMITTER_DEFAULT_CAPACITY_STEP, options.blending ?? NormalBlending, options.useAlphaHashing ?? false, options.renderingMode ?? EMITTER_DEFAULT_RENDERING_MODE, options.normalsMode ?? EMITTER_DEFAULT_NORMALS_MODE);
|
|
87
|
+
if (options.castShadow ?? EMITTER_DEFAULT_CAST_SHADOW) {
|
|
88
|
+
this._private_mesh.castShadow = true;
|
|
89
|
+
this._private_mesh.customDepthMaterial = buildParticleDepthMaterial();
|
|
90
|
+
}
|
|
91
|
+
if (options.receiveShadow ?? EMITTER_DEFAULT_RECEIVE_SHADOW) {
|
|
92
|
+
this._private_mesh.receiveShadow = true;
|
|
93
|
+
}
|
|
84
94
|
this.automaticallyDestroyModules =
|
|
85
95
|
options.automaticallyDestroyModules ?? EMITTER_DEFAULT_AUTOMATICALLY_DESTROY_MODULES;
|
|
86
96
|
this.add(this._private_mesh);
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { FXBehaviorTorqueNoise } from "./behaviorModules/FXBehaviorTorqueNoise";
|
|
|
6
6
|
export { FXBehaviorVelocityDamping } from "./behaviorModules/FXBehaviorVelocityDamping";
|
|
7
7
|
export { FXBehaviorVelocityNoise } from "./behaviorModules/FXBehaviorVelocityNoise";
|
|
8
8
|
export { FXColor } from "./color/FXColor";
|
|
9
|
-
export { FXEmitter } from "./elements/FXEmitter";
|
|
9
|
+
export { FXEmitter, FXParticleNormalsMode, FXParticleRenderingMode } from "./elements/FXEmitter";
|
|
10
10
|
export { FXRenderingAnimatedTexture } from "./renderingModules/FXRenderingAnimatedTexture";
|
|
11
11
|
export { FXRenderingColorOverLife } from "./renderingModules/FXRenderingColorOverLife";
|
|
12
12
|
export { FXRenderingColorOverVelocity } from "./renderingModules/FXRenderingColorOverVelocity";
|
package/dist/index.js
CHANGED
|
@@ -18,3 +18,5 @@ export { FXSpawnRandomRotation } from './spawnModules/FXSpawnRandomRotation.js';
|
|
|
18
18
|
export { FXSpawnRandomScale } from './spawnModules/FXSpawnRandomScale.js';
|
|
19
19
|
export { FXSpawnRandomTorque } from './spawnModules/FXSpawnRandomTorque.js';
|
|
20
20
|
export { FXSpawnRandomVelocity } from './spawnModules/FXSpawnRandomVelocity.js';
|
|
21
|
+
export { FXParticleNormalsMode } from './instancedParticle/FXParticleNormalsMode.js';
|
|
22
|
+
export { FXParticleRenderingMode } from './instancedParticle/FXParticleRenderingMode.js';
|
|
@@ -121,8 +121,9 @@ function buildParticleFragmentShader(uniformDeclarations, varyingDeclarations, s
|
|
|
121
121
|
drawCalls += `draw${i}()`;
|
|
122
122
|
}
|
|
123
123
|
return `
|
|
124
|
+
#include <common>
|
|
125
|
+
|
|
124
126
|
// Defines
|
|
125
|
-
#define PI 3.14159265359
|
|
126
127
|
#define SRGB_SUPPORTED ${checkSRGBSupport() ? "1" : "0"}
|
|
127
128
|
|
|
128
129
|
#define PARTICLE_POSITION_X p_builtin[0][0]
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { Blending } from "three";
|
|
2
2
|
import { InstancedBufferAttribute, Mesh } from "three";
|
|
3
|
+
import { FXParticleNormalsMode } from "./FXParticleNormalsMode";
|
|
4
|
+
import { FXParticleRenderingMode } from "./FXParticleRenderingMode";
|
|
3
5
|
import type { GLProperty, GLTypeInfo } from "./shared";
|
|
4
6
|
export declare class FXInstancedParticle extends Mesh {
|
|
5
7
|
private readonly capacityStep;
|
|
6
8
|
readonly propertyBuffers: Record<string, InstancedBufferAttribute>;
|
|
7
9
|
private readonly instancedGeometry;
|
|
8
|
-
private readonly
|
|
10
|
+
private readonly particleMaterial;
|
|
9
11
|
private capacity;
|
|
10
|
-
constructor(sources: string[], uniforms: Record<string, GLProperty>, varyings: Record<string, GLTypeInfo>, expectedCapacity: number, capacityStep: number, blending: Blending, useAlphaHashing: boolean);
|
|
12
|
+
constructor(sources: string[], uniforms: Record<string, GLProperty>, varyings: Record<string, GLTypeInfo>, expectedCapacity: number, capacityStep: number, blending: Blending, useAlphaHashing: boolean, renderingMode: FXParticleRenderingMode, normalsMode: FXParticleNormalsMode);
|
|
11
13
|
get instanceCount(): number;
|
|
12
14
|
createInstances(count: number): void;
|
|
13
15
|
removeDeadParticles(): void;
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { Mesh, InstancedBufferAttribute, StreamDrawUsage } from 'three';
|
|
2
2
|
import { BUILTIN_OFFSET_AGE, BUILTIN_OFFSET_LIFETIME } from '../miscellaneous/miscellaneous.js';
|
|
3
3
|
import { INSTANCED_PARTICLE_GEOMETRY, buildParticleMaterial } from './FXInstancedParticle.Internal.js';
|
|
4
|
+
import { buildParticleLambertMaterial } from './FXParticleLambertMaterial.js';
|
|
5
|
+
import './FXParticleNormalsMode.js';
|
|
6
|
+
import { FXParticleRenderingMode } from './FXParticleRenderingMode.js';
|
|
4
7
|
|
|
5
8
|
class FXInstancedParticle extends Mesh {
|
|
6
|
-
constructor(sources, uniforms, varyings, expectedCapacity, _private_capacityStep, blending, useAlphaHashing) {
|
|
9
|
+
constructor(sources, uniforms, varyings, expectedCapacity, _private_capacityStep, blending, useAlphaHashing, renderingMode, normalsMode) {
|
|
7
10
|
const instancedGeometry = INSTANCED_PARTICLE_GEOMETRY.clone();
|
|
8
|
-
const
|
|
9
|
-
|
|
11
|
+
const particleMaterial = renderingMode === FXParticleRenderingMode.Lambert
|
|
12
|
+
? buildParticleLambertMaterial(sources, uniforms, varyings, blending, useAlphaHashing, normalsMode)
|
|
13
|
+
: buildParticleMaterial(sources, uniforms, varyings, blending, useAlphaHashing);
|
|
14
|
+
super(instancedGeometry, particleMaterial);
|
|
10
15
|
this._private_capacityStep = _private_capacityStep;
|
|
11
16
|
this.propertyBuffers = {};
|
|
12
17
|
this.frustumCulled = false;
|
|
13
18
|
this._private_instancedGeometry = instancedGeometry;
|
|
14
19
|
this._private_instancedGeometry.instanceCount = 0;
|
|
15
|
-
this.
|
|
20
|
+
this._private_particleMaterial = particleMaterial;
|
|
16
21
|
this._private_capacity = Math.max(Math.ceil(expectedCapacity / this._private_capacityStep) * this._private_capacityStep, this._private_capacityStep);
|
|
17
22
|
for (const name in varyings) {
|
|
18
23
|
const { bufferSize } = varyings[name];
|
|
@@ -61,7 +66,7 @@ class FXInstancedParticle extends Mesh {
|
|
|
61
66
|
}
|
|
62
67
|
destroy() {
|
|
63
68
|
this._private_instancedGeometry.dispose();
|
|
64
|
-
this.
|
|
69
|
+
this._private_particleMaterial.dispose();
|
|
65
70
|
}
|
|
66
71
|
_private_ensureCapacity(requiredCapacity) {
|
|
67
72
|
if (requiredCapacity <= this._private_capacity) {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { MeshDepthMaterial, RGBADepthPacking } from 'three';
|
|
2
|
+
|
|
3
|
+
const PARTICLE_DEPTH_VERTEX_SHADER = `
|
|
4
|
+
#define PARTICLE_POSITION_X a_builtin[0][0]
|
|
5
|
+
#define PARTICLE_POSITION_Y a_builtin[0][1]
|
|
6
|
+
#define PARTICLE_POSITION_Z a_builtin[0][2]
|
|
7
|
+
|
|
8
|
+
#define PARTICLE_SCALE_X a_builtin[1][2]
|
|
9
|
+
#define PARTICLE_SCALE_Y a_builtin[1][3]
|
|
10
|
+
|
|
11
|
+
#define PARTICLE_ROTATION a_builtin[2][1]
|
|
12
|
+
|
|
13
|
+
attribute mat4 a_builtin;
|
|
14
|
+
|
|
15
|
+
varying vec2 vHighPrecisionZW;
|
|
16
|
+
|
|
17
|
+
void main() {
|
|
18
|
+
vec2 transformedPosition = position.xy;
|
|
19
|
+
|
|
20
|
+
transformedPosition.x *= PARTICLE_SCALE_X;
|
|
21
|
+
transformedPosition.y *= PARTICLE_SCALE_Y;
|
|
22
|
+
|
|
23
|
+
float cosR = cos(PARTICLE_ROTATION);
|
|
24
|
+
float sinR = sin(PARTICLE_ROTATION);
|
|
25
|
+
|
|
26
|
+
transformedPosition = vec2(
|
|
27
|
+
transformedPosition.x * cosR - transformedPosition.y * sinR,
|
|
28
|
+
transformedPosition.x * sinR + transformedPosition.y * cosR
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
vec3 center = vec3(
|
|
32
|
+
PARTICLE_POSITION_X,
|
|
33
|
+
PARTICLE_POSITION_Y,
|
|
34
|
+
PARTICLE_POSITION_Z
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
vec4 modelViewCenter = modelViewMatrix * vec4(center, 1.0);
|
|
38
|
+
modelViewCenter.xy += transformedPosition;
|
|
39
|
+
gl_Position = projectionMatrix * modelViewCenter;
|
|
40
|
+
vHighPrecisionZW = gl_Position.zw;
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
function buildParticleDepthMaterial() {
|
|
44
|
+
const material = new MeshDepthMaterial({ depthPacking: RGBADepthPacking });
|
|
45
|
+
material.onBeforeCompile = (shader) => {
|
|
46
|
+
shader.vertexShader = PARTICLE_DEPTH_VERTEX_SHADER;
|
|
47
|
+
};
|
|
48
|
+
material.customProgramCacheKey = () => "fx-particle-depth";
|
|
49
|
+
return material;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { buildParticleDepthMaterial };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { MeshLambertMaterial, type Blending } from "three";
|
|
2
|
+
import { FXParticleNormalsMode } from "./FXParticleNormalsMode";
|
|
3
|
+
import type { GLProperty, GLTypeInfo } from "./shared";
|
|
4
|
+
export declare function buildParticleLambertMaterial(sources: string[], uniformProperties: Record<string, GLProperty>, varyingProperties: Record<string, GLTypeInfo>, blending: Blending, useAlphaHashing: boolean, normalsMode: FXParticleNormalsMode): MeshLambertMaterial;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { MeshLambertMaterial } from 'three';
|
|
2
|
+
import { FXColor } from '../color/FXColor.js';
|
|
3
|
+
import { checkSRGBSupport } from '../miscellaneous/webglCapabilities.js';
|
|
4
|
+
import { FXParticleNormalsMode } from './FXParticleNormalsMode.js';
|
|
5
|
+
|
|
6
|
+
const PARTICLE_DEFINES = `
|
|
7
|
+
#define PARTICLE_POSITION_X p_builtin[0][0]
|
|
8
|
+
#define PARTICLE_POSITION_Y p_builtin[0][1]
|
|
9
|
+
#define PARTICLE_POSITION_Z p_builtin[0][2]
|
|
10
|
+
|
|
11
|
+
#define PARTICLE_VELOCITY_X p_builtin[0][3]
|
|
12
|
+
#define PARTICLE_VELOCITY_Y p_builtin[1][0]
|
|
13
|
+
#define PARTICLE_VELOCITY_Z p_builtin[1][1]
|
|
14
|
+
|
|
15
|
+
#define PARTICLE_SCALE_X p_builtin[1][2]
|
|
16
|
+
#define PARTICLE_SCALE_Y p_builtin[1][3]
|
|
17
|
+
#define PARTICLE_SCALE_Z p_builtin[2][0]
|
|
18
|
+
|
|
19
|
+
#define PARTICLE_ROTATION p_builtin[2][1]
|
|
20
|
+
#define PARTICLE_TORQUE p_builtin[2][2]
|
|
21
|
+
|
|
22
|
+
#define PARTICLE_LIFETIME p_builtin[2][3]
|
|
23
|
+
#define PARTICLE_AGE p_builtin[3][0]
|
|
24
|
+
|
|
25
|
+
#define PARTICLE_RANDOM_A p_builtin[3][1]
|
|
26
|
+
#define PARTICLE_RANDOM_B p_builtin[3][2]
|
|
27
|
+
#define PARTICLE_RANDOM_C p_builtin[3][3]
|
|
28
|
+
`;
|
|
29
|
+
function buildParticleLambertMaterial(sources, uniformProperties, varyingProperties, blending, useAlphaHashing, normalsMode) {
|
|
30
|
+
const uniformValues = {};
|
|
31
|
+
const uniformDeclarations = [];
|
|
32
|
+
const attributeDeclarations = [];
|
|
33
|
+
const varyingDeclarations = [];
|
|
34
|
+
const vertexAssignments = [];
|
|
35
|
+
for (const name in uniformProperties) {
|
|
36
|
+
const { value, glslTypeInfo } = uniformProperties[name];
|
|
37
|
+
uniformValues[`p_${name}`] = { value: value instanceof FXColor ? value.toGLSLColor() : value };
|
|
38
|
+
uniformDeclarations.push(`uniform ${glslTypeInfo.glslTypeName} p_${name};`);
|
|
39
|
+
}
|
|
40
|
+
for (const name in varyingProperties) {
|
|
41
|
+
const { glslTypeName } = varyingProperties[name];
|
|
42
|
+
attributeDeclarations.push(`attribute ${glslTypeName} a_${name};`);
|
|
43
|
+
varyingDeclarations.push(`varying ${glslTypeName} p_${name};`);
|
|
44
|
+
vertexAssignments.push(`p_${name} = a_${name};`);
|
|
45
|
+
}
|
|
46
|
+
const renamedSources = sources.map((source, index) => source.replace(/vec4\s+draw\s*\(\s*\)/g, `vec4 draw${index}()`));
|
|
47
|
+
let drawCalls = "";
|
|
48
|
+
for (let i = 0; i < sources.length; i++) {
|
|
49
|
+
drawCalls += i !== 0 ? " * " : "";
|
|
50
|
+
drawCalls += `draw${i}()`;
|
|
51
|
+
}
|
|
52
|
+
const srgbSupported = checkSRGBSupport() ? "1" : "0";
|
|
53
|
+
const srgbHelper = `
|
|
54
|
+
vec4 srgbTexture2D(sampler2D textureSampler, vec2 uv) {
|
|
55
|
+
#if SRGB_SUPPORTED
|
|
56
|
+
return texture2D(textureSampler, uv);
|
|
57
|
+
#else
|
|
58
|
+
vec4 textureValue = texture2D(textureSampler, uv);
|
|
59
|
+
return vec4(pow(textureValue.rgb, vec3(2.2)), textureValue.a);
|
|
60
|
+
#endif
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
const material = new MeshLambertMaterial({
|
|
64
|
+
transparent: true,
|
|
65
|
+
depthWrite: false,
|
|
66
|
+
depthTest: true,
|
|
67
|
+
alphaHash: useAlphaHashing,
|
|
68
|
+
blending,
|
|
69
|
+
});
|
|
70
|
+
material.onBeforeCompile = (shader) => {
|
|
71
|
+
Object.assign(shader.uniforms, uniformValues);
|
|
72
|
+
// --- Vertex shader ---
|
|
73
|
+
const vertexPreamble = [
|
|
74
|
+
PARTICLE_DEFINES,
|
|
75
|
+
attributeDeclarations.join("\n"),
|
|
76
|
+
"varying vec2 p_uv;",
|
|
77
|
+
varyingDeclarations.join("\n"),
|
|
78
|
+
].join("\n");
|
|
79
|
+
shader.vertexShader =
|
|
80
|
+
vertexPreamble +
|
|
81
|
+
"\n" +
|
|
82
|
+
shader.vertexShader
|
|
83
|
+
// Hardcode objectNormal — no normal attribute on billboard geometry
|
|
84
|
+
.replace("#include <beginnormal_vertex>", "vec3 objectNormal = vec3(0.0, 0.0, 1.0);")
|
|
85
|
+
// Hardcode transformedNormal as view-space camera-facing (0,0,1)
|
|
86
|
+
.replace("#include <defaultnormal_vertex>", "vec3 transformedNormal = vec3(0.0, 0.0, 1.0);")
|
|
87
|
+
// Set p_uv, user varyings, placeholder transformed for downstream chunks
|
|
88
|
+
.replace("#include <begin_vertex>", ["p_uv = uv;", vertexAssignments.join("\n"), "vec3 transformed = position;"].join("\n"))
|
|
89
|
+
// Billboard projection: computes p_bp (screen offset) and p_c (center), sets mvPosition
|
|
90
|
+
.replace("#include <project_vertex>", `
|
|
91
|
+
vec2 p_bp = position.xy;
|
|
92
|
+
p_bp.x *= PARTICLE_SCALE_X;
|
|
93
|
+
p_bp.y *= PARTICLE_SCALE_Y;
|
|
94
|
+
float p_cosR = cos(PARTICLE_ROTATION);
|
|
95
|
+
float p_sinR = sin(PARTICLE_ROTATION);
|
|
96
|
+
p_bp = vec2(
|
|
97
|
+
p_bp.x * p_cosR - p_bp.y * p_sinR,
|
|
98
|
+
p_bp.x * p_sinR + p_bp.y * p_cosR
|
|
99
|
+
);
|
|
100
|
+
vec3 p_c = vec3(PARTICLE_POSITION_X, PARTICLE_POSITION_Y, PARTICLE_POSITION_Z);
|
|
101
|
+
vec4 mvPosition = modelViewMatrix * vec4(p_c, 1.0);
|
|
102
|
+
mvPosition.xy += p_bp;
|
|
103
|
+
gl_Position = projectionMatrix * mvPosition;
|
|
104
|
+
`)
|
|
105
|
+
// Billboard world position — p_c and p_bp in scope from project_vertex above
|
|
106
|
+
.replace("#include <worldpos_vertex>", `
|
|
107
|
+
#if defined(USE_SHADOWMAP) || defined(USE_ENVMAP) || defined(DISTANCE) || (NUM_SPOT_LIGHT_COORDS > 0)
|
|
108
|
+
vec3 p_cr = vec3(viewMatrix[0][0], viewMatrix[1][0], viewMatrix[2][0]);
|
|
109
|
+
vec3 p_cu = vec3(viewMatrix[0][1], viewMatrix[1][1], viewMatrix[2][1]);
|
|
110
|
+
vec4 worldPosition = vec4(
|
|
111
|
+
(modelMatrix * vec4(p_c, 1.0)).xyz + p_cr * p_bp.x + p_cu * p_bp.y,
|
|
112
|
+
1.0
|
|
113
|
+
);
|
|
114
|
+
#endif
|
|
115
|
+
`);
|
|
116
|
+
// --- Fragment shader ---
|
|
117
|
+
const fragmentPreamble = [
|
|
118
|
+
PARTICLE_DEFINES,
|
|
119
|
+
`#define SRGB_SUPPORTED ${srgbSupported}`,
|
|
120
|
+
uniformDeclarations.join("\n"),
|
|
121
|
+
"varying vec2 p_uv;",
|
|
122
|
+
varyingDeclarations.join("\n"),
|
|
123
|
+
srgbHelper,
|
|
124
|
+
renamedSources.join("\n"),
|
|
125
|
+
].join("\n");
|
|
126
|
+
let fragmentShader = shader.fragmentShader;
|
|
127
|
+
if (normalsMode === FXParticleNormalsMode.Spherical) {
|
|
128
|
+
fragmentShader = fragmentShader.replace("#include <normal_fragment_begin>", `
|
|
129
|
+
float faceDirection = gl_FrontFacing ? 1.0 : -1.0;
|
|
130
|
+
vec2 p_sn = p_uv * 2.0 - 1.0;
|
|
131
|
+
vec3 normal = normalize(vec3(p_sn, sqrt(max(0.0, 1.0 - dot(p_sn, p_sn)))));
|
|
132
|
+
`);
|
|
133
|
+
}
|
|
134
|
+
else if (normalsMode === FXParticleNormalsMode.TowardsLight) {
|
|
135
|
+
fragmentShader = fragmentShader.replace("float dotNL = saturate( dot( geometryNormal, directLight.direction ) );", "float dotNL = 1.0;");
|
|
136
|
+
}
|
|
137
|
+
shader.fragmentShader =
|
|
138
|
+
fragmentPreamble +
|
|
139
|
+
"\n" +
|
|
140
|
+
fragmentShader
|
|
141
|
+
// Inject custom diffuse color from draw() pipeline
|
|
142
|
+
.replace("#include <map_fragment>", `
|
|
143
|
+
vec4 p_color = ${drawCalls};
|
|
144
|
+
if (p_color.a < 0.0035) discard;
|
|
145
|
+
diffuseColor = p_color;
|
|
146
|
+
`);
|
|
147
|
+
};
|
|
148
|
+
material.customProgramCacheKey = () => `fx-particle-lambert-${normalsMode}-${sources.join("|")}`;
|
|
149
|
+
return material;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export { buildParticleLambertMaterial };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
var FXParticleNormalsMode;
|
|
2
|
+
(function (FXParticleNormalsMode) {
|
|
3
|
+
FXParticleNormalsMode["Flat"] = "flat";
|
|
4
|
+
FXParticleNormalsMode["Spherical"] = "spherical";
|
|
5
|
+
FXParticleNormalsMode["TowardsLight"] = "towards-light";
|
|
6
|
+
})(FXParticleNormalsMode || (FXParticleNormalsMode = {}));
|
|
7
|
+
|
|
8
|
+
export { FXParticleNormalsMode };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var FXParticleRenderingMode;
|
|
2
|
+
(function (FXParticleRenderingMode) {
|
|
3
|
+
FXParticleRenderingMode["Unlit"] = "unlit";
|
|
4
|
+
FXParticleRenderingMode["Lambert"] = "lambert";
|
|
5
|
+
})(FXParticleRenderingMode || (FXParticleRenderingMode = {}));
|
|
6
|
+
|
|
7
|
+
export { FXParticleRenderingMode };
|
|
@@ -13,7 +13,6 @@ export type FXAspectConfig = number | FXTextureConfig;
|
|
|
13
13
|
export declare function resolveFXRangeConfig(config: FXRangeConfig): FXRange;
|
|
14
14
|
export declare function resolveFXVector3Config(config: FXVector3Config): Vector3Like;
|
|
15
15
|
export declare function resolveAspect(config: number | FXTextureConfig): number;
|
|
16
|
-
export declare function generateNoise3D(x: number, y: number, z: number): number;
|
|
17
16
|
export declare function buildGradientTexture(colors: FXColor[]): DataTexture;
|
|
18
17
|
export declare const BUILTIN_OFFSET_POSITION_X = 0;
|
|
19
18
|
export declare const BUILTIN_OFFSET_POSITION_Y = 1;
|
|
@@ -27,10 +27,6 @@ function resolveAspect(config) {
|
|
|
27
27
|
}
|
|
28
28
|
return config.sourceSize.w / config.sourceSize.h;
|
|
29
29
|
}
|
|
30
|
-
function generateNoise3D(x, y, z) {
|
|
31
|
-
const noise = Math.sin(x * 12.9898 + y * 78.233 + z * 37.719) * 43758.5453123;
|
|
32
|
-
return (noise - Math.floor(noise)) * 2 - 1;
|
|
33
|
-
}
|
|
34
30
|
function buildGradientTexture(colors) {
|
|
35
31
|
const width = colors.length;
|
|
36
32
|
const height = 1;
|
|
@@ -63,4 +59,4 @@ const BUILTIN_OFFSET_RANDOM_A = 13;
|
|
|
63
59
|
const BUILTIN_OFFSET_RANDOM_B = 14;
|
|
64
60
|
const BUILTIN_OFFSET_RANDOM_C = 15;
|
|
65
61
|
|
|
66
|
-
export { BUILTIN_OFFSET_AGE, BUILTIN_OFFSET_LIFETIME, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_RANDOM_B, BUILTIN_OFFSET_RANDOM_C, BUILTIN_OFFSET_ROTATION, BUILTIN_OFFSET_SCALE_X, BUILTIN_OFFSET_SCALE_Y, BUILTIN_OFFSET_TORQUE, BUILTIN_OFFSET_VELOCITY_X, BUILTIN_OFFSET_VELOCITY_Y, BUILTIN_OFFSET_VELOCITY_Z, buildGradientTexture,
|
|
62
|
+
export { BUILTIN_OFFSET_AGE, BUILTIN_OFFSET_LIFETIME, BUILTIN_OFFSET_POSITION_X, BUILTIN_OFFSET_POSITION_Y, BUILTIN_OFFSET_POSITION_Z, BUILTIN_OFFSET_RANDOM_A, BUILTIN_OFFSET_RANDOM_B, BUILTIN_OFFSET_RANDOM_C, BUILTIN_OFFSET_ROTATION, BUILTIN_OFFSET_SCALE_X, BUILTIN_OFFSET_SCALE_Y, BUILTIN_OFFSET_TORQUE, BUILTIN_OFFSET_VELOCITY_X, BUILTIN_OFFSET_VELOCITY_Y, BUILTIN_OFFSET_VELOCITY_Z, buildGradientTexture, resolveAspect, resolveFXRangeConfig, resolveFXVector3Config };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { __exports as _2d } from '../../../_virtual/2d.js';
|
|
2
|
+
|
|
3
|
+
var hasRequired_2d;
|
|
4
|
+
|
|
5
|
+
function require_2d () {
|
|
6
|
+
if (hasRequired_2d) return _2d;
|
|
7
|
+
hasRequired_2d = 1;
|
|
8
|
+
/*
|
|
9
|
+
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
|
|
10
|
+
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
|
|
11
|
+
* Better rank ordering method by Stefan Gustavson in 2012.
|
|
12
|
+
*
|
|
13
|
+
* This code was placed in the public domain by its original author,
|
|
14
|
+
* Stefan Gustavson. You may use it as you see fit, but
|
|
15
|
+
* attribution is appreciated.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(_2d, "__esModule", { value: true });
|
|
18
|
+
_2d.makeNoise2D = void 0;
|
|
19
|
+
var G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
|
|
20
|
+
var Grad = [
|
|
21
|
+
[1, 1],
|
|
22
|
+
[-1, 1],
|
|
23
|
+
[1, -1],
|
|
24
|
+
[-1, -1],
|
|
25
|
+
[1, 0],
|
|
26
|
+
[-1, 0],
|
|
27
|
+
[1, 0],
|
|
28
|
+
[-1, 0],
|
|
29
|
+
[0, 1],
|
|
30
|
+
[0, -1],
|
|
31
|
+
[0, 1],
|
|
32
|
+
[0, -1],
|
|
33
|
+
];
|
|
34
|
+
function makeNoise2D(random) {
|
|
35
|
+
if (random === void 0) { random = Math.random; }
|
|
36
|
+
var p = new Uint8Array(256);
|
|
37
|
+
for (var i = 0; i < 256; i++)
|
|
38
|
+
p[i] = i;
|
|
39
|
+
var n;
|
|
40
|
+
var q;
|
|
41
|
+
for (var i = 255; i > 0; i--) {
|
|
42
|
+
n = Math.floor((i + 1) * random());
|
|
43
|
+
q = p[i];
|
|
44
|
+
p[i] = p[n];
|
|
45
|
+
p[n] = q;
|
|
46
|
+
}
|
|
47
|
+
var perm = new Uint8Array(512);
|
|
48
|
+
var permMod12 = new Uint8Array(512);
|
|
49
|
+
for (var i = 0; i < 512; i++) {
|
|
50
|
+
perm[i] = p[i & 255];
|
|
51
|
+
permMod12[i] = perm[i] % 12;
|
|
52
|
+
}
|
|
53
|
+
return function (x, y) {
|
|
54
|
+
// Skew the input space to determine which simplex cell we're in
|
|
55
|
+
var s = (x + y) * 0.5 * (Math.sqrt(3.0) - 1.0); // Hairy factor for 2D
|
|
56
|
+
var i = Math.floor(x + s);
|
|
57
|
+
var j = Math.floor(y + s);
|
|
58
|
+
var t = (i + j) * G2;
|
|
59
|
+
var X0 = i - t; // Unskew the cell origin back to (x,y) space
|
|
60
|
+
var Y0 = j - t;
|
|
61
|
+
var x0 = x - X0; // The x,y distances from the cell origin
|
|
62
|
+
var y0 = y - Y0;
|
|
63
|
+
// Determine which simplex we are in.
|
|
64
|
+
var i1 = x0 > y0 ? 1 : 0;
|
|
65
|
+
var j1 = x0 > y0 ? 0 : 1;
|
|
66
|
+
// Offsets for corners
|
|
67
|
+
var x1 = x0 - i1 + G2;
|
|
68
|
+
var y1 = y0 - j1 + G2;
|
|
69
|
+
var x2 = x0 - 1.0 + 2.0 * G2;
|
|
70
|
+
var y2 = y0 - 1.0 + 2.0 * G2;
|
|
71
|
+
// Work out the hashed gradient indices of the three simplex corners
|
|
72
|
+
var ii = i & 255;
|
|
73
|
+
var jj = j & 255;
|
|
74
|
+
var g0 = Grad[permMod12[ii + perm[jj]]];
|
|
75
|
+
var g1 = Grad[permMod12[ii + i1 + perm[jj + j1]]];
|
|
76
|
+
var g2 = Grad[permMod12[ii + 1 + perm[jj + 1]]];
|
|
77
|
+
// Calculate the contribution from the three corners
|
|
78
|
+
var t0 = 0.5 - x0 * x0 - y0 * y0;
|
|
79
|
+
var n0 = t0 < 0 ? 0.0 : Math.pow(t0, 4) * (g0[0] * x0 + g0[1] * y0);
|
|
80
|
+
var t1 = 0.5 - x1 * x1 - y1 * y1;
|
|
81
|
+
var n1 = t1 < 0 ? 0.0 : Math.pow(t1, 4) * (g1[0] * x1 + g1[1] * y1);
|
|
82
|
+
var t2 = 0.5 - x2 * x2 - y2 * y2;
|
|
83
|
+
var n2 = t2 < 0 ? 0.0 : Math.pow(t2, 4) * (g2[0] * x2 + g2[1] * y2);
|
|
84
|
+
// Add contributions from each corner to get the final noise value.
|
|
85
|
+
// The result is scaled to return values in the interval [-1, 1]
|
|
86
|
+
return 70.14805770653952 * (n0 + n1 + n2);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
_2d.makeNoise2D = makeNoise2D;
|
|
90
|
+
return _2d;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { require_2d as __require };
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { __exports as _3d } from '../../../_virtual/3d.js';
|
|
2
|
+
|
|
3
|
+
var hasRequired_3d;
|
|
4
|
+
|
|
5
|
+
function require_3d () {
|
|
6
|
+
if (hasRequired_3d) return _3d;
|
|
7
|
+
hasRequired_3d = 1;
|
|
8
|
+
/*
|
|
9
|
+
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
|
|
10
|
+
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
|
|
11
|
+
* Better rank ordering method by Stefan Gustavson in 2012.
|
|
12
|
+
*
|
|
13
|
+
* This code was placed in the public domain by its original author,
|
|
14
|
+
* Stefan Gustavson. You may use it as you see fit, but
|
|
15
|
+
* attribution is appreciated.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(_3d, "__esModule", { value: true });
|
|
18
|
+
_3d.makeNoise3D = void 0;
|
|
19
|
+
var G3 = 1.0 / 6.0;
|
|
20
|
+
var Grad = [
|
|
21
|
+
[1, 1, 0],
|
|
22
|
+
[-1, 1, 0],
|
|
23
|
+
[1, -1, 0],
|
|
24
|
+
[-1, -1, 0],
|
|
25
|
+
[1, 0, 1],
|
|
26
|
+
[-1, 0, 1],
|
|
27
|
+
[1, 0, -1],
|
|
28
|
+
[-1, 0, -1],
|
|
29
|
+
[0, 1, 1],
|
|
30
|
+
[0, -1, -1],
|
|
31
|
+
[0, 1, -1],
|
|
32
|
+
[0, -1, -1],
|
|
33
|
+
];
|
|
34
|
+
function makeNoise3D(random) {
|
|
35
|
+
if (random === void 0) { random = Math.random; }
|
|
36
|
+
var p = new Uint8Array(256);
|
|
37
|
+
for (var i = 0; i < 256; i++)
|
|
38
|
+
p[i] = i;
|
|
39
|
+
var n;
|
|
40
|
+
var q;
|
|
41
|
+
for (var i = 255; i > 0; i--) {
|
|
42
|
+
n = Math.floor((i + 1) * random());
|
|
43
|
+
q = p[i];
|
|
44
|
+
p[i] = p[n];
|
|
45
|
+
p[n] = q;
|
|
46
|
+
}
|
|
47
|
+
var perm = new Uint8Array(512);
|
|
48
|
+
var permMod12 = new Uint8Array(512);
|
|
49
|
+
for (var i = 0; i < 512; i++) {
|
|
50
|
+
perm[i] = p[i & 255];
|
|
51
|
+
permMod12[i] = perm[i] % 12;
|
|
52
|
+
}
|
|
53
|
+
return function (x, y, z) {
|
|
54
|
+
// Skew the input space to determine which simplex cell we're in
|
|
55
|
+
var s = (x + y + z) / 3.0; // Very nice and simple skew factor for 3D
|
|
56
|
+
var i = Math.floor(x + s);
|
|
57
|
+
var j = Math.floor(y + s);
|
|
58
|
+
var k = Math.floor(z + s);
|
|
59
|
+
var t = (i + j + k) * G3;
|
|
60
|
+
var X0 = i - t; // Unskew the cell origin back to (x,y,z) space
|
|
61
|
+
var Y0 = j - t;
|
|
62
|
+
var Z0 = k - t;
|
|
63
|
+
var x0 = x - X0; // The x,y,z distances from the cell origin
|
|
64
|
+
var y0 = y - Y0;
|
|
65
|
+
var z0 = z - Z0;
|
|
66
|
+
// Deterine which simplex we are in
|
|
67
|
+
var i1, j1, k1 // Offsets for second corner of simplex in (i,j,k) coords
|
|
68
|
+
;
|
|
69
|
+
var i2, j2, k2 // Offsets for third corner of simplex in (i,j,k) coords
|
|
70
|
+
;
|
|
71
|
+
if (x0 >= y0) {
|
|
72
|
+
if (y0 >= z0) {
|
|
73
|
+
i1 = i2 = j2 = 1;
|
|
74
|
+
j1 = k1 = k2 = 0;
|
|
75
|
+
}
|
|
76
|
+
else if (x0 >= z0) {
|
|
77
|
+
i1 = i2 = k2 = 1;
|
|
78
|
+
j1 = k1 = j2 = 0;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
k1 = i2 = k2 = 1;
|
|
82
|
+
i1 = j1 = j2 = 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (y0 < z0) {
|
|
87
|
+
k1 = j2 = k2 = 1;
|
|
88
|
+
i1 = j1 = i2 = 0;
|
|
89
|
+
}
|
|
90
|
+
else if (x0 < z0) {
|
|
91
|
+
j1 = j2 = k2 = 1;
|
|
92
|
+
i1 = k1 = i2 = 0;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
j1 = i2 = j2 = 1;
|
|
96
|
+
i1 = k1 = k2 = 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
var x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
|
|
100
|
+
var y1 = y0 - j1 + G3;
|
|
101
|
+
var z1 = z0 - k1 + G3;
|
|
102
|
+
var x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
|
|
103
|
+
var y2 = y0 - j2 + 2.0 * G3;
|
|
104
|
+
var z2 = z0 - k2 + 2.0 * G3;
|
|
105
|
+
var x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
|
|
106
|
+
var y3 = y0 - 1.0 + 3.0 * G3;
|
|
107
|
+
var z3 = z0 - 1.0 + 3.0 * G3;
|
|
108
|
+
// Work out the hashed gradient indices of the four simplex corners
|
|
109
|
+
var ii = i & 255;
|
|
110
|
+
var jj = j & 255;
|
|
111
|
+
var kk = k & 255;
|
|
112
|
+
var g0 = Grad[permMod12[ii + perm[jj + perm[kk]]]];
|
|
113
|
+
var g1 = Grad[permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]]];
|
|
114
|
+
var g2 = Grad[permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]]];
|
|
115
|
+
var g3 = Grad[permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]]];
|
|
116
|
+
// Calculate the contribution from the four corners
|
|
117
|
+
var t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0;
|
|
118
|
+
var n0 = t0 < 0
|
|
119
|
+
? 0.0
|
|
120
|
+
: Math.pow(t0, 4) * (g0[0] * x0 + g0[1] * y0 + g0[2] * z0);
|
|
121
|
+
var t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1;
|
|
122
|
+
var n1 = t1 < 0
|
|
123
|
+
? 0.0
|
|
124
|
+
: Math.pow(t1, 4) * (g1[0] * x1 + g1[1] * y1 + g1[2] * z1);
|
|
125
|
+
var t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2;
|
|
126
|
+
var n2 = t2 < 0
|
|
127
|
+
? 0.0
|
|
128
|
+
: Math.pow(t2, 4) * (g2[0] * x2 + g2[1] * y2 + g2[2] * z2);
|
|
129
|
+
var t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3;
|
|
130
|
+
var n3 = t3 < 0
|
|
131
|
+
? 0.0
|
|
132
|
+
: Math.pow(t3, 4) * (g3[0] * x3 + g3[1] * y3 + g3[2] * z3);
|
|
133
|
+
// Add contributions from each corner to get the final noise value.
|
|
134
|
+
// The result is scaled to stay just inside [-1,1]
|
|
135
|
+
return 94.68493150681972 * (n0 + n1 + n2 + n3);
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
_3d.makeNoise3D = makeNoise3D;
|
|
139
|
+
return _3d;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { require_3d as __require };
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { __exports as _4d } from '../../../_virtual/4d.js';
|
|
2
|
+
|
|
3
|
+
var hasRequired_4d;
|
|
4
|
+
|
|
5
|
+
function require_4d () {
|
|
6
|
+
if (hasRequired_4d) return _4d;
|
|
7
|
+
hasRequired_4d = 1;
|
|
8
|
+
/*
|
|
9
|
+
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
|
|
10
|
+
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
|
|
11
|
+
* Better rank ordering method by Stefan Gustavson in 2012.
|
|
12
|
+
*
|
|
13
|
+
* This code was placed in the public domain by its original author,
|
|
14
|
+
* Stefan Gustavson. You may use it as you see fit, but
|
|
15
|
+
* attribution is appreciated.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(_4d, "__esModule", { value: true });
|
|
18
|
+
_4d.makeNoise4D = void 0;
|
|
19
|
+
var G4 = (5.0 - Math.sqrt(5.0)) / 20.0;
|
|
20
|
+
var Grad = [
|
|
21
|
+
[0, 1, 1, 1],
|
|
22
|
+
[0, 1, 1, -1],
|
|
23
|
+
[0, 1, -1, 1],
|
|
24
|
+
[0, 1, -1, -1],
|
|
25
|
+
[0, -1, 1, 1],
|
|
26
|
+
[0, -1, 1, -1],
|
|
27
|
+
[0, -1, -1, 1],
|
|
28
|
+
[0, -1, -1, -1],
|
|
29
|
+
[1, 0, 1, 1],
|
|
30
|
+
[1, 0, 1, -1],
|
|
31
|
+
[1, 0, -1, 1],
|
|
32
|
+
[1, 0, -1, -1],
|
|
33
|
+
[-1, 0, 1, 1],
|
|
34
|
+
[-1, 0, 1, -1],
|
|
35
|
+
[-1, 0, -1, 1],
|
|
36
|
+
[-1, 0, -1, -1],
|
|
37
|
+
[1, 1, 0, 1],
|
|
38
|
+
[1, 1, 0, -1],
|
|
39
|
+
[1, -1, 0, 1],
|
|
40
|
+
[1, -1, 0, -1],
|
|
41
|
+
[-1, 1, 0, 1],
|
|
42
|
+
[-1, 1, 0, -1],
|
|
43
|
+
[-1, -1, 0, 1],
|
|
44
|
+
[-1, -1, 0, -1],
|
|
45
|
+
[1, 1, 1, 0],
|
|
46
|
+
[1, 1, -1, 0],
|
|
47
|
+
[1, -1, 1, 0],
|
|
48
|
+
[1, -1, -1, 0],
|
|
49
|
+
[-1, 1, 1, 0],
|
|
50
|
+
[-1, 1, -1, 0],
|
|
51
|
+
[-1, -1, 1, 0],
|
|
52
|
+
[-1, -1, -1, 0],
|
|
53
|
+
];
|
|
54
|
+
function makeNoise4D(random) {
|
|
55
|
+
if (random === void 0) { random = Math.random; }
|
|
56
|
+
var p = new Uint8Array(256);
|
|
57
|
+
for (var i = 0; i < 256; i++)
|
|
58
|
+
p[i] = i;
|
|
59
|
+
var n;
|
|
60
|
+
var q;
|
|
61
|
+
for (var i = 255; i > 0; i--) {
|
|
62
|
+
n = Math.floor((i + 1) * random());
|
|
63
|
+
q = p[i];
|
|
64
|
+
p[i] = p[n];
|
|
65
|
+
p[n] = q;
|
|
66
|
+
}
|
|
67
|
+
var perm = new Uint8Array(512);
|
|
68
|
+
var permMod12 = new Uint8Array(512);
|
|
69
|
+
for (var i = 0; i < 512; i++) {
|
|
70
|
+
perm[i] = p[i & 255];
|
|
71
|
+
permMod12[i] = perm[i] % 12;
|
|
72
|
+
}
|
|
73
|
+
return function (x, y, z, w) {
|
|
74
|
+
// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
|
|
75
|
+
var s = (x + y + z + w) * (Math.sqrt(5.0) - 1.0) / 4.0; // Factor for 4D skewing
|
|
76
|
+
var i = Math.floor(x + s);
|
|
77
|
+
var j = Math.floor(y + s);
|
|
78
|
+
var k = Math.floor(z + s);
|
|
79
|
+
var l = Math.floor(w + s);
|
|
80
|
+
var t = (i + j + k + l) * G4; // Factor for 4D unskewing
|
|
81
|
+
var X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
|
|
82
|
+
var Y0 = j - t;
|
|
83
|
+
var Z0 = k - t;
|
|
84
|
+
var W0 = l - t;
|
|
85
|
+
var x0 = x - X0; // The x,y,z,w distances from the cell origin
|
|
86
|
+
var y0 = y - Y0;
|
|
87
|
+
var z0 = z - Z0;
|
|
88
|
+
var w0 = w - W0;
|
|
89
|
+
// To find out which of the 24 possible simplices we're in, we need to determine the
|
|
90
|
+
// magnitude ordering of x0, y0, z0 and w0. Six pair-wise comparisons are performed between
|
|
91
|
+
// each possible pair of the four coordinates, and the results are used to rank the numbers.
|
|
92
|
+
var rankx = 0;
|
|
93
|
+
var ranky = 0;
|
|
94
|
+
var rankz = 0;
|
|
95
|
+
var rankw = 0;
|
|
96
|
+
if (x0 > y0)
|
|
97
|
+
rankx++;
|
|
98
|
+
else
|
|
99
|
+
ranky++;
|
|
100
|
+
if (x0 > z0)
|
|
101
|
+
rankx++;
|
|
102
|
+
else
|
|
103
|
+
rankz++;
|
|
104
|
+
if (x0 > w0)
|
|
105
|
+
rankx++;
|
|
106
|
+
else
|
|
107
|
+
rankw++;
|
|
108
|
+
if (y0 > z0)
|
|
109
|
+
ranky++;
|
|
110
|
+
else
|
|
111
|
+
rankz++;
|
|
112
|
+
if (y0 > w0)
|
|
113
|
+
ranky++;
|
|
114
|
+
else
|
|
115
|
+
rankw++;
|
|
116
|
+
if (z0 > w0)
|
|
117
|
+
rankz++;
|
|
118
|
+
else
|
|
119
|
+
rankw++;
|
|
120
|
+
// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
|
|
121
|
+
// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
|
|
122
|
+
// impossible. Only the 24 indices which have non-zero entries make any sense.
|
|
123
|
+
// We use a thresholding to set the coordinates in turn from the largest magnitude.
|
|
124
|
+
// Rank 3 denotes the largest coordinate.
|
|
125
|
+
var i1 = rankx >= 3 ? 1 : 0;
|
|
126
|
+
var j1 = ranky >= 3 ? 1 : 0;
|
|
127
|
+
var k1 = rankz >= 3 ? 1 : 0;
|
|
128
|
+
var l1 = rankw >= 3 ? 1 : 0;
|
|
129
|
+
// Rank 2 denotes the second largest coordinate.
|
|
130
|
+
var i2 = rankx >= 2 ? 1 : 0;
|
|
131
|
+
var j2 = ranky >= 2 ? 1 : 0;
|
|
132
|
+
var k2 = rankz >= 2 ? 1 : 0;
|
|
133
|
+
var l2 = rankw >= 2 ? 1 : 0;
|
|
134
|
+
// Rank 1 denotes the second smallest coordinate.
|
|
135
|
+
var i3 = rankx >= 1 ? 1 : 0;
|
|
136
|
+
var j3 = ranky >= 1 ? 1 : 0;
|
|
137
|
+
var k3 = rankz >= 1 ? 1 : 0;
|
|
138
|
+
var l3 = rankw >= 1 ? 1 : 0;
|
|
139
|
+
// The fifth corner has all coordinate offsets = 1, so no need to compute that.
|
|
140
|
+
var x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
|
|
141
|
+
var y1 = y0 - j1 + G4;
|
|
142
|
+
var z1 = z0 - k1 + G4;
|
|
143
|
+
var w1 = w0 - l1 + G4;
|
|
144
|
+
var x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
|
|
145
|
+
var y2 = y0 - j2 + 2.0 * G4;
|
|
146
|
+
var z2 = z0 - k2 + 2.0 * G4;
|
|
147
|
+
var w2 = w0 - l2 + 2.0 * G4;
|
|
148
|
+
var x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
|
|
149
|
+
var y3 = y0 - j3 + 3.0 * G4;
|
|
150
|
+
var z3 = z0 - k3 + 3.0 * G4;
|
|
151
|
+
var w3 = w0 - l3 + 3.0 * G4;
|
|
152
|
+
var x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
|
|
153
|
+
var y4 = y0 - 1.0 + 4.0 * G4;
|
|
154
|
+
var z4 = z0 - 1.0 + 4.0 * G4;
|
|
155
|
+
var w4 = w0 - 1.0 + 4.0 * G4;
|
|
156
|
+
// Work out the hashed gradient indices of the five simplex corners
|
|
157
|
+
var ii = i & 255;
|
|
158
|
+
var jj = j & 255;
|
|
159
|
+
var kk = k & 255;
|
|
160
|
+
var ll = l & 255;
|
|
161
|
+
var g0 = Grad[perm[ii + perm[jj + perm[kk + perm[ll]]]] %
|
|
162
|
+
32];
|
|
163
|
+
var g1 = Grad[perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32];
|
|
164
|
+
var g2 = Grad[perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32];
|
|
165
|
+
var g3 = Grad[perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32];
|
|
166
|
+
var g4 = Grad[perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32];
|
|
167
|
+
// Calculate the contribution from the five corners
|
|
168
|
+
var t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
|
|
169
|
+
var n0 = t0 < 0
|
|
170
|
+
? 0.0
|
|
171
|
+
: Math.pow(t0, 4) * (g0[0] * x0 + g0[1] * y0 + g0[2] * z0 + g0[3] * w0);
|
|
172
|
+
var t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
|
|
173
|
+
var n1 = t1 < 0
|
|
174
|
+
? 0.0
|
|
175
|
+
: Math.pow(t1, 4) * (g1[0] * x1 + g1[1] * y1 + g1[2] * z1 + g1[3] * w1);
|
|
176
|
+
var t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
|
|
177
|
+
var n2 = t2 < 0
|
|
178
|
+
? 0.0
|
|
179
|
+
: Math.pow(t2, 4) * (g2[0] * x2 + g2[1] * y2 + g2[2] * z2 + g2[3] * w2);
|
|
180
|
+
var t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
|
|
181
|
+
var n3 = t3 < 0
|
|
182
|
+
? 0.0
|
|
183
|
+
: Math.pow(t3, 4) * (g3[0] * x3 + g3[1] * y3 + g3[2] * z3 + g3[3] * w3);
|
|
184
|
+
var t4 = 0.5 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
|
|
185
|
+
var n4 = t4 < 0
|
|
186
|
+
? 0.0
|
|
187
|
+
: Math.pow(t4, 4) * (g4[0] * x4 + g4[1] * y4 + g4[2] * z4 + g4[3] * w4);
|
|
188
|
+
// Sum up and scale the result to cover the range [-1,1]
|
|
189
|
+
return 72.37855765153665 * (n0 + n1 + n2 + n3 + n4);
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
_4d.makeNoise4D = makeNoise4D;
|
|
193
|
+
return _4d;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export { require_4d as __require };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { __exports as mod } from '../../../_virtual/mod2.js';
|
|
2
|
+
import { __require as require_2d } from './2d.js';
|
|
3
|
+
import { __require as require_3d } from './3d.js';
|
|
4
|
+
import { __require as require_4d } from './4d.js';
|
|
5
|
+
|
|
6
|
+
var hasRequiredMod;
|
|
7
|
+
|
|
8
|
+
function requireMod () {
|
|
9
|
+
if (hasRequiredMod) return mod;
|
|
10
|
+
hasRequiredMod = 1;
|
|
11
|
+
(function (exports$1) {
|
|
12
|
+
Object.defineProperty(exports$1, "__esModule", { value: true });
|
|
13
|
+
exports$1.makeNoise4D = exports$1.makeNoise3D = exports$1.makeNoise2D = void 0;
|
|
14
|
+
var _2d_1 = require_2d();
|
|
15
|
+
Object.defineProperty(exports$1, "makeNoise2D", { enumerable: true, get: function () { return _2d_1.makeNoise2D; } });
|
|
16
|
+
var _3d_1 = require_3d();
|
|
17
|
+
Object.defineProperty(exports$1, "makeNoise3D", { enumerable: true, get: function () { return _3d_1.makeNoise3D; } });
|
|
18
|
+
var _4d_1 = require_4d();
|
|
19
|
+
Object.defineProperty(exports$1, "makeNoise4D", { enumerable: true, get: function () { return _4d_1.makeNoise4D; } });
|
|
20
|
+
} (mod));
|
|
21
|
+
return mod;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { requireMod as __require };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FXRenderingModule } from "./FXRenderingModule";
|
|
2
|
+
/**
|
|
3
|
+
* Applies directional light shadow attenuation to particles.
|
|
4
|
+
*
|
|
5
|
+
* Samples the first directional light's shadow map per billboard fragment,
|
|
6
|
+
* multiplying the particle color by the shadow factor.
|
|
7
|
+
*
|
|
8
|
+
* Requires a DirectionalLight with `castShadow = true` in the scene,
|
|
9
|
+
* and `receiveShadow = true` on the emitter (or its parent).
|
|
10
|
+
*/
|
|
11
|
+
export declare class FXRenderingShadow extends FXRenderingModule {
|
|
12
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var source = "vec4 draw(){float totalFrames=p_count.x*p_count.y
|
|
1
|
+
var source = "vec4 draw(){\n float totalFrames=p_count.x*p_count.y;\n float frame=floor(PARTICLE_AGE/PARTICLE_LIFETIME*totalFrames);\n frame=clamp(frame,0.0,totalFrames-1.0);\n float col=mod(frame,p_count.x);\n float row=floor(frame/p_count.x);\n vec2 frameSize=vec2(1.0/p_count.x,1.0/p_count.y);\n vec2 uv=(p_uv+vec2(col,(p_count.y-1.0-row)))*frameSize;\n return srgbTexture2D(p_texture,uv);\n}";
|
|
2
2
|
|
|
3
3
|
export { source as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var source = "vec4 draw(){float t=clamp(PARTICLE_AGE/PARTICLE_LIFETIME,0.0,1.0)
|
|
1
|
+
var source = "vec4 draw(){\n float t=clamp(PARTICLE_AGE/PARTICLE_LIFETIME,0.0,1.0);\n return srgbTexture2D(p_colorOverLifeTexture,vec2(t,0.5));\n}";
|
|
2
2
|
|
|
3
3
|
export { source as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var source = "#define COLOR_OVER_VELOCITY_MAX
|
|
1
|
+
var source = "#define COLOR_OVER_VELOCITY_MAX \nvec4 draw(){\n float t=clamp(length(vec3(PARTICLE_VELOCITY_X,PARTICLE_VELOCITY_Y,PARTICLE_VELOCITY_Z))/COLOR_OVER_VELOCITY_MAX,0.0,1.0);\n return srgbTexture2D(p_colorOverVelocityTexture,vec2(t,0.5));\n}";
|
|
2
2
|
|
|
3
3
|
export { source as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var source = "vec4 draw(){vec2 transformedUV=(p_textureTransform*vec3(p_uv,1.0)).xy
|
|
1
|
+
var source = "vec4 draw(){\n vec2 transformedUV=(p_textureTransform*vec3(p_uv,1.0)).xy;\n return srgbTexture2D(p_texture,transformedUV);\n}";
|
|
2
2
|
|
|
3
3
|
export { source as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sparcoon",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"particles",
|
|
@@ -39,8 +39,9 @@
|
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"
|
|
43
|
-
"ferrsign": "^0.0.4"
|
|
42
|
+
"fast-simplex-noise": "^4.0.0",
|
|
43
|
+
"ferrsign": "^0.0.4",
|
|
44
|
+
"three": ">=0.157.0 <0.180.0"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@rollup/plugin-node-resolve": "^16.0.1",
|
|
@@ -54,5 +55,8 @@
|
|
|
54
55
|
"rollup-plugin-typescript2": "^0.36.0",
|
|
55
56
|
"ts-transformer-minify-privates": "^1.0.0",
|
|
56
57
|
"typescript": "^5.8.3"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@rollup/plugin-commonjs": "^29.0.2"
|
|
57
61
|
}
|
|
58
62
|
}
|