Ver Fonte

fix errors on comparison mode in file viewer

lviguier há 1 ano atrás
pai
commit
b41fb30800
1 ficheiros alterados com 81 adições e 49 exclusões
  1. 81 49
      hide/view/Image.hx

+ 81 - 49
hide/view/Image.hx

@@ -65,10 +65,12 @@ enum ViewMode {
 class Image extends FileView {
 
 	var bmp : h2d.Bitmap;
+	var sliderBmp : h2d.Bitmap;
 	var scene : hide.comp.Scene;
 	var viewMode : ViewMode = Compressed;
-	var firstDisplay : Bool = true;
+	var interactive : h2d.Interactive;
 	var tools : hide.comp.Toolbar;
+	var sliderTexture : Null<h3d.mat.Texture>;
 
 	override function onDisplay() {
 		element.html('
@@ -79,13 +81,14 @@ class Image extends FileView {
 			</div>
 		');
 
+		cleanUp();
+
+		scene = new hide.comp.Scene(config, null, element.find(".heaps-scene"));
+
 		this.saveDisplayKey = state.path;
 		this.viewMode = getDisplayState("ViewMode");
 
-		if (this.viewMode == null)
-			this.viewMode = Compressed;
-
-		firstDisplay = true;
+		var shader = new ImageViewerShader();
 
 		tools = new hide.comp.Toolbar(null,element.find(".toolbar"));
 
@@ -95,73 +98,65 @@ class Image extends FileView {
 			tools.element.find(".show-uncompressed").removeAttr("checked");
 			tools.element.find(".show-comparison").removeAttr("checked");
 
-			if (firstDisplay) {
-				firstDisplay = false;
-				return;
-			}
-
 			this.saveDisplayState("ViewMode", Compressed);
-			this.onDisplay();
-		}, this.viewMode.match(Compressed));
+			this.viewMode = Compressed;
+			
+			if (bmp != null)
+				applyShaderConfiguration(shader);
+
+		});
 		tgCompressed.element.addClass("show-compressed");
 
 		var tgUncompressed = tools.addToggle("file-image-o", "Show uncompressed texture", "", function (e) {
 			tools.element.find(".show-compressed").removeAttr("checked");
 			tools.element.find(".show-comparison").removeAttr("checked");
 
-			if (firstDisplay) {
-				firstDisplay = false;
-				return;
-			}
-
 			this.saveDisplayState("ViewMode", Uncompressed);
-			scene.remove();
-			this.onDisplay();
+			this.viewMode = Uncompressed;
 			
-		}, this.viewMode.match(Uncompressed));
+			if (bmp != null)
+				applyShaderConfiguration(shader);
+
+		});
 		tgUncompressed.element.addClass("show-uncompressed");
 
 		var tgComparison = tools.addToggle("arrows-h", "Show comparison between compressed and uncompressed texture", "", function (e) {
 			tools.element.find(".show-uncompressed").removeAttr("checked");
 			tools.element.find(".show-compressed").removeAttr("checked");
 
-			if (firstDisplay) {
-				firstDisplay = false;
-				return;
-			}
-
 			this.saveDisplayState("ViewMode", Comparison);
-			scene.remove();
-			this.onDisplay();
-		}, this.viewMode.match(Comparison));
+			this.viewMode = Comparison;
+			
+			if (bmp != null)
+				applyShaderConfiguration(shader);
+			
+		});
 		tgComparison.element.addClass("show-comparison");
 
 		tools.addSeparator();
 
 		tools.addPopup(null, "Compression", (e) -> new hide.comp.SceneEditor.CompressionPopup(null, e, state.path), null);
-		
-		tools.addSeparator();
-
-		tools.addSeparator();
-
-		tools.addButton("", "Save compression", function() {});
 
 		tools.addSeparator();
-
-		scene = new hide.comp.Scene(config, null, element.find(".heaps-scene"));
 		
 		scene.onReady = function() {
 			scene.loadTexture(state.path, state.path, function(compressedTexture) {
 				scene.loadTexture(state.path, state.path, function(uncompressedTexture) {
-					onTexturesLoaded(compressedTexture, uncompressedTexture);
+					var path = hide.Ide.inst.appPath + "/res/slider.png";
+					scene.loadTexture(path, path, function(sliderTexture) {
+						this.sliderTexture = sliderTexture;
+						onTexturesLoaded(compressedTexture, uncompressedTexture, shader, tgCompressed, tgUncompressed, tgComparison);
+					}, false);
 				}, false, true);
 			}, false);
 		};
 	}
 
 	override function onRebuild() {
-		if ( scene != null )
+		if ( scene != null ) {
 			scene.dispose();
+			scene = null;
+		}
 		super.onRebuild();
 	}
 
