فهرست منبع

set default render props at sceneeditor level, added Make Default for RenderProps
locked behavior at scene editor level and hide gizmo when locked

Nicolas Cannasse 5 سال پیش
والد
کامیت
0fd1574b93
3فایلهای تغییر یافته به همراه51 افزوده شده و 63 حذف شده
  1. 46 22
      hide/comp/SceneEditor.hx
  2. 0 40
      hide/view/l3d/Level3D.hx
  3. 5 1
      hrt/prefab/RenderProps.hx

+ 46 - 22
hide/comp/SceneEditor.hx

@@ -150,6 +150,7 @@ class SceneEditor {
 
 	public var view(default, null) : hide.view.FileView;
 	var sceneData : PrefabElement;
+	var lastRenderProps : hrt.prefab.RenderProps;
 
 	public function new(view, data, ?chunkifyS3D : Bool = false) {
 		ide = hide.Ide.inst;
@@ -518,7 +519,10 @@ class SceneEditor {
 				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 : "Locked", checked : locked, click : function() {
+						locked = !locked;
+						setLock(curEdit.elements, locked);
+					} },
 					{ label : "Select all", click : selectAll },
 					{ label : "Select children", enabled : current != null, click : function() selectObjects(current.flatten()) },
 				]);
@@ -650,6 +654,20 @@ class SceneEditor {
 		var all = sceneData.flatten(hrt.prefab.Prefab);
 		for(elt in all)
 			applySceneStyle(elt);
+
+		if( lastRenderProps == null ) {
+			var renderProps = sceneData.getAll(hrt.prefab.RenderProps);
+			for( r in renderProps )
+				if( @:privateAccess r.isDefault ) {
+					lastRenderProps = r;
+					break;
+				}
+			if( lastRenderProps == null )
+				lastRenderProps = renderProps[0];
+		}
+		if(lastRenderProps != null)
+			lastRenderProps.applyProps(scene.s3d.renderer);
+
 		onRefresh();
 	}
 
