@zephyr3d/scene 0.7.0 → 0.7.1
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/animation/animation.js +4 -15
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +22 -9
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js +1 -0
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +0 -1
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/morphtarget.js +7 -1
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -3
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/proptrack.js +37 -41
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +0 -1
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +0 -1
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +7 -14
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/translationtrack.js +0 -1
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/api.js +13 -4
- package/dist/app/api.js.map +1 -1
- package/dist/app/app.js +13 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +33 -45
- package/dist/app/engine.js.map +1 -1
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +318 -0
- package/dist/app/screen.js.map +1 -0
- package/dist/app/scriptingsystem.js +10 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +11 -22
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +79 -58
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/builtin.js +5 -5
- package/dist/asset/builtin.js.map +1 -1
- package/dist/asset/loaders/dds/dds.js +6 -2
- package/dist/asset/loaders/dds/dds.js.map +1 -1
- package/dist/asset/loaders/dds/dds_loader.js +1 -1
- package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/helpers.js +6 -2
- package/dist/asset/loaders/gltf/helpers.js.map +1 -1
- package/dist/asset/loaders/hdr/hdr.js +22 -15
- package/dist/asset/loaders/hdr/hdr.js.map +1 -1
- package/dist/asset/loaders/image/tga_Loader.js +2 -1
- package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +2 -2
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/model.js +2 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +9 -11
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/box.js +0 -1
- package/dist/blitter/box.js.map +1 -1
- package/dist/blitter/copy.js.map +1 -1
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +1 -3
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +121 -37
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +19 -17
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +45 -43
- package/dist/camera/orbit.js.map +1 -1
- package/dist/camera/orthocamera.js +27 -21
- package/dist/camera/orthocamera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +26 -17
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +14453 -15609
- package/dist/index.js +17 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/grassmaterial.js.map +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +11 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +10 -9
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/foliage.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +3 -3
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -0
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/particle.js.map +1 -1
- package/dist/material/pbrblueprint.js +180 -22
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +36 -53
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite.js +301 -0
- package/dist/material/sprite.js.map +1 -0
- package/dist/material/sprite3d.js +301 -0
- package/dist/material/sprite3d.js.map +1 -0
- package/dist/material/sprite3d_std.js +116 -0
- package/dist/material/sprite3d_std.js.map +1 -0
- package/dist/material/sprite3dblueprint.js +235 -0
- package/dist/material/sprite3dblueprint.js.map +1 -0
- package/dist/material/sprite_std.js +116 -0
- package/dist/material/sprite_std.js.map +1 -0
- package/dist/material/spriteblueprint.js +235 -0
- package/dist/material/spriteblueprint.js.map +1 -0
- package/dist/material/terrain-cm.js +0 -1
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +7 -5
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -6
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +0 -10
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +4 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +15 -17
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +3 -4
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable.js +15 -0
- package/dist/render/drawable.js.map +1 -0
- package/dist/render/drawable_mixin.js +8 -4
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +67 -64
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/fullscreenquad.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +3 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +1 -2
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +13 -13
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +4 -7
- package/dist/render/objectcolorpass.js.map +1 -1
- package/dist/render/primitive.js +4 -5
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +10 -5
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +16 -22
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +27 -52
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/rendertarget.js +5 -0
- package/dist/render/rendertarget.js.map +1 -0
- package/dist/render/screenrendertarget.js +56 -0
- package/dist/render/screenrendertarget.js.map +1 -0
- package/dist/render/shadowmap_pass.js +4 -5
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +16 -14
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +296 -0
- package/dist/scene/basesprite.js.map +1 -0
- package/dist/scene/batchgroup.js +4 -2
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +9 -10
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +22 -4
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +93 -15
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/particlesys.js +25 -22
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +0 -16
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +7 -4
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +20 -35
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sprite.js +18 -0
- package/dist/scene/sprite.js.map +1 -0
- package/dist/scene/sprite3d.js +18 -0
- package/dist/scene/sprite3d.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +5 -4
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +65 -48
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +35 -30
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +17 -29
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/pbr.js.map +1 -1
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/esm.js +1 -1
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +3 -1
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +6 -18
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/box.js +9 -3
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/cylinder.js +2 -2
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +2 -2
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/shape.js +2 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +2 -2
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/shapes/tetrahedron.js +5 -6
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +2 -2
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/aabbtree.js +1 -1
- package/dist/utility/aabbtree.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +578 -104
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +471 -9
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/common.js +1 -1
- package/dist/utility/blueprint/common.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +9 -5
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +288 -80
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +92 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +62 -45
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/blueprint/node.js +28 -1
- package/dist/utility/blueprint/node.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/debug.js.map +1 -1
- package/dist/utility/draco/decoder.js.map +1 -1
- package/dist/utility/misc.js +1 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/panorama.js.map +1 -1
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/json.js +19 -15
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +89 -22
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +23 -21
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -3
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +97 -9
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +102 -28
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +14 -12
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +154 -26
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +71 -100
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +3 -2
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +42 -9
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +7 -5
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -15
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +3 -2
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +164 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -0
- package/dist/utility/serialization/scene/terrain.js +8 -6
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +11 -9
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +6 -0
- package/dist/utility/serialization/types.js.map +1 -0
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/gradientnoise.js.map +1 -1
- package/dist/utility/textures/randomnoise.js.map +1 -1
- package/dist/values.js +14 -14
- package/dist/values.js.map +1 -1
- package/package.json +80 -80
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { LightPass } from './lightpass';\r\nimport { ShadowMapPass } from './shadowmap_pass';\r\nimport { DepthPass } from './depthpass';\r\nimport { isPowerOf2, Matrix4x4, nextPowerOf2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n ColorState,\r\n FrameBuffer,\r\n GPUProgram,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight, Scene } from '../scene';\r\nimport type { PickResult } from '../camera';\r\nimport { Camera } from '../camera';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../posteffect/posteffect';\r\nimport { ClusteredLight } from './cluster_light';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\nimport { buildHiZ } from './hzb';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Primitive } from '.';\r\nimport { BoxShape } from '../shapes';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /** @internal */\r\n private static _skyMotionVectorProgram: GPUProgram = null;\r\n /** @internal */\r\n private static _skyMotionVectorBindGroup: BindGroup = null;\r\n private static _box: Primitive = null;\r\n /** @internal */\r\n private static readonly _pickCamera = new Camera(null);\r\n /** @internal */\r\n private static readonly _scenePass = new LightPass();\r\n /** @internal */\r\n private static readonly _depthPass = new DepthPass();\r\n /** @internal */\r\n private static readonly _shadowMapPass = new ShadowMapPass();\r\n /** @internal */\r\n private static readonly _objectColorPass = new ObjectColorPass();\r\n /** @internal */\r\n private static _frontDepthColorState: ColorState = null;\r\n /** @internal */\r\n private static _backDepthColorState: ColorState = null;\r\n /** @internal */\r\n private static readonly _clusters: ClusteredLight[] = [];\r\n /** lighting render pass */\r\n static get sceneRenderPass(): LightPass {\r\n return this._scenePass;\r\n }\r\n /** depth render pass */\r\n static get depthRenderPass(): DepthPass {\r\n return this._depthPass;\r\n }\r\n /** shadow map render pass */\r\n static get shadowMapRenderPass(): ShadowMapPass {\r\n return this._shadowMapPass;\r\n }\r\n /** @internal */\r\n static getClusteredLight(): ClusteredLight {\r\n if (this._clusters.length > 0) {\r\n return this._clusters.pop();\r\n }\r\n return new ClusteredLight();\r\n }\r\n /** @internal */\r\n static freeClusteredLight(clusteredLight: ClusteredLight) {\r\n this._clusters.push(clusteredLight);\r\n }\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene tondered\r\n * @param camera - The camera that will be used to render the scene\r\n * @param compositor - The compositor that will be used to apply postprocess effects\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const colorFormat =\r\n camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth <= 0 || renderHeight <= 0) {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n primaryCamera: camera,\r\n picking: false,\r\n oit: null,\r\n motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n timestamp: device.frameInfo.frameTimestamp,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n fogFlags: 0,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n materialFlags: 0,\r\n TAA: camera.TAA,\r\n SSR,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: device.pool.fetchTemporalTexture2D(\r\n true,\r\n 'rgba8unorm',\r\n renderWidth,\r\n renderHeight\r\n ),\r\n SSRNormalTexture: device.pool.fetchTemporalTexture2D(true, 'rgba8unorm', renderWidth, renderHeight),\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport;\r\n }\r\n blitter.scissor = camera.scissor;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n private static renderSceneDepth(ctx: DrawContext, renderQueue: RenderQueue, depthFramebuffer: FrameBuffer) {\r\n const transmission = !!depthFramebuffer;\r\n if (!depthFramebuffer) {\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n if (!ctx.finalFramebuffer) {\r\n depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n depthFramebuffer = originDepth?.isTexture2D()\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n originDepth.width,\r\n originDepth.height,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n originDepth,\r\n false\r\n )\r\n : ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n }\r\n }\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(depthFramebuffer);\r\n this._depthPass.encodeDepth = depthFramebuffer.getColorAttachments()[0].format === 'rgba8unorm';\r\n this._depthPass.clearColor = transmission\r\n ? null\r\n : this._depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n this._depthPass.clearDepth = transmission ? null : 1;\r\n this._depthPass.clearStencil = null;\r\n this._depthPass.transmission = transmission;\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!this._backDepthColorState) {\r\n this._backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!this._frontDepthColorState) {\r\n this._frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = this._backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n this._depthPass.renderBackface = true;\r\n this._depthPass.transmission = false;\r\n this._depthPass.render(ctx, null, renderQueue);\r\n this._depthPass.clearColor = null;\r\n this._depthPass.renderBackface = false;\r\n ctx.forceColorState = this._frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n this._depthPass.render(ctx, null, renderQueue);\r\n ctx.forceColorState = null;\r\n ctx.device.popDeviceStates();\r\n\r\n if (!transmission) {\r\n ctx.motionVectorTexture = ctx.motionVectors\r\n ? (depthFramebuffer.getColorAttachments()[1] as Texture2D)\r\n : null;\r\n ctx.linearDepthTexture = depthFramebuffer.getColorAttachments()[0] as Texture2D;\r\n ctx.depthTexture = depthFramebuffer.getDepthAttachment() as Texture2D;\r\n if (ctx.motionVectorTexture) {\r\n this.renderSkyMotionVectors(ctx);\r\n }\r\n if (ctx.HiZ) {\r\n let w = isPowerOf2(ctx.linearDepthTexture.width)\r\n ? ctx.linearDepthTexture.width\r\n : nextPowerOf2(ctx.linearDepthTexture.width);\r\n let h = isPowerOf2(ctx.linearDepthTexture.height)\r\n ? ctx.linearDepthTexture.height\r\n : nextPowerOf2(ctx.linearDepthTexture.height);\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n w = ctx.linearDepthTexture.width;\r\n h = ctx.linearDepthTexture.height;\r\n const HiZFrameBuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n w,\r\n h,\r\n ctx.linearDepthTexture.format,\r\n null,\r\n true\r\n );\r\n buildHiZ(ctx.depthTexture, HiZFrameBuffer);\r\n ctx.HiZTexture = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n }\r\n }\r\n return depthFramebuffer;\r\n }\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n const device = ctx.device;\r\n\r\n // Cull scene\r\n const renderQueue = this._scenePass.cullScene(ctx, ctx.camera);\r\n\r\n // Update sky\r\n const sunLightColor = ctx.scene.env.sky.update(ctx);\r\n\r\n // Gather lights\r\n ctx.clusteredLight = this.getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n\r\n // Do GPU ray picking if required\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n this.renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n\r\n // Render shadow maps\r\n this.renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n\r\n // Render scene depth first\r\n const depthFramebuffer = this.renderSceneDepth(ctx, renderQueue, null);\r\n if (ctx.depthTexture === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else {\r\n // TODO: fetch resizable framebuffer if ctx.defaultViewport is true\r\n ctx.intermediateFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.depthTexture.width,\r\n ctx.depthTexture.height,\r\n ctx.colorFormat,\r\n ctx.depthTexture\r\n );\r\n }\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(ctx.intermediateFramebuffer);\r\n } else {\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n this._scenePass.transmission = false; // transmission\r\n this._scenePass.clearDepth = ctx.depthTexture ? null : 1;\r\n this._scenePass.clearStencil = ctx.depthTexture ? null : 0;\r\n if (ctx.SSR && !renderQueue.needSceneColor()) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\r\n ctx.compositor?.begin(ctx);\r\n if (renderQueue.needSceneColor()) {\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const sceneColorFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.depthTexture.width,\r\n ctx.depthTexture.height,\r\n ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS\r\n ? [\r\n ctx.colorFormat,\r\n device.getFramebuffer().getColorAttachments()[1],\r\n device.getFramebuffer().getColorAttachments()[2]\r\n ]\r\n : ctx.colorFormat,\r\n ctx.depthTexture,\r\n false\r\n );\r\n device.pushDeviceStates();\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n this._scenePass.transmission = false;\r\n this._scenePass.render(ctx, null, renderQueue);\r\n device.popDeviceStates();\r\n ctx.sceneColorTexture = sceneColorFramebuffer.getColorAttachments()[0] as Texture2D;\r\n new CopyBlitter().blit(\r\n ctx.sceneColorTexture,\r\n device.getFramebuffer() ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._scenePass.transmission = true;\r\n this._scenePass.clearColor = null;\r\n this._scenePass.clearDepth = null;\r\n this._scenePass.clearStencil = null;\r\n ctx.compositor = compositor;\r\n }\r\n this._scenePass.render(ctx, null, renderQueue);\r\n if (renderQueue.needSceneColor()) {\r\n this.renderSceneDepth(ctx, renderQueue, depthFramebuffer);\r\n }\r\n ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture);\r\n ctx.compositor?.end(ctx);\r\n renderQueue.dispose();\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n const blitter = new CopyBlitter();\r\n blitter.srgbOut = !ctx.finalFramebuffer;\r\n const srcTex = ctx.intermediateFramebuffer.getColorAttachments()[0] as Texture2D;\r\n blitter.blit(srcTex, ctx.finalFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(ctx.intermediateFramebuffer);\r\n }\r\n //ShadowMapper.releaseTemporalResources(ctx);\r\n this.freeClusteredLight(ctx.clusteredLight);\r\n\r\n // Restore sun color\r\n if (sunLightColor) {\r\n ctx.sunLight.color = sunLightColor;\r\n }\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext): GPUProgram {\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 /** @internal */\r\n private static renderSkyMotionVectors(ctx: DrawContext) {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\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 = this._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = this._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 /** @internal */\r\n private static renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]) {\r\n ctx.renderPass = this._shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n for (const light of lights) {\r\n light.shadow.render(ctx, this._shadowMapPass);\r\n }\r\n ctx.device.popDeviceStates();\r\n }\r\n /** @internal */\r\n private static decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>): number {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n }\r\n /** @internal */\r\n private static renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: PickResult) => void,\r\n renderQueue: RenderQueue\r\n ) {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = this._objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n camera.worldMatrix.decompose(\r\n this._pickCamera.scale,\r\n this._pickCamera.rotation,\r\n this._pickCamera.position\r\n );\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n this._pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(this._pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n this._objectColorPass.clearColor = Vector4.zero();\r\n this._objectColorPass.clearDepth = 1;\r\n const rq = this._objectColorPass.cullScene(ctx, this._pickCamera);\r\n ctx.camera = this._pickCamera;\r\n this._objectColorPass.render(ctx, null, rq);\r\n rq.dispose();\r\n ctx.camera = camera;\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = renderQueue.getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? this.decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos.x + ray.direction.x * d;\r\n intersectedPoint.y = cameraPos.y + ray.direction.y * d;\r\n intersectedPoint.z = cameraPos.z + ray.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n device.pool.releaseFrameBuffer(fb);\r\n })\r\n .catch((_err) => {\r\n camera.getPickResultResolveFunc()?.(null);\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n }\r\n}\r\n"],"names":["SceneRenderer","_skyMotionVectorProgram","_skyMotionVectorBindGroup","_box","_pickCamera","Camera","_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_objectColorPass","ObjectColorPass","_frontDepthColorState","_backDepthColorState","_clusters","sceneRenderPass","depthRenderPass","shadowMapRenderPass","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","clusteredLight","push","renderScene","scene","camera","device","getDevice","colorFormat","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","viewport","scissor","renderX","screenToDevice","renderY","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","getPickResultResolveFunc","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","ctx","primaryCamera","picking","oit","motionVectors","type","TAA","motionBlur","HiZ","HiZTexture","compositor","timestamp","frameInfo","frameTimestamp","queue","lightBlending","renderPass","renderPassHash","fogFlags","flip","drawEnvLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","release","renderSceneDepth","renderQueue","depthFramebuffer","transmission","format","mvFormat","originDepth","getDepthAttachment","isTexture2D","width","height","encodeDepth","Vector4","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","render","motionVectorTexture","linearDepthTexture","depthTexture","renderSkyMotionVectors","w","isPowerOf2","nextPowerOf2","h","Math","max","HiZFrameBuffer","buildHiZ","cullScene","sunLightColor","sky","update","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","shadowedLights","setViewport","setScissor","needSceneColor","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","begin","sceneColorFramebuffer","sceneColorTexture","drawPostEffects","PostEffectLayer","end","dispose","srcTex","sunLight","color","_getSkyMotionVectorProgram","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","name","_getBox","_ctx","BoxShape","size","needNormal","needUV","fb","program","createBindGroup","bindGroupLayouts","box","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","lights","shadow","decodeNormalizedFloat","rgba","a","b","c","d","isWebGL1","vp","getViewport","windowX","getPickPosX","windowY","getPickPosY","windowW","windowH","worldMatrix","decompose","scale","rotation","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","Vector3","ray","constructRay","zero","rq","colorTex","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","getDrawableByColor","intersectedPoint","x","direction","y","distance","target","getPickTarget","catch","_err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { LightPass } from './lightpass';\r\nimport { ShadowMapPass } from './shadowmap_pass';\r\nimport { DepthPass } from './depthpass';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { isPowerOf2, Matrix4x4, nextPowerOf2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n ColorState,\r\n FrameBuffer,\r\n GPUProgram,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight, Scene } from '../scene';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../posteffect/posteffect';\r\nimport { ClusteredLight } from './cluster_light';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\nimport { buildHiZ } from './hzb';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Primitive } from '.';\r\nimport { BoxShape } from '../shapes';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /** @internal */\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n /** @internal */\r\n private static _skyMotionVectorBindGroup: Nullable<BindGroup> = null;\r\n private static _box: Nullable<Primitive> = null;\r\n /** @internal */\r\n private static readonly _pickCamera = new Camera(null);\r\n /** @internal */\r\n private static readonly _scenePass = new LightPass();\r\n /** @internal */\r\n private static readonly _depthPass = new DepthPass();\r\n /** @internal */\r\n private static readonly _shadowMapPass = new ShadowMapPass();\r\n /** @internal */\r\n private static readonly _objectColorPass = new ObjectColorPass();\r\n /** @internal */\r\n private static _frontDepthColorState: Nullable<ColorState> = null;\r\n /** @internal */\r\n private static _backDepthColorState: Nullable<ColorState> = null;\r\n /** @internal */\r\n private static readonly _clusters: ClusteredLight[] = [];\r\n /** lighting render pass */\r\n static get sceneRenderPass() {\r\n return this._scenePass;\r\n }\r\n /** depth render pass */\r\n static get depthRenderPass() {\r\n return this._depthPass;\r\n }\r\n /** shadow map render pass */\r\n static get shadowMapRenderPass() {\r\n return this._shadowMapPass;\r\n }\r\n /** @internal */\r\n static getClusteredLight() {\r\n if (this._clusters.length > 0) {\r\n return this._clusters.pop()!;\r\n }\r\n return new ClusteredLight();\r\n }\r\n /** @internal */\r\n static freeClusteredLight(clusteredLight: ClusteredLight) {\r\n this._clusters.push(clusteredLight);\r\n }\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene tondered\r\n * @param camera - The camera that will be used to render the scene\r\n * @param compositor - The compositor that will be used to apply postprocess effects\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const colorFormat =\r\n camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth <= 0 || renderHeight <= 0) {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: device.pool.fetchTemporalTexture2D(\r\n true,\r\n 'rgba8unorm',\r\n renderWidth,\r\n renderHeight\r\n ),\r\n SSRNormalTexture: device.pool.fetchTemporalTexture2D(true, 'rgba8unorm', renderWidth, renderHeight),\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n private static renderSceneDepth(\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n depthFramebuffer: Nullable<FrameBuffer>\r\n ) {\r\n const transmission = !!depthFramebuffer;\r\n if (!depthFramebuffer) {\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n if (!ctx.finalFramebuffer) {\r\n depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n depthFramebuffer = originDepth?.isTexture2D()\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n originDepth.width,\r\n originDepth.height,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n originDepth,\r\n false\r\n )\r\n : ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n }\r\n }\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(depthFramebuffer);\r\n this._depthPass.encodeDepth = depthFramebuffer.getColorAttachments()[0].format === 'rgba8unorm';\r\n this._depthPass.clearColor = transmission\r\n ? null\r\n : this._depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n this._depthPass.clearDepth = transmission ? null : 1;\r\n this._depthPass.clearStencil = null;\r\n this._depthPass.transmission = transmission;\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!this._backDepthColorState) {\r\n this._backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!this._frontDepthColorState) {\r\n this._frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = this._backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n this._depthPass.renderBackface = true;\r\n this._depthPass.transmission = false;\r\n this._depthPass.render(ctx, null, null, renderQueue);\r\n this._depthPass.clearColor = null;\r\n this._depthPass.renderBackface = false;\r\n ctx.forceColorState = this._frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n this._depthPass.render(ctx, null, null, renderQueue);\r\n ctx.forceColorState = null;\r\n ctx.device.popDeviceStates();\r\n\r\n if (!transmission) {\r\n ctx.motionVectorTexture = ctx.motionVectors\r\n ? (depthFramebuffer.getColorAttachments()[1] as Texture2D)\r\n : null;\r\n ctx.linearDepthTexture = depthFramebuffer.getColorAttachments()[0] as Texture2D;\r\n ctx.depthTexture = depthFramebuffer.getDepthAttachment() as Texture2D;\r\n if (ctx.motionVectorTexture) {\r\n this.renderSkyMotionVectors(ctx);\r\n }\r\n if (ctx.HiZ) {\r\n let w = isPowerOf2(ctx.linearDepthTexture.width)\r\n ? ctx.linearDepthTexture.width\r\n : nextPowerOf2(ctx.linearDepthTexture.width);\r\n let h = isPowerOf2(ctx.linearDepthTexture.height)\r\n ? ctx.linearDepthTexture.height\r\n : nextPowerOf2(ctx.linearDepthTexture.height);\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n w = ctx.linearDepthTexture.width;\r\n h = ctx.linearDepthTexture.height;\r\n const HiZFrameBuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n w,\r\n h,\r\n ctx.linearDepthTexture.format,\r\n null,\r\n true\r\n );\r\n buildHiZ(ctx.depthTexture, HiZFrameBuffer);\r\n ctx.HiZTexture = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n }\r\n }\r\n return depthFramebuffer;\r\n }\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext) {\r\n const device = ctx.device;\r\n\r\n // Cull scene\r\n const renderQueue = this._scenePass.cullScene(ctx, ctx.camera);\r\n\r\n // Update sky\r\n const sunLightColor = ctx.scene.env.sky.update(ctx);\r\n\r\n // Gather lights\r\n ctx.clusteredLight = this.getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n\r\n // Do GPU ray picking if required\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n this.renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n\r\n // Render shadow maps\r\n this.renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n\r\n // Render scene depth first\r\n const depthFramebuffer = this.renderSceneDepth(ctx, renderQueue, null);\r\n if (ctx.depthTexture === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else {\r\n // TODO: fetch resizable framebuffer if ctx.defaultViewport is true\r\n ctx.intermediateFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.depthTexture!.width,\r\n ctx.depthTexture!.height,\r\n ctx.colorFormat!,\r\n ctx.depthTexture\r\n );\r\n }\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(ctx.intermediateFramebuffer);\r\n } else {\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n this._scenePass.transmission = false; // transmission\r\n this._scenePass.clearDepth = ctx.depthTexture ? null : 1;\r\n this._scenePass.clearStencil = ctx.depthTexture ? null : 0;\r\n if (ctx.SSR && !renderQueue.needSceneColor()) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\r\n ctx.compositor?.begin(ctx);\r\n if (renderQueue.needSceneColor()) {\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const sceneColorFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.depthTexture!.width,\r\n ctx.depthTexture!.height,\r\n ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS\r\n ? [\r\n ctx.colorFormat!,\r\n device.getFramebuffer()!.getColorAttachments()[1]!,\r\n device.getFramebuffer()!.getColorAttachments()[2]!\r\n ]\r\n : ctx.colorFormat!,\r\n ctx.depthTexture,\r\n false\r\n );\r\n device.pushDeviceStates();\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n this._scenePass.transmission = false;\r\n this._scenePass.render(ctx, null, null, renderQueue);\r\n device.popDeviceStates();\r\n ctx.sceneColorTexture = sceneColorFramebuffer.getColorAttachments()[0] as Texture2D;\r\n new CopyBlitter().blit(\r\n ctx.sceneColorTexture,\r\n device.getFramebuffer() ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._scenePass.transmission = true;\r\n this._scenePass.clearColor = null;\r\n this._scenePass.clearDepth = null;\r\n this._scenePass.clearStencil = null;\r\n ctx.compositor = compositor;\r\n }\r\n this._scenePass.render(ctx, null, null, renderQueue);\r\n if (renderQueue.needSceneColor()) {\r\n this.renderSceneDepth(ctx, renderQueue, depthFramebuffer);\r\n }\r\n ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture!);\r\n ctx.compositor?.end(ctx);\r\n renderQueue.dispose();\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n const blitter = new CopyBlitter();\r\n blitter.srgbOut = !ctx.finalFramebuffer;\r\n const srcTex = ctx.intermediateFramebuffer.getColorAttachments()[0] as Texture2D;\r\n blitter.blit(srcTex, ctx.finalFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(ctx.intermediateFramebuffer);\r\n }\r\n //ShadowMapper.releaseTemporalResources(ctx);\r\n this.freeClusteredLight(ctx.clusteredLight);\r\n\r\n // Restore sun color\r\n if (sunLightColor) {\r\n ctx.sunLight!.color = sunLightColor;\r\n }\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 /** @internal */\r\n private static renderSkyMotionVectors(ctx: DrawContext) {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\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 = this._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = this._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 /** @internal */\r\n private static renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]) {\r\n ctx.renderPass = this._shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n for (const light of lights) {\r\n light.shadow.render(ctx, this._shadowMapPass);\r\n }\r\n ctx.device.popDeviceStates();\r\n }\r\n /** @internal */\r\n private static decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>) {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n }\r\n /** @internal */\r\n private static renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n ) {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = this._objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = this._pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n this._objectColorPass.clearColor = Vector4.zero();\r\n this._objectColorPass.clearDepth = 1;\r\n const rq = this._objectColorPass.cullScene(ctx, pickCamera);\r\n this._objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = renderQueue.getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? this.decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos!.x + ray!.direction.x * d;\r\n intersectedPoint.y = cameraPos!.y + ray!.direction.y * d;\r\n intersectedPoint.z = cameraPos!.z + ray!.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos!);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n device.pool.releaseFrameBuffer(fb);\r\n })\r\n .catch((_err) => {\r\n camera.getPickResultResolveFunc()?.(null);\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n }\r\n}\r\n"],"names":["SceneRenderer","_skyMotionVectorProgram","_skyMotionVectorBindGroup","_box","_pickCamera","Camera","_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_objectColorPass","ObjectColorPass","_frontDepthColorState","_backDepthColorState","_clusters","sceneRenderPass","depthRenderPass","shadowMapRenderPass","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","clusteredLight","push","renderScene","scene","camera","device","getDevice","colorFormat","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","getPickResultResolveFunc","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","ctx","oit","motionVectors","type","TAA","motionBlur","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","release","renderSceneDepth","renderQueue","depthFramebuffer","transmission","format","mvFormat","originDepth","getDepthAttachment","isTexture2D","width","height","encodeDepth","Vector4","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","render","motionVectorTexture","linearDepthTexture","depthTexture","renderSkyMotionVectors","w","isPowerOf2","nextPowerOf2","h","Math","max","HiZFrameBuffer","buildHiZ","cullScene","sunLightColor","sky","update","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","shadowedLights","setViewport","setScissor","needSceneColor","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","begin","sceneColorFramebuffer","sceneColorTexture","drawPostEffects","PostEffectLayer","end","dispose","srcTex","sunLight","color","_getSkyMotionVectorProgram","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","name","_getBox","_ctx","BoxShape","size","needNormal","needUV","fb","program","createBindGroup","bindGroupLayouts","box","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","lights","shadow","decodeNormalizedFloat","rgba","a","b","c","d","isWebGL1","vp","getViewport","windowX","getPickPosX","windowY","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","Vector3","ray","constructRay","zero","rq","colorTex","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","getDrawableByColor","intersectedPoint","x","direction","y","distance","target","getPickTarget","catch","_err"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Disposable, Vector4 } from '@zephyr3d/base';
|
|
2
2
|
import { CullVisitor } from './cull_visitor.js';
|
|
3
3
|
import { RenderQueue } from './render_queue.js';
|
|
4
|
-
import { ShaderHelper } from '../material/shader/helper.js';
|
|
5
4
|
import { RenderBundleWrapper } from './renderbundle_wrapper.js';
|
|
6
5
|
import { MaterialVaryingFlags } from '../values.js';
|
|
7
6
|
import { getDevice } from '../app/api.js';
|
|
@@ -30,19 +29,19 @@ import { getDevice } from '../app/api.js';
|
|
|
30
29
|
return this._clearColor;
|
|
31
30
|
}
|
|
32
31
|
set clearColor(color) {
|
|
33
|
-
this._clearColor = color
|
|
32
|
+
this._clearColor = color;
|
|
34
33
|
}
|
|
35
34
|
/** Depth value that is used to clear the frame buffer */ get clearDepth() {
|
|
36
35
|
return this._clearDepth;
|
|
37
36
|
}
|
|
38
37
|
set clearDepth(depth) {
|
|
39
|
-
this._clearDepth = depth
|
|
38
|
+
this._clearDepth = depth;
|
|
40
39
|
}
|
|
41
40
|
/** Stencil value that is used to clear the frame buffer */ get clearStencil() {
|
|
42
41
|
return this._clearStencil;
|
|
43
42
|
}
|
|
44
43
|
set clearStencil(stencil) {
|
|
45
|
-
this._clearStencil = stencil
|
|
44
|
+
this._clearStencil = stencil;
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
48
47
|
* The render pass type
|
|
@@ -55,40 +54,21 @@ import { getDevice } from '../app/api.js';
|
|
|
55
54
|
/**
|
|
56
55
|
* Renders a scene
|
|
57
56
|
* @param ctx - Drawing context
|
|
58
|
-
*/ render(ctx, cullCamera, renderQueue) {
|
|
57
|
+
*/ render(ctx, renderCamera, cullCamera, renderQueue) {
|
|
59
58
|
ctx.renderPass = this;
|
|
60
|
-
this.drawScene(ctx, cullCamera ?? ctx.camera, renderQueue);
|
|
61
|
-
}
|
|
62
|
-
/** @internal */ getGlobalBindGroup(ctx) {
|
|
63
|
-
const hash = this.getGlobalBindGroupHash(ctx);
|
|
64
|
-
let bindGroup = this._globalBindGroups[hash];
|
|
65
|
-
if (!bindGroup) {
|
|
66
|
-
const ret = ctx.device.programBuilder.buildRender({
|
|
67
|
-
vertex (pb) {
|
|
68
|
-
ShaderHelper.prepareVertexShader(pb, ctx);
|
|
69
|
-
pb.main(function() {});
|
|
70
|
-
},
|
|
71
|
-
fragment (pb) {
|
|
72
|
-
ShaderHelper.prepareFragmentShader(pb, ctx);
|
|
73
|
-
pb.main(function() {});
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
bindGroup = ctx.device.createBindGroup(ret[2][0]);
|
|
77
|
-
this._globalBindGroups[hash] = bindGroup;
|
|
78
|
-
}
|
|
79
|
-
return bindGroup;
|
|
59
|
+
this.drawScene(ctx, renderCamera ?? ctx.camera, cullCamera ?? renderCamera ?? ctx.camera, renderQueue);
|
|
80
60
|
}
|
|
81
|
-
/** @internal */ getGlobalBindGroupHash(ctx) {
|
|
82
|
-
return `${this.constructor.name}:${this._getGlobalBindGroupHash(ctx)}`;
|
|
61
|
+
/** @internal */ getGlobalBindGroupHash(ctx, camera) {
|
|
62
|
+
return `${this.constructor.name}:${this._getGlobalBindGroupHash(ctx, camera)}`;
|
|
83
63
|
}
|
|
84
|
-
/** @internal */ drawScene(ctx, cullCamera, renderQueue) {
|
|
64
|
+
/** @internal */ drawScene(ctx, renderCamera, cullCamera, renderQueue) {
|
|
85
65
|
const device = ctx.device;
|
|
86
66
|
this.clearFramebuffer();
|
|
87
67
|
const rq = renderQueue ?? this.cullScene(ctx, cullCamera);
|
|
88
68
|
if (rq) {
|
|
89
69
|
const windingReversed = device.isWindingOrderReversed();
|
|
90
70
|
device.reverseVertexWindingOrder(this.isAutoFlip(ctx) ? !windingReversed : windingReversed);
|
|
91
|
-
this.renderItems(ctx, rq);
|
|
71
|
+
this.renderItems(ctx, renderCamera, rq);
|
|
92
72
|
device.reverseVertexWindingOrder(windingReversed);
|
|
93
73
|
if (rq !== renderQueue) {
|
|
94
74
|
rq.dispose();
|
|
@@ -101,23 +81,20 @@ import { getDevice } from '../app/api.js';
|
|
|
101
81
|
* @param cullCamera - The camera that will be used to cull the scene
|
|
102
82
|
* @returns The cull result
|
|
103
83
|
*/ cullScene(ctx, cullCamera) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
ctx.scene.rootNode.traverse(cullVisitor);
|
|
111
|
-
}
|
|
112
|
-
renderQueue.end(cullCamera);
|
|
113
|
-
ctx.sunLight = renderQueue.sunLight;
|
|
114
|
-
return renderQueue;
|
|
84
|
+
const renderQueue = new RenderQueue(this);
|
|
85
|
+
const cullVisitor = new CullVisitor(this, cullCamera, renderQueue);
|
|
86
|
+
if (ctx.scene.octree) {
|
|
87
|
+
ctx.scene.octree.getRootNode().traverse(cullVisitor);
|
|
88
|
+
} else {
|
|
89
|
+
ctx.scene.rootNode.traverse(cullVisitor);
|
|
115
90
|
}
|
|
116
|
-
|
|
91
|
+
renderQueue.end(cullCamera);
|
|
92
|
+
ctx.sunLight = renderQueue.sunLight;
|
|
93
|
+
return renderQueue;
|
|
117
94
|
}
|
|
118
|
-
/** @internal */ internalDrawItemList(ctx, items, renderBundle, reverseWinding, hash) {
|
|
95
|
+
/** @internal */ internalDrawItemList(ctx, items, renderQueue, renderBundle, reverseWinding, hash) {
|
|
119
96
|
let recording = false;
|
|
120
|
-
if (renderBundle && ctx.
|
|
97
|
+
if (renderBundle && ctx.camera.commandBufferReuse) {
|
|
121
98
|
const bundle = renderBundle.getRenderBundle(hash);
|
|
122
99
|
if (bundle) {
|
|
123
100
|
ctx.device.executeRenderBundle(bundle);
|
|
@@ -135,17 +112,16 @@ import { getDevice } from '../app/api.js';
|
|
|
135
112
|
if (recording) {
|
|
136
113
|
RenderBundleWrapper.addDrawable(item.drawable, item.drawable.getMaterial()?.coreMaterial, item.drawable.getPrimitive(), renderBundle, hash);
|
|
137
114
|
}
|
|
138
|
-
item.drawable.draw(ctx, recording ? undefined : hash);
|
|
115
|
+
item.drawable.draw(ctx, renderQueue, recording ? undefined : hash);
|
|
139
116
|
if (reverse) {
|
|
140
117
|
ctx.device.reverseVertexWindingOrder(!ctx.device.isWindingOrderReversed());
|
|
141
118
|
}
|
|
142
119
|
}
|
|
143
|
-
if (renderBundle && ctx.
|
|
120
|
+
if (renderBundle && ctx.camera.commandBufferReuse) {
|
|
144
121
|
renderBundle.endRenderBundle(hash);
|
|
145
122
|
}
|
|
146
123
|
}
|
|
147
124
|
/** @internal */ drawItemList(itemList, ctx, reverseWinding) {
|
|
148
|
-
ctx.renderQueue = itemList.renderQueue;
|
|
149
125
|
ctx.instanceData = null;
|
|
150
126
|
const windingHash = reverseWinding ? '1' : '0';
|
|
151
127
|
const bindGroupHash = ctx.device.getBindGroup(0)[0].getGPUId();
|
|
@@ -156,34 +132,33 @@ import { getDevice } from '../app/api.js';
|
|
|
156
132
|
if (itemList.itemList.length > 0) {
|
|
157
133
|
ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.INSTANCING | MaterialVaryingFlags.MORPH_ANIMATION);
|
|
158
134
|
itemList.materialList.forEach((mat)=>mat.apply(ctx));
|
|
159
|
-
this.internalDrawItemList(ctx, itemList.itemList, itemList.renderBundle, reverseWinding, hash);
|
|
135
|
+
this.internalDrawItemList(ctx, itemList.itemList, itemList.renderQueue, itemList.renderBundle ?? null, reverseWinding, hash);
|
|
160
136
|
}
|
|
161
137
|
if (itemList.skinItemList.length > 0) {
|
|
162
138
|
ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION;
|
|
163
139
|
ctx.materialFlags &= ~(MaterialVaryingFlags.MORPH_ANIMATION | MaterialVaryingFlags.INSTANCING);
|
|
164
140
|
itemList.materialList.forEach((mat)=>mat.apply(ctx));
|
|
165
|
-
this.internalDrawItemList(ctx, itemList.skinItemList, itemList.skinRenderBundle, reverseWinding, hash);
|
|
141
|
+
this.internalDrawItemList(ctx, itemList.skinItemList, itemList.renderQueue, itemList.skinRenderBundle ?? null, reverseWinding, hash);
|
|
166
142
|
}
|
|
167
143
|
if (itemList.morphItemList.length > 0) {
|
|
168
144
|
ctx.materialFlags |= MaterialVaryingFlags.MORPH_ANIMATION;
|
|
169
145
|
ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.INSTANCING);
|
|
170
146
|
itemList.materialList.forEach((mat)=>mat.apply(ctx));
|
|
171
|
-
this.internalDrawItemList(ctx, itemList.morphItemList, itemList.morphRenderBundle, reverseWinding, hash);
|
|
147
|
+
this.internalDrawItemList(ctx, itemList.morphItemList, itemList.renderQueue, itemList.morphRenderBundle ?? null, reverseWinding, hash);
|
|
172
148
|
}
|
|
173
149
|
if (itemList.skinAndMorphItemList.length > 0) {
|
|
174
150
|
ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION;
|
|
175
151
|
ctx.materialFlags &= ~MaterialVaryingFlags.INSTANCING;
|
|
176
152
|
itemList.materialList.forEach((mat)=>mat.apply(ctx));
|
|
177
|
-
this.internalDrawItemList(ctx, itemList.skinAndMorphItemList, itemList.skinAndMorphRenderBundle, reverseWinding, hash);
|
|
153
|
+
this.internalDrawItemList(ctx, itemList.skinAndMorphItemList, itemList.renderQueue, itemList.skinAndMorphRenderBundle ?? null, reverseWinding, hash);
|
|
178
154
|
}
|
|
179
155
|
if (itemList.instanceItemList.length > 0) {
|
|
180
156
|
ctx.materialFlags |= MaterialVaryingFlags.INSTANCING;
|
|
181
157
|
ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION);
|
|
182
158
|
itemList.materialList.forEach((mat)=>mat.apply(ctx));
|
|
183
|
-
this.internalDrawItemList(ctx, itemList.instanceItemList, itemList.instanceRenderBundle, reverseWinding, hash);
|
|
159
|
+
this.internalDrawItemList(ctx, itemList.instanceItemList, itemList.renderQueue, itemList.instanceRenderBundle ?? null, reverseWinding, hash);
|
|
184
160
|
}
|
|
185
161
|
}
|
|
186
|
-
ctx.renderQueue = null;
|
|
187
162
|
}
|
|
188
163
|
/**
|
|
189
164
|
* Disposes the render pass
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderpass.js","sources":["../../src/render/renderpass.ts"],"sourcesContent":["import { Disposable, Vector4 } from '@zephyr3d/base';\r\nimport { CullVisitor } from './cull_visitor';\r\nimport type { RenderItemListInfo, RenderQueueItem } from './render_queue';\r\nimport { RenderQueue } from './render_queue';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Base class for any kind of render passes\r\n * @public\r\n */\r\nexport abstract class RenderPass extends Disposable {\r\n /** @internal */\r\n protected _type: number;\r\n /** @internal */\r\n protected _globalBindGroups: Record<string, BindGroup>;\r\n /** @internal */\r\n protected _clearColor: Vector4;\r\n /** @internal */\r\n protected _clearDepth: number;\r\n /** @internal */\r\n protected _clearStencil: number;\r\n /**\r\n * Creates an instanceof RenderPass\r\n * @param type - Render pass type\r\n */\r\n constructor(type: number) {\r\n super();\r\n this._type = type;\r\n this._clearColor = new Vector4(0, 0, 0, 1);\r\n this._clearDepth = 1;\r\n this._clearStencil = 0;\r\n this._globalBindGroups = {};\r\n }\r\n /** Color value that is used to clear the frame buffer */\r\n get clearColor(): Vector4 {\r\n return this._clearColor;\r\n }\r\n set clearColor(color: Vector4) {\r\n this._clearColor = color ?? null;\r\n }\r\n /** Depth value that is used to clear the frame buffer */\r\n get clearDepth(): number {\r\n return this._clearDepth;\r\n }\r\n set clearDepth(depth: number) {\r\n this._clearDepth = depth ?? null;\r\n }\r\n /** Stencil value that is used to clear the frame buffer */\r\n get clearStencil(): number {\r\n return this._clearStencil;\r\n }\r\n set clearStencil(stencil: number) {\r\n this._clearStencil = stencil ?? null;\r\n }\r\n /**\r\n * The render pass type\r\n */\r\n get type(): number {\r\n return this._type;\r\n }\r\n /** @internal */\r\n isAutoFlip(ctx: DrawContext): boolean {\r\n return !!(ctx.device.getFramebuffer() && ctx.device.type === 'webgpu');\r\n }\r\n /**\r\n * Renders a scene\r\n * @param ctx - Drawing context\r\n */\r\n render(ctx: DrawContext, cullCamera?: Camera, renderQueue?: RenderQueue) {\r\n ctx.renderPass = this;\r\n this.drawScene(ctx, cullCamera ?? ctx.camera, renderQueue);\r\n }\r\n /** @internal */\r\n protected getGlobalBindGroup(ctx: DrawContext): BindGroup {\r\n const hash = this.getGlobalBindGroupHash(ctx);\r\n let bindGroup = this._globalBindGroups[hash];\r\n if (!bindGroup) {\r\n const ret = ctx.device.programBuilder.buildRender({\r\n vertex(pb) {\r\n ShaderHelper.prepareVertexShader(pb, ctx);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n ShaderHelper.prepareFragmentShader(pb, ctx);\r\n pb.main(function () {});\r\n }\r\n });\r\n bindGroup = ctx.device.createBindGroup(ret[2][0]);\r\n this._globalBindGroups[hash] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n /** @internal */\r\n getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${this.constructor.name}:${this._getGlobalBindGroupHash(ctx)}`;\r\n }\r\n /** @internal */\r\n protected abstract _getGlobalBindGroupHash(ctx: DrawContext);\r\n /** @internal */\r\n protected abstract renderItems(ctx: DrawContext, renderQueue: RenderQueue);\r\n /** @internal */\r\n protected drawScene(ctx: DrawContext, cullCamera: Camera, renderQueue?: RenderQueue) {\r\n const device = ctx.device;\r\n this.clearFramebuffer();\r\n const rq = renderQueue ?? this.cullScene(ctx, cullCamera);\r\n if (rq) {\r\n const windingReversed = device.isWindingOrderReversed();\r\n device.reverseVertexWindingOrder(this.isAutoFlip(ctx) ? !windingReversed : windingReversed);\r\n this.renderItems(ctx, rq);\r\n device.reverseVertexWindingOrder(windingReversed);\r\n if (rq !== renderQueue) {\r\n rq.dispose();\r\n }\r\n }\r\n }\r\n /**\r\n * Culls a scene by a given camera\r\n * @param ctx - The draw context\r\n * @param cullCamera - The camera that will be used to cull the scene\r\n * @returns The cull result\r\n */\r\n cullScene(ctx: DrawContext, cullCamera: Camera): RenderQueue {\r\n if (cullCamera) {\r\n const renderQueue = new RenderQueue(this);\r\n const cullVisitor = new CullVisitor(this, cullCamera, renderQueue, ctx.primaryCamera);\r\n if (ctx.scene.octree) {\r\n ctx.scene.octree.getRootNode().traverse(cullVisitor);\r\n } else {\r\n ctx.scene.rootNode.traverse(cullVisitor);\r\n }\r\n renderQueue.end(cullCamera);\r\n ctx.sunLight = renderQueue.sunLight;\r\n return renderQueue;\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private internalDrawItemList(\r\n ctx: DrawContext,\r\n items: RenderQueueItem[],\r\n renderBundle: RenderBundleWrapper,\r\n reverseWinding: boolean,\r\n hash: string\r\n ) {\r\n let recording = false;\r\n if (renderBundle && ctx.primaryCamera.commandBufferReuse) {\r\n const bundle = renderBundle.getRenderBundle(hash);\r\n if (bundle) {\r\n ctx.device.executeRenderBundle(bundle);\r\n return;\r\n }\r\n recording = true;\r\n renderBundle.beginRenderBundle();\r\n }\r\n for (const item of items) {\r\n ctx.instanceData = item.instanceData;\r\n const reverse = reverseWinding !== item.drawable.getNode().worldMatrixDet < 0;\r\n if (reverse) {\r\n ctx.device.reverseVertexWindingOrder(!ctx.device.isWindingOrderReversed());\r\n }\r\n if (recording) {\r\n RenderBundleWrapper.addDrawable(\r\n item.drawable,\r\n item.drawable.getMaterial()?.coreMaterial,\r\n item.drawable.getPrimitive(),\r\n renderBundle,\r\n hash\r\n );\r\n }\r\n item.drawable.draw(ctx, recording ? undefined : hash);\r\n if (reverse) {\r\n ctx.device.reverseVertexWindingOrder(!ctx.device.isWindingOrderReversed());\r\n }\r\n }\r\n if (renderBundle && ctx.primaryCamera.commandBufferReuse) {\r\n renderBundle.endRenderBundle(hash);\r\n }\r\n }\r\n /** @internal */\r\n protected drawItemList(itemList: RenderItemListInfo, ctx: DrawContext, reverseWinding: boolean) {\r\n ctx.renderQueue = itemList.renderQueue;\r\n ctx.instanceData = null;\r\n const windingHash = reverseWinding ? '1' : '0';\r\n const bindGroupHash = ctx.device.getBindGroup(0)[0].getGPUId();\r\n const framebufferHash = ctx.device.getFramebuffer()?.getHash() ?? '';\r\n const ctxHash = `${ctx.sceneColorTexture?.uid ?? 0}-${ctx.linearDepthTexture?.uid ?? 0}`;\r\n const hash = `${windingHash}-${bindGroupHash}-${framebufferHash}-${ctxHash}-${ctx.renderPassHash}`;\r\n if (itemList) {\r\n if (itemList.itemList.length > 0) {\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SKIN_ANIMATION |\r\n MaterialVaryingFlags.INSTANCING |\r\n MaterialVaryingFlags.MORPH_ANIMATION\r\n );\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(ctx, itemList.itemList, itemList.renderBundle, reverseWinding, hash);\r\n }\r\n if (itemList.skinItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.MORPH_ANIMATION | MaterialVaryingFlags.INSTANCING);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.skinItemList,\r\n itemList.skinRenderBundle,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.morphItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.MORPH_ANIMATION;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.INSTANCING);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.morphItemList,\r\n itemList.morphRenderBundle,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.skinAndMorphItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.INSTANCING;\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.skinAndMorphItemList,\r\n itemList.skinAndMorphRenderBundle,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.instanceItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.INSTANCING;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.instanceItemList,\r\n itemList.instanceRenderBundle,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n }\r\n ctx.renderQueue = null;\r\n }\r\n /**\r\n * Disposes the render pass\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._globalBindGroups = {};\r\n }\r\n /** @internal */\r\n private clearFramebuffer() {\r\n if (this._clearColor || this._clearDepth || this._clearStencil) {\r\n getDevice().clearFrameBuffer(this._clearColor, this._clearDepth, this._clearStencil);\r\n }\r\n }\r\n}\r\n"],"names":["RenderPass","Disposable","type","_type","_clearColor","Vector4","_clearDepth","_clearStencil","_globalBindGroups","clearColor","color","clearDepth","depth","clearStencil","stencil","isAutoFlip","ctx","device","getFramebuffer","render","cullCamera","renderQueue","renderPass","drawScene","camera","getGlobalBindGroup","hash","getGlobalBindGroupHash","bindGroup","ret","programBuilder","buildRender","vertex","pb","ShaderHelper","prepareVertexShader","main","fragment","prepareFragmentShader","createBindGroup","name","_getGlobalBindGroupHash","clearFramebuffer","rq","cullScene","windingReversed","isWindingOrderReversed","reverseVertexWindingOrder","renderItems","dispose","RenderQueue","cullVisitor","CullVisitor","primaryCamera","scene","octree","getRootNode","traverse","rootNode","end","sunLight","internalDrawItemList","items","renderBundle","reverseWinding","recording","commandBufferReuse","bundle","getRenderBundle","executeRenderBundle","beginRenderBundle","item","instanceData","reverse","drawable","getNode","worldMatrixDet","RenderBundleWrapper","addDrawable","getMaterial","coreMaterial","getPrimitive","draw","undefined","endRenderBundle","itemList","windingHash","bindGroupHash","getBindGroup","getGPUId","framebufferHash","getHash","ctxHash","sceneColorTexture","uid","linearDepthTexture","renderPassHash","length","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","INSTANCING","MORPH_ANIMATION","materialList","forEach","mat","apply","skinItemList","skinRenderBundle","morphItemList","morphRenderBundle","skinAndMorphItemList","skinAndMorphRenderBundle","instanceItemList","instanceRenderBundle","onDispose","getDevice","clearFrameBuffer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderpass.js","sources":["../../src/render/renderpass.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, Vector4 } from '@zephyr3d/base';\r\nimport { CullVisitor } from './cull_visitor';\r\nimport type { RenderItemListInfo, RenderQueueItem } from './render_queue';\r\nimport { RenderQueue } from './render_queue';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { DrawContext } from './drawable';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Base class for any kind of render passes\r\n * @public\r\n */\r\nexport abstract class RenderPass extends Disposable {\r\n /** @internal */\r\n protected _type: number;\r\n /** @internal */\r\n protected _globalBindGroups: Record<string, BindGroup>;\r\n /** @internal */\r\n protected _clearColor: Nullable<Vector4>;\r\n /** @internal */\r\n protected _clearDepth: Nullable<number>;\r\n /** @internal */\r\n protected _clearStencil: Nullable<number>;\r\n /**\r\n * Creates an instanceof RenderPass\r\n * @param type - Render pass type\r\n */\r\n constructor(type: number) {\r\n super();\r\n this._type = type;\r\n this._clearColor = new Vector4(0, 0, 0, 1);\r\n this._clearDepth = 1;\r\n this._clearStencil = 0;\r\n this._globalBindGroups = {};\r\n }\r\n /** Color value that is used to clear the frame buffer */\r\n get clearColor(): Nullable<Immutable<Vector4>> {\r\n return this._clearColor;\r\n }\r\n set clearColor(color: Nullable<Immutable<Vector4>>) {\r\n this._clearColor = color;\r\n }\r\n /** Depth value that is used to clear the frame buffer */\r\n get clearDepth() {\r\n return this._clearDepth;\r\n }\r\n set clearDepth(depth) {\r\n this._clearDepth = depth;\r\n }\r\n /** Stencil value that is used to clear the frame buffer */\r\n get clearStencil() {\r\n return this._clearStencil;\r\n }\r\n set clearStencil(stencil) {\r\n this._clearStencil = stencil;\r\n }\r\n /**\r\n * The render pass type\r\n */\r\n get type() {\r\n return this._type;\r\n }\r\n /** @internal */\r\n isAutoFlip(ctx: DrawContext) {\r\n return !!(ctx.device.getFramebuffer() && ctx.device.type === 'webgpu');\r\n }\r\n /**\r\n * Renders a scene\r\n * @param ctx - Drawing context\r\n */\r\n render(\r\n ctx: DrawContext,\r\n renderCamera?: Nullable<Camera>,\r\n cullCamera?: Nullable<Camera>,\r\n renderQueue?: RenderQueue\r\n ) {\r\n ctx.renderPass = this;\r\n this.drawScene(ctx, renderCamera ?? ctx.camera, cullCamera ?? renderCamera ?? ctx.camera, renderQueue);\r\n }\r\n /** @internal */\r\n getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this.constructor.name}:${this._getGlobalBindGroupHash(ctx, camera)}`;\r\n }\r\n /** @internal */\r\n protected abstract _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera): string;\r\n /** @internal */\r\n protected abstract renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue): void;\r\n /** @internal */\r\n protected drawScene(ctx: DrawContext, renderCamera: Camera, cullCamera: Camera, renderQueue?: RenderQueue) {\r\n const device = ctx.device;\r\n this.clearFramebuffer();\r\n const rq = renderQueue ?? this.cullScene(ctx, cullCamera);\r\n if (rq) {\r\n const windingReversed = device.isWindingOrderReversed();\r\n device.reverseVertexWindingOrder(this.isAutoFlip(ctx) ? !windingReversed : windingReversed);\r\n this.renderItems(ctx, renderCamera, rq);\r\n device.reverseVertexWindingOrder(windingReversed);\r\n if (rq !== renderQueue) {\r\n rq.dispose();\r\n }\r\n }\r\n }\r\n /**\r\n * Culls a scene by a given camera\r\n * @param ctx - The draw context\r\n * @param cullCamera - The camera that will be used to cull the scene\r\n * @returns The cull result\r\n */\r\n cullScene(ctx: DrawContext, cullCamera: Camera) {\r\n const renderQueue = new RenderQueue(this);\r\n const cullVisitor = new CullVisitor(this, cullCamera, renderQueue);\r\n if (ctx.scene.octree) {\r\n ctx.scene.octree.getRootNode().traverse(cullVisitor);\r\n } else {\r\n ctx.scene.rootNode.traverse(cullVisitor);\r\n }\r\n renderQueue.end(cullCamera);\r\n ctx.sunLight = renderQueue.sunLight;\r\n return renderQueue;\r\n }\r\n /** @internal */\r\n private internalDrawItemList(\r\n ctx: DrawContext,\r\n items: RenderQueueItem[],\r\n renderQueue: Nullable<RenderQueue>,\r\n renderBundle: Nullable<RenderBundleWrapper>,\r\n reverseWinding: boolean,\r\n hash: string\r\n ) {\r\n let recording = false;\r\n if (renderBundle && ctx.camera.commandBufferReuse) {\r\n const bundle = renderBundle.getRenderBundle(hash);\r\n if (bundle) {\r\n ctx.device.executeRenderBundle(bundle);\r\n return;\r\n }\r\n recording = true;\r\n renderBundle.beginRenderBundle();\r\n }\r\n for (const item of items) {\r\n ctx.instanceData = item.instanceData;\r\n const reverse = reverseWinding !== item.drawable.getNode().worldMatrixDet < 0;\r\n if (reverse) {\r\n ctx.device.reverseVertexWindingOrder(!ctx.device.isWindingOrderReversed());\r\n }\r\n if (recording) {\r\n RenderBundleWrapper.addDrawable(\r\n item.drawable,\r\n item.drawable.getMaterial()?.coreMaterial!,\r\n item.drawable.getPrimitive()!,\r\n renderBundle!,\r\n hash\r\n );\r\n }\r\n item.drawable.draw(ctx, renderQueue, recording ? undefined : hash);\r\n if (reverse) {\r\n ctx.device.reverseVertexWindingOrder(!ctx.device.isWindingOrderReversed());\r\n }\r\n }\r\n if (renderBundle && ctx.camera.commandBufferReuse) {\r\n renderBundle.endRenderBundle(hash);\r\n }\r\n }\r\n /** @internal */\r\n protected drawItemList(itemList: RenderItemListInfo, ctx: DrawContext, reverseWinding: boolean) {\r\n ctx.instanceData = null;\r\n const windingHash = reverseWinding ? '1' : '0';\r\n const bindGroupHash = ctx.device.getBindGroup(0)[0].getGPUId();\r\n const framebufferHash = ctx.device.getFramebuffer()?.getHash() ?? '';\r\n const ctxHash = `${ctx.sceneColorTexture?.uid ?? 0}-${ctx.linearDepthTexture?.uid ?? 0}`;\r\n const hash = `${windingHash}-${bindGroupHash}-${framebufferHash}-${ctxHash}-${ctx.renderPassHash}`;\r\n if (itemList) {\r\n if (itemList.itemList.length > 0) {\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SKIN_ANIMATION |\r\n MaterialVaryingFlags.INSTANCING |\r\n MaterialVaryingFlags.MORPH_ANIMATION\r\n );\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.itemList,\r\n itemList.renderQueue,\r\n itemList.renderBundle ?? null,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.skinItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.MORPH_ANIMATION | MaterialVaryingFlags.INSTANCING);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.skinItemList,\r\n itemList.renderQueue,\r\n itemList.skinRenderBundle ?? null,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.morphItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.MORPH_ANIMATION;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.INSTANCING);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.morphItemList,\r\n itemList.renderQueue,\r\n itemList.morphRenderBundle ?? null,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.skinAndMorphItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.INSTANCING;\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.skinAndMorphItemList,\r\n itemList.renderQueue,\r\n itemList.skinAndMorphRenderBundle ?? null,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n if (itemList.instanceItemList.length > 0) {\r\n ctx.materialFlags |= MaterialVaryingFlags.INSTANCING;\r\n ctx.materialFlags &= ~(MaterialVaryingFlags.SKIN_ANIMATION | MaterialVaryingFlags.MORPH_ANIMATION);\r\n itemList.materialList.forEach((mat) => mat.apply(ctx));\r\n this.internalDrawItemList(\r\n ctx,\r\n itemList.instanceItemList,\r\n itemList.renderQueue,\r\n itemList.instanceRenderBundle ?? null,\r\n reverseWinding,\r\n hash\r\n );\r\n }\r\n }\r\n }\r\n /**\r\n * Disposes the render pass\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._globalBindGroups = {};\r\n }\r\n /** @internal */\r\n private clearFramebuffer() {\r\n if (this._clearColor || this._clearDepth || this._clearStencil) {\r\n getDevice().clearFrameBuffer(this._clearColor, this._clearDepth, this._clearStencil);\r\n }\r\n }\r\n}\r\n"],"names":["RenderPass","Disposable","type","_type","_clearColor","Vector4","_clearDepth","_clearStencil","_globalBindGroups","clearColor","color","clearDepth","depth","clearStencil","stencil","isAutoFlip","ctx","device","getFramebuffer","render","renderCamera","cullCamera","renderQueue","renderPass","drawScene","camera","getGlobalBindGroupHash","name","_getGlobalBindGroupHash","clearFramebuffer","rq","cullScene","windingReversed","isWindingOrderReversed","reverseVertexWindingOrder","renderItems","dispose","RenderQueue","cullVisitor","CullVisitor","scene","octree","getRootNode","traverse","rootNode","end","sunLight","internalDrawItemList","items","renderBundle","reverseWinding","hash","recording","commandBufferReuse","bundle","getRenderBundle","executeRenderBundle","beginRenderBundle","item","instanceData","reverse","drawable","getNode","worldMatrixDet","RenderBundleWrapper","addDrawable","getMaterial","coreMaterial","getPrimitive","draw","undefined","endRenderBundle","itemList","windingHash","bindGroupHash","getBindGroup","getGPUId","framebufferHash","getHash","ctxHash","sceneColorTexture","uid","linearDepthTexture","renderPassHash","length","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","INSTANCING","MORPH_ANIMATION","materialList","forEach","mat","apply","skinItemList","skinRenderBundle","morphItemList","morphRenderBundle","skinAndMorphItemList","skinAndMorphRenderBundle","instanceItemList","instanceRenderBundle","onDispose","getDevice","clearFrameBuffer"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendertarget.js","sources":["../../src/render/rendertarget.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\n\r\nexport abstract class RenderTarget {\r\n abstract getVersion(): number;\r\n abstract calcViewport(outViewport?: Nullable<number[]>): number[];\r\n abstract calcRelativeViewport(outViewport?: Nullable<number[]>): number[];\r\n abstract calcPerspectiveProjection(\r\n fov: number,\r\n nearClip: number,\r\n farClip: number,\r\n outMatrix?: Matrix4x4\r\n ): Matrix4x4;\r\n abstract calcOrthographicProjection(nearClip: number, farClip: number, outMatrix?: Matrix4x4): Matrix4x4;\r\n}\r\n"],"names":["RenderTarget"],"mappings":"AAEO,MAAeA,YAAAA,CAAAA;AAWtB;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Matrix4x4 } from '@zephyr3d/base';
|
|
2
|
+
import { getEngine } from '../app/api.js';
|
|
3
|
+
import { RenderTarget } from './rendertarget.js';
|
|
4
|
+
|
|
5
|
+
class ScreenRenderTarget extends RenderTarget {
|
|
6
|
+
screenAdapter;
|
|
7
|
+
constructor(screenAdapter){
|
|
8
|
+
super();
|
|
9
|
+
this.screenAdapter = screenAdapter ?? getEngine().screen;
|
|
10
|
+
}
|
|
11
|
+
getVersion() {
|
|
12
|
+
return this.screenAdapter.version;
|
|
13
|
+
}
|
|
14
|
+
calcViewport(outViewport) {
|
|
15
|
+
outViewport = outViewport ?? [];
|
|
16
|
+
const transform = this.screenAdapter.transform;
|
|
17
|
+
outViewport[0] = transform.croppedViewport.x;
|
|
18
|
+
outViewport[1] = transform.croppedViewport.y;
|
|
19
|
+
outViewport[2] = transform.croppedViewport.width;
|
|
20
|
+
outViewport[3] = transform.croppedViewport.height;
|
|
21
|
+
return outViewport;
|
|
22
|
+
}
|
|
23
|
+
calcRelativeViewport(outViewport) {
|
|
24
|
+
outViewport = outViewport ?? [];
|
|
25
|
+
const transform = this.screenAdapter.transform;
|
|
26
|
+
outViewport[0] = transform.croppedViewport.x - transform.viewportX;
|
|
27
|
+
outViewport[1] = transform.croppedViewport.y - transform.viewportY;
|
|
28
|
+
outViewport[2] = transform.croppedViewport.width;
|
|
29
|
+
outViewport[3] = transform.croppedViewport.height;
|
|
30
|
+
return outViewport;
|
|
31
|
+
}
|
|
32
|
+
calcOrthographicProjection(nearClip, farClip, outMatrix) {
|
|
33
|
+
const matrix = outMatrix ?? new Matrix4x4();
|
|
34
|
+
const transform = this.screenAdapter.transform;
|
|
35
|
+
const left = transform.croppedViewport.x;
|
|
36
|
+
const right = transform.croppedViewport.x + transform.croppedViewport.width;
|
|
37
|
+
const bottom = transform.croppedViewport.y + transform.croppedViewport.height;
|
|
38
|
+
const top = transform.croppedViewport.y;
|
|
39
|
+
return matrix.ortho(left, right, bottom, top, nearClip, farClip);
|
|
40
|
+
}
|
|
41
|
+
calcPerspectiveProjection(fov, nearClip, farClip, outMatrix) {
|
|
42
|
+
const matrix = outMatrix ?? new Matrix4x4();
|
|
43
|
+
const transform = this.screenAdapter.transform;
|
|
44
|
+
const aspect = transform.viewportHeight !== 0 ? transform.viewportWidth / transform.viewportHeight : 1;
|
|
45
|
+
const h = nearClip * Math.tan(fov * 0.5);
|
|
46
|
+
const w = h * aspect;
|
|
47
|
+
let left = -w + 2 * w * (transform.croppedViewport.x - transform.viewportX) / transform.viewportWidth;
|
|
48
|
+
let right = w - 2 * w * (transform.viewportX + transform.viewportWidth - transform.croppedViewport.x - transform.croppedViewport.width) / transform.viewportWidth;
|
|
49
|
+
let bottom = -h + 2 * w * (transform.croppedViewport.y - transform.viewportY) / transform.viewportHeight;
|
|
50
|
+
let top = h - 2 * h * (transform.viewportY + transform.viewportHeight - transform.croppedViewport.y - transform.croppedViewport.height) / transform.viewportHeight;
|
|
51
|
+
return matrix.frustum(left, right, bottom, top, nearClip, farClip);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { ScreenRenderTarget };
|
|
56
|
+
//# sourceMappingURL=screenrendertarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenrendertarget.js","sources":["../../src/render/screenrendertarget.ts"],"sourcesContent":["import { Matrix4x4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { ScreenAdapter } from '../app/screen';\r\nimport { getEngine } from '../app/api';\r\nimport { RenderTarget } from './rendertarget';\r\n\r\nexport class ScreenRenderTarget extends RenderTarget {\r\n private readonly screenAdapter: ScreenAdapter;\r\n constructor(screenAdapter?: ScreenAdapter) {\r\n super();\r\n this.screenAdapter = screenAdapter ?? getEngine().screen;\r\n }\r\n getVersion() {\r\n return this.screenAdapter.version;\r\n }\r\n calcViewport(outViewport?: Nullable<number[]>): number[] {\r\n outViewport = outViewport ?? [];\r\n const transform = this.screenAdapter.transform;\r\n outViewport[0] = transform.croppedViewport.x;\r\n outViewport[1] = transform.croppedViewport.y;\r\n outViewport[2] = transform.croppedViewport.width;\r\n outViewport[3] = transform.croppedViewport.height;\r\n return outViewport;\r\n }\r\n calcRelativeViewport(outViewport?: Nullable<number[]>): number[] {\r\n outViewport = outViewport ?? [];\r\n const transform = this.screenAdapter.transform;\r\n outViewport[0] = transform.croppedViewport.x - transform.viewportX;\r\n outViewport[1] = transform.croppedViewport.y - transform.viewportY;\r\n outViewport[2] = transform.croppedViewport.width;\r\n outViewport[3] = transform.croppedViewport.height;\r\n return outViewport;\r\n }\r\n calcOrthographicProjection(nearClip: number, farClip: number, outMatrix?: Matrix4x4): Matrix4x4 {\r\n const matrix = outMatrix ?? new Matrix4x4();\r\n const transform = this.screenAdapter.transform;\r\n const left = transform.croppedViewport.x;\r\n const right = transform.croppedViewport.x + transform.croppedViewport.width;\r\n const bottom = transform.croppedViewport.y + transform.croppedViewport.height;\r\n const top = transform.croppedViewport.y;\r\n return matrix.ortho(left, right, bottom, top, nearClip, farClip);\r\n }\r\n calcPerspectiveProjection(\r\n fov: number,\r\n nearClip: number,\r\n farClip: number,\r\n outMatrix?: Matrix4x4\r\n ): Matrix4x4 {\r\n const matrix = outMatrix ?? new Matrix4x4();\r\n const transform = this.screenAdapter.transform;\r\n const aspect = transform.viewportHeight !== 0 ? transform.viewportWidth / transform.viewportHeight : 1;\r\n const h = nearClip * Math.tan(fov * 0.5);\r\n const w = h * aspect;\r\n let left = -w + (2 * w * (transform.croppedViewport.x - transform.viewportX)) / transform.viewportWidth;\r\n let right =\r\n w -\r\n (2 *\r\n w *\r\n (transform.viewportX +\r\n transform.viewportWidth -\r\n transform.croppedViewport.x -\r\n transform.croppedViewport.width)) /\r\n transform.viewportWidth;\r\n let bottom =\r\n -h + (2 * w * (transform.croppedViewport.y - transform.viewportY)) / transform.viewportHeight;\r\n let top =\r\n h -\r\n (2 *\r\n h *\r\n (transform.viewportY +\r\n transform.viewportHeight -\r\n transform.croppedViewport.y -\r\n transform.croppedViewport.height)) /\r\n transform.viewportHeight;\r\n return matrix.frustum(left, right, bottom, top, nearClip, farClip);\r\n }\r\n}\r\n"],"names":["ScreenRenderTarget","RenderTarget","screenAdapter","getEngine","screen","getVersion","version","calcViewport","outViewport","transform","croppedViewport","x","y","width","height","calcRelativeViewport","viewportX","viewportY","calcOrthographicProjection","nearClip","farClip","outMatrix","matrix","Matrix4x4","left","right","bottom","top","ortho","calcPerspectiveProjection","fov","aspect","viewportHeight","viewportWidth","h","Math","tan","w","frustum"],"mappings":"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"}
|