@zephyr3d/editor 0.3.8 → 0.3.9
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/assets/{index-BZ1L8ggE.js → index-CO6yA4Rj.js} +313 -11
- package/dist/assistant/zephyr-types-index.json +13834 -11679
- package/dist/index.html +1 -1
- package/dist/modules/zephyr3d_backend-webgpu.js +1 -1
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_device.js +2 -2
- package/dist/modules/zephyr3d_device.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +2325 -515
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/device.js +2 -2
- package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/app/engine.js +3 -1
- package/dist/vendor/zephyr3d/scene/dist/app/engine.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +87 -0
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/index.d.ts +158 -4
- package/dist/vendor/zephyr3d/scene/dist/index.js +3 -0
- package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js +8 -1
- package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js +6 -0
- package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/material/skin.js +263 -0
- package/dist/vendor/zephyr3d/scene/dist/material/skin.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js +3 -0
- package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js +194 -0
- package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js +26 -49
- package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js +2 -40
- package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js +4 -1
- package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/renderer.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/render/renderer.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js +12 -5
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +78 -8
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/environment.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/environment.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/light.js +158 -154
- package/dist/vendor/zephyr3d/scene/dist/scene/light.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/water.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/water.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js +617 -1
- package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js +182 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js +183 -105
- package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +3 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js +122 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js +102 -21
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js +195 -3
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/values.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/values.js.map +1 -1
- package/electron/main.cjs +30 -6
- package/package.json +4 -4
|
@@ -48,10 +48,8 @@ import { RGHistoryResources } from '../render/rendergraph/history_resources.js';
|
|
|
48
48
|
}
|
|
49
49
|
apply(ctx, inputColorTexture, sceneDepthTexture, srgbOutput) {
|
|
50
50
|
const historyManager = ctx.camera.getHistoryResourceManager();
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
const prevColorTex = useGraphHistory ? historyManager.tryGetPrevious(RGHistoryResources.TAA_COLOR) : data.prevColorTex;
|
|
54
|
-
const prevMotionVectorTex = useGraphHistory ? historyManager.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR) : data.prevMotionVectorTex;
|
|
51
|
+
const prevColorTex = historyManager.tryGetPrevious(RGHistoryResources.TAA_COLOR);
|
|
52
|
+
const prevMotionVectorTex = historyManager.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR);
|
|
55
53
|
if (!prevColorTex || !prevMotionVectorTex || prevColorTex.width !== inputColorTexture.width || prevColorTex.height !== inputColorTexture.height) {
|
|
56
54
|
this.passThrough(ctx, inputColorTexture, srgbOutput);
|
|
57
55
|
} else {
|
|
@@ -76,42 +74,6 @@ import { RGHistoryResources } from '../render/rendergraph/history_resources.js';
|
|
|
76
74
|
ctx.device.setBindGroup(0, this._bindGroup);
|
|
77
75
|
this.drawFullscreenQuad();
|
|
78
76
|
}
|
|
79
|
-
const currentColorTex = ctx.device.getFramebuffer().getColorAttachments()[0];
|
|
80
|
-
if (useGraphHistory) {
|
|
81
|
-
const colorSize = {
|
|
82
|
-
width: currentColorTex.width,
|
|
83
|
-
height: currentColorTex.height
|
|
84
|
-
};
|
|
85
|
-
historyManager.queueRetainedCommit(RGHistoryResources.TAA_COLOR, {
|
|
86
|
-
format: currentColorTex.format,
|
|
87
|
-
sizeMode: 'absolute',
|
|
88
|
-
width: currentColorTex.width,
|
|
89
|
-
height: currentColorTex.height
|
|
90
|
-
}, colorSize, currentColorTex);
|
|
91
|
-
if (ctx.motionVectorTexture) {
|
|
92
|
-
const motionVectorSize = {
|
|
93
|
-
width: ctx.motionVectorTexture.width,
|
|
94
|
-
height: ctx.motionVectorTexture.height
|
|
95
|
-
};
|
|
96
|
-
historyManager.queueRetainedCommit(RGHistoryResources.TAA_MOTION_VECTOR, {
|
|
97
|
-
format: ctx.motionVectorTexture.format,
|
|
98
|
-
sizeMode: 'absolute',
|
|
99
|
-
width: ctx.motionVectorTexture.width,
|
|
100
|
-
height: ctx.motionVectorTexture.height
|
|
101
|
-
}, motionVectorSize, ctx.motionVectorTexture);
|
|
102
|
-
}
|
|
103
|
-
} else {
|
|
104
|
-
if (data.prevColorTex) {
|
|
105
|
-
ctx.device.pool.releaseTexture(data.prevColorTex);
|
|
106
|
-
}
|
|
107
|
-
ctx.device.pool.retainTexture(currentColorTex);
|
|
108
|
-
data.prevColorTex = currentColorTex;
|
|
109
|
-
if (data.prevMotionVectorTex) {
|
|
110
|
-
ctx.device.pool.releaseTexture(data.prevMotionVectorTex);
|
|
111
|
-
}
|
|
112
|
-
ctx.device.pool.retainTexture(ctx.motionVectorTexture);
|
|
113
|
-
data.prevMotionVectorTex = ctx.motionVectorTexture;
|
|
114
|
-
}
|
|
115
77
|
}
|
|
116
78
|
requireLinearDepthTexture(_ctx) {
|
|
117
79
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taa.js","sources":["../../src/posteffect/taa.ts"],"sourcesContent":["import type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, Primitive } from '../render';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { BoxShape } from '../shapes';\r\nimport { temporalResolve } from '../shaders/temporal';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\n\r\n/** @internal */\r\nexport class TAA extends AbstractPostEffect {\r\n private static _resolveProgram: GPUProgram[] = [];\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n private static _box: Primitive;\r\n private static readonly _texSize = new Vector2();\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _skyMotionVectorBindGroup: Nullable<BindGroup>;\r\n constructor() {\r\n super();\r\n this._bindGroup = null;\r\n this._layer = PostEffectLayer.end;\r\n this._skyMotionVectorBindGroup = null;\r\n }\r\n renderSkyMotionVectors(ctx: DrawContext) {\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n ctx.motionVectorTexture!,\r\n ctx.depthTexture\r\n );\r\n const program = TAA._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = TAA._getBox(ctx);\r\n this._skyMotionVectorBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n this._skyMotionVectorBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n this._skyMotionVectorBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n this._skyMotionVectorBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._skyMotionVectorBindGroup);\r\n ctx.device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, 'le'));\r\n ctx.device.setFramebuffer(fb);\r\n box.draw();\r\n ctx.device.popDeviceStates();\r\n ctx.device.pool.releaseFrameBuffer(fb);\r\n }\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const historyManager = ctx.camera.getHistoryResourceManager();\r\n const useGraphHistory = !!historyManager?.frameActive;\r\n const data = useGraphHistory ? null : ctx.camera.getHistoryData();\r\n const prevColorTex = useGraphHistory\r\n ? historyManager.tryGetPrevious(RGHistoryResources.TAA_COLOR)\r\n : data!.prevColorTex;\r\n const prevMotionVectorTex = useGraphHistory\r\n ? historyManager.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR)\r\n : data!.prevMotionVectorTex;\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputColorTexture.width ||\r\n prevColorTex.height !== inputColorTexture.height\r\n ) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n } else {\r\n let program = TAA._resolveProgram[ctx.camera.TAADebug];\r\n if (!program) {\r\n program = TAA._getResolveProgram(ctx, ctx.camera.TAADebug);\r\n TAA._resolveProgram[ctx.camera.TAADebug] = program;\r\n }\r\n if (!this._bindGroup) {\r\n this._bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n this._bindGroup.setTexture('historyColorTex', prevColorTex, fetchSampler('clamp_linear_nomip'));\r\n this._bindGroup.setTexture('currentColorTex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('currentDepthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture(\r\n 'motionVector',\r\n ctx.motionVectorTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._bindGroup.setTexture(\r\n 'prevMotionVector',\r\n prevMotionVectorTex,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n this._bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n TAA._texSize.setXY(sceneDepthTexture.width, sceneDepthTexture.height);\r\n this._bindGroup.setValue('texSize', TAA._texSize);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n const currentColorTex = ctx.device.getFramebuffer()!.getColorAttachments()[0] as Texture2D;\r\n if (useGraphHistory) {\r\n const colorSize = { width: currentColorTex.width, height: currentColorTex.height };\r\n historyManager.queueRetainedCommit(\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: currentColorTex.format,\r\n sizeMode: 'absolute',\r\n width: currentColorTex.width,\r\n height: currentColorTex.height\r\n },\r\n colorSize,\r\n currentColorTex\r\n );\r\n if (ctx.motionVectorTexture) {\r\n const motionVectorSize = {\r\n width: ctx.motionVectorTexture.width,\r\n height: ctx.motionVectorTexture.height\r\n };\r\n historyManager.queueRetainedCommit(\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: ctx.motionVectorTexture.format,\r\n sizeMode: 'absolute',\r\n width: ctx.motionVectorTexture.width,\r\n height: ctx.motionVectorTexture.height\r\n },\r\n motionVectorSize,\r\n ctx.motionVectorTexture\r\n );\r\n }\r\n } else {\r\n if (data!.prevColorTex) {\r\n ctx.device.pool.releaseTexture(data!.prevColorTex);\r\n }\r\n ctx.device.pool.retainTexture(currentColorTex);\r\n data!.prevColorTex = currentColorTex;\r\n if (data!.prevMotionVectorTex) {\r\n ctx.device.pool.releaseTexture(data!.prevMotionVectorTex);\r\n }\r\n ctx.device.pool.retainTexture(ctx.motionVectorTexture!);\r\n data!.prevMotionVectorTex = ctx.motionVectorTexture!;\r\n }\r\n }\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return true;\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext) {\r\n if (!this._skyMotionVectorProgram) {\r\n this._skyMotionVectorProgram = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = this.clipPos.w;\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n this._skyMotionVectorProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n return this._skyMotionVectorProgram;\r\n }\r\n private static _getBox(_ctx: DrawContext) {\r\n if (!this._box) {\r\n this._box = new BoxShape({\r\n size: 2,\r\n needNormal: false,\r\n needUV: false\r\n });\r\n }\r\n return this._box;\r\n }\r\n private static _getResolveProgram(ctx: DrawContext, debug: number) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.historyColorTex = pb.tex2D().uniform(0);\r\n this.currentColorTex = pb.tex2D().uniform(0);\r\n this.currentDepthTex = pb.tex2D().uniform(0);\r\n this.motionVector = pb.tex2D().uniform(0);\r\n this.prevMotionVector = pb.tex2D().uniform(0);\r\n this.texSize = pb.vec2().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.screenUV = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.texSize);\r\n this.$l.resolvedColor = temporalResolve(\r\n this,\r\n this.currentColorTex,\r\n this.historyColorTex,\r\n this.currentDepthTex,\r\n this.motionVector,\r\n this.prevMotionVector,\r\n this.screenUV,\r\n this.texSize,\r\n debug\r\n );\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.resolvedColor, 1);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.resolvedColor), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TAA_Resolve';\r\n return program;\r\n }\r\n}\r\n"],"names":["TAA","AbstractPostEffect","_resolveProgram","_skyMotionVectorProgram","_box","_texSize","Vector2","_bindGroup","_skyMotionVectorBindGroup","_layer","PostEffectLayer","end","renderSkyMotionVectors","ctx","fb","device","pool","fetchTemporalFramebuffer","motionVectorTexture","depthTexture","program","_getSkyMotionVectorProgram","createBindGroup","bindGroupLayouts","box","_getBox","setValue","camera","viewProjectionMatrix","prevVPMatrix","getWorldPosition","prevPosition","pushDeviceStates","setProgram","setBindGroup","setRenderStates","getDefaultRenderState","setFramebuffer","draw","popDeviceStates","releaseFrameBuffer","apply","inputColorTexture","sceneDepthTexture","srgbOutput","historyManager","getHistoryResourceManager","useGraphHistory","frameActive","data","getHistoryData","prevColorTex","tryGetPrevious","RGHistoryResources","TAA_COLOR","prevMotionVectorTex","TAA_MOTION_VECTOR","width","height","passThrough","TAADebug","_getResolveProgram","setTexture","fetchSampler","needFlip","setXY","drawFullscreenQuad","currentColorTex","getFramebuffer","getColorAttachments","colorSize","queueRetainedCommit","format","sizeMode","motionVectorSize","releaseTexture","retainTexture","requireLinearDepthTexture","_ctx","requireDepthAttachment","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","color","motionVector","sub","div","xy","name","BoxShape","size","needNormal","needUV","debug","flip","int","vec2","uv","$if","notEqual","y","neg","historyColorTex","tex2D","currentDepthTex","prevMotionVector","texSize","srgbOut","outColor","screenUV","fragCoord","resolvedColor","temporalResolve","equal","$else","linearToGamma"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"taa.js","sources":["../../src/posteffect/taa.ts"],"sourcesContent":["import type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, Primitive } from '../render';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { BoxShape } from '../shapes';\r\nimport { temporalResolve } from '../shaders/temporal';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\n\r\n/** @internal */\r\nexport class TAA extends AbstractPostEffect {\r\n private static _resolveProgram: GPUProgram[] = [];\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n private static _box: Primitive;\r\n private static readonly _texSize = new Vector2();\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _skyMotionVectorBindGroup: Nullable<BindGroup>;\r\n constructor() {\r\n super();\r\n this._bindGroup = null;\r\n this._layer = PostEffectLayer.end;\r\n this._skyMotionVectorBindGroup = null;\r\n }\r\n renderSkyMotionVectors(ctx: DrawContext) {\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n ctx.motionVectorTexture!,\r\n ctx.depthTexture\r\n );\r\n const program = TAA._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = TAA._getBox(ctx);\r\n this._skyMotionVectorBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n this._skyMotionVectorBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n this._skyMotionVectorBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n this._skyMotionVectorBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._skyMotionVectorBindGroup);\r\n ctx.device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, 'le'));\r\n ctx.device.setFramebuffer(fb);\r\n box.draw();\r\n ctx.device.popDeviceStates();\r\n ctx.device.pool.releaseFrameBuffer(fb);\r\n }\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const historyManager = ctx.camera.getHistoryResourceManager();\r\n const prevColorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_COLOR);\r\n const prevMotionVectorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR);\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputColorTexture.width ||\r\n prevColorTex.height !== inputColorTexture.height\r\n ) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n } else {\r\n let program = TAA._resolveProgram[ctx.camera.TAADebug];\r\n if (!program) {\r\n program = TAA._getResolveProgram(ctx, ctx.camera.TAADebug);\r\n TAA._resolveProgram[ctx.camera.TAADebug] = program;\r\n }\r\n if (!this._bindGroup) {\r\n this._bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n this._bindGroup.setTexture('historyColorTex', prevColorTex, fetchSampler('clamp_linear_nomip'));\r\n this._bindGroup.setTexture('currentColorTex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('currentDepthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture(\r\n 'motionVector',\r\n ctx.motionVectorTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._bindGroup.setTexture(\r\n 'prevMotionVector',\r\n prevMotionVectorTex,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n this._bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n TAA._texSize.setXY(sceneDepthTexture.width, sceneDepthTexture.height);\r\n this._bindGroup.setValue('texSize', TAA._texSize);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n }\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return true;\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext) {\r\n if (!this._skyMotionVectorProgram) {\r\n this._skyMotionVectorProgram = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = this.clipPos.w;\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n this._skyMotionVectorProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n return this._skyMotionVectorProgram;\r\n }\r\n private static _getBox(_ctx: DrawContext) {\r\n if (!this._box) {\r\n this._box = new BoxShape({\r\n size: 2,\r\n needNormal: false,\r\n needUV: false\r\n });\r\n }\r\n return this._box;\r\n }\r\n private static _getResolveProgram(ctx: DrawContext, debug: number) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.historyColorTex = pb.tex2D().uniform(0);\r\n this.currentColorTex = pb.tex2D().uniform(0);\r\n this.currentDepthTex = pb.tex2D().uniform(0);\r\n this.motionVector = pb.tex2D().uniform(0);\r\n this.prevMotionVector = pb.tex2D().uniform(0);\r\n this.texSize = pb.vec2().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.screenUV = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.texSize);\r\n this.$l.resolvedColor = temporalResolve(\r\n this,\r\n this.currentColorTex,\r\n this.historyColorTex,\r\n this.currentDepthTex,\r\n this.motionVector,\r\n this.prevMotionVector,\r\n this.screenUV,\r\n this.texSize,\r\n debug\r\n );\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.resolvedColor, 1);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.resolvedColor), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TAA_Resolve';\r\n return program;\r\n }\r\n}\r\n"],"names":["TAA","AbstractPostEffect","_resolveProgram","_skyMotionVectorProgram","_box","_texSize","Vector2","_bindGroup","_skyMotionVectorBindGroup","_layer","PostEffectLayer","end","renderSkyMotionVectors","ctx","fb","device","pool","fetchTemporalFramebuffer","motionVectorTexture","depthTexture","program","_getSkyMotionVectorProgram","createBindGroup","bindGroupLayouts","box","_getBox","setValue","camera","viewProjectionMatrix","prevVPMatrix","getWorldPosition","prevPosition","pushDeviceStates","setProgram","setBindGroup","setRenderStates","getDefaultRenderState","setFramebuffer","draw","popDeviceStates","releaseFrameBuffer","apply","inputColorTexture","sceneDepthTexture","srgbOutput","historyManager","getHistoryResourceManager","prevColorTex","tryGetPrevious","RGHistoryResources","TAA_COLOR","prevMotionVectorTex","TAA_MOTION_VECTOR","width","height","passThrough","TAADebug","_getResolveProgram","setTexture","fetchSampler","needFlip","setXY","drawFullscreenQuad","requireLinearDepthTexture","_ctx","requireDepthAttachment","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","color","motionVector","sub","div","xy","name","BoxShape","size","needNormal","needUV","debug","flip","int","vec2","uv","$if","notEqual","y","neg","historyColorTex","tex2D","currentColorTex","currentDepthTex","prevMotionVector","texSize","srgbOut","outColor","screenUV","fragCoord","resolvedColor","temporalResolve","equal","$else","linearToGamma"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import '../material/blinn.js';
|
|
|
5
5
|
import '../material/unlit.js';
|
|
6
6
|
import '../material/particle.js';
|
|
7
7
|
import '../material/subsurfaceprofile.js';
|
|
8
|
+
import '../material/skin.js';
|
|
8
9
|
import '@zephyr3d/device';
|
|
9
10
|
import '../values.js';
|
|
10
11
|
import { Disposable } from '@zephyr3d/base';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abuffer_oit.js","sources":["../../src/render/abuffer_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceViewport,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { ShaderHelper } from '../material';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * per-pixel linked list OIT renderer using ABuffer.\r\n *\r\n * @remarks\r\n * The ABuffer OIT renderer only supports WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class ABufferOIT extends Disposable implements OIT {\r\n /** Type name of ABufferOIT */\r\n public static readonly type = 'ab';\r\n public static readonly usePremultipliedAlpha = true;\r\n private static readonly MAX_FRAGMENT_LAYERS = 75;\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private static _compositeAdditiveRenderStates: Nullable<RenderStateSet> = null;\r\n private static _ubAlignment = 0;\r\n private _nodeBuffer: Nullable<GPUDataBuffer>;\r\n private _headStagingBuffer: Nullable<GPUDataBuffer>;\r\n private _headBuffer: Nullable<GPUDataBuffer>;\r\n private _scissorOffsetBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _numLayers: number;\r\n private _screenSize: Uint32Array<ArrayBuffer>;\r\n private _hash: Nullable<string>;\r\n private readonly _debug: boolean;\r\n private _scissorSlices: number;\r\n private _scissorHeight: number;\r\n private _currentPass: number;\r\n private _savedScissor: Nullable<DeviceViewport>;\r\n private _singleColorFramebuffer: Nullable<FrameBuffer>;\r\n /**\r\n * Creates an instance of ABufferOIT class\r\n *\r\n * @param numLayers - How many transparent layers, default is 16\r\n */\r\n constructor(numLayers = 16) {\r\n super();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer = null;\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer = null;\r\n this._numLayers = numLayers;\r\n this._screenSize = new Uint32Array([0xffffffff, 0xffffffff]);\r\n this._hash = null;\r\n this._debug = false;\r\n this._scissorSlices = 0;\r\n this._scissorHeight = 0;\r\n this._savedScissor = null;\r\n this._currentPass = 0;\r\n this._singleColorFramebuffer = null;\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return ABufferOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n return deviceType === 'webgpu';\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return ABufferOIT.usePremultipliedAlpha;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._savedScissor = device.getScissor();\r\n const ubAlignment = (ABufferOIT._ubAlignment =\r\n device.getDeviceCaps().shaderCaps.uniformBufferOffsetAlignment);\r\n const viewport = device.getViewport();\r\n const screenWidth = device.screenXToDevice(viewport.width);\r\n const screenHeight = device.screenYToDevice(Math.max(viewport.height, 1));\r\n if (screenWidth !== this._screenSize[0] || screenHeight !== this._screenSize[1]) {\r\n // Resize buffers if viewport was changed\r\n this._screenSize[0] = screenWidth;\r\n this._screenSize[1] = screenHeight;\r\n // compute scissor slices\r\n const maxBufferSize = device.getDeviceCaps().shaderCaps.maxStorageBufferSize;\r\n const bytesPerLine = screenWidth * 4 * 4 * this._numLayers;\r\n this._scissorHeight = (maxBufferSize / bytesPerLine) >> 0;\r\n this._scissorSlices = Math.ceil(screenHeight / this._scissorHeight);\r\n const offsetBufferSize = ubAlignment * this._scissorSlices;\r\n const offsetBuffer = new Uint32Array(offsetBufferSize >> 2);\r\n for (let i = 0; i < this._scissorSlices; i++) {\r\n offsetBuffer[i * (ubAlignment >> 2)] = i * this._scissorHeight;\r\n }\r\n if (!this._scissorOffsetBuffer || this._scissorOffsetBuffer.byteLength < offsetBuffer.byteLength) {\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = device.createBuffer(offsetBuffer.byteLength, { usage: 'uniform' });\r\n }\r\n this._scissorOffsetBuffer.bufferSubData(0, offsetBuffer);\r\n // resize node buffer\r\n const size = screenWidth * this._scissorHeight * 4;\r\n const nodeBufferSize = size * 4 * this._numLayers;\r\n if (!this._nodeBuffer || nodeBufferSize > this._nodeBuffer.byteLength) {\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = device.createBuffer(nodeBufferSize, { storage: true, usage: 'uniform' });\r\n }\r\n // resize head buffer\r\n const headBufferSize = size + 4;\r\n if (!this._headBuffer || headBufferSize > this._headBuffer.byteLength) {\r\n this._headBuffer?.dispose();\r\n this._headBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n const tmpArray = new Uint32Array(headBufferSize >> 2);\r\n tmpArray.fill(0xffffffff);\r\n this._headStagingBuffer.bufferSubData(0, tmpArray);\r\n }\r\n }\r\n return this._scissorSlices;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n // Restore scissor rect\r\n ctx.device.setScissor(this._savedScissor);\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.Z_AB_scissorOffset = pb.uint().uniformBuffer(2);\r\n scope.Z_AB_nodeBuffer = pb.uvec4[0]().storageBuffer(2);\r\n scope.Z_AB_headImage = pb.atomic_uint[0]().storageBuffer(2);\r\n scope.Z_AB_screenSize = pb.uint().uniform(2);\r\n scope.Z_AB_depthTexture = pb.tex2D().uniform(2);\r\n scope.$outputs.outColor = pb.vec4();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const device = ctx.device;\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n this._singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (this._singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n const scissorY = pass * this._scissorHeight;\r\n const scissorH =\r\n Math.min((pass + 1) * this._scissorHeight, this._screenSize[1]) - pass * this._scissorHeight;\r\n device.setScissor([\r\n 0,\r\n device.deviceYToScreen(this._screenSize[1] - scissorY - scissorH),\r\n device.deviceXToScreen(this._screenSize[0]),\r\n device.deviceYToScreen(scissorH)\r\n ]);\r\n device.copyBuffer(this._headStagingBuffer!, this._headBuffer!, 0, 0, this._headStagingBuffer!.byteLength);\r\n // Update render hash\r\n this._hash = `${this.getType()}#${this._nodeBuffer!.uid}#${this._headBuffer!.uid}#${\r\n this._scissorOffsetBuffer!.uid\r\n }#${pass}`;\r\n if (this._debug) {\r\n const data = new Uint8Array(this._headBuffer!.byteLength);\r\n const readBuffer = device.createBuffer(this._headBuffer!.byteLength, { usage: 'read' });\r\n device.copyBuffer(this._headBuffer!, readBuffer, 0, 0, this._headBuffer!.byteLength);\r\n readBuffer.getBufferSubData(data).then(() => {\r\n const uint = new Uint32Array(data.buffer);\r\n for (let i = 0; i < uint.length; i++) {\r\n if (uint[i] !== 0xffffffff) {\r\n console.error('Clear head buffer failed');\r\n break;\r\n }\r\n }\r\n readBuffer.dispose();\r\n });\r\n }\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, pass: number) {\r\n const device = ctx.device;\r\n ABufferOIT.getCompositeProgram(device);\r\n const lastBindGroup = device.getBindGroup(0);\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n !this._singleColorFramebuffer &&\r\n currentFramebuffer &&\r\n currentFramebuffer.getColorAttachments().length > 1 &&\r\n colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(ABufferOIT.getCompositeProgram(device));\r\n const bindGroup = ABufferOIT._compositeBindGroup!;\r\n bindGroup.setBuffer(\r\n 'scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n pass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('headBuffer', this._headBuffer!);\r\n bindGroup.setBuffer('nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setValue('screenWidth', this._screenSize[0]);\r\n bindGroup.setValue('additiveOnly', ctx.lightBlending ? 1 : 0);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(\r\n ctx.lightBlending ? ABufferOIT._compositeAdditiveRenderStates! : ABufferOIT._compositeRenderStates!\r\n );\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n } else if (this._singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(this._singleColorFramebuffer);\r\n this._singleColorFramebuffer = null;\r\n } else {\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash!;\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(ctx: DrawContext, bindGroup: BindGroup) {\r\n bindGroup.setBuffer('Z_AB_nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setBuffer(\r\n 'Z_AB_scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n this._currentPass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('Z_AB_headImage', this._headBuffer!);\r\n bindGroup.setValue('Z_AB_screenSize', this._screenSize[0]);\r\n bindGroup.setTexture('Z_AB_depthTexture', ctx.linearDepthTexture!);\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n // linear depth of current fragment\r\n scope.$l.fragDepth = ShaderHelper.nonLinearDepthToLinearNormalized(scope, scope.$builtins.fragCoord.z);\r\n // linear depth in depth texture\r\n scope.$l.linearDepth = pb.textureLoad(\r\n scope.Z_AB_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).r;\r\n // saved to buffer only if nothing is infront\r\n scope.$if(pb.lessThan(scope.fragDepth, scope.linearDepth), function () {\r\n this.$l.Z_AB_pixelCount = pb.atomicAdd(this.Z_AB_headImage.at(0), 1);\r\n this.$l.Z_AB_nodeOffset = this.Z_AB_pixelCount;\r\n // save if index not exceeded\r\n this.$if(pb.lessThan(this.Z_AB_nodeOffset, pb.arrayLength(this.Z_AB_nodeBuffer)), function () {\r\n this.$l.Z_AB_headOffset = pb.add(\r\n pb.mul(this.Z_AB_screenSize, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.Z_AB_scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n this.$l.Z_AB_oldHead = pb.atomicExchange(\r\n this.Z_AB_headImage.at(pb.add(this.Z_AB_headOffset, 1)),\r\n this.Z_AB_nodeOffset\r\n );\r\n this.$l.Z_AB_colorScale = pb.floatBitsToUint(pb.length(color.rgb));\r\n this.$l.Z_AB_color = pb.pack4x8unorm(pb.vec4(pb.normalize(color.rgb), pb.clamp(color.a, 0, 1)));\r\n this.$l.Z_AB_depth = pb.floatBitsToUint(this.fragDepth);\r\n this.Z_AB_nodeBuffer.setAt(\r\n this.Z_AB_nodeOffset,\r\n pb.uvec4(this.Z_AB_color, this.Z_AB_colorScale, this.Z_AB_depth, this.Z_AB_oldHead)\r\n );\r\n pb.discard();\r\n });\r\n });\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const stencilStates = rs.useStencilState();\r\n stencilStates.enable(true);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(1);\r\n stencilStates.setReadMask(0xff);\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.scissorOffset = pb.uint().uniformBuffer(0);\r\n this.headBuffer = pb.uint[0]().storageBuffer(0);\r\n this.nodeBuffer = pb.uvec4[0]().storageBuffer(0);\r\n this.screenWidth = pb.uint().uniform(0);\r\n this.additiveOnly = pb.int().uniform(0);\r\n pb.func('unpackColor', [pb.uvec4('x')], function () {\r\n this.$l.colorNorm = pb.unpack4x8unorm(this.x.x);\r\n this.$l.colorScale = pb.uintBitsToFloat(this.x.y);\r\n this.$return(pb.vec4(pb.mul(this.colorNorm.rgb, this.colorScale), this.colorNorm.a));\r\n });\r\n pb.main(function () {\r\n this.$l.fragmentArray = pb.uvec4[ABufferOIT.MAX_FRAGMENT_LAYERS]();\r\n this.$l.fragmentArrayLen = pb.uint(0);\r\n this.$l.offset = pb.add(\r\n pb.mul(this.screenWidth, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n //this.$l.head = this.headBuffer.at(this.offset);\r\n this.$l.head = this.headBuffer.at(pb.add(this.offset, 1));\r\n this.$while(\r\n pb.and(\r\n pb.lessThan(this.fragmentArrayLen, ABufferOIT.MAX_FRAGMENT_LAYERS),\r\n pb.notEqual(this.head, 0xffffffff)\r\n ),\r\n function () {\r\n this.fragmentArray.setAt(this.fragmentArrayLen, this.nodeBuffer.at(this.head));\r\n this.head = this.fragmentArray.at(this.fragmentArrayLen).w;\r\n this.fragmentArrayLen = pb.add(this.fragmentArrayLen, 1);\r\n }\r\n );\r\n this.$if(pb.equal(this.fragmentArrayLen, 0), function () {\r\n this.$outputs.outColor = pb.vec4(0, 0, 0, 1);\r\n }).$else(function () {\r\n // bubble sort\r\n this.$for(pb.uint('i'), 0, pb.sub(this.fragmentArrayLen, 1), function () {\r\n this.$for(pb.uint('j'), 0, pb.sub(pb.sub(this.fragmentArrayLen, 1), this.i), function () {\r\n this.$l.a = this.fragmentArray.at(this.j);\r\n this.$l.b = this.fragmentArray.at(pb.add(this.j, 1));\r\n this.$if(pb.greaterThan(this.a.z, this.b.z), function () {\r\n this.fragmentArray.setAt(this.j, this.b);\r\n this.fragmentArray.setAt(pb.add(this.j, 1), this.a);\r\n });\r\n });\r\n });\r\n // under operator blending\r\n this.$l.c0 = this.unpackColor(this.fragmentArray[0]);\r\n this.$l.c_dst = ABufferOIT.usePremultipliedAlpha ? this.c0.rgb : pb.mul(this.c0.rgb, this.c0.a);\r\n this.$l.a_dst = pb.sub(1, this.c0.a);\r\n this.$for(pb.uint('i'), 1, this.fragmentArrayLen, function () {\r\n this.$l.c = this.unpackColor(this.fragmentArray.at(this.i));\r\n if (ABufferOIT.usePremultipliedAlpha) {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.a_dst));\r\n } else {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.c.a, this.a_dst));\r\n }\r\n this.a_dst = pb.mul(this.a_dst, pb.sub(1, this.c.a));\r\n });\r\n this.$outputs.outColor = pb.vec4(\r\n this.c_dst,\r\n pb.equal(this.additiveOnly, 0) ? this.a_dst : pb.float(0)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@ABufferOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._compositeAdditiveRenderStates = device.createRenderStateSet();\r\n this._compositeAdditiveRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeAdditiveRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n const stencilStates = this._compositeRenderStates.useStencilState();\r\n stencilStates.enable(false);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(0);\r\n stencilStates.setReadMask(0xff);\r\n const additiveStencilStates = this._compositeAdditiveRenderStates.useStencilState();\r\n additiveStencilStates.enable(false);\r\n additiveStencilStates.setFrontCompareFunc('always');\r\n additiveStencilStates.setBackCompareFunc('always');\r\n additiveStencilStates.setFrontOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setBackOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setReference(0);\r\n additiveStencilStates.setReadMask(0xff);\r\n }\r\n return this._compositeProgram;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = null;\r\n this._headBuffer?.dispose();\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = null;\r\n this._hash = null;\r\n this._savedScissor = null;\r\n }\r\n}\r\n"],"names":["ABufferOIT","Disposable","type","usePremultipliedAlpha","MAX_FRAGMENT_LAYERS","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_compositeAdditiveRenderStates","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","_singleColorFramebuffer","numLayers","Uint32Array","getType","supportDevice","deviceType","wantsPremultipliedAlpha","begin","ctx","device","getScissor","ubAlignment","getDeviceCaps","shaderCaps","uniformBufferOffsetAlignment","viewport","getViewport","screenWidth","screenXToDevice","width","screenHeight","screenYToDevice","Math","max","height","maxBufferSize","maxStorageBufferSize","bytesPerLine","ceil","offsetBufferSize","offsetBuffer","i","byteLength","dispose","createBuffer","usage","bufferSubData","size","nodeBufferSize","storage","headBufferSize","tmpArray","fill","end","setScissor","setupFragmentOutput","scope","pb","$builder","Z_AB_scissorOffset","uint","uniformBuffer","Z_AB_nodeBuffer","uvec4","storageBuffer","Z_AB_headImage","atomic_uint","Z_AB_screenSize","uniform","Z_AB_depthTexture","tex2D","$outputs","outColor","vec4","beginPass","pass","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","length","pool","fetchTemporalFramebuffer","getDepthAttachment","scissor","pushDeviceStates","setFramebuffer","setViewport","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","singleColorFramebuffer","setProgram","bindGroup","setBuffer","setValue","lightBlending","setBindGroup","drawFullscreenQuad","popDeviceStates","releaseFrameBuffer","calculateHash","applyUniforms","setTexture","linearDepthTexture","outputFragmentColor","color","$l","fragDepth","ShaderHelper","nonLinearDepthToLinearNormalized","$builtins","fragCoord","z","linearDepth","textureLoad","ivec2","xy","r","$if","lessThan","Z_AB_pixelCount","atomicAdd","at","Z_AB_nodeOffset","arrayLength","Z_AB_headOffset","add","mul","sub","y","x","Z_AB_oldHead","atomicExchange","Z_AB_colorScale","floatBitsToUint","rgb","Z_AB_color","pack4x8unorm","normalize","clamp","a","Z_AB_depth","setAt","discard","setRenderStates","rs","stencilStates","useStencilState","enable","setFrontCompareFunc","setBackCompareFunc","setFrontOp","setBackOp","setReference","setReadMask","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","neg","fragment","scissorOffset","headBuffer","nodeBuffer","additiveOnly","int","func","colorNorm","unpack4x8unorm","colorScale","uintBitsToFloat","$return","fragmentArray","fragmentArrayLen","offset","head","$while","and","notEqual","w","equal","$else","$for","j","b","greaterThan","c0","unpackColor","c_dst","a_dst","c","float","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","additiveStencilStates","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abuffer_oit.js","sources":["../../src/render/abuffer_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceViewport,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { ShaderHelper } from '../material';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * per-pixel linked list OIT renderer using ABuffer.\r\n *\r\n * @remarks\r\n * The ABuffer OIT renderer only supports WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class ABufferOIT extends Disposable implements OIT {\r\n /** Type name of ABufferOIT */\r\n public static readonly type = 'ab';\r\n public static readonly usePremultipliedAlpha = true;\r\n private static readonly MAX_FRAGMENT_LAYERS = 75;\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private static _compositeAdditiveRenderStates: Nullable<RenderStateSet> = null;\r\n private static _ubAlignment = 0;\r\n private _nodeBuffer: Nullable<GPUDataBuffer>;\r\n private _headStagingBuffer: Nullable<GPUDataBuffer>;\r\n private _headBuffer: Nullable<GPUDataBuffer>;\r\n private _scissorOffsetBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _numLayers: number;\r\n private _screenSize: Uint32Array<ArrayBuffer>;\r\n private _hash: Nullable<string>;\r\n private readonly _debug: boolean;\r\n private _scissorSlices: number;\r\n private _scissorHeight: number;\r\n private _currentPass: number;\r\n private _savedScissor: Nullable<DeviceViewport>;\r\n private _singleColorFramebuffer: Nullable<FrameBuffer>;\r\n /**\r\n * Creates an instance of ABufferOIT class\r\n *\r\n * @param numLayers - How many transparent layers, default is 16\r\n */\r\n constructor(numLayers = 16) {\r\n super();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer = null;\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer = null;\r\n this._numLayers = numLayers;\r\n this._screenSize = new Uint32Array([0xffffffff, 0xffffffff]);\r\n this._hash = null;\r\n this._debug = false;\r\n this._scissorSlices = 0;\r\n this._scissorHeight = 0;\r\n this._savedScissor = null;\r\n this._currentPass = 0;\r\n this._singleColorFramebuffer = null;\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return ABufferOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n return deviceType === 'webgpu';\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return ABufferOIT.usePremultipliedAlpha;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._savedScissor = device.getScissor();\r\n const ubAlignment = (ABufferOIT._ubAlignment =\r\n device.getDeviceCaps().shaderCaps.uniformBufferOffsetAlignment);\r\n const viewport = device.getViewport();\r\n const screenWidth = device.screenXToDevice(viewport.width);\r\n const screenHeight = device.screenYToDevice(Math.max(viewport.height, 1));\r\n if (screenWidth !== this._screenSize[0] || screenHeight !== this._screenSize[1]) {\r\n // Resize buffers if viewport was changed\r\n this._screenSize[0] = screenWidth;\r\n this._screenSize[1] = screenHeight;\r\n // compute scissor slices\r\n const maxBufferSize = device.getDeviceCaps().shaderCaps.maxStorageBufferSize;\r\n const bytesPerLine = screenWidth * 4 * 4 * this._numLayers;\r\n this._scissorHeight = (maxBufferSize / bytesPerLine) >> 0;\r\n this._scissorSlices = Math.ceil(screenHeight / this._scissorHeight);\r\n const offsetBufferSize = ubAlignment * this._scissorSlices;\r\n const offsetBuffer = new Uint32Array(offsetBufferSize >> 2);\r\n for (let i = 0; i < this._scissorSlices; i++) {\r\n offsetBuffer[i * (ubAlignment >> 2)] = i * this._scissorHeight;\r\n }\r\n if (!this._scissorOffsetBuffer || this._scissorOffsetBuffer.byteLength < offsetBuffer.byteLength) {\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = device.createBuffer(offsetBuffer.byteLength, { usage: 'uniform' });\r\n }\r\n this._scissorOffsetBuffer.bufferSubData(0, offsetBuffer);\r\n // resize node buffer\r\n const size = screenWidth * this._scissorHeight * 4;\r\n const nodeBufferSize = size * 4 * this._numLayers;\r\n if (!this._nodeBuffer || nodeBufferSize > this._nodeBuffer.byteLength) {\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = device.createBuffer(nodeBufferSize, { storage: true, usage: 'uniform' });\r\n }\r\n // resize head buffer\r\n const headBufferSize = size + 4;\r\n if (!this._headBuffer || headBufferSize > this._headBuffer.byteLength) {\r\n this._headBuffer?.dispose();\r\n this._headBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n const tmpArray = new Uint32Array(headBufferSize >> 2);\r\n tmpArray.fill(0xffffffff);\r\n this._headStagingBuffer.bufferSubData(0, tmpArray);\r\n }\r\n }\r\n return this._scissorSlices;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n // Restore scissor rect\r\n ctx.device.setScissor(this._savedScissor);\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.Z_AB_scissorOffset = pb.uint().uniformBuffer(2);\r\n scope.Z_AB_nodeBuffer = pb.uvec4[0]().storageBuffer(2);\r\n scope.Z_AB_headImage = pb.atomic_uint[0]().storageBuffer(2);\r\n scope.Z_AB_screenSize = pb.uint().uniform(2);\r\n scope.Z_AB_depthTexture = pb.tex2D().uniform(2);\r\n scope.$outputs.outColor = pb.vec4();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const device = ctx.device;\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n this._singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (this._singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n const scissorY = pass * this._scissorHeight;\r\n const scissorH =\r\n Math.min((pass + 1) * this._scissorHeight, this._screenSize[1]) - pass * this._scissorHeight;\r\n device.setScissor([\r\n 0,\r\n device.deviceYToScreen(this._screenSize[1] - scissorY - scissorH),\r\n device.deviceXToScreen(this._screenSize[0]),\r\n device.deviceYToScreen(scissorH)\r\n ]);\r\n device.copyBuffer(this._headStagingBuffer!, this._headBuffer!, 0, 0, this._headStagingBuffer!.byteLength);\r\n // Update render hash\r\n this._hash = `${this.getType()}#${this._nodeBuffer!.uid}#${this._headBuffer!.uid}#${\r\n this._scissorOffsetBuffer!.uid\r\n }#${pass}`;\r\n if (this._debug) {\r\n const data = new Uint8Array(this._headBuffer!.byteLength);\r\n const readBuffer = device.createBuffer(this._headBuffer!.byteLength, { usage: 'read' });\r\n device.copyBuffer(this._headBuffer!, readBuffer, 0, 0, this._headBuffer!.byteLength);\r\n readBuffer.getBufferSubData(data).then(() => {\r\n const uint = new Uint32Array(data.buffer);\r\n for (let i = 0; i < uint.length; i++) {\r\n if (uint[i] !== 0xffffffff) {\r\n console.error('Clear head buffer failed');\r\n break;\r\n }\r\n }\r\n readBuffer.dispose();\r\n });\r\n }\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, pass: number) {\r\n const device = ctx.device;\r\n ABufferOIT.getCompositeProgram(device);\r\n const lastBindGroup = device.getBindGroup(0);\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n !this._singleColorFramebuffer &&\r\n currentFramebuffer &&\r\n currentFramebuffer.getColorAttachments().length > 1 &&\r\n colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(ABufferOIT.getCompositeProgram(device));\r\n const bindGroup = ABufferOIT._compositeBindGroup!;\r\n bindGroup.setBuffer(\r\n 'scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n pass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('headBuffer', this._headBuffer!);\r\n bindGroup.setBuffer('nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setValue('screenWidth', this._screenSize[0]);\r\n bindGroup.setValue('additiveOnly', ctx.lightBlending ? 1 : 0);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(\r\n ctx.lightBlending ? ABufferOIT._compositeAdditiveRenderStates! : ABufferOIT._compositeRenderStates!\r\n );\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n } else if (this._singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(this._singleColorFramebuffer);\r\n this._singleColorFramebuffer = null;\r\n } else {\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash!;\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(ctx: DrawContext, bindGroup: BindGroup) {\r\n bindGroup.setBuffer('Z_AB_nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setBuffer(\r\n 'Z_AB_scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n this._currentPass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('Z_AB_headImage', this._headBuffer!);\r\n bindGroup.setValue('Z_AB_screenSize', this._screenSize[0]);\r\n bindGroup.setTexture('Z_AB_depthTexture', ctx.linearDepthTexture!);\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n // linear depth of current fragment\r\n scope.$l.fragDepth = ShaderHelper.nonLinearDepthToLinearNormalized(scope, scope.$builtins.fragCoord.z);\r\n // linear depth in depth texture\r\n scope.$l.linearDepth = pb.textureLoad(\r\n scope.Z_AB_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).r;\r\n // saved to buffer only if nothing is infront\r\n scope.$if(pb.lessThan(scope.fragDepth, scope.linearDepth), function () {\r\n this.$l.Z_AB_pixelCount = pb.atomicAdd(this.Z_AB_headImage.at(0), 1);\r\n this.$l.Z_AB_nodeOffset = this.Z_AB_pixelCount;\r\n // save if index not exceeded\r\n this.$if(pb.lessThan(this.Z_AB_nodeOffset, pb.arrayLength(this.Z_AB_nodeBuffer)), function () {\r\n this.$l.Z_AB_headOffset = pb.add(\r\n pb.mul(this.Z_AB_screenSize, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.Z_AB_scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n this.$l.Z_AB_oldHead = pb.atomicExchange(\r\n this.Z_AB_headImage.at(pb.add(this.Z_AB_headOffset, 1)),\r\n this.Z_AB_nodeOffset\r\n );\r\n this.$l.Z_AB_colorScale = pb.floatBitsToUint(pb.length(color.rgb));\r\n this.$l.Z_AB_color = pb.pack4x8unorm(pb.vec4(pb.normalize(color.rgb), pb.clamp(color.a, 0, 1)));\r\n this.$l.Z_AB_depth = pb.floatBitsToUint(this.fragDepth);\r\n this.Z_AB_nodeBuffer.setAt(\r\n this.Z_AB_nodeOffset,\r\n pb.uvec4(this.Z_AB_color, this.Z_AB_colorScale, this.Z_AB_depth, this.Z_AB_oldHead)\r\n );\r\n pb.discard();\r\n });\r\n });\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const stencilStates = rs.useStencilState();\r\n stencilStates.enable(true);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(1);\r\n stencilStates.setReadMask(0xff);\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.scissorOffset = pb.uint().uniformBuffer(0);\r\n this.headBuffer = pb.uint[0]().storageBuffer(0);\r\n this.nodeBuffer = pb.uvec4[0]().storageBuffer(0);\r\n this.screenWidth = pb.uint().uniform(0);\r\n this.additiveOnly = pb.int().uniform(0);\r\n pb.func('unpackColor', [pb.uvec4('x')], function () {\r\n this.$l.colorNorm = pb.unpack4x8unorm(this.x.x);\r\n this.$l.colorScale = pb.uintBitsToFloat(this.x.y);\r\n this.$return(pb.vec4(pb.mul(this.colorNorm.rgb, this.colorScale), this.colorNorm.a));\r\n });\r\n pb.main(function () {\r\n this.$l.fragmentArray = pb.uvec4[ABufferOIT.MAX_FRAGMENT_LAYERS]();\r\n this.$l.fragmentArrayLen = pb.uint(0);\r\n this.$l.offset = pb.add(\r\n pb.mul(this.screenWidth, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n //this.$l.head = this.headBuffer.at(this.offset);\r\n this.$l.head = this.headBuffer.at(pb.add(this.offset, 1));\r\n this.$while(\r\n pb.and(\r\n pb.lessThan(this.fragmentArrayLen, ABufferOIT.MAX_FRAGMENT_LAYERS),\r\n pb.notEqual(this.head, 0xffffffff)\r\n ),\r\n function () {\r\n this.fragmentArray.setAt(this.fragmentArrayLen, this.nodeBuffer.at(this.head));\r\n this.head = this.fragmentArray.at(this.fragmentArrayLen).w;\r\n this.fragmentArrayLen = pb.add(this.fragmentArrayLen, 1);\r\n }\r\n );\r\n this.$if(pb.equal(this.fragmentArrayLen, 0), function () {\r\n this.$outputs.outColor = pb.vec4(0, 0, 0, 1);\r\n }).$else(function () {\r\n // bubble sort\r\n this.$for(pb.uint('i'), 0, pb.sub(this.fragmentArrayLen, 1), function () {\r\n this.$for(pb.uint('j'), 0, pb.sub(pb.sub(this.fragmentArrayLen, 1), this.i), function () {\r\n this.$l.a = this.fragmentArray.at(this.j);\r\n this.$l.b = this.fragmentArray.at(pb.add(this.j, 1));\r\n this.$if(pb.greaterThan(this.a.z, this.b.z), function () {\r\n this.fragmentArray.setAt(this.j, this.b);\r\n this.fragmentArray.setAt(pb.add(this.j, 1), this.a);\r\n });\r\n });\r\n });\r\n // under operator blending\r\n this.$l.c0 = this.unpackColor(this.fragmentArray[0]);\r\n this.$l.c_dst = ABufferOIT.usePremultipliedAlpha ? this.c0.rgb : pb.mul(this.c0.rgb, this.c0.a);\r\n this.$l.a_dst = pb.sub(1, this.c0.a);\r\n this.$for(pb.uint('i'), 1, this.fragmentArrayLen, function () {\r\n this.$l.c = this.unpackColor(this.fragmentArray.at(this.i));\r\n if (ABufferOIT.usePremultipliedAlpha) {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.a_dst));\r\n } else {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.c.a, this.a_dst));\r\n }\r\n this.a_dst = pb.mul(this.a_dst, pb.sub(1, this.c.a));\r\n });\r\n this.$outputs.outColor = pb.vec4(\r\n this.c_dst,\r\n pb.equal(this.additiveOnly, 0) ? this.a_dst : pb.float(0)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@ABufferOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._compositeAdditiveRenderStates = device.createRenderStateSet();\r\n this._compositeAdditiveRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeAdditiveRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n const stencilStates = this._compositeRenderStates.useStencilState();\r\n stencilStates.enable(false);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(0);\r\n stencilStates.setReadMask(0xff);\r\n const additiveStencilStates = this._compositeAdditiveRenderStates.useStencilState();\r\n additiveStencilStates.enable(false);\r\n additiveStencilStates.setFrontCompareFunc('always');\r\n additiveStencilStates.setBackCompareFunc('always');\r\n additiveStencilStates.setFrontOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setBackOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setReference(0);\r\n additiveStencilStates.setReadMask(0xff);\r\n }\r\n return this._compositeProgram;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = null;\r\n this._headBuffer?.dispose();\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = null;\r\n this._hash = null;\r\n this._savedScissor = null;\r\n }\r\n}\r\n"],"names":["ABufferOIT","Disposable","type","usePremultipliedAlpha","MAX_FRAGMENT_LAYERS","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_compositeAdditiveRenderStates","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","_singleColorFramebuffer","numLayers","Uint32Array","getType","supportDevice","deviceType","wantsPremultipliedAlpha","begin","ctx","device","getScissor","ubAlignment","getDeviceCaps","shaderCaps","uniformBufferOffsetAlignment","viewport","getViewport","screenWidth","screenXToDevice","width","screenHeight","screenYToDevice","Math","max","height","maxBufferSize","maxStorageBufferSize","bytesPerLine","ceil","offsetBufferSize","offsetBuffer","i","byteLength","dispose","createBuffer","usage","bufferSubData","size","nodeBufferSize","storage","headBufferSize","tmpArray","fill","end","setScissor","setupFragmentOutput","scope","pb","$builder","Z_AB_scissorOffset","uint","uniformBuffer","Z_AB_nodeBuffer","uvec4","storageBuffer","Z_AB_headImage","atomic_uint","Z_AB_screenSize","uniform","Z_AB_depthTexture","tex2D","$outputs","outColor","vec4","beginPass","pass","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","length","pool","fetchTemporalFramebuffer","getDepthAttachment","scissor","pushDeviceStates","setFramebuffer","setViewport","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","singleColorFramebuffer","setProgram","bindGroup","setBuffer","setValue","lightBlending","setBindGroup","drawFullscreenQuad","popDeviceStates","releaseFrameBuffer","calculateHash","applyUniforms","setTexture","linearDepthTexture","outputFragmentColor","color","$l","fragDepth","ShaderHelper","nonLinearDepthToLinearNormalized","$builtins","fragCoord","z","linearDepth","textureLoad","ivec2","xy","r","$if","lessThan","Z_AB_pixelCount","atomicAdd","at","Z_AB_nodeOffset","arrayLength","Z_AB_headOffset","add","mul","sub","y","x","Z_AB_oldHead","atomicExchange","Z_AB_colorScale","floatBitsToUint","rgb","Z_AB_color","pack4x8unorm","normalize","clamp","a","Z_AB_depth","setAt","discard","setRenderStates","rs","stencilStates","useStencilState","enable","setFrontCompareFunc","setBackCompareFunc","setFrontOp","setBackOp","setReference","setReadMask","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","neg","fragment","scissorOffset","headBuffer","nodeBuffer","additiveOnly","int","func","colorNorm","unpack4x8unorm","colorScale","uintBitsToFloat","$return","fragmentArray","fragmentArrayLen","offset","head","$while","and","notEqual","w","equal","$else","$for","j","b","greaterThan","c0","unpackColor","c_dst","a_dst","c","float","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","additiveStencilStates","onDispose"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import '../material/blinn.js';
|
|
|
5
5
|
import '../material/unlit.js';
|
|
6
6
|
import '../material/particle.js';
|
|
7
7
|
import '../material/subsurfaceprofile.js';
|
|
8
|
+
import '../material/skin.js';
|
|
8
9
|
import '@zephyr3d/device';
|
|
9
10
|
import { MaterialVaryingFlags } from '../values.js';
|
|
10
11
|
import { getDevice } from '../app/api.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const ref = this._mdRenderQueueRef[i].ref;\r\n if (force || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","pushRenderQueueRef","ref","renderQueueRefPrune","force","i","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const ref = this._mdRenderQueueRef[i].ref;\r\n if (force || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","pushRenderQueueRef","ref","renderQueueRefPrune","force","i","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import '../material/blinn.js';
|
|
|
8
8
|
import '../material/unlit.js';
|
|
9
9
|
import '../material/particle.js';
|
|
10
10
|
import '../material/subsurfaceprofile.js';
|
|
11
|
+
import '../material/skin.js';
|
|
11
12
|
import '../values.js';
|
|
12
13
|
import '../material/meshmaterial.js';
|
|
13
14
|
import '../material/grassmaterial.js';
|