浏览代码

Fix instance creation

trethaller 7 年之前
父节点
当前提交
57aaf3f170
共有 2 个文件被更改,包括 47 次插入42 次删除
  1. 1 1
      hide/prefab/l3d/Instance.hx
  2. 46 41
      hide/view/l3d/Level3D.hx

+ 1 - 1
hide/prefab/l3d/Instance.hx

@@ -60,7 +60,7 @@ class Instance extends Object3D {
 	}
 
 	override function getHideProps() : HideProps {
-		return { icon : "circle", name : "Instance", allowParent : function(p) return p.type == "layer" };
+		return { icon : "circle", name : "Instance" };
 	}
 
 	// Move to Prefab?

+ 46 - 41
hide/view/l3d/Level3D.hx

@@ -149,9 +149,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		if(current != null && current.type == "object" && current.name == "settings" && current.parent == sceneData)
 			newItems.push(getNewTypeMenuItem("renderProps",current)); // hack : todo
 
-		var curLayer = current != null ? current.to(hide.prefab.l3d.Layer) : null;
-		var cdbSheet = curLayer != null ? curLayer.getCdbModel(curLayer) : null;
-
 		function setup(p : PrefabElement) {
 			var proj = screenToWorld(scene.s2d.width/2, scene.s2d.height/2);
 			var obj3d = p.to(hide.prefab.Object3D);
@@ -164,9 +161,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 				obj3d.setTransform(localMat);
 			}
 
-			if(cdbSheet != null)
-				p.props = cdbSheet.getDefaults();
-
 			autoName(p);
 			haxe.Timer.delay(addObject.bind(p), 0);
 		}
@@ -174,44 +168,55 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		newItems = newItems.concat(super.getNewContextMenu(current));
 
 		function addNewInstances() {
-			if(curLayer == null)
-				return;
-			if(cdbSheet == null)
-				return;
-			var refCol = Instance.findRefColumn(cdbSheet);
-			if(refCol == null)
-				return;
-			var refSheet = cdbSheet.base.getSheet(refCol.sheet);
-			var idCol = Instance.findIDColumn(refSheet);
-			if(idCol != null) {
-				var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
-				for(line in refSheet.lines) {
-					var kind : String = Reflect.getProperty(line, idCol.name);
-					kindItems.push({
-						label : kind,
-						click : function() {
-							var p = new hide.prefab.l3d.Instance(current);
-							p.name = kind.charAt(0).toLowerCase() + kind.substr(1);
-							setup(p);
-							Reflect.setField(p.props, refCol.col.name, kind);
-						}
-					});
+			var types = Level3D.getCdbTypes();
+			var items = new Array<hide.comp.ContextMenu.ContextMenuItem>();
+			for(type in types) {
+				var typeId = type.name.split("@").pop();
+				var label = typeId.charAt(0).toUpperCase() + typeId.substr(1);
+
+				var refCol = Instance.findRefColumn(type);
+				if(refCol == null)
+					continue;
+				var refSheet = type.base.getSheet(refCol.sheet);
+				var idCol = Instance.findIDColumn(refSheet);
+
+				function make(name) {
+					var p = new hide.prefab.l3d.Instance(current);
+					p.props = type.getDefaults();
+					Reflect.setField(p.props, "$cdbtype", typeId);
+					p.name = name;
+					setup(p);
+					return p;
 				}
-				newItems.unshift({
-					label : "Instance",
-					menu: kindItems
-				});
-			}
-			else {
-				newItems.unshift({
-					label : "Instance",
-					click : function() {
-						var p = new hide.prefab.l3d.Instance(current);
-						p.name = "object";
-						setup(p);
+
+				if(idCol != null) {
+					var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
+					for(line in refSheet.lines) {
+						var kind : String = Reflect.getProperty(line, idCol.name);
+						kindItems.push({
+							label : kind,
+							click : function() {
+								var p = make(kind.charAt(0).toLowerCase() + kind.substr(1));
+								Reflect.setField(p.props, refCol.col.name, kind);
+							}
+						});
 					}
-				});
+					items.unshift({
+						label : label,
+						menu: kindItems
+					});
+				}
+				else {
+					items.push({
+						label : label,
+						click : make.bind(typeId)
+					});
+				}
 			}
+			newItems.unshift({
+				label : "Instance",
+				menu: items
+			});
 		};
 		addNewInstances();
 		return newItems;