@forgeax/engine-vfx-render 0.1.7 → 0.1.19
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/.tsbuildinfo +1 -1
- package/dist/feature/gpu-particle-feature.d.ts.map +1 -1
- package/dist/feature/particle-resources.d.ts +11 -0
- package/dist/feature/particle-resources.d.ts.map +1 -1
- package/dist/index.mjs +16 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
- package/src/__tests__/fog-producer.integration.test.ts +5 -3
- package/src/__tests__/gpu-host.integration.test.ts +20 -2
- package/src/__tests__/particle-resources.unit.test.ts +9 -0
- package/src/__tests__/stage-plan.integration.test.ts +7 -1
- package/src/feature/gpu-particle-feature.ts +17 -3
- package/src/feature/particle-resources.ts +18 -0
- package/src/shaders/beam.wgsl +1 -24
- package/src/shaders/billboard.wgsl +1 -24
- package/src/shaders/mesh.wgsl +1 -24
- package/src/shaders/ribbon.wgsl +1 -24
- package/src/shaders/trail.wgsl +1 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpu-particle-feature.d.ts","sourceRoot":"","sources":["../../src/feature/gpu-particle-feature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAO,KAAK,aAAa,EAAE,KAAK,SAAS,EAAM,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gpu-particle-feature.d.ts","sourceRoot":"","sources":["../../src/feature/gpu-particle-feature.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RenderFeatureMaterialShaderBindingContract } from '@forgeax/engine-render';
|
|
1
2
|
import { type MaterialAsset, type MaterialRenderState, type MeshAsset, type Result } from '@forgeax/engine-types';
|
|
2
3
|
import type { ParticleRendererSource } from '@forgeax/engine-vfx';
|
|
3
4
|
type ParticleRendererKind = ParticleRendererSource['kind'];
|
|
@@ -58,6 +59,16 @@ export interface ParticleMaterialPass {
|
|
|
58
59
|
export declare function particleMaterialPass(kind: ParticleRendererKind, material: MaterialAsset | undefined): ParticleMaterialPass;
|
|
59
60
|
/** True when the authored particle shader consumes the standard material bind group. */
|
|
60
61
|
export declare function particleMaterialUsesBindings(material: MaterialAsset | undefined): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Return the scene-depth binding slot required by a particle material shader.
|
|
64
|
+
*
|
|
65
|
+
* Custom particle shaders historically bind only the sampled depth resource at
|
|
66
|
+
* group(0)/binding(0), while the renderer-owned billboard shader also consumes
|
|
67
|
+
* the view UBO at binding(0) and therefore uses depth at binding(1). Keep this
|
|
68
|
+
* choice derived from the renderer contract instead of assuming every
|
|
69
|
+
* billboard has the built-in layout.
|
|
70
|
+
*/
|
|
71
|
+
export declare function particleMaterialSceneDepthBinding(contract: RenderFeatureMaterialShaderBindingContract | undefined): 0 | 1 | undefined;
|
|
61
72
|
export declare function canonicalMeshVertices(mesh: MeshAsset): Float32Array;
|
|
62
73
|
export {};
|
|
63
74
|
//# sourceMappingURL=particle-resources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"particle-resources.d.ts","sourceRoot":"","sources":["../../src/feature/particle-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAEd,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,KAAK,oBAAoB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC3D,KAAK,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC/F,KAAK,oBAAoB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,2BAA2B;;;;;;EAMtC,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,OAAO,GAChB,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAsErD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,qBAAqB;;;;;;;EAWhG;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,oBAAoB,CAQtB;AAED,wFAAwF;AACxF,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAEzF;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAyBnE"}
|
|
1
|
+
{"version":3,"file":"particle-resources.d.ts","sourceRoot":"","sources":["../../src/feature/particle-resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAEd,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,KAAK,oBAAoB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC3D,KAAK,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC/F,KAAK,oBAAoB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,2BAA2B;;;;;;EAMtC,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,OAAO,GAChB,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAsErD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,qBAAqB;;;;;;;EAWhG;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,oBAAoB,CAQtB;AAED,wFAAwF;AACxF,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAEzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,0CAA0C,GAAG,SAAS,GAC/D,CAAC,GAAG,CAAC,GAAG,SAAS,CAInB;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAyBnE"}
|
package/dist/index.mjs
CHANGED
|
@@ -174,6 +174,11 @@ function particleMaterialPass(kind, material) {
|
|
|
174
174
|
function particleMaterialUsesBindings(material) {
|
|
175
175
|
return (material?.parameters?.length ?? 0) > 0;
|
|
176
176
|
}
|
|
177
|
+
function particleMaterialSceneDepthBinding(contract) {
|
|
178
|
+
if (contract === "group-0-resource") return 0;
|
|
179
|
+
if (contract === "view-and-scene-depth") return 1;
|
|
180
|
+
return void 0;
|
|
181
|
+
}
|
|
177
182
|
function floatAttribute(value) {
|
|
178
183
|
if (value instanceof Float32Array) return value;
|
|
179
184
|
if (value instanceof Uint16Array) return Float32Array.from(value);
|
|
@@ -571,6 +576,11 @@ function gpuParticleRenderFeature(options) {
|
|
|
571
576
|
return {
|
|
572
577
|
identity: IDENTITY,
|
|
573
578
|
requiredCapabilities: ["compute", "indirectDrawing"],
|
|
579
|
+
// Generated emitter programs are first-use assets. They must hand a
|
|
580
|
+
// WebGPU module to the prepared feature pipeline without waiting for the
|
|
581
|
+
// diagnostic-only getCompilationInfo() round trip; pipeline creation still
|
|
582
|
+
// validates the module before the pass is submitted.
|
|
583
|
+
shaderModuleMode: "immediate",
|
|
574
584
|
requiredMaterialShaders: Object.values(PARTICLE_SHADER_IDENTIFIERS),
|
|
575
585
|
extract: (context) => {
|
|
576
586
|
const extracted = [];
|
|
@@ -749,6 +759,9 @@ function gpuParticleRenderFeature(options) {
|
|
|
749
759
|
const mesh = meshes[rendererIndex];
|
|
750
760
|
const submesh = renderer.kind === "mesh" ? mesh?.submeshes[renderer.submesh ?? 0] : void 0;
|
|
751
761
|
const indexFormat = mesh?.indices instanceof Uint32Array ? "uint32" : "uint16";
|
|
762
|
+
const sceneDepthBinding = isBillboard ? particleMaterialSceneDepthBinding(
|
|
763
|
+
context.materialShaderBindingContract?.(materialPass.shader) ?? (materialPass.shader === PARTICLE_SHADER_IDENTIFIERS.billboard ? "view-and-scene-depth" : void 0)
|
|
764
|
+
) : void 0;
|
|
752
765
|
const instances = `${rendererPrefix}.instances`;
|
|
753
766
|
const history = `${rendererPrefix}.history`;
|
|
754
767
|
const projectionRuntime = `${rendererPrefix}.runtime`;
|
|
@@ -860,9 +873,9 @@ function gpuParticleRenderFeature(options) {
|
|
|
860
873
|
group: 0,
|
|
861
874
|
runtime: projectionRuntime,
|
|
862
875
|
instances,
|
|
863
|
-
...
|
|
876
|
+
...sceneDepthBinding === void 0 ? {} : { sceneDepthBinding }
|
|
864
877
|
},
|
|
865
|
-
...
|
|
878
|
+
...sceneDepthBinding !== void 0 && depthTarget !== void 0 ? { logicalTargets: { sceneDepth: depthTarget.name } } : {}
|
|
866
879
|
},
|
|
867
880
|
{ kind: "vertex-data", name: vertexData, layout: vertexLayout, buffer: instances }
|
|
868
881
|
);
|
|
@@ -946,7 +959,7 @@ function gpuParticleRenderFeature(options) {
|
|
|
946
959
|
depthStoreOp: "store"
|
|
947
960
|
}
|
|
948
961
|
},
|
|
949
|
-
...
|
|
962
|
+
...sceneDepthBinding !== void 0 && depthTarget !== void 0 ? { sampledTargets: [depthTarget.name] } : {},
|
|
950
963
|
draws: [
|
|
951
964
|
{
|
|
952
965
|
program: graphicsProgram,
|