Browse Source

cdb props at prefab level

ncannasse 7 năm trước cách đây
mục cha
commit
143f72c1c9
4 tập tin đã thay đổi với 59 bổ sung70 xóa
  1. 14 0
      hide/prefab/Prefab.hx
  2. 38 65
      hide/prefab/l3d/Instance.hx
  3. 4 1
      hide/prefab/l3d/Layer.hx
  4. 3 4
      hide/view/l3d/Level3D.hx

+ 14 - 0
hide/prefab/Prefab.hx

@@ -7,6 +7,7 @@ class Prefab {
 	public var parent(default, set) : Prefab;
 	public var source(default, set) : String;
 	public var children(default, null) : Array<Prefab>;
+	public var props(default, null) : {};
 
 	public function new(?parent) {
 		this.parent = parent;
@@ -63,6 +64,8 @@ class Prefab {
 			obj.source = source;
 		if( children.length > 0 )
 			obj.children = [for( s in children ) s.saveRec()];
+		if( props != null )
+			obj.props = props;
 		return obj;
 	}
 
@@ -97,6 +100,7 @@ class Prefab {
 		var p = Type.createInstance(pcl, [parent]);
 		p.type = v.type;
 		p.name = v.name;
+		p.props = v.props;
 		if( v.source != null )
 			p.source = v.source;
 		p.load(v);
@@ -117,6 +121,16 @@ class Prefab {
 			c.makeInstanceRec(ctx);
 	}
 
+	#if editor
+	public function getCdbModel( ?p : Prefab ) : cdb.Sheet {
+		if( p == null )
+			p = this;
+		if( parent != null )
+			return parent.getCdbModel(p);
+		return null;
+	}
+	#end
+
 	public function getPrefabByName( name : String ) {
 		if( this.name == name )
 			return this;

+ 38 - 65
hide/prefab/l3d/Instance.hx

@@ -3,66 +3,51 @@ 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;
+		props = {};
 	}
 
 	override function makeInstance(ctx:Context):Context {
 		#if editor
 		var ctx = super.makeInstance(ctx);
 		var parentLayer = getParent(Layer);
-		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 = sheet.base.getSheet(refCol.sheet);
-						if(refSheet != null) {
-							var idx = refSheet.index.get(refId);
-							var modelPath = findModelPath(refSheet, idx.obj);
-							if(modelPath != null) {
-								try {
-									var obj = ctx.loadModel(modelPath);
-									obj.name = name;
-									applyPos(obj);
-									ctx.local3d.addChild(obj);
-									ctx.local3d = obj;
-								} catch( e : hxd.res.NotFound ) {
-									ctx.onError(e);
-								}
-							}
-							else {
-								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;
-								var obj = new h3d.scene.Object(ctx.local3d);
-								var prim = h3d.prim.Cube.defaultUnitCube();
-								var mesh = new h3d.scene.Mesh(prim, obj);
-								mesh.setPos(-0.25, -0.25, -0.25);
-								mesh.scale(0.5);
-								var mat = mesh.material;
-								mat.color.setColor(parentLayer.color);
-								mat.shadows = false;
-							}
+		var sheet = getCdbModel();
+		if( sheet == null ) return ctx;
+		var refCol = findRefColumn(sheet);
+		if(refCol != null) {
+			var refId = Reflect.getProperty(props, refCol.col.name);
+			if(refId != null) {
+				var refSheet = sheet.base.getSheet(refCol.sheet);
+				if(refSheet != null) {
+					var idx = refSheet.index.get(refId);
+					var modelPath = findModelPath(refSheet, idx.obj);
+					if(modelPath != null) {
+						try {
+							var obj = ctx.loadModel(modelPath);
+							obj.name = name;
+							applyPos(obj);
+							ctx.local3d.addChild(obj);
+							ctx.local3d = obj;
+						} catch( e : hxd.res.NotFound ) {
+							ctx.onError(e);
 						}
 					}
+					else {
+						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;
+						var obj = new h3d.scene.Object(ctx.local3d);
+						var prim = h3d.prim.Cube.defaultUnitCube();
+						var mesh = new h3d.scene.Mesh(prim, obj);
+						mesh.setPos(-0.25, -0.25, -0.25);
+						mesh.scale(0.5);
+						var mat = mesh.material;
+						mat.color.setColor(parentLayer.color);
+						mat.shadows = false;
+					}
 				}
 			}
 		}
@@ -73,30 +58,18 @@ class Instance extends Object3D {
 	override function edit( ctx : EditContext ) {
 		super.edit(ctx);
 		#if editor
+		var sheet = getCdbModel();
+		if( sheet == null ) return;
+
 		var props = ctx.properties.add(new hide.Element('
 			<div class="group" name="Instance">
 			</div>
 		'),this);
 
-		var parentLayer = getParent(Layer);
-		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);
+		//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);
-		}
-	}
-
 	override function getHideProps() {
 		return { icon : "circle", name : "Instance", fileSource : null };
 	}

+ 4 - 1
hide/prefab/l3d/Layer.hx

@@ -12,7 +12,10 @@ class Layer extends Object3D {
 	}
 
 	#if editor
-	public function getCdbModel() {
+	override function getCdbModel( ?p : Prefab ) {
+		if( p == null ) p = this;
+		if( p == this )
+			return null;
 		var levelSheet = getLevelSheet();
 		if(levelSheet == null) return null;
 		var lname = name.split("_")[0];

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

@@ -16,7 +16,7 @@ class LevelEditContext extends hide.prefab.EditContext {
 	public function new(parent, context) {
 		super(context);
 		this.parent = parent;
-	}	
+	}
 }
 
 @:access(hide.view.l3d.Level3D)
@@ -59,7 +59,7 @@ class CamController extends h3d.scene.CameraController {
 				}
 				pushX = e.relX;
 				pushY = e.relY;
-			case 2: 
+			case 2:
 				rot(e.relX - pushX, e.relY - pushY);
 				pushX = e.relX;
 				pushY = e.relY;
@@ -183,7 +183,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 						label : kind,
 						click : function() {
 							var p = new hide.prefab.l3d.Instance(current);
-							p.props = {};
 							for( c in cdbSheet.columns ) {
 								var d = cdbSheet.base.getDefault(c);
 								if( d != null )
@@ -231,7 +230,7 @@ class Level3D extends FileView {
 	var light : h3d.scene.DirLight;
 	var lightDirection = new h3d.Vector( 1, 2, -4 );
 
-	var layerToolbar : hide.comp.Toolbar;	
+	var layerToolbar : hide.comp.Toolbar;
 	var layerButtons : Map<PrefabElement, hide.comp.Toolbar.ToolToggle>;
 
 	var grid : h3d.scene.Graphics;