Browse Source

fix uv checker view mode for fbx object

lviguier 1 year ago
parent
commit
5320bc5f2d
1 changed files with 37 additions and 12 deletions
  1. 37 12
      hide/comp/SceneEditor.hx

+ 37 - 12
hide/comp/SceneEditor.hx

@@ -214,13 +214,12 @@ class ViewModePopup extends hide.comp.Popup {
 	];
 	];
 	var renderer:h3d.scene.pbr.Renderer;
 	var renderer:h3d.scene.pbr.Renderer;
 	var editor : SceneEditor;
 	var editor : SceneEditor;
-	var isUvChecker = false;
 
 
 	public function new(?parent:Element, ?root:Element, engineRenderer:h3d.scene.pbr.Renderer, editor: SceneEditor) {
 	public function new(?parent:Element, ?root:Element, engineRenderer:h3d.scene.pbr.Renderer, editor: SceneEditor) {
 		super(parent, root);
 		super(parent, root);
 		this.renderer = engineRenderer;
 		this.renderer = engineRenderer;
 		this.editor = editor;
 		this.editor = editor;
-		this.saveDisplayKey = "ViewModePopup";
+
 		popup.addClass("settings-popup");
 		popup.addClass("settings-popup");
 		popup.css("max-width", "300px");
 		popup.css("max-width", "300px");
 
 
@@ -232,15 +231,14 @@ class ViewModePopup extends hide.comp.Popup {
 		var slides = @:privateAccess renderer.slides;
 		var slides = @:privateAccess renderer.slides;
 		for (v in viewFilter) {
 		for (v in viewFilter) {
 			var typeid = v.name;
 			var typeid = v.name;
+			var on = renderer.displayMode == v.inf.display && (renderer.displayMode == Debug ? slides.shader.mode == v.inf.debug : true && v.name != "UVChecker");
 
 
-			var currMode = this.getDisplayState("ViewMode");
+			if (v.name == "UVChecker" && isUvChecker())
+				on = true;
 
 
 			var input = new Element('<input type="radio" name="filter" id="$typeid" value="$typeid"/>');
 			var input = new Element('<input type="radio" name="filter" id="$typeid" value="$typeid"/>');
-			if (currMode == v.name || (currMode == null && v.name == "LIT")) {
+			if (on)
 				input.get(0).toggleAttribute("checked", true);
 				input.get(0).toggleAttribute("checked", true);
-				this.saveDisplayState("ViewMode", v.name);
-				this.applyViewMode(input, v);
-			}
 
 
 			input.change((e) -> {
 			input.change((e) -> {
 				this.applyViewMode(input, v);
 				this.applyViewMode(input, v);
@@ -266,10 +264,14 @@ class ViewModePopup extends hide.comp.Popup {
 			}
 			}
 
 
 			function checkUV(obj: Object, addShader = true) {
 			function checkUV(obj: Object, addShader = true) {
-				for (mat in obj.getMaterials()) {
-					if (mat.mainPass.getShader(h3d.shader.Texture) != null) {
-
-						if (addShader) {
+				var mesh = Std.downcast(obj, Mesh);
+
+				if (mesh != null && mesh.primitive.buffer != null &&
+					!mesh.primitive.buffer.isDisposed() &&
+					mesh.primitive.buffer.format != null &&
+					mesh.primitive.buffer.format.getInput("uv") != null) {
+					 for (mat in mesh.getMaterials(null, false)) {
+							if (addShader) {
 							if (mat.mainPass.getShader(h3d.shader.Checker) == null)
 							if (mat.mainPass.getShader(h3d.shader.Checker) == null)
 								mat.mainPass.addShader(new h3d.shader.Checker());
 								mat.mainPass.addShader(new h3d.shader.Checker());
 						}
 						}
@@ -286,7 +288,30 @@ class ViewModePopup extends hide.comp.Popup {
 			}
 			}
 
 
 			var isUvChecker = v.name == "UVChecker" && input.is(":checked");
 			var isUvChecker = v.name == "UVChecker" && input.is(":checked");
-			@:privateAccess checkUV(editor.context.local3d, isUvChecker);
+			@:privateAccess checkUV(editor.scene.s3d, isUvChecker);
+	}
+
+	public function isUvChecker() {
+		function hasCheckUV(obj: Object) {
+				var mesh = Std.downcast(obj, Mesh);
+
+				if (mesh != null && mesh.primitive.buffer != null &&
+					!mesh.primitive.buffer.isDisposed() &&
+					mesh.primitive.buffer.format != null &&
+					mesh.primitive.buffer.format.getInput("uv") != null) {
+					for (mat in mesh.getMaterials(null, false)) {
+						if (mat.mainPass.getShader(h3d.shader.Checker) != null)
+							return true;
+					}
+				}
+
+				for (idx in 0...obj.numChildren)
+					hasCheckUV(obj.getChildAt(idx));
+
+				return false;
+			}
+
+		@:privateAccess return hasCheckUV(editor.scene.s3d);
 	}
 	}
 }
 }