Browse Source

- add lock feature
- fix spraymesh bug relative to interactive creation

ChuckAtShiro 6 years ago
parent
commit
df2c51a59a
5 changed files with 175 additions and 61 deletions
  1. 17 4
      bin/style.css
  2. 17 0
      bin/style.less
  3. 83 7
      hide/comp/SceneEditor.hx
  4. 8 2
      hide/view/l3d/Level3D.hx
  5. 50 48
      hrt/prefab/l3d/MeshSpray.hx

+ 17 - 4
bin/style.css

@@ -1205,8 +1205,8 @@ input[type=checkbox]:checked:after {
   box-shadow: 0px 0px 34px -9px black;
 }
 .graph-view #add-menu #results div.group:hover {
-  background: #474747!important;
-  color: #dadada!important;
+  background: #474747 !important;
+  color: #dadada !important;
   box-shadow: none;
 }
 .graph-view #add-menu #results div > span:first-child {
@@ -1254,8 +1254,8 @@ input[type=checkbox]:checked:after {
   box-shadow: 0px 0px 34px -9px black;
 }
 .graph-view #context-menu #options div.group:hover {
-  background: #474747!important;
-  color: #dadada!important;
+  background: #474747 !important;
+  color: #dadada !important;
   box-shadow: none;
 }
 .graph-view #context-menu #options div > span:first-child {