@@ -664,6 +682,16 @@ class SceneEditor {
 		var int = elt.makeInteractive(ctx);
 		if( int == null ) return;
 		initInteractive(elt,cast int);
+		if( isLocked(elt) ) toggleInteractive(elt, false);
+	}
+
+	function toggleInteractive( e : PrefabElement, visible : Bool ) {
+		var int = getInteractive(e);
+		if( int == null ) return;
+		var i2d = Std.downcast(int,h2d.Interactive);
+		var i3d = Std.downcast(int,h3d.scene.Interactive);
+		if( i2d != null ) i2d.visible = visible;
+		if( i3d != null ) i3d.visible = visible;
 	}
 
 	function initInteractive( elt : PrefabElement, int : {
@@ -744,7 +772,7 @@ class SceneEditor {
 		}
 		int.onMove = function(e) {
 			if(startDrag != null && hxd.Math.distance(startDrag[0] - scene.s2d.mouseX, startDrag[1] - scene.s2d.mouseY) > 5 ) {
-				if(dragBtn == K.MOUSE_LEFT) {
+				if(dragBtn == K.MOUSE_LEFT ) {
 					if( i3d != null ) {
 						moveGizmoToSelection();
 						gizmo.startMove(MoveXY);
@@ -757,19 +785,6 @@ class SceneEditor {
 				int.preventClick();
 				startDrag = null;
 			}
-			/*
-			if( curDrag != null ) {
-				var dx = scene.s2d.mouseX - curDrag[0];
-				var dy = scene.s2d.mouseY - curDrag[1];
-				var obj = getContext(elt).local2d;
-				obj.x += Math.round(dx / context.shared.root2d.scaleX);
-				obj.y += Math.round(dy / context.shared.root2d.scaleY);
-				var o2d = Std.instance(elt,hrt.prefab.Object2D);
-				o2d.x = obj.x;
-				o2d.y = obj.y;
-				curDrag[0] += dx;
-				curDrag[1] += dy;
-			}*/
 		}
 		interactives.set(elt,cast int);
 	}
@@ -1176,9 +1191,9 @@ class SceneEditor {
 				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));
+						setLock(curEdit.elements, !isLocked(obj3d));
 					else
-						setLock([obj3d], isLocked(obj3d));
+						setLock([obj3d], !isLocked(obj3d));
 
 					e.preventDefault();
 					e.stopPropagation();
@@ -1383,7 +1398,6 @@ class SceneEditor {
 	}
 
 	function setObjectSelected( p : PrefabElement, ctx : hrt.prefab.Context, b : Bool ) {
-		showGizmo = true;
 		return p.setSelected(ctx, b);
 	}
 
@@ -1428,6 +1442,12 @@ class SceneEditor {
 			});
 
 			curEdit = edit;
+			showGizmo = false;
+			for( e in elts )
+				if( !isLocked(e) ) {
+					showGizmo = true;
+					break;
+				}
 			setupGizmo();
 		}
 
@@ -1756,19 +1776,23 @@ class SceneEditor {
 		saveDisplayState();
 	}
 
-	public function setLock(elements : Array<PrefabElement>, unlocked: Bool) {
+	function setLock(elements : Array<PrefabElement>, locked: Bool) {
 		for(o in elements) {
 			for(c in o.flatten(Object3D) ) {
-				if( unlocked )
-					lockList.remove(c);
-				else
+				if( locked )
 					lockList.set(c, true);
+				else
+					lockList.remove(c);
 				var el = tree.getElement(c);
 				applyTreeStyle(c, el);
 				applySceneStyle(c);
 			}
 		}
 		saveDisplayState();
+		showGizmo = !locked;
+		moveGizmoToSelection();
+		for( e in elements )
+			toggleInteractive(e,!locked);
 	}
 
 	function isolate(elts : Array<PrefabElement>) {

+ 0 - 40
hide/view/l3d/Level3D.hx

@@ -107,11 +107,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		super.refresh(mode, callback);
 	}
 
-	override function refreshScene() {
-		super.refreshScene();
-		parent.onRefreshScene();
-	}
-
 	override function update(dt) {
 		super.update(dt);
 		parent.onUpdate(dt);
@@ -136,11 +131,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		parent.onPrefabChange(p, pname);
 	}
 
-	override function selectObjects(elts:Array<PrefabElement>, ?mode ) {
-		super.selectObjects(elts, mode);
-		parent.onSelectObjects(elts);
-	}
-
 	override function projectToGround(ray: h3d.col.Ray) {
 		var polygons = parent.getGroundPolys();
 		var minDist = -1.;
@@ -274,7 +264,6 @@ class Level3D extends FileView {
 	var sceneFilters : Map<String, Bool>;
 	var statusText : h2d.Text;
 	var posToolTip : h2d.Text;
-	var lastRenderProps : hrt.prefab.RenderProps = null;
 
 	var scene(get, null):  hide.comp.Scene;
 	function get_scene() return sceneEditor.scene;
@@ -575,20 +564,6 @@ class Level3D extends FileView {
 	function onRefresh() {
 	}
 
-	function onRefreshScene() {
-		if(lastRenderProps != null) {
-			lastRenderProps.applyProps(scene.s3d.renderer);
-		}
-		else {
-			// Apply first render props (either defaults or first found)
-			var renderProps = data.getOpt(hrt.prefab.RenderProps, "defaults");
-			if( renderProps == null )
-				renderProps = data.getOpt(hrt.prefab.RenderProps);
-			if( renderProps != null )
-				renderProps.applyProps(scene.s3d.renderer);
-		}
-	}
-
 	override function onDragDrop(items : Array<String>, isDrop : Bool) {
 		var supported = ["fbx", "fx", "l3d", "prefab"];
 		var paths = [];
@@ -671,12 +646,6 @@ class Level3D extends FileView {
 
 	}
 
-	function onSelectObjects(elts: Array<PrefabElement>) {
-		var renderProps = Std.downcast(elts.find(e -> Std.is(e, hrt.prefab.RenderProps)), hrt.prefab.RenderProps);
-		if(renderProps != null)
-			lastRenderProps = renderProps;
-	}
-
 	function applySceneStyle(p: PrefabElement) {
 		var level3d = Std.downcast(p, hrt.prefab.l3d.Level3D); // don't use "to" (Reference)
 		if(level3d != null) {
@@ -694,15 +663,6 @@ 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) {
-					var i3d = Std.downcast(inter,h3d.scene.Interactive);
-					if( i3d != null )
-						i3d.visible = interIsVisible;
-				}
-			}
 		}
 		var color = getDisplayColor(p);
 		if(color != null){

+ 5 - 1
hrt/prefab/RenderProps.hx

@@ -2,6 +2,8 @@ package hrt.prefab;
 
 class RenderProps extends Prefab {
 
+	var isDefault = false;
+
 	public function new(?parent) {
 		super(parent);
 		type = "renderProps";
@@ -9,10 +11,11 @@ class RenderProps extends Prefab {
 	}
 
 	override function load(o:Dynamic) {
+		isDefault = o.isDefault;
 	}
 
 	override function save() {
-		return {};
+		return { isDefault : isDefault };
 	}
 
 	public function getProps(renderer: h3d.scene.Renderer) {
@@ -91,6 +94,7 @@ class RenderProps extends Prefab {
 			}
 			applyProps(renderer);
 		});
+		ctx.properties.add(new Element('<dl><dt>Make Default</dt><dd><input type="checkbox" field="isDefault"/></dd></dl>'), this);
 		applyProps(renderer);
 	}