Explorar o código

Editor: Improved pathtracer performance and robustness.

Mr.doob hai 1 ano
pai
achega
1b35d645db
Modificáronse 2 ficheiros con 31 adicións e 5 borrados
  1. 20 2
      editor/js/Viewport.Pathtracer.js
  2. 11 3
      editor/js/Viewport.js

+ 20 - 2
editor/js/Viewport.Pathtracer.js

@@ -18,13 +18,17 @@ function buildColorTexture( color ) {
 
 function ViewportPathtracer( renderer ) {
 
+	let generator = null;
 	let pathtracer = null;
 	let quad = null;
+	let hdr = null;
 
 	function init( scene, camera ) {
 
 		if ( pathtracer === null ) {
 
+			generator = new PathTracingSceneGenerator();
+
 			pathtracer = new PathTracingRenderer( renderer );
 			pathtracer.setSize( renderer.domElement.offsetWidth, renderer.domElement.offsetHeight );
 			pathtracer.alpha = true;
@@ -42,7 +46,14 @@ function ViewportPathtracer( renderer ) {
 		pathtracer.material.backgroundBlur = scene.backgroundBlurriness;
 		pathtracer.reset();
 
-		const generator = new PathTracingSceneGenerator();
+		// TOFIX: If the scene is empty the generator crashes so we render a tiny cube (:
+
+		if ( scene.children.length === 0 ) {
+
+			scene = new THREE.Mesh( new THREE.BoxGeometry( 0.0001, 0.0001, 0.0001 ) );
+
+		}
+
 		const { bvh, textures, materials, lights } = generator.generate( scene );
 
 		const ptGeometry = bvh.geometry;
@@ -88,7 +99,14 @@ function ViewportPathtracer( renderer ) {
 
 		if ( environment && environment.isTexture === true ) {
 
-			ptMaterial.envMapInfo.updateFrom( scene.environment );
+			// Avoid calling envMapInfo() with the same hdr
+
+			if ( scene.environment !== hdr ) {
+
+				ptMaterial.envMapInfo.updateFrom( scene.environment );
+				hdr = scene.environment;
+
+			}
 
 		} else {
 

+ 11 - 3
editor/js/Viewport.js

@@ -92,7 +92,7 @@ function Viewport( editor ) {
 
 		}
 
-		render();
+		render( true );
 
 	} );
 	transformControls.addEventListener( 'mouseDown', function () {
@@ -302,6 +302,8 @@ function Viewport( editor ) {
 	signals.editorCleared.add( function () {
 
 		controls.center.set( 0, 0, 0 );
+		pathtracer.reset();
+
 		render();
 
 	} );
@@ -697,7 +699,7 @@ function Viewport( editor ) {
 		sceneHelpers.visible = value;
 		transformControls.enabled = value;
 
-		render();
+		render( true );
 
 	} );
 
@@ -766,7 +768,13 @@ function Viewport( editor ) {
 	let startTime = 0;
 	let endTime = 0;
 
-	function render() {
+	function render( isHelper = false ) {
+
+		if ( editor.viewportShading === 'realistic' && isHelper === false ) {
+
+			pathtracer.init( scene, camera );
+
+		}
 
 		startTime = performance.now();