فهرست منبع

Merge branch 'ft-kill-l3d-oli' into ft-kill-l3d

Jed 4 سال پیش
والد
کامیت
3e738bf249
4فایلهای تغییر یافته به همراه137 افزوده شده و 77 حذف شده
  1. 13 2
      bin/defaultProps.json
  2. 9 8
      hide/comp/SceneEditor.hx
  3. 23 0
      hide/comp/Toolbar.hx
  4. 92 67
      hide/view/l3d/Level3D.hx

+ 13 - 2
bin/defaultProps.json

@@ -74,8 +74,8 @@
 	"key.sceneeditor.selectParent": "Backspace",
 	"key.sceneeditor.selectParent": "Backspace",
 	"key.sceneeditor.reparent": "Ctrl-P",
 	"key.sceneeditor.reparent": "Ctrl-P",
 	"key.sceneeditor.editPivot" : "P",
 	"key.sceneeditor.editPivot" : "P",
-	"key.sceneeditor.toggleLocal": "D",
-	"key.sceneeditor.toggleGrid": "G",
+	"key.sceneeditor.localTransformsToggle": "D",
+	"key.sceneeditor.gridToggle": "G",
 
 
 	// cdb config
 	// cdb config
 	"cdb.databaseFile" : "data.cdb",
 	"cdb.databaseFile" : "data.cdb",
@@ -121,6 +121,17 @@
 	"sceneeditor.icons" : {},
 	"sceneeditor.icons" : {},
 	"sceneeditor.ranges" : {},
 	"sceneeditor.ranges" : {},
 	"sceneeditor.huds" : {},
 	"sceneeditor.huds" : {},
+	"sceneeditor.tools" : ["perspectiveCamera", "topCamera", "snapToGroundToggle", "localTransformsToggle", "gridToggle", "bakeLights", "sceneInformationToggle", "backgroundColor", "autoSyncToggle", "sceneSpeed"],
+	"sceneeditor.perspectiveCamera": {"title" : "Perspective camera", "icon" : "video-camera", "type" : "Button"},
+	"sceneeditor.topCamera": {"title" : "Top camera", "icon" : "video-camera", "iconTransform" : "rotateZ(90deg)", "type" : "Button"},
+	"sceneeditor.snapToGroundToggle": {"title" : "Snap to ground", "icon" : "anchor", "type" : "Toggle"},
+	"sceneeditor.localTransformsToggle": {"title" : "Local transforms", "icon" : "compass", "type" : "Toggle"},
+	"sceneeditor.gridToggle": {"title" : "Toggle grid", "icon" : "th", "type" : "Toggle"},
+	"sceneeditor.bakeLights": {"title" : "Bake lights", "icon" : "lightbulb-o", "type" : "Button"},
+	"sceneeditor.sceneInformationToggle" : {"title" : "Scene information", "icon" : "info-circle", "type" : "Toggle", "customRightClick" : true},
+	"sceneeditor.backgroundColor" : {"title" : "Background Color", "type" : "Color"},
+	"sceneeditor.autoSyncToggle" : {"title" : "Auto synchronize", "icon" : "refresh", "type" : "Toggle"},
+	"sceneeditor.sceneSpeed" : {"title" : "Speed", "type" : "Range"},
 
 
 	// l3d config
 	// l3d config
 	"l3d.groundLayer": "ground",
 	"l3d.groundLayer": "ground",

+ 9 - 8
hide/comp/SceneEditor.hx

