2
0
Эх сурвалжийг харах

Merge pull request #27 from ChuckAtShiro/master

Fix "important" issues and quad-to-poly scaling issue
trethaller 6 жил өмнө
parent
commit
1c041ac86c

+ 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;
 

+ 88 - 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()) },
 				]);
@@ -632,6 +643,15 @@ class SceneEditor {
 		}
 	}
 
+	public function refreshInteractive(elt : PrefabElement) {
+		var int = interactives.get(elt);
+		if(int != null) {
+			int.remove();
+			interactives.remove(elt);
+		}
+		makeInteractive(elt);
+	}
+
 	function refreshInteractives() {
 		var contexts = context.shared.contexts;
 		interactives = new Map();
@@ -851,7 +871,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));
@@ -859,10 +879,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
@@ -871,12 +892,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) {
@@ -889,6 +928,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;
@@ -1294,9 +1345,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);
 	}
@@ -1339,6 +1398,28 @@ 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 {
+				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 - 0
hide/prefab/PolygonEditor.hx

@@ -166,6 +166,10 @@ class PolygonEditor {
 		return editContext.getContext(polygonPrefab);
 	}
 
+	inline function refreshInteractive() {
+		editContext.scene.editor.refreshInteractive(polygonPrefab);
+	}
+
 	public function update( ?propName : String) {
 		if(propName == "showDebug"){
 			for(mp in movablePoints){
@@ -178,6 +182,8 @@ class PolygonEditor {
 		}
 		else if(propName == "editMode") {
 			setSelected(getContext(), true);
+		} else {
+			refreshInteractive();
 		}
 	}
 
@@ -577,6 +583,8 @@ class PolygonEditor {
 			editModeButton.val(editMode ? "Edit Mode : Enabled" : "Edit Mode : Disabled");
 			editModeButton.toggleClass("editModeEnabled", editMode);
 			setSelected(getContext(), true);
+			if(!editMode) 
+				refreshInteractive();
 		});
 
 		props.find(".reset").click(function(_) {

+ 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;

+ 2 - 12
hrt/prefab/Object3D.hx

@@ -104,18 +104,8 @@ class Object3D extends Prefab {
 
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		var o = ctx.local3d;
-		o.x = x;
-		o.y = y;
-		o.z = z;
-		if(propName == null || propName.indexOf("scale") == 0) {
-			o.scaleX = scaleX;
-			o.scaleY = scaleY;
-			o.scaleZ = scaleZ;
-		}
-		if(propName == null || propName.indexOf("rotation") == 0)
-			o.setRotation(Math.degToRad(rotationX), Math.degToRad(rotationY), Math.degToRad(rotationZ));
-		if(propName == null || propName == "visible")
-			o.visible = visible;
+		applyPos(o);
+		o.visible = visible;
 	}
 
 	override function removeInstance(ctx: Context):Bool {

+ 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() {

+ 26 - 7
hrt/prefab/l3d/Polygon.hx

@@ -17,6 +17,7 @@ class Polygon extends Object3D {
 	public var debugColor : Int = 0xFFFFFFFF;
 	public var editor : hide.prefab.PolygonEditor;
 	public var cachedPrim : h3d.prim.Polygon;
+	var prevScale = [1.0, 1.0];
 	#end
 
 	override function save() {
@@ -189,14 +190,20 @@ class Polygon extends Object3D {
 			polyPrim.alloc(h3d.Engine.getCurrent());
 		}
 		#if editor
-		if(cachedPrim != null)
-			cachedPrim.decref();
+		clearCustomPolygonCache();
 		cachedPrim = polyPrim;
 		cachedPrim.incref();
 		#end
 		return polyPrim;
 	}
 
+	public function clearCustomPolygonCache() {
+		if(cachedPrim != null) {
+			cachedPrim.decref();
+			cachedPrim = null;
+		}
+	}
+
 	public function getPrimitive( ctx : Context ) : h3d.prim.Polygon {
 		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 		return Std.downcast(mesh.primitive, h3d.prim.Polygon);
@@ -264,7 +271,8 @@ class Polygon extends Object3D {
 		var updateProps = null;
 
 		ctx.properties.add(group, viewModel, function(pname) {
-			if( pname == "kind" ) {
+			var pIsKind = pname == "kind";
+			if( pIsKind ) {
 				editor.reset();
 
 				if( prevKind != Custom ){
@@ -284,13 +292,23 @@ class Polygon extends Object3D {
 			}
 
 			switch( viewModel.kind ) {
-				case "Quad": shape = Quad;
-				case "Disc": shape = Disc(viewModel.segments, viewModel.angle, viewModel.innerRadius, viewModel.rings);
+				case "Quad": 
+					shape = Quad;
+					if(pIsKind && prevKind == Custom) {
+						scaleX = prevScale[0]; 
+						scaleY = prevScale[1];
+					}
+				case "Disc": 
+					shape = Disc(viewModel.segments, viewModel.angle, viewModel.innerRadius, viewModel.rings);
+					if(pIsKind && prevKind == Custom) {
+						scaleX = prevScale[0]; 
+						scaleY = prevScale[1];
+					}
 				case "Custom":
 					shape = Custom;
-					if(points == null) {
+					if(pIsKind) {
 						if(prevKind == Quad) {
-							var prevScale = [scaleX, scaleY];
+							prevScale = [scaleX, scaleY];
 							function apply() {
 								points = [
 									new Point(-scaleX/2, -scaleY/2),
@@ -309,6 +327,7 @@ class Polygon extends Object3D {
 								else apply();
 								ctx.onChange(this, null);
 							}));
+							clearCustomPolygonCache();
 							apply();
 							ctx.onChange(this, null);
 						}