@@ -1546,6 +1546,19 @@ body.hide-subview .lm_controls {
 .visibility-large-toggle {
   font-size: 14px!important;
 }
+.lock-toggle,
+.lock-large-toggle {
+  position: absolute;
+  right: 24px;
+  padding: 4px;
+}
+.locked .lock-toggle i,
+.locked .lock-large-toggle i {
+  color: #555;
+}
+.lock-large-toggle {
+  font-size: 14px!important;
+}
 .jstree.small a {
   font-size: 12px;
 }

+ 17 - 0
bin/style.less

@@ -1748,6 +1748,23 @@ body.hide-subview {
 	font-size: 14px!important;
 }
 
+.lock-toggle, .lock-large-toggle {
+	position: absolute;
+	right: 24px;
+	padding: 4px;
+}
+.locked {
+	.lock-toggle, .lock-large-toggle {
+		i {
+			color: #555;
+		}
+	}
+}
+
+.lock-large-toggle {
+	font-size: 14px!important;
+}
+
 .jstree.small {
 	@size: 18px;
 

+ 83 - 7
hide/comp/SceneEditor.hx

@@ -110,6 +110,7 @@ class SceneEditor {
 	var ide : hide.Ide;
 	public var event(default, null) : hxd.WaitEvent;
 	var hideList : Map<PrefabElement, Bool> = new Map();
+	var lockList : Map<PrefabElement, Bool> = new Map();
 	var favorites : Array<PrefabElement> = [];
 
 	var undo(get, null):hide.ui.UndoHistory;
@@ -204,6 +205,14 @@ class SceneEditor {
 						hideList.set(p, true);
 				}
 			}
+			var list = @:privateAccess view.getDisplayState("lockList");
+			if(list != null) {
+				var m = [for(i in (list:Array<Dynamic>)) i => true];
+				for(p in all) {
+					if(m.exists(p.getAbsPath()))
+						lockList.set(p, true);
+				}
+			}
 			var favList = @:privateAccess view.getDisplayState("favorites");
 			if(favList != null) {
 				for(p in all) {
@@ -379,8 +388,10 @@ class SceneEditor {
 
 			if(current != null && current.to(Object3D) != null && current.to(hrt.prefab.Reference) == null) {
 				var visible = !isHidden(current);
+				var locked = isLocked(current);
 				menuItems = menuItems.concat([
 					{ label : "Visible", checked : visible, click : function() setVisible(curEdit.elements, !visible) },
+					{ label : "Locked", checked : locked, click : function() setLock(curEdit.elements, locked) },
 					{ label : "Select all", click : selectAll },
 					{ label : "Select children", enabled : current != null, click : function() selectObjects(current.flatten()) },
 				]);
@@ -849,7 +860,7 @@ class SceneEditor {
 		applySceneStyle(p);
 	}
 
-	public function applyTreeStyle(p: PrefabElement, el: Element) {
+	public function applyTreeStyle(p: PrefabElement, el: Element) {		
 		var obj3d  = p.to(Object3D);
 		el.toggleClass("disabled", !p.enabled);
 		el.find("a").first().toggleClass("favorite", isFavorite(p));
@@ -857,10 +868,11 @@ class SceneEditor {
 		if(obj3d != null) {
 			el.toggleClass("disabled", !obj3d.visible);
 			el.toggleClass("hidden", isHidden(obj3d));
-			var tog = el.find(".visibility-toggle").first();
-			if(tog.length == 0) {
-				tog = new Element('<i class="fa fa-eye visibility-toggle"/>').insertAfter(el.find("a.jstree-anchor").first());
-				tog.click(function(e) {
+			el.toggleClass("locked", isLocked(obj3d));
+			var visTog = el.find(".visibility-toggle").first();
+			if(visTog.length == 0) {
+				visTog = new Element('<i class="fa fa-eye visibility-toggle"/>').insertAfter(el.find("a.jstree-anchor").first());
+				visTog.click(function(e) {
 					if(curEdit.elements.indexOf(obj3d) >= 0)
 						setVisible(curEdit.elements, isHidden(obj3d));
 					else
@@ -869,12 +881,30 @@ class SceneEditor {
 					e.preventDefault();
 					e.stopPropagation();
 				});
-				tog.dblclick(function(e) {
+				visTog.dblclick(function(e) {
 					e.preventDefault();
 					e.stopPropagation();
 				});
 			}
-		}
+			var lockTog = el.find(".lock-toggle").first();
+			if(lockTog.length == 0) {
+				lockTog = new Element('<i class="fa fa-lock lock-toggle"/>').insertAfter(el.find("a.jstree-anchor").first());
+				lockTog.click(function(e) {
+					if(curEdit.elements.indexOf(obj3d) >= 0)
+						setLock(curEdit.elements, isLocked(obj3d));
+					else
+						setLock([obj3d], isLocked(obj3d));
+
+					e.preventDefault();
+					e.stopPropagation();
+				});
+				lockTog.dblclick(function(e) {
+					e.preventDefault();
+					e.stopPropagation();
+				});
+			}
+			lockTog.css({visibility: (isLocked(obj3d) ? "visible" : "hidden")});
+		} 
 	}
 
 	public function applySceneStyle(p: PrefabElement) {
@@ -887,6 +917,18 @@ class SceneEditor {
 		}
 	}
 
+	public function getInteractives(elt : PrefabElement) {
+		var r = [getInteractive(elt)];
+		for(c in elt.children) {
+			r = r.concat(getInteractives(c));
+		}
+		return r;
+	}
+
+	public function getInteractive(elt: PrefabElement) {
+		return interactives.get(elt);
+	}
+
 	public function getContext(elt : PrefabElement) {
 		if(elt == null) return null;
 		var ctx = null;
@@ -1292,9 +1334,17 @@ class SceneEditor {
 		return hideList.exists(e);
 	}
 
+	public function isLocked(e: PrefabElement) {
+		if(e == null)
+			return false;
+		return lockList.exists(e);
+	}
+
 	function saveDisplayState() {
 		var state = [for (h in hideList.keys()) h.getAbsPath()];
 		@:privateAccess view.saveDisplayState("hideList", state);
+		var state = [for (h in lockList.keys()) h.getAbsPath()];
+		@:privateAccess view.saveDisplayState("lockList", state);
 		var state = [for(f in favorites) f.getAbsPath()];
 		@:privateAccess view.saveDisplayState("favorites", state);
 	}
@@ -1337,6 +1387,32 @@ class SceneEditor {
 		saveDisplayState();
 	}
 
+	public function setLock(elements : Array<PrefabElement>, unlocked: Bool) {
+		for(o in elements) {
+			if(unlocked) {
+				for(c in o.flatten(Object3D)) {
+					lockList.remove(c);
+					var el = tree.getElement(c);
+					applyTreeStyle(c, el);
+					applySceneStyle(c);
+				}
+			}
+			else {
+				lockList.set(o, true);
+				var el = tree.getElement(o);
+				applyTreeStyle(o, el);
+				applySceneStyle(o);
+				for(c in o.flatten(Object3D)) {
+					lockList.set(c, true);
+					var el = tree.getElement(c);
+					applyTreeStyle(c, el);
+					applySceneStyle(c);
+				}
+			}
+		}
+		saveDisplayState();
+	}
+
 	function isolate(elts : Array<PrefabElement>) {
 		var toShow = elts.copy();
 		var toHide = [];

+ 8 - 2
hide/view/l3d/Level3D.hx

@@ -383,6 +383,7 @@ class Level3D extends FileView {
 
 	public function onSceneReady() {
 
+
 		tools.saveDisplayKey = "Level3D/toolbar";
 		tools.addButton("video-camera", "Perspective camera", () -> resetCamera(false));
 		tools.addButton("video-camera", "Top camera", () -> resetCamera(true)).find(".icon").css({transform: "rotateZ(90deg)"});
@@ -693,7 +694,6 @@ class Level3D extends FileView {
 			updateGrid();
 			return;
 		}
-
 		var obj3d = p.to(Object3D);
 		if(obj3d != null) {
 			var visible = obj3d.visible && !sceneEditor.isHidden(obj3d) && sceneFilters.get(p.type) != false;
@@ -705,8 +705,14 @@ class Level3D extends FileView {
 			for(ctx in sceneEditor.getContexts(obj3d)) {
 				ctx.local3d.visible = visible;
 			}
+			var interIsVisible = !sceneEditor.isLocked(obj3d);
+			var inters = sceneEditor.getInteractives(p);
+			for(inter in inters) {
+				if(inter != null) {
+					inter.visible = interIsVisible;
+				}
+			}
 		}
-
 		var color = getDisplayColor(p);
 		if(color != null){
 			color = (color & 0xffffff) | 0xa0000000;

+ 50 - 48
hrt/prefab/l3d/MeshSpray.hx

@@ -56,8 +56,52 @@ class MeshSpray extends Object3D {
 		return childParts[childParts.length - 1].split(".")[0];
 	}
 
-	override function edit( ctx : EditContext ) {
-		sceneEditor = ctx.scene.editor;
+	override function edit( ectx : EditContext ) {
+		sceneEditor = ectx.scene.editor;
+
+
+		var ctx = ectx.getContext(this);
+		var s2d = @:privateAccess ctx.local2d.getScene();
+		interactive = new h2d.Interactive(10000, 10000, s2d);
+		interactive.propagateEvents = true;
+		interactive.cancelEvents = false;
+
+		interactive.onWheel = function(e) {
+
+		};
+
+		interactive.onPush = function(e) {
+			e.propagate = false;
+			sprayEnable = true;
+
+		};
+
+		interactive.onRelease = function(e) {
+			e.propagate = false;
+			sprayEnable = false;
+		};
+
+		interactive.onMove = function(e) {
+			var worldPos = screenToWorld(s2d.mouseX, s2d.mouseY);
+
+			drawCircle(ctx, worldPos.x, worldPos.y, getZ(worldPos.x, worldPos.y), radius, 2, 16711680);
+
+			if( K.isDown( K.MOUSE_LEFT) ) {
+				e.propagate = false;
+
+				if (sprayEnable) {
+
+					if (lastSpray < Date.now().getTime() - 50) {
+						if( K.isDown( K.SHIFT) ) {
+							removeMeshesAround(ctx, worldPos);
+						} else {
+							addMeshesAround(ctx, worldPos);
+						}
+						lastSpray = Date.now().getTime();
+					}
+				}
+			}
+		};
 
 		var props = new hide.Element('<div class="group" name="Meshes"></div>');
 		var selectElement = new hide.Element('<select multiple size="6" style="width: 300px" ></select>').appendTo(props);
@@ -103,7 +147,7 @@ class MeshSpray extends Object3D {
 			}
 		});
 
-		ctx.properties.add(props, this, function(pname) {});
+		ectx.properties.add(props, this, function(pname) {});
 
 		var optionsGroup = new hide.Element('<div class="group" name="Options"><dl></dl></div>');
 		optionsGroup.append(hide.comp.PropsEditor.makePropsList([
@@ -114,57 +158,15 @@ class MeshSpray extends Object3D {
 				{ name: "rotation", t: PFloat(0, 180), def: rotation },
 				{ name: "rotationOffset", t: PFloat(0, 30), def: rotationOffset }
 			]));
-		ctx.properties.add(optionsGroup, this, function(pname) {  });
+		ectx.properties.add(optionsGroup, this, function(pname) {  });
 	}
 
 	override function setSelected( ctx : Context, b : Bool ) {
+
 		if (timerCicle != null) {
 			timerCicle.stop();
 		}
-		if( b ) {
-			var s2d = @:privateAccess ctx.local2d.getScene();
-			interactive = new h2d.Interactive(10000, 10000, s2d);
-			interactive.propagateEvents = true;
-			interactive.cancelEvents = false;
-
-			interactive.onWheel = function(e) {
-
-			};
-
-			interactive.onPush = function(e) {
-				e.propagate = false;
-				sprayEnable = true;
-
-			};
-
-			interactive.onRelease = function(e) {
-				e.propagate = false;
-				sprayEnable = false;
-			};
-
-			interactive.onMove = function(e) {
-				var worldPos = screenToWorld(s2d.mouseX, s2d.mouseY);
-
-				drawCircle(ctx, worldPos.x, worldPos.y, getZ(worldPos.x, worldPos.y), radius, 2, 16711680);
-
-				if( K.isDown( K.MOUSE_LEFT) ) {
-					e.propagate = false;
-
-					if (sprayEnable) {
-
-						if (lastSpray < Date.now().getTime() - 50) {
-							if( K.isDown( K.SHIFT) ) {
-								removeMeshesAround(ctx, worldPos);
-							} else {
-								addMeshesAround(ctx, worldPos);
-							}
-							lastSpray = Date.now().getTime();
-						}
-					}
-				}
-			};
-		}
-		else{
+		if( !b ) {
 			if( interactive != null ) interactive.remove();
 			timerCicle = new haxe.Timer(100);
 			timerCicle.run = function() {