Ver código fonte

Add support for Instances

trethaller 7 anos atrás
pai
commit
dda645fcc6
3 arquivos alterados com 244 adições e 37 exclusões
  1. 124 0
      hide/prefab/l3d/Instance.hx
  2. 50 30
      hide/prefab/l3d/Layer.hx
  3. 70 7
      hide/view/l3d/Level3D.hx

+ 124 - 0
hide/prefab/l3d/Instance.hx

@@ -0,0 +1,124 @@
+package hide.prefab.l3d;
+using Lambda;
+
+class Instance extends Object3D {
+
+	public var props : Dynamic;
+
+	public function new(?parent) {
+		super(parent);
+		type = "instance";
+	}
+
+	override function load( obj : Dynamic ) {
+		super.load(obj);
+		props = obj.props;
+	}
+
+	override function save() {
+		var obj : Dynamic = super.save();
+		obj.props = props;
+		return obj;
+	}
+
+	override function makeInstance(ctx:Context):Context {
+		var ctx = super.makeInstance(ctx);
+		#if editor
+		var parentLayer = getParentLayer();
+		if(parentLayer != null) {
+			var sheet = parentLayer.getCdbModel();			
+			if(sheet != null) {
+				var refCol = findRefColumn(sheet);
+				if(refCol != null) {
+					var refId = Reflect.getProperty(props, refCol.col.name);
+					if(refId != null) {
+						var refSheet = hide.ui.Ide.inst.database.getSheet(refCol.sheet);
+						if(refSheet != null) {
+							var idx = refSheet.index.get(refId);
+							var tile = findTile(refSheet, idx.obj).center();
+							var objFollow = new h2d.ObjectFollower(ctx.local3d, ctx.shared.root2d);
+							var bmp = new h2d.Bitmap(tile, objFollow);
+							ctx.local2d = objFollow;
+						}
+					}
+				}
+			}
+		}
+		#end
+		return ctx;
+	}
+
+	override function edit( ctx : EditContext ) {
+		super.edit(ctx);
+		#if editor
+		var props = ctx.properties.add(new hide.Element('
+			<div class="group" name="Instance">
+			</div>
+		'),this);
+
+		var parentLayer = getParentLayer();
+		if(parentLayer == null) return;
+
+		var sheet = parentLayer.getCdbModel();
+		if(sheet == null) return;
+		ctx.properties.addProps([for(c in sheet.columns) {t: getPropType(c), name: c.name}], this.props);
+		#end
+	}
+
+	function getPropType(col : cdb.Data.Column) : hide.comp.PropsEditor.PropType {
+		return switch(col.type) {
+			// case TString: TODO
+			case TBool: PBool;
+			case TInt: PInt();
+			case TFloat: PFloat();
+			default: PUnsupported(col.name);
+		}
+	}
+
+	function getParentLayer() {
+		var p = parent;
+		while(p != null) {
+			var layer = p.to(hide.prefab.l3d.Layer);
+			if(layer != null) return layer;
+			p = p.parent;			
+		}
+		return null;
+	}
+
+	override function getHideProps() {
+		return { icon : "circle", name : "Instance", fileSource : null };
+	}
+
+	public static function findRefColumn(sheet : cdb.Sheet) {
+		for(col in sheet.columns) {
+			switch(col.type) {
+				case TRef(sheet): 
+					return {col: col, sheet: sheet};
+				default:
+			}
+		}
+		return null;
+	}
+
+	public static function findIDColumn(refSheet : cdb.Sheet) {
+		return refSheet.columns.find(c -> c.type == cdb.Data.ColumnType.TId);
+	}
+
+	public static function findTile(refSheet : cdb.Sheet, obj : Dynamic) {
+		var idCol = refSheet.columns.find(c -> c.type == cdb.Data.ColumnType.TTilePos);
+		if(idCol != null) {
+			var tile: cdb.Types.TilePos = Reflect.getProperty(obj, idCol.name);
+			if(tile != null)
+				return makeTile(tile);
+		}
+		return h2d.Tile.fromColor(0xFF00FF, 16, 16, 0.8).sub(0, 0, 8, 8);
+	}
+
+	static function makeTile(p:cdb.Types.TilePos) : h2d.Tile {
+		var w = (p.width == null ? 1 : p.width) * p.size;
+		var h = (p.height == null ? 1 : p.height) * p.size;
+		return hxd.Res.load(p.file).toTile().sub(p.x * p.size, p.y * p.size, w, h);
+	}
+
+	static var _ = Library.register("instance", Instance);
+}

+ 50 - 30
hide/prefab/l3d/Layer.hx

@@ -1,11 +1,31 @@
 package hide.prefab.l3d;
+using Lambda;
 
 class Layer extends Object3D {
 
-    public var locked = false;
-    public var color = 0xffffffff;
+	public var locked = false;
+	public var color = 0xffffffff;
+
+	public function new(?parent) {
+		super(parent);
+		type = "layer";
+	}
+	
+	public function getCdbModel() {
+		var levelSheet = getLevelSheet();
+		if(levelSheet == null) return null;
+		var lname = name.toLowerCase();
+		lname = lname.split("_")[0].split(" ")[0].split("-")[0];
+		var col = levelSheet.columns.find(c -> { var lc = c.name.toLowerCase(); lc == lname || lc + "s" == lname; });
+		if(col == null || col.type != TList) return null;
+		return levelSheet.getSub(col);
+	}
+
+	public function getLevelSheet() {
+		return hide.ui.Ide.inst.database.getSheet("level");
+	}
 	
-    override function save() {
+	override function save() {
 		var obj : Dynamic = super.save();
 		obj.locked = locked;
 		obj.color = color;
@@ -15,7 +35,7 @@ class Layer extends Object3D {
 	override function load( obj : Dynamic ) {
 		super.load(obj);
 		locked = obj.locked;
-        color = obj.color;
+		color = obj.color;
 	}
 
 	override function edit( ctx : EditContext ) {
@@ -29,32 +49,32 @@ class Layer extends Object3D {
 				</dl>
 			</div>
 		'),this, function(_) {
-            ctx.onChange(this);
-        });
-        var colorInput = props.find('input[name="colorVal"]');
-        var picker = new hide.comp.ColorPicker(colorInput, false);
-        picker.value = color;
-        picker.onChange = function(move) {
-            if(!move) {
-                var prevVal = color;
-                var newVal = picker.value;
-                color = picker.value;
-                ctx.properties.undo.change(Custom(function(undo) {
-                    if(undo) {
-                        color = prevVal;
-                    }
-                    else {
-                        color = newVal;
-                    }
-                    picker.value = color;
-                    ctx.onChange(this);
-                }));
-                ctx.onChange(this);
-            }
-        }
-        #end
-    }
-    
+			ctx.onChange(this);
+		});
+		var colorInput = props.find('input[name="colorVal"]');
+		var picker = new hide.comp.ColorPicker(colorInput, false);
+		picker.value = color;
+		picker.onChange = function(move) {
+			if(!move) {
+				var prevVal = color;
+				var newVal = picker.value;
+				color = picker.value;
+				ctx.properties.undo.change(Custom(function(undo) {
+					if(undo) {
+						color = prevVal;
+					}
+					else {
+						color = newVal;
+					}
+					picker.value = color;
+					ctx.onChange(this);
+				}));
+				ctx.onChange(this);
+			}
+		}
+		#end
+	}
+	
 	override function getHideProps() {
 		return { icon : "file", name : "Layer", fileSource : null };
 	}

+ 70 - 7
hide/view/l3d/Level3D.hx

@@ -1,9 +1,13 @@
 package hide.view.l3d;
+using Lambda;
+
 import hxd.Math;
 import hxd.Key as K;
 
 import hide.prefab.Prefab as PrefabElement;
 import hide.prefab.Object3D;
+import hide.prefab.l3d.Instance;
+import hide.prefab.l3d.Layer;
 import h3d.scene.Object;
 
 class Level3D extends FileView {
@@ -119,13 +123,16 @@ class Level3D extends FileView {
 	function refresh( ?callb ) {
 		var sh = context.shared;
 		sh.root3d.remove();
+		sh.root2d.remove();
 		for( f in sh.cleanups )
 			f();
 		sh.root3d = new h3d.scene.Object();
+		scene.s3d.addChild(sh.root3d);
+		sh.root2d = new h2d.Sprite();
+		scene.s2d.addChild(sh.root2d);
 		sh.cleanups = [];
 		context.init();
 		data.makeInstance(context);
-		scene.s3d.addChild(sh.root3d);
 		scene.init(props);
 		refreshInteractives();
 		refreshLayerIcons();
@@ -138,19 +145,24 @@ class Level3D extends FileView {
 	}
 
 	function autoName(p : PrefabElement) {
-		var id = 0;
 		var prefix = p.type;
 		if(prefix == "object")
 			prefix = "group";
+		if(p.name != null && p.name.length > 0) {
+			prefix = p.name.split("_")[0].split(" ")[0].split("-")[0];
+		}
 
 		var model = p.to(hide.prefab.Model);
 		if(model != null && model.source != null) {
 			var path = new haxe.io.Path(model.source);
 			prefix = path.file;
 		}
+
+		prefix += "_";
+		var id = 0;		
 		while( data.getPrefabByName(prefix + id) != null )
 			id++;
-		
+			
 		p.name = prefix + id;
 
 		for(c in p.children) {
@@ -279,7 +291,7 @@ class Level3D extends FileView {
 	function updateGrid() {
 		if(grid == null) {
 			grid = new h3d.scene.Graphics(scene.s3d);
-			grid.scale(10);
+			grid.scale(1);
 		}
 		else {
 			grid.clear();
@@ -430,13 +442,13 @@ class Level3D extends FileView {
 				selectObjects([current]);
 			}
 
-			var registered = new Array<hide.comp.ContextMenu.ContextMenuItem>();
+			var newItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
 			var allRegs = @:privateAccess hide.prefab.Library.registeredElements;
 			var allowed = ["model", "object", "layer", "box"];
 			for( ptype in allowed ) {
 				var pcl = allRegs.get(ptype);
 				var props = Type.createEmptyInstance(pcl).getHideProps();
-				registered.push({
+				newItems.push({
 					label : props.name,
 					click : function() {
 
@@ -461,8 +473,59 @@ class Level3D extends FileView {
 				});
 			}
 
+			{
+				var curLayer = current.to(hide.prefab.l3d.Layer);
+				if(curLayer != null) {
+					var cdbSheet = curLayer.getCdbModel();
+					if(cdbSheet != null) {
+						var refCol = Instance.findRefColumn(cdbSheet);
+						if(refCol != null) {
+							var refSheet = ide.database.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 = Reflect.getProperty(line, idCol.name);
+									kindItems.push({
+										label : kind,
+										click : function() {
+											var p = new hide.prefab.l3d.Instance(current);
+											p.props = {};
+											for( c in cdbSheet.columns ) {
+												var d = ide.database.getDefault(c);
+												if( d != null )
+													Reflect.setField(p.props, c.name, d);
+											}
+											p.name = kind.toLowerCase() + "_";
+											Reflect.setField(p.props, refCol.col.name, kind);
+											autoName(p);
+											addObject(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";
+										autoName(p);
+										addObject(p);
+									}
+								});
+							}
+						}
+					}
+				}
+			}
+
 			var menuItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [
-				{ label : "New...", menu : registered },
+				{ label : "New...", menu : newItems },
 				{ label : "Rename", enabled : current != null, click : function() tree.editNode(current) },
 				{ label : "Delete", enabled : current != null, click : function() deleteElements(curEdit.rootElements) },
 				{ label : "Select all", click : selectAll },