Browse Source

progressive baking fixed

ncannasse 7 năm trước cách đây
mục cha
commit
f205b5694e

+ 4 - 0
hide/Ide.hx

@@ -768,6 +768,10 @@ class Ide {
 			target.addChild(config, index);
 	}
 
+	public function message( text : String ) {
+		js.Browser.window.alert(text);
+	}
+
 	public function confirm( text : String ) {
 		return js.Browser.window.confirm(text);
 	}

+ 4 - 2
hide/prefab/l3d/VolumetricLightmap.hx

@@ -277,14 +277,16 @@ class VolumetricLightmap extends Object3D {
 		}
 
 	}
-	#end
 
-	public function startBake(ctx : EditContext){
+	public function startBake(ctx : EditContext, ?onEnd){
 		maxOrderBaked = order;
 		volumetricLightmap.lastBakedProbeIndex = 0;
 		var s3d = @:privateAccess ctx.rootContext.local3d.getScene();
 		baker = new hide.view.l3d.ProbeBakerProcess(s3d, this);
+		baker.onEnd = function() if( onEnd != null ) onEnd();
 	}
 
+	#end
+
 	static var _ = hxd.prefab.Library.register("volumetricLightmap", VolumetricLightmap);
 }

+ 9 - 3
hide/view/l3d/Level3D.hx

@@ -144,11 +144,17 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 	}
 
 	public function bakeVolumetricLightmaps(){
-		var volumetricLightmaps : Array<hide.prefab.l3d.VolumetricLightmap> = sceneData.getAll(hide.prefab.l3d.VolumetricLightmap);
-		for(v in volumetricLightmaps){
-			v.startBake(curEdit);
+		var volumetricLightmaps = sceneData.getAll(hide.prefab.l3d.VolumetricLightmap);
+		function bakeNext() {
+			var v = volumetricLightmaps.shift();
+			if( v == null ) {
+				ide.message("Done");
+				return;
+			}
+			v.startBake(curEdit, bakeNext);
 			selectObjects([v]);
 		}
+		bakeNext();
 	}
 
 	override function getNewContextMenu(current: PrefabElement) {

+ 19 - 28
hide/view/l3d/ProbeBakerProcess.hx

@@ -2,49 +2,40 @@ package hide.view.l3d;
 
 class ProbeBakerProcess {
 
-	static var lightProbeBaker : h3d.scene.pbr.LightProbeBaker;
-	static var bakeTime = 0.01;
-	static var lastlightmapBaked : hide.prefab.l3d.VolumetricLightmap;
-	static var globalRemainingTime : Float;
-
 	public var progress : Float = 0.;
+
+	var lightProbeBaker : h3d.scene.pbr.LightProbeBaker;
 	var volumetricLightmap : hide.prefab.l3d.VolumetricLightmap;
 	var s3d : h3d.scene.Scene;
+	var bakeTime : Float;
 
-	public function new(s3d, volumetricLightmap){
+	public function new(s3d, volumetricLightmap, bakeTime : Float = 0.08 ){
 		progress = 0;
 		this.s3d = s3d;
+		this.bakeTime = bakeTime;
 		this.volumetricLightmap = volumetricLightmap;
 
-		if(lightProbeBaker == null){
-			lightProbeBaker = new h3d.scene.pbr.LightProbeBaker();
-			lightProbeBaker.useGPU = false;
-		}
+		lightProbeBaker = new h3d.scene.pbr.LightProbeBaker();
+		lightProbeBaker.useGPU = false;
 
 		var rend = Std.instance(s3d.renderer, h3d.scene.pbr.Renderer) ;
 		if(rend != null) lightProbeBaker.environment = rend.env;
 	}
 
-	public function update(dt:Float){
-
-		if(lastlightmapBaked == volumetricLightmap)
-			globalRemainingTime = bakeTime;
-
-		if(lastlightmapBaked == null){
-			lastlightmapBaked = volumetricLightmap;
+	public function update(dt:Float) {
+		lightProbeBaker.bakePartial(s3d.renderer, s3d, volumetricLightmap.volumetricLightmap, 32, bakeTime);
+		volumetricLightmap.volumetricLightmap.packDataInsideTexture();
+		volumetricLightmap.createPreview();
+		progress = (volumetricLightmap.volumetricLightmap.lastBakedProbeIndex +1.0) / volumetricLightmap.volumetricLightmap.lightProbes.length;
+		if( progress == 1 ) {
+			lightProbeBaker.dispose();
+			lightProbeBaker = null;
+			onEnd();
 		}
+	}
 
-		if(lastlightmapBaked == volumetricLightmap && globalRemainingTime > 0){
-			var remainingTime = lightProbeBaker.bakePartial(s3d.renderer, s3d, volumetricLightmap.volumetricLightmap, 32, bakeTime);
-			globalRemainingTime -= remainingTime;
-			volumetricLightmap.volumetricLightmap.packDataInsideTexture();
-			volumetricLightmap.createPreview();
-			progress = (volumetricLightmap.volumetricLightmap.lastBakedProbeIndex +1.0) /volumetricLightmap.volumetricLightmap.lightProbes.length;
-
-			if(progress == 1){
-				lastlightmapBaked = null;
-			}
-		}
+	public dynamic function onEnd() {
 	}
+
 }