@@ -173,8 +168,7 @@ class Image extends FileView {
 		bmp.y = -Std.int(bmp.tile.height * bmp.scaleY) >> 1;
 	}
 
-	public function onTexturesLoaded(compressedTexture: Null<h3d.mat.Texture>, uncompressedTexture: Null<h3d.mat.Texture>) {
-		var shader = new ImageViewerShader();
+	public function onTexturesLoaded(compressedTexture: Null<h3d.mat.Texture>, uncompressedTexture: Null<h3d.mat.Texture>, shader : ImageViewerShader, tgCompressed : hide.comp.Toolbar.ToolToggle, tgUncompressed : hide.comp.Toolbar.ToolToggle, tgComparison : hide.comp.Toolbar.ToolToggle) {
 		for( i in 0...4 ) {
 			var name = "RGBA".charAt(i);
 			tools.addToggle("", "Channel "+name, name, function(b) {
@@ -183,6 +177,10 @@ class Image extends FileView {
 			});
 		}
 
+		tgCompressed.toggle(this.viewMode.match(Compressed));
+		tgUncompressed.toggle(this.viewMode.match(Uncompressed));
+		tgComparison.toggle(this.viewMode.match(Comparison));
+
 		if( !compressedTexture.flags.has(Cube) ) {
 			bmp = new h2d.Bitmap(h2d.Tile.fromTexture(compressedTexture), scene.s2d);
 			bmp.addShader(shader);
@@ -222,31 +220,57 @@ class Image extends FileView {
 			tools.addRange("Exposure", function(f) shader.exposure = f, 0, -10, 10);
 		}
 
-		var switch (this.viewMode) {
+		applyShaderConfiguration(shader);
+		onResize();
+	}
+
+	public function applyShaderConfiguration(shader : ImageViewerShader) {
+		switch (this.viewMode) {
 			case  Compressed:
-				shader.comparisonFactor = 1;
+				{
+					shader.comparisonFactor = 1;
+
+					if (interactive != null)
+						interactive.remove();
+
+					if (sliderBmp != null)
+						sliderBmp.alpha = 0;
+				}
 
 			case Uncompressed:
-				shader.comparisonFactor = 0;
+				{
+					shader.comparisonFactor = 0;
+
+					if (interactive != null)
+						interactive.remove();
+
+					if (sliderBmp != null)
+						sliderBmp.alpha = 0;
+				}
 
 			case Comparison:
 				{
-					var path = hide.Ide.inst.appPath + "/res/slider.png";
-					var data = sys.io.File.getBytes(path);
-					var tex = hxd.res.Any.fromBytes(path, data).toTexture();
-					var sliderBmp = new h2d.Bitmap(h2d.Tile.fromTexture(tex), bmp);
+					if (sliderBmp == null)
+						sliderBmp = new h2d.Bitmap(h2d.Tile.fromTexture(sliderTexture), bmp);
+					else 
+						sliderBmp.alpha = 1;
+
 					bmp.addChild(sliderBmp);
 					sliderBmp.height = bmp.tile.height;
 			
 					var bounds = new h2d.col.Bounds();
 					sliderBmp.getSize(bounds);
 			
-					var interactive = new h2d.Interactive(bmp.tile.width,bmp.tile.height,bmp);
+					if (interactive != null)
+						interactive.remove();
+
+					interactive = new h2d.Interactive(bmp.tile.width,bmp.tile.height,bmp);
 					interactive.propagateEvents = true;
 					interactive.x = bmp.tile.dx;
 					interactive.y = bmp.tile.dy;
 			
 					sliderBmp.x = bmp.tile.width / 2.0 - bounds.width / 2.0;
+					shader.comparisonFactor = 0.5;
 					var clicked = false;
 			
 					function updateSlider(e: hxd.Event) {
@@ -274,8 +298,16 @@ class Image extends FileView {
 				default:
 					trace("Not implemented yet");
 		}
+	}
 
-		onResize();
+	public function cleanUp() {
+		if (scene != null)
+			scene.dispose();
+
+		sliderBmp = null;
+		bmp = null;
+		interactive = null;
+		sliderTexture = null;
 	}
 
 	static var _ = FileTree.registerExtension(Image,hide.Ide.IMG_EXTS.concat(["envd","envs"]),{ icon : "picture-o" });