Selaa lähdekoodia

Dispatch events preRenderCamera, preBlitCamera, postRenderCamera from VirtualCamerasPlugin, update example to account for tonemapping.

master
Palash Bansal 2 vuotta sitten
vanhempi
commit
069dc7bd98
No account linked to committer's email address

+ 21
- 5
examples/virtual-camera/script.ts Näytä tiedosto

import { import {
_testFinish, _testFinish,
IObject3D, IObject3D,
LinearToneMapping,
Mesh, Mesh,
PerspectiveCamera2, PerspectiveCamera2,
PhysicalMaterial,
PlaneGeometry, PlaneGeometry,
PopmotionPlugin, PopmotionPlugin,
ProgressivePlugin, ProgressivePlugin,
Texture, Texture,
ThreeViewer, ThreeViewer,
ToneMapping,
TonemapPlugin,
UnlitMaterial,
VirtualCamerasPlugin, VirtualCamerasPlugin,
} from 'threepipe' } from 'threepipe'


autoScale: true, autoScale: true,
}) })


const aspect = 2
const plane = new Mesh( const plane = new Mesh(
new PlaneGeometry(5, 5)
.translate(0, 0, -4),
new PhysicalMaterial({
new PlaneGeometry(5 * aspect, 5)
.translate(0, 0, -3),
new UnlitMaterial({
color: '#ffffff', color: '#ffffff',
}) })
) )
plane.receiveShadow = true plane.receiveShadow = true
viewer.scene.addObject(plane) viewer.scene.addObject(plane)


const camera = new PerspectiveCamera2('', viewer.canvas, false, 45, 1)
const camera = new PerspectiveCamera2('', viewer.canvas, false, 45, aspect)
camera.position.set(0, 0, 5) camera.position.set(0, 0, 5)
camera.target.set(0, 0.25, 0) camera.target.set(0, 0.25, 0)
camera.userData.autoLookAtTarget = true camera.userData.autoLookAtTarget = true
}, },
}) })


// We need to disable tonemapping when rendering the virtual camera, otherwise the tonemapping will be applied multiple times.
let lastTonemapping: ToneMapping = LinearToneMapping
const tonemap = viewer.getPlugin(TonemapPlugin)!
virtualCameras.addEventListener('preRenderCamera', ()=>{
lastTonemapping = tonemap.toneMapping
// Comment this and see what happens to the color in the plane
tonemap.toneMapping = LinearToneMapping
})
virtualCameras.addEventListener('postRenderCamera', ()=>{
tonemap.toneMapping = lastTonemapping
})

} }


init().then(_testFinish) init().then(_testFinish)

+ 4
- 1
src/plugins/rendering/VirtualCamerasPlugin.ts Näytä tiedosto

enabled: boolean enabled: boolean
} }
@uiFolderContainer('Virtual Cameras') @uiFolderContainer('Virtual Cameras')
export class VirtualCamerasPlugin extends AViewerPluginSync<''> {
export class VirtualCamerasPlugin extends AViewerPluginSync<'preRenderCamera' | 'preBlitCamera' | 'postRenderCamera'> {
public static readonly PluginType = 'VirtualCamerasPlugin' public static readonly PluginType = 'VirtualCamerasPlugin'


@uiToggle() @uiToggle()
if (!v.enabled) continue if (!v.enabled) continue
const camera = v.camera const camera = v.camera
try { try {
this.dispatchEvent({type: 'preRenderCamera', camera: v})
viewer.scene.renderCamera = camera viewer.scene.renderCamera = camera
viewer.renderManager.render(viewer.scene, false) viewer.renderManager.render(viewer.scene, false)
const source = viewer.renderManager.composer.readBuffer.texture const source = viewer.renderManager.composer.readBuffer.texture
this.dispatchEvent({type: 'preBlitCamera', camera: v, readBuffer: source})
viewer.renderManager.blit(v.target, {source}) viewer.renderManager.blit(v.target, {source})
this.dispatchEvent({type: 'postRenderCamera', camera: v})
} catch (e: any) { } catch (e: any) {
viewer.console.error(e) viewer.console.error(e)
v.enabled = false v.enabled = false

Loading…
Peruuta
Tallenna