@@ -483,9 +483,10 @@ class SceneEditor {
 				{ label : "New...", menu : newItems },
 				{ label : "New...", menu : newItems },
 			];
 			];
 			var actionItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [
 			var actionItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [
-				{ label : "Rename", enabled : current != null, click : function() tree.editNode(current) },
-				{ label : "Delete", enabled : current != null, click : function() deleteElements(curEdit.rootElements) },
-				{ label : "Duplicate", enabled : current != null, click : duplicate.bind(false) },
+				{ label : "Favorite", checked : current != null && isFavorite(current), click : function() setFavorite(current, !isFavorite(current)) },
+				{ label : "Rename" + ((view.config.get("key.rename") != null)? "	" + view.config.get("key.rename") : ""), enabled : current != null, click : function() tree.editNode(current) },
+				{ label : "Delete" + ((view.config.get("key.delete") != null)? "	" + view.config.get("key.delete") : ""), enabled : current != null, click : function() deleteElements(curEdit.rootElements) },
+				{ label : "Duplicate" + ((view.config.get("key.duplicate") != null)? "	" + view.config.get("key.duplicate") : ""), enabled : current != null, click : duplicate.bind(false) },
 			];
 			];
 
 
 			var isObj = current != null && (current.to(Object3D) != null || current.to(Object2D) != null);
 			var isObj = current != null && (current.to(Object3D) != null || current.to(Object2D) != null);
