Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 51x 51x 51x 11x 11x 11x 2x 2x 1x 1x 1x 1x 2x 2x 2x 1x 1x 2x 5x 4x 5x 5x 5x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 2x 4x 4x | import { WebGLInfo, WebGLRenderTarget, WebGLRenderer } from "three" import { MaskPass, ClearMaskPass } from "three/examples/jsm/postprocessing/MaskPass" import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer" import { Pass } from "three/examples/jsm/postprocessing/Pass" export class CustomComposer extends EffectComposer { private info: WebGLInfo["render"][] = [] private memInfo: WebGLInfo["memory"][] = [] constructor(renderer: WebGLRenderer, renderTarget?: WebGLRenderTarget) { super(renderer, renderTarget) } getInfo(): WebGLInfo["render"] { const result: WebGLInfo["render"] = { calls: 0, lines: 0, triangles: 0, points: 0, frame: 0 } for (const info of this.info) { result.calls += info.calls result.lines += info.lines result.triangles += info.triangles result.points += info.points } return result } getMemoryInfo(): WebGLInfo["memory"] { const result: WebGLInfo["memory"] = { geometries: 0, textures: 0 } for (const info of this.memInfo) { result.geometries += info.geometries result.textures += info.textures } return result } render(deltaTime?: number): void { if (deltaTime === undefined) { deltaTime = this.clock.getDelta() } const currentRenderTarget = this.renderer.getRenderTarget() let maskActive = false let pass: Pass for (let index = 0; index < this.passes.length; index++) { pass = this.passes[index] Iif (pass.enabled === false) { continue } pass.renderToScreen = this.renderToScreen && this.isLastEnabledPass(index) // nosonar this.info[index] = { ...this.renderer.info.render } this.memInfo[index] = { ...this.renderer.info.memory } pass.render(this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive) if (pass.needsSwap) { Iif (maskActive) { const context = this.renderer.getContext() const stencil = this.renderer.state.buffers.stencil stencil.setFunc(context.NOTEQUAL, 1, 0xff_ff_ff_ff) this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, deltaTime, false) stencil.setFunc(context.EQUAL, 1, 0xff_ff_ff_ff) } this.swapBuffers() } Iif (pass instanceof MaskPass) { maskActive = true } else Iif (pass instanceof ClearMaskPass) { maskActive = false } } this.renderer.setRenderTarget(currentRenderTarget) } dispose() { // TODO add more dispose // biome-ignore lint/style/useForOf: <explanation> for (let index = 0; index < this.passes.length; index++) { this.passes[index]["fsQuad"]?.material.dispose() this.passes[index]["fsQuad"]?._mesh?.geometry.dispose() } } } |