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