瀏覽代碼

add UV checker view mode

lviguier 1 年之前
父節點
當前提交
cbc545e68e
共有 4 個文件被更改,包括 127 次插入85 次删除
  1. 67 25
      hide/comp/SceneEditor.hx
  2. 49 49
      hide/view/FXEditor.hx
  3. 10 10
      hide/view/Model.hx
  4. 1 1
      hide/view/Prefab.hx

+ 67 - 25
hide/comp/SceneEditor.hx

@@ -203,13 +203,24 @@ class ViewModePopup extends hide.comp.Popup {
 				display: Performance,
 				debug: Normal
 			}
+		},
+		{
+			name : "UVChecker",
+			inf : {
+				display : Pbr,
+				debug : Normal
+			},
 		}
 	];
 	var renderer:h3d.scene.pbr.Renderer;
+	var editor : SceneEditor;
+	var isUvChecker = false;
 
-	public function new(?parent:Element, ?root:Element, engineRenderer:h3d.scene.pbr.Renderer) {
+	public function new(?parent:Element, ?root:Element, engineRenderer:h3d.scene.pbr.Renderer, editor: SceneEditor) {
 		super(parent, root);
 		this.renderer = engineRenderer;
+		this.editor = editor;
+		this.saveDisplayKey = "ViewModePopup";
 		popup.addClass("settings-popup");
 		popup.css("max-width", "300px");
 
@@ -218,34 +229,65 @@ class ViewModePopup extends hide.comp.Popup {
 
 		var form_div = new Element("<div>").addClass("form-grid").appendTo(popup);
 
-		{
-			var initDone = false;
-			{
+		var slides = @:privateAccess renderer.slides;
+		for (v in viewFilter) {
+			var typeid = v.name;
 
-				var slides = @:privateAccess renderer.slides;
-				for (v in viewFilter) {
-					var typeid = v.name;
-					var on = renderer.displayMode == v.inf.display && (renderer.displayMode == Debug ? slides.shader.mode == v.inf.debug : true);
-					var input = new Element('<input type="radio" name="filter" id="$typeid" value="$typeid"/>');
-					if (on)
-						input.get(0).toggleAttribute("checked", true);
-
-					input.change((e) -> {
-						var slides = @:privateAccess renderer.slides;
-						if (slides == null)
-							return;
-						renderer.displayMode = v.inf.display;
-						if (renderer.displayMode == Debug) {
-							slides.shader.mode = v.inf.debug;
-						}
-					});
+			var currMode = this.getDisplayState("ViewMode");
 
-					form_div.append(input);
-					form_div.append(new Element('<label for="$typeid" class="left">$typeid</label>'));
-				}
+			var input = new Element('<input type="radio" name="filter" id="$typeid" value="$typeid"/>');
+			if (currMode == v.name || (currMode == null && v.name == "LIT")) {
+				input.get(0).toggleAttribute("checked", true);
+				this.saveDisplayState("ViewMode", v.name);
+				this.applyViewMode(input, v);
 			}
+
+			input.change((e) -> {
+				this.applyViewMode(input, v);
+			});
+
+			form_div.append(input);
+			form_div.append(new Element('<label for="$typeid" class="left">$typeid</label>'));
 		}
 	}
+
+	public function applyViewMode(input: Element, v: Dynamic) {
+		var slides = @:privateAccess renderer.slides;
+			if (slides == null)
+				return;
+
+			if (input.is(':checked')) {
+				this.saveDisplayState("ViewMode", v.name);
+			}
+
+			renderer.displayMode = v.inf.display;
+			if (renderer.displayMode == Debug) {
+				slides.shader.mode = v.inf.debug;
+			}
+
+			function checkUV(obj: Object, addShader = true) {
+				for (mat in obj.getMaterials()) {
+					if (mat.mainPass.getShader(h3d.shader.Texture) != null) {
+
+						if (addShader) {
+							if (mat.mainPass.getShader(h3d.shader.Checker) == null)
+								mat.mainPass.addShader(new h3d.shader.Checker());
+						}
+						else {
+							var s = mat.mainPass.getShader(h3d.shader.Checker);
+							if (s != null)
+								mat.mainPass.removeShader(s);
+						}
+					}
+				}
+
+				for (idx in 0...obj.numChildren)
+					checkUV(obj.getChildAt(idx), addShader);
+			}
+
+			var isUvChecker = v.name == "UVChecker" && input.is(":checked");
+			@:privateAccess checkUV(editor.context.local3d, isUvChecker);
+	}
 }
 
 class SnapSettingsPopup extends Popup {
@@ -1911,7 +1953,7 @@ class SceneEditor {
 			var el = tree.getElement(p);
 			if( el != null && el.toggleClass != null ) applyTreeStyle(p, el, pname);
 		}
-		
+
 		applySceneStyle(p);
 	}
 

+ 49 - 49
hide/view/FXEditor.hx

@@ -16,7 +16,7 @@ typedef PropTrackDef = {
 typedef Section = {
 	root: PrefabElement,
 	curves: Array<Curve>,
-	children: Array<Section>, 
+	children: Array<Section>,
 	events: Array<IEvent>
 };
 
@@ -409,7 +409,7 @@ class FXEditor extends FileView {
 		treePanel.saveDisplayKey = "treeColumn";
 		treePanel.onResize = () -> @:privateAccess if( scene.window != null) scene.window.checkResize();
 
-		var fxPanel = element.find(".fx-animpanel").first(); 
+		var fxPanel = element.find(".fx-animpanel").first();
 		animPanel = new hide.comp.ResizablePanel(Vertical, fxPanel);
 		animPanel.saveDisplayKey = "animPanel";
 		animPanel.onResize = () -> @:privateAccess { if( scene.window != null) scene.window.checkResize(); if( this.curveEditor != null) this.curveEditor.refresh();}
@@ -579,10 +579,10 @@ class FXEditor extends FileView {
 
 		tools.addSeparator();
 
-		tools.addPopup(null, "View Modes", (e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer)), null);
-		
+		tools.addPopup(null, "View Modes", (e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer), sceneEditor), null);
+
 		tools.addSeparator();
-		
+
 		tools.addPopup(null, "Render Props", (e) -> new hide.comp.SceneEditor.RenderPropsPopup(null, e, sceneEditor, true), null);
 
 		tools.addSeparator();
@@ -632,7 +632,7 @@ class FXEditor extends FileView {
 				var toRemove: Array<Curve> = [];
 				for (child in curve.children) {
 					var c = Std.downcast(child, Curve);
-					if (c != null) 
+					if (c != null)
 						toRemove.push(c);
 				}
 
@@ -640,14 +640,14 @@ class FXEditor extends FileView {
 					var c = toRemove.pop();
 					c.removeInstance(sceneEditor.context);
 					c.parent.children.remove(c);
-				}	
+				}
 			}
 
 			if (curve != null) {
-				if (curve.blendMode == CurveBlendMode.Blend || curve.blendMode == CurveBlendMode.RandomBlend) {	
+				if (curve.blendMode == CurveBlendMode.Blend || curve.blendMode == CurveBlendMode.RandomBlend) {
 					if (curve.children.length != 2) {
 						removeCurves();
-						
+
 						// We're currently supporting blending with only 2 curves
 						for (i in 0...2) {
 							var c = new Curve();
@@ -657,8 +657,8 @@ class FXEditor extends FileView {
 					}
 				}
 				else {
-					removeCurves();				
-				}				
+					removeCurves();
+				}
 			}
 
 			sceneEditor.refresh();
@@ -678,7 +678,7 @@ class FXEditor extends FileView {
 			if (this.curveEditor != null)
 				this.curveEditor.refreshGraph();
 		}
-		
+
 	}
 
 	function onRefreshScene() {
@@ -716,14 +716,14 @@ class FXEditor extends FileView {
 		var previousTime = 0.0;
 		if (this.curveEditor != null)
 			previousTime = @:privateAccess this.curveEditor.currentTime;
-		
+
 		this.curveEditor = new hide.comp.CurveEditor(this.undo, rightPanel);
 
 		var overviewEditor = new hide.comp.CurveEditor.OverviewEditor(rightPanel, this.curveEditor);
 		var eventEditor = new hide.comp.CurveEditor.EventsEditor(rightPanel, this, this.curveEditor);
 		for (e in events)
 			eventEditor.events.push(e);
-		
+
 		var minHeight = 40;
 		var curveEditorHeight = 100;
 		var ctx = sceneEditor.getContext(data);
@@ -732,18 +732,18 @@ class FXEditor extends FileView {
 			var dispKey = getPath() + "/" + curve.getAbsPath(true);
 			curve.maxTime = data.duration == 0 ? 5000 : data.duration;
 			this.curveEditor.saveDisplayKey = dispKey;
-	
+
 			this.curveEditor.requestXZoom = function(xMin, xMax) {
 				var margin = 10.0;
 				var scroll = element.find(".timeline-scroll");
 				var width = scroll.parent().width();
 				xScale = (width - margin * 2.0) / (xMax);
 				xOffset = 0.0;
-	
+
 				this.curveEditor.xOffset = xOffset;
 				this.curveEditor.xScale = xScale;
 			}
-	
+
 			if(["visibility", "s", "l", "a"].indexOf(curve.name.split(".").pop()) >= 0) {
 				curve.minValue = 0;
 				curve.maxValue = 1;
@@ -776,7 +776,7 @@ class FXEditor extends FileView {
 				this.curveEditor.onChange = function(anim) {
 					//refreshDopesheet();
 				}
-	
+
 				rightPanel.on("mousewheel", function(e) {
 				var step = e.originalEvent.wheelDelta > 0 ? 1.0 : -1.0;
 				if(e.ctrlKey) {
@@ -789,13 +789,13 @@ class FXEditor extends FileView {
 					e.preventDefault();
 					e.stopPropagation();
 				}
-			});	
+			});
 		}
-		
+
 		this.curveEditor.refreshTimeline(previousTime);
 		this.curveEditor.refresh();
 	}
-	
+
 	function addHeadersToCurveEditor(sections: Array<Section>) {
 		var savedFoldList : Array<String> = getDisplayState("foldList") != null ? getDisplayState("foldList") : [];
 		var toFoldList : Array<{ el: Element, parentEl: Element }> = [];
@@ -807,7 +807,7 @@ class FXEditor extends FileView {
 		var toHiddenList : Array<{ parentEl: Element, elements: Array<Dynamic> }> = [];
 
 		var leftPanel = element.find(".left-fx-animpanel").first();
-		
+
 		function drawSection(parent : Element, section: Section, depth: Int) {
 
 			function getTagRec(elt : PrefabElement) {
@@ -851,7 +851,7 @@ class FXEditor extends FileView {
 					var visible = visibilityEl.first().hasClass("ico-eye");
 					if (visible) {
 						visibilityEl.removeClass("ico-eye").addClass("ico-eye-slash");
-						
+
 						savedHiddenList = savedHiddenList.filter(hidden -> !StringTools.contains(hidden, saveKey));
 						savedHiddenList.push(saveKey);
 					}
@@ -859,12 +859,12 @@ class FXEditor extends FileView {
 						visibilityEl.removeClass("ico-eye-slash").addClass("ico-eye");
 						savedHiddenList = savedHiddenList.filter(hidden -> !StringTools.contains(saveKey, hidden));
 					}
-	
+
 					saveDisplayState("hiddenList", savedHiddenList);
 
 					for (c in affectedElements)
 						c.hidden = visibilityEl.hasClass("ico-eye-slash");
-	
+
 					rebuildAnimPanel();
 				});
 			}
@@ -881,7 +881,7 @@ class FXEditor extends FileView {
 					// the html tree might not be fully constructed
 					lockEl = parentEl.find(".lock");
 					var locked = lockEl.first().hasClass("ico-lock");
-					
+
 					if (locked) {
 						lockEl.removeClass("ico-lock").addClass("ico-unlock");
 
@@ -909,7 +909,7 @@ class FXEditor extends FileView {
 
 					for (c in this.curveEditor.curves)
 						c.selected = false;
-					
+
 					for (c in affectedElements)
 						c.selected = true;
 
@@ -922,14 +922,14 @@ class FXEditor extends FileView {
 
 				if (savedFoldList.contains(section.root.getAbsPath(true)))
 					toFoldList.push( {el:foldEl, parentEl: parentEl} );
-			
+
 				foldEl.click(function(e) {
 					var expanded = foldEl.hasClass("ico-angle-down");
 					if (expanded) {
 						foldEl.removeClass("ico-angle-down").addClass("ico-angle-right");
 						parentEl.children().find(".tracks-header").addClass("hidden");
 						parentEl.children().find(".track-header").addClass("hidden");
-						
+
 						if (!savedFoldList.contains(section.root.getAbsPath(true)))
 							savedFoldList.push(section.root.getAbsPath(true));
 					}
@@ -953,7 +953,7 @@ class FXEditor extends FileView {
 				if(parentTag != null) {
 					parentEl.find(".name").css("background", parentTag.color);
 				}
-	
+
 				addTrackEl.click(function(e) {
 					var menuItems = getNewTrackMenu(secRoot);
 					new hide.comp.ContextMenu(menuItems);
@@ -962,7 +962,7 @@ class FXEditor extends FileView {
 
 			var allElements: Array<Dynamic> = [];
 			var curves = section.root.flatten(Curve);
-			for (c in curves) 
+			for (c in curves)
 				allElements.push(c);
 
 			if (section.root is Curve) {
@@ -984,7 +984,7 @@ class FXEditor extends FileView {
 				events.push(cast section.root);
 				allElements.push(cast section.root);
 			}
-			
+
 			var sectionEl = new Element('<div class="section" name="${section.root.name}">
 			<div class="tracks-header" style="margin-left: ${depth * 10}px">
 			<div class="track-button fold ico ico-angle-down"></div>
@@ -1002,7 +1002,7 @@ class FXEditor extends FileView {
 			addOnSelectListener(sectionEl, allElements);
 			addFoldButtonListener(sectionEl);
 			addAddTrackButtonListener(sectionEl, section.root);
-			
+
 			if (section.curves.length > 0) {
 				for (i in 0...section.curves.length) {
 					var c = section.curves[i];
@@ -1012,7 +1012,7 @@ class FXEditor extends FileView {
 					if (StringTools.contains(c.name, ".y") || StringTools.contains(c.name, ".s")) curveColor = hide.comp.CurveEditor.CURVE_COLORS[1];
 					if (StringTools.contains(c.name, ".z") || StringTools.contains(c.name, ".l")) curveColor = hide.comp.CurveEditor.CURVE_COLORS[2];
 					if (StringTools.contains(c.name, ".w") || StringTools.contains(c.name, ".a")) curveColor = hide.comp.CurveEditor.CURVE_COLORS[3];
-					
+
 					// Assign same color to curve and curve's header
 					c.color = curveColor;
 					var hexColor = '#${StringTools.hex(curveColor)}';
@@ -1027,7 +1027,7 @@ class FXEditor extends FileView {
 						</div>
 						<div class="tracks"></div>
 					</div>');
-					
+
 					sectionEl.append(trackEl);
 
 					addVisibilityButtonListener(trackEl, [ c ]);
@@ -1053,7 +1053,7 @@ class FXEditor extends FileView {
 						</div>
 						<div class="tracks"></div>
 					</div>');
-					
+
 					sectionEl.append(trackEl);
 
 					addVisibilityButtonListener(trackEl, [ e ]);
@@ -1081,9 +1081,9 @@ class FXEditor extends FileView {
 						</div>
 						<div class="tracks"></div>
 					</div>');
-						
+
 					sectionEl.append(trackEl);
-	
+
 					addVisibilityButtonListener(trackEl, curves);
 					addLockButtonListener(trackEl, curves);
 					addOnSelectListener(trackEl, curves);
@@ -1104,7 +1104,7 @@ class FXEditor extends FileView {
 					</div>
 					<div class="tracks"></div>
 				</div>');
-				
+
 				sectionEl.append(trackEl);
 
 				addVisibilityButtonListener(trackEl, [ e ]);
@@ -1115,10 +1115,10 @@ class FXEditor extends FileView {
 
 			for (child in section.children)
 				drawSection(sectionEl, child, depth + 1);
-				
+
 			parent.append(sectionEl);
 		}
-		
+
 		for (sec in sections)
 			drawSection(leftPanel, sec, 0);
 
@@ -1162,7 +1162,7 @@ class FXEditor extends FileView {
 		var curvesToDraw : Array<Curve> = [];
 		var eventsToDraw : Array<IEvent> = [];
 
-		function getSection(?root : PrefabElement, depth = 0): Section {		
+		function getSection(?root : PrefabElement, depth = 0): Section {
 			var section: Section = { root:root, curves: [], children: [], events: []};
 			var eventAdded = false;
 
@@ -1177,8 +1177,8 @@ class FXEditor extends FileView {
 					if (child is Curve) {
 						var c = Std.downcast(child, Curve);
 						curvesToDraw.push(c);
-						
-						if (c.blendMode == CurveBlendMode.Blend || c.blendMode == CurveBlendMode.RandomBlend) 
+
+						if (c.blendMode == CurveBlendMode.Blend || c.blendMode == CurveBlendMode.RandomBlend)
 							section.children.push(getSection(c,depth+1));
 						else
 							section.curves.push(c);
@@ -1203,12 +1203,12 @@ class FXEditor extends FileView {
 						eventsToDraw.push(s);
 					}
 				}
-			
+
 			}
-			
+
 			return section;
 		}
-		
+
 		var sections : Array<Section> = [];
 		for (sel in selection) {
 			sections.push(getSection(sel));
@@ -1789,12 +1789,12 @@ class FXEditor extends FileView {
 	static var _ = FileTree.registerExtension(FXEditor, ["fx"], { icon : "sitemap", createNew : "FX" });
 
 	function set_currentTime(value:Float):Float {
-		if (this.curveEditor != null) 
+		if (this.curveEditor != null)
 			@:privateAccess this.curveEditor.currentTime = value;
 
 		return this.currentTime = value;
 	}
-	
+
 	function get_currentTime():Float {
 		return @:privateAccess this.curveEditor.currentTime;
 	}

+ 10 - 10
hide/view/Model.hx

@@ -148,7 +148,7 @@ class Model extends FileView {
 			var toSave = root.children[0];
 			@:privateAccess toSave.save();
 
-			save();			
+			save();
 		});
 	}
 
@@ -539,18 +539,18 @@ class Model extends FileView {
 
 		// Remove current instancied render props
 		sceneEditor.context.local3d.removeChildren();
-		
+
 		// Remove current library to create a new one with the actual render prop
 		root = new hrt.prefab.Library();
 		for (c in @:privateAccess sceneEditor.sceneData.children)
 			@:privateAccess sceneEditor.sceneData.children.remove(c);
-		
+
 
 		@:privateAccess sceneEditor.createRenderProps(@:privateAccess sceneEditor.sceneData);
 
 		if (sceneEditor.renderPropsRoot != null && sceneEditor.renderPropsRoot.source != null)
 			root.children.push(sceneEditor.renderPropsRoot);
-		
+
 		// Create default render props if no render props has been created yet
 		var r = root.getOpt(hrt.prefab.RenderProps, true);
 		if( r == null) {
@@ -584,13 +584,13 @@ class Model extends FileView {
 			if( renderProps != null )
 				renderProps.applyProps(scene.s3d.renderer);
 		}
-		
+
 		plight = root.getAll(hrt.prefab.Light)[0];
 		if( plight != null ) {
 			this.light = sceneEditor.context.shared.contexts.get(plight).local3d;
 			lightDirection = this.light.getLocalDirection();
 		}
-		
+
 		undo.onChange = function() {};
 
 		if (obj != null)
@@ -685,7 +685,7 @@ class Model extends FileView {
 
 		tools.addSeparator();
 
-		tools.addPopup(null, "View Modes", (e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer)), null);
+		tools.addPopup(null, "View Modes", (e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer), sceneEditor), null);
 
 		tools.addSeparator();
 
@@ -725,10 +725,10 @@ class Model extends FileView {
 		if (sceneEditor.view.getDisplayState("Camera") == null) {
 			var bnds = new h3d.col.Bounds();
 			var centroid = new h3d.Vector();
-	
+
 			centroid = centroid.add(this.obj.getAbsPos().getPosition());
 			bnds.add(this.obj.getBounds());
-			
+
 			var s = bnds.toSphere();
 			var r = s.r * 4.0;
 			sceneEditor.cameraController.set(r, null, null, s.getCenter());
@@ -792,7 +792,7 @@ class Model extends FileView {
 		];
 		return menu.concat(arr);
 	}
-	
+
 	function setAnimation( file : String ) {
 
 		scene.setCurrent();

+ 1 - 1
hide/view/Prefab.hx

@@ -469,7 +469,7 @@ class Prefab extends FileView {
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
 
-		toolsDefs.push({id: "viewModes", title: "View Modes", type: Popup((e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer)))});
+		toolsDefs.push({id: "viewModes", title: "View Modes", type: Popup((e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer), sceneEditor))});
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});