All files / app/codeCharta/ui/codeMap/rendering/postprocessor customComposer.ts

83.33% Statements 40/48
80.95% Branches 17/21
100% Functions 5/5
82.6% Lines 38/46

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()
        }
    }
}