@@ -499,18 +500,18 @@ class SceneEditor {
 			if( isObj ) {
 			if( isObj ) {
 				var visible = !isHidden(current);
 				var visible = !isHidden(current);
 				menuItems = menuItems.concat([
 				menuItems = menuItems.concat([
-					{ label : "Show in editor", checked : visible, click : function() setVisible(curEdit.elements, !visible) },
+					{ label : "Show in editor" + ((view.config.get("key.sceneeditor.hide") != null)? "	" + view.config.get("key.sceneeditor.hide") : ""), checked : visible, click : function() setVisible(curEdit.elements, !visible) },
 					{ label : "Locked", checked : current.locked, click : function() {
 					{ label : "Locked", checked : current.locked, click : function() {
 						current.locked = !current.locked;
 						current.locked = !current.locked;
 						setLock(curEdit.elements, current.locked);
 						setLock(curEdit.elements, current.locked);
 					} },
 					} },
-					{ label : "Select all", click : selectAll },
+					{ label : "Select all" + ((view.config.get("key.selectAll") != null)? "	" + view.config.get("key.selectAll") : ""), click : selectAll },
 					{ label : "Select children", enabled : current != null, click : function() selectElements(current.flatten()) },
 					{ label : "Select children", enabled : current != null, click : function() selectElements(current.flatten()) },
 				]);
 				]);
 				if( !isRef )
 				if( !isRef )
 					actionItems = actionItems.concat([
 					actionItems = actionItems.concat([
-						{ label : "Isolate", click : function() isolate(curEdit.elements) },
-						{ label : "Group", enabled : curEdit != null && canGroupSelection(), click : groupSelection }
+						{ label : "Isolate" + ((view.config.get("key.sceneeditor.isolate") != null)? "	" + view.config.get("key.sceneeditor.isolate") : ""), click : function() isolate(curEdit.elements) },
+						{ label : "Group" + ((view.config.get("key.group") != null)? "	" + view.config.get("key.group") : ""), enabled : curEdit != null && canGroupSelection(), click : groupSelection }
 					]);
 					]);
 			}
 			}
 
 
@@ -1183,7 +1184,7 @@ class SceneEditor {
 
 
 			var visTog = el.find(".visibility-toggle").first();
 			var visTog = el.find(".visibility-toggle").first();
 			if(visTog.length == 0) {
 			if(visTog.length == 0) {
-				visTog = new Element('<i class="fa fa-eye visibility-toggle"/>').insertAfter(el.find("a.jstree-anchor").first());
+				visTog = new Element('<i class="fa fa-eye visibility-toggle" title = "Hide	${view.config.get("key.sceneeditor.hide")}"/>').insertAfter(el.find("a.jstree-anchor").first());
 				visTog.click(function(e) {
 				visTog.click(function(e) {
 					if(curEdit.elements.indexOf(obj3d) >= 0)
 					if(curEdit.elements.indexOf(obj3d) >= 0)
 						setVisible(curEdit.elements, isHidden(obj3d));
 						setVisible(curEdit.elements, isHidden(obj3d));

+ 23 - 0
hide/comp/Toolbar.hx

@@ -13,6 +13,12 @@ typedef ToolSelect<T> = {
 	dynamic function onSelect( v : T ) : Void;
 	dynamic function onSelect( v : T ) : Void;
 }
 }
 
 
+typedef ToolMenu<T> = {
+	var element : Element;
+	function setContent( elements : Array<hide.comp.ContextMenu.ContextMenuItem> ) : Void;
+	dynamic function onSelect( v : T ) : Void;
+}
+
 class Toolbar extends Component {
 class Toolbar extends Component {
 
 
 	public function new(?parent,?el) {
 	public function new(?parent,?el) {
@@ -89,6 +95,23 @@ class Toolbar extends Component {
 		return tool;
 		return tool;
 	}
 	}
 
 
+	public function addMenu<T>( icon : String, label : String ) : ToolMenu<T> {
+		var e = new Element('<div class="button"><div class="icon fa fa-$icon"/>${label==null ? "" : label}</div>');
+		var menuItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
+		var tool : ToolMenu<T> = {
+			element : e,
+			setContent : function(c) {
+					menuItems = c;
+			},
+			onSelect : function(_) {},
+		};
+		e.click(function(ev) if( ev.button == 0 ){
+			new hide.comp.ContextMenu(menuItems);
+		});
+		e.appendTo(element);
+		return tool;
+	}
+
 	public function addRange( label : String, onChange : Float -> Void, ?defValue = 0., min = 0., max = 1. ) {
 	public function addRange( label : String, onChange : Float -> Void, ?defValue = 0., min = 0., max = 1. ) {
 		var r = new hide.comp.Range(element,new Element('<input title="$label" type="range" min="$min" max="$max" value="$defValue">'));
 		var r = new hide.comp.Range(element,new Element('<input title="$label" type="range" min="$min" max="$max" value="$defValue">'));
 		r.onChange = function(_) onChange(r.value);
 		r.onChange = function(_) onChange(r.value);

+ 92 - 67
hide/view/l3d/Level3D.hx

@@ -412,63 +412,92 @@ class Level3D extends FileView {
 
 
 	public function onSceneReady() {
 	public function onSceneReady() {
 		tools.saveDisplayKey = "Level3D/toolbar";
 		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)"});
-		//tools.addToggle("arrows", "2D Camera", (b) -> sceneEditor.camera2D = b);
-		tools.addToggle("anchor", "Snap to ground", (v) -> sceneEditor.snapToGround = v, sceneEditor.snapToGround);
-		var localToggle = tools.addToggle("compass", "Local transforms", (v) -> sceneEditor.localTransform = v, sceneEditor.localTransform);
-		keys.register("sceneeditor.toggleLocal", () -> localToggle.toggle(!localToggle.isDown()));
-		var gridToggle = tools.addToggle("th", "Show grid", function(v) { showGrid = v; updateGrid(); }, showGrid);
-		keys.register("sceneeditor.toggleGrid", () -> gridToggle.toggle(!gridToggle.isDown()));
-		tools.addButton("sun-o", "Bake Lights", () -> bakeLights());
-		tools.addButton("map", "Bake Volumetric Lightmaps", () -> { bakeLights(); bakeVolumetricLightmaps(); });
 
 
+		var toolButtonFunctions = new Map<String, Void -> Void>();
+		toolButtonFunctions.set("perspectiveCamera", () -> resetCamera(false));
+		toolButtonFunctions.set("topCamera", () -> resetCamera(true));
+		toolButtonFunctions.set("bakeLights", () -> bakeLights());
 
 
+		var toolToggleFunctions = new Map<String, Bool -> Void>();
+		toolToggleFunctions.set("snapToGroundToggle", (v) -> sceneEditor.snapToGround = v);
+		toolToggleFunctions.set("localTransformsToggle", (v) -> sceneEditor.localTransform = v);
+		toolToggleFunctions.set("gridToggle", function(v) { showGrid = v; updateGrid(); });
 		statusText = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
 		statusText = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
 		statusText.setPosition(5, 5);
 		statusText.setPosition(5, 5);
 		statusText.visible = false;
 		statusText.visible = false;
-		var texContent : Element = null;
-		tools.addToggle("info-circle", "Scene information", function(b) statusText.visible = b).rightClick(function() {
-			if( texContent != null ) {
-				texContent.remove();
-				texContent = null;
-			}
-			new hide.comp.ContextMenu([
-				{
-					label : "Show Texture Details",
-					click : function() {
-						var memStats = scene.engine.mem.stats();
-						var texs = @:privateAccess scene.engine.mem.textures;
-						var list = [for(t in texs) {
-							n: '${t.width}x${t.height}  ${t.format}  ${t.name}',
-							size: t.width * t.height
-						}];
-						list.sort((a, b) -> Reflect.compare(b.size, a.size));
-						var content = new Element('<div tabindex="1" class="overlay-info"><h2>Scene info</h2><pre></pre></div>');
-						new Element(element[0].ownerDocument.body).append(content);
-						var pre = content.find("pre");
-						pre.text([for(l in list) l.n].join("\n"));
-						texContent = content;
-						content.blur(function(_) {
-							content.remove();
-							texContent = null;
-						});
-					}
-				}
-			]);
-		});
-
-		tools.addColor("Background color", function(v) {
+		toolToggleFunctions.set("sceneInformationToggle", function(b) statusText.visible = b);
+		toolToggleFunctions.set("autoSyncToggle", function(b) autoSync = b);
+		var toolToggleRightClickFunctions = new Map<String, Void -> Void>();
+		var toolColorFunctions = new Map<String, Int -> Void>();
+		toolColorFunctions.set("backgroundColor", function(v) {
 			scene.engine.backgroundColor = v;
 			scene.engine.backgroundColor = v;
 			updateGrid();
 			updateGrid();
-		}, scene.engine.backgroundColor);
-		tools.addToggle("refresh", "Auto synchronize", function(b) {
-			autoSync = b;
 		});
 		});
-		tools.addRange("Speed", function(v) {
-			scene.speed = v;
-		}, scene.speed);
+		var toolRangeFunctions = new Map<String, Float -> Void>();
+		toolRangeFunctions.set("sceneSpeed", function(v) scene.speed = v);
+
+		var texContent : Element = null;
+		toolToggleRightClickFunctions.set("sceneInformationToggle", function() {
+				if( texContent != null ) {
+					texContent.remove();
+					texContent = null;
+				}
+				new hide.comp.ContextMenu([
+					{
+						label : "Show Texture Details",
+						click : function() {
+							var memStats = scene.engine.mem.stats();
+							var texs = @:privateAccess scene.engine.mem.textures;
+							var list = [for(t in texs) {
+								n: '${t.width}x${t.height}  ${t.format}  ${t.name}',
+								size: t.width * t.height
+							}];
+							list.sort((a, b) -> Reflect.compare(b.size, a.size));
+							var content = new Element('<div tabindex="1" class="overlay-info"><h2>Scene info</h2><pre></pre></div>');
+							new Element(element[0].ownerDocument.body).append(content);
+							var pre = content.find("pre");
+							pre.text([for(l in list) l.n].join("\n"));
+							texContent = content;
+							content.blur(function(_) {
+								content.remove();
+								texContent = null;
+							});
+						}
+					}
+				]);
+			});
 
 
+		var toolsNames : Array<String> = config.get("sceneeditor.tools");
+		for (toolName in toolsNames) {
+			var tool = config.get("sceneeditor." + toolName);
+			if (tool != null) {
+				switch(tool.type) {
+					case "Button":
+						var shortcut = (config.get("key.sceneeditor." + toolName) != null)? "	" + config.get("key.sceneeditor." + toolName) : "";
+						var button = tools.addButton(tool.icon, tool.title +  shortcut, toolButtonFunctions[toolName]);
+						if (tool.iconTransform != null) {
+							button.find(".icon").css({transform: tool.iconTransform});
+						}
+						
+					case "Toggle":
+						var shortcut = (config.get("key.sceneeditor." + toolName) != null)? "	" + config.get("key.sceneeditor." + toolName) : "";
+						var toggle = tools.addToggle(tool.icon, tool.title + shortcut, toolToggleFunctions[toolName]);
+						if (tool.iconTransform != null) {
+							toggle.element.find(".icon").css({transform: tool.iconTransform});
+						}
+						keys.register("sceneeditor." + toolName, () -> toggle.toggle(!toggle.isDown()));
+						if (tool.customRightClick != null && tool.customRightClick) {
+							toggle.rightClick(toolToggleRightClickFunctions[toolName]);
+						}
+					case "Color":
+						tools.addColor(tool.title, toolColorFunctions[toolName]);
+					case "Range":
+						tools.addRange(tool.title, toolRangeFunctions[toolName], 1.);
+					
+				}
+			}
+			
+		}
 		posToolTip = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
 		posToolTip = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
 		posToolTip.dropShadow = { dx : 1, dy : 1, color : 0, alpha : 0.5 };
 		posToolTip.dropShadow = { dx : 1, dy : 1, color : 0, alpha : 0.5 };
 
 
@@ -681,21 +710,19 @@ class Level3D extends FileView {
 			sceneFilters.set(f, getDisplayState("sceneFilters/" + f) != false);
 			sceneFilters.set(f, getDisplayState("sceneFilters/" + f) != false);
 		}
 		}
 
 
-		if(layerButtons != null) {
-			for(b in layerButtons)
-				b.element.remove();
-		}
-		layerButtons = new Map<PrefabElement, hide.comp.Toolbar.ToolToggle>();
+		var sceneFiltersMenu = layerToolbar.addMenu("", "Scene filters");
+		var content : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
 		var initDone = false;
 		var initDone = false;
 		for(typeid in sceneFilters.keys()) {
 		for(typeid in sceneFilters.keys()) {
-			var btn = layerToolbar.addToggle("", typeid, typeid.charAt(0).toLowerCase() + typeid.substr(1), function(on) {
+			content.push({label : typeid, checked : sceneFilters[typeid], click : function() {
+				var on = !sceneFilters[typeid];
 				sceneFilters.set(typeid, on);
 				sceneFilters.set(typeid, on);
 				if(initDone)
 				if(initDone)
 					applySceneFilter(typeid, on);
 					applySceneFilter(typeid, on);
-			});
-			if(sceneFilters.get(typeid) != false)
-				btn.toggle(true);
+				content.find(function(item) return item.label == typeid).checked = on;
+			}});
 		}
 		}
+		sceneFiltersMenu.setContent(content);
 		initDone = true;
 		initDone = true;
 	}
 	}
 
 
@@ -713,21 +740,19 @@ class Level3D extends FileView {
 		for(f in filters) {
 		for(f in filters) {
 			graphicsFilters.set(f, getDisplayState("graphicsFilters/" + f) != false);
 			graphicsFilters.set(f, getDisplayState("graphicsFilters/" + f) != false);
 		}
 		}
-		if(layerButtons != null) {
-			for(b in layerButtons)
-				b.element.remove();
-		}
-		layerButtons = new Map<PrefabElement, hide.comp.Toolbar.ToolToggle>();
+		var graphicsFiltersMenu = layerToolbar.addMenu("", "Graphics filters");
+		var content : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
 		var initDone = false;
 		var initDone = false;
 		for(typeid in graphicsFilters.keys()) {
 		for(typeid in graphicsFilters.keys()) {
-			var btn = layerToolbar.addToggle("", typeid, typeid.charAt(0).toLowerCase() + typeid.substr(1), function(on) {
+			content.push({label : typeid, checked : graphicsFilters[typeid], click : function() {
+				var on = !graphicsFilters[typeid];
 				graphicsFilters.set(typeid, on);
 				graphicsFilters.set(typeid, on);
-				if (initDone)
+				if(initDone)
 					applyGraphicsFilters(typeid, on);
 					applyGraphicsFilters(typeid, on);
-			});
-			if(graphicsFilters.get(typeid) != false)
-				btn.toggle(true);
+				content.find(function(item) return item.label == typeid).checked = on;
+			}});
 		}
 		}
+		graphicsFiltersMenu.setContent(content);
 		initDone = true;
 		initDone = true;
 	}
 	}