瀏覽代碼

look into properties refs for instance display

Nicolas Cannasse 5 年之前
父節點
當前提交
32380c5d9c
共有 2 個文件被更改,包括 37 次插入10 次删除
  1. 16 4
      hide/view/l3d/Level3D.hx
  2. 21 6
      hrt/prefab/l3d/Instance.hx

+ 16 - 4
hide/view/l3d/Level3D.hx

@@ -186,9 +186,9 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 				var typeId = DataFiles.getTypeName(type);
 				var label = typeId.charAt(0).toUpperCase() + typeId.substr(1);
 
-				var refCol = Instance.findRefColumn(type);
-				var refSheet = refCol == null ? null : type.base.getSheet(refCol.sheet);
-				var idCol = refCol == null ? null : Instance.findIDColumn(refSheet);
+				var refCols = Instance.findRefColumns(type);
+				var refSheet = refCols == null ? null : type.base.getSheet(refCols.sheet);
+				var idCol = refCols == null ? null : Instance.findIDColumn(refSheet);
 
 				function make(name) {
 					var p = new hrt.prefab.l3d.Instance(current == null ? sceneData : current);
@@ -208,7 +208,19 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 							label : kind,
 							click : function() {
 								var p = make(kind.charAt(0).toLowerCase() + kind.substr(1));
-								Reflect.setField(p.props, refCol.col.name, kind);
+								var obj : Dynamic = p.props;
+								for( c in refCols.cols ) {
+									if( c == refCols.cols[refCols.cols.length-1] )
+										Reflect.setField(obj, c.name, kind);
+									else {
+										var s = Reflect.field(obj,c.name);
+										if( s == null ) {
+											s = {};
+											Reflect.setField(obj, c.name, s);
+										}
+										obj = s;
+									}
+								}
 							}
 						});
 					}

+ 21 - 6
hrt/prefab/l3d/Instance.hx

@@ -126,26 +126,41 @@ class Instance extends Object3D {
 		var sheet = hide.comp.cdb.DataFiles.resolveType(name);
 		if( sheet == null )
 			return null;
-		var refCol = findRefColumn(sheet);
-		if(refCol == null)
+		var refCols = findRefColumns(sheet);
+		if(refCols == null)
 			return null;
-		var refId = Reflect.getProperty(p.props, refCol.col.name);
+		var refId : Dynamic = p.props;
+		for( c in refCols.cols )
+			refId = Reflect.field(refId, c.name);
 		if(refId == null)
 			return null;
-		var refSheet = sheet.base.getSheet(refCol.sheet);
+		var refSheet = sheet.base.getSheet(refCols.sheet);
 		if(refSheet == null)
 			return null;
 		return {sheet: refSheet, idx: refSheet.index.get(refId)};
 	}
 
-	public static function findRefColumn(sheet : cdb.Sheet) {
+	public static function findRefColumns(sheet : cdb.Sheet) {
 		for(col in sheet.columns) {
 			switch(col.type) {
 				case TRef(sheet):
-					return {col: col, sheet: sheet};
+					return {cols: [col], sheet: sheet};
 				default:
 			}
 		}
+		for(col in sheet.columns) {
+			switch(col.type) {
+			case TProperties:
+				var sub = sheet.getSub(col);
+				for( col2 in sub.columns )
+					switch( col2.type ) {
+					case TRef(sheet2):
+						return {cols: [col,col2], sheet: sheet2};
+					default:
+					}
+			default:
+			}
+		}
 		return null;
 	}