Просмотр исходного кода

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

master
Palash Bansal 2 лет назад
Родитель
Сommit
069dc7bd98
Аккаунт пользователя с таким Email не найден
2 измененных файлов: 25 добавлений и 6 удалений
  1. 21
    5
      examples/virtual-camera/script.ts
  2. 4
    1
      src/plugins/rendering/VirtualCamerasPlugin.ts

+ 21
- 5
examples/virtual-camera/script.ts Просмотреть файл

@@ -1,14 +1,17 @@
import {
_testFinish,
IObject3D,
LinearToneMapping,
Mesh,
PerspectiveCamera2,
PhysicalMaterial,
PlaneGeometry,
PopmotionPlugin,
ProgressivePlugin,
Texture,
ThreeViewer,
ToneMapping,
TonemapPlugin,
UnlitMaterial,
VirtualCamerasPlugin,
} from 'threepipe'

@@ -28,10 +31,11 @@ async function init() {
autoScale: true,
})

const aspect = 2
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',
})
)
@@ -39,7 +43,7 @@ async function init() {
plane.receiveShadow = true
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.target.set(0, 0.25, 0)
camera.userData.autoLookAtTarget = true
@@ -64,6 +68,18 @@ async function init() {
},
})

// 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)

+ 4
- 1
src/plugins/rendering/VirtualCamerasPlugin.ts Просмотреть файл

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

@uiToggle()
@@ -32,10 +32,13 @@ export class VirtualCamerasPlugin extends AViewerPluginSync<''> {
if (!v.enabled) continue
const camera = v.camera
try {
this.dispatchEvent({type: 'preRenderCamera', camera: v})
viewer.scene.renderCamera = camera
viewer.renderManager.render(viewer.scene, false)
const source = viewer.renderManager.composer.readBuffer.texture
this.dispatchEvent({type: 'preBlitCamera', camera: v, readBuffer: source})
viewer.renderManager.blit(v.target, {source})
this.dispatchEvent({type: 'postRenderCamera', camera: v})
} catch (e: any) {
viewer.console.error(e)
v.enabled = false

Загрузка…
Отмена
Сохранить