فهرست منبع

Add model previews of objects

trethaller 7 سال پیش
والد
کامیت
4f26a79c5c
3فایلهای تغییر یافته به همراه100 افزوده شده و 36 حذف شده
  1. 21 21
      hide/prefab/Box.hx
  2. 77 10
      hide/prefab/l3d/Instance.hx
  3. 2 5
      hide/view/l3d/Level3D.hx

+ 21 - 21
hide/prefab/Box.hx

@@ -2,31 +2,31 @@ package hide.prefab;
 
 class Box extends Object3D {
 
-    var mesh : h3d.scene.Mesh = null;
-    
-    public function setColor(col: Int) {
-        if(mesh != null) {
-            mesh.material.color.setColor(col | (80 << 24));
-        }
-    }
+	var mesh : h3d.scene.Mesh = null;
+	
+	public function setColor(col: Int) {
+		if(mesh != null) {
+			mesh.material.color.setColor(col | (80 << 24));
+		}
+	}
 
 	override function makeInstance(ctx:Context):Context {
-        ctx = ctx.clone(this);
+		ctx = ctx.clone(this);
 
-        var obj = new h3d.scene.Object(ctx.local3d);
-        var prim = h3d.prim.Cube.defaultUnitCube();
-        mesh = new h3d.scene.Mesh(prim, obj);
-        mesh.setPos(-0.5, -0.5, -0.5);
-        var mat = mesh.material;
+		var obj = new h3d.scene.Object(ctx.local3d);
+		var prim = h3d.prim.Cube.defaultUnitCube();
+		mesh = new h3d.scene.Mesh(prim, obj);
+		mesh.setPos(-0.5, -0.5, -0.5);
+		var mat = mesh.material;
 		mat.color.setColor(0x60ff00ff);
-        mat.mainPass.depthWrite = false;
-        mat.mainPass.setPassName("alpha");
-        mat.shadows = false;
-        mat.blendMode = Alpha;
+		mat.mainPass.depthWrite = false;
+		mat.mainPass.setPassName("alpha");
+		mat.shadows = false;
+		mat.blendMode = Alpha;
 
-        var wire = new h3d.scene.Box(obj);
-        wire.color = 0;
-        wire.ignoreCollide = true;
+		var wire = new h3d.scene.Box(obj);
+		wire.color = 0;
+		wire.ignoreCollide = true;
 
 		ctx.local3d = obj;
 		ctx.local3d.name = name;
@@ -34,7 +34,7 @@ class Box extends Object3D {
 		return ctx;
 	}
 
-    override function getHideProps() {
+	override function getHideProps() {
 		return { icon : "square", name : "Box", fileSource : null };
 	}
 

+ 77 - 10
hide/prefab/l3d/Instance.hx

@@ -22,8 +22,8 @@ class Instance extends Object3D {
 	}
 
 	override function makeInstance(ctx:Context):Context {
-		var ctx = super.makeInstance(ctx);
 		#if editor
+		var ctx = super.makeInstance(ctx);
 		var parentLayer = getParentLayer();
 		if(parentLayer != null) {
 			var sheet = parentLayer.getCdbModel();			
@@ -32,13 +32,35 @@ class Instance extends Object3D {
 				if(refCol != null) {
 					var refId = Reflect.getProperty(props, refCol.col.name);
 					if(refId != null) {
-						var refSheet = hide.ui.Ide.inst.database.getSheet(refCol.sheet);
+						var refSheet = sheet.base.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;
+							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(0xff0000ff);
+								mat.shadows = false;
+							}
 						}
 					}
 				}
@@ -104,10 +126,55 @@ class Instance extends Object3D {
 		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);
+	static function getModel(refSheet : cdb.Sheet, obj : Dynamic) {
+		var path = findModelPath(refSheet, obj);
+		if(path == null)
+			return null;
+		try {
+			var model = hxd.Res.load(path).toModel();
+			return model;
+		} catch( e : hxd.res.NotFound ) {}
+		return null;
+	}
+
+	static function findModelPath(refSheet : cdb.Sheet, obj : Dynamic) {
+		function filter(f: String) {
+			if(f != null) {
+				var lower = f.toLowerCase();
+				if(StringTools.endsWith(lower.toLowerCase(), ".fbx"))
+					return f;
+			}
+			return null;
+		}
+		var col = refSheet.columns.find(c -> c.type == cdb.Data.ColumnType.TFile);
+		var path = null;
+		if(col != null) {
+			path = filter(Reflect.getProperty(obj, col.name));
+		}
+		if(path == null) {
+			for(c in refSheet.columns) {
+				if(c.type == cdb.Data.ColumnType.TList) {
+					var sub = refSheet.getSub(c);
+					if(sub != null) {
+						var lines = sub.getLines();
+						if(lines.length > 0) {
+							var col = sub.columns.find(sc -> sc.type == cdb.Data.ColumnType.TFile);
+							if(col != null) {
+								path = filter(Reflect.getProperty(lines[0], col.name));
+								if(path != null) break;
+							}
+						}
+					}
+				}
+			}
+		}
+		return path;
+	}
+
+	static function findTile(refSheet : cdb.Sheet, obj : Dynamic) {
+		var tileCol = refSheet.columns.find(c -> c.type == cdb.Data.ColumnType.TTilePos);
+		if(tileCol != null) {
+			var tile: cdb.Types.TilePos = Reflect.getProperty(obj, tileCol.name);
 			if(tile != null)
 				return makeTile(tile);
 		}

+ 2 - 5
hide/view/l3d/Level3D.hx

@@ -480,7 +480,7 @@ class Level3D extends FileView {
 					if(cdbSheet != null) {
 						var refCol = Instance.findRefColumn(cdbSheet);
 						if(refCol != null) {
-							var refSheet = ide.database.getSheet(refCol.sheet);
+							var refSheet = cdbSheet.base.getSheet(refCol.sheet);
 							var idCol = Instance.findIDColumn(refSheet);
 							if(idCol != null) {
 								var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
@@ -492,7 +492,7 @@ class Level3D extends FileView {
 											var p = new hide.prefab.l3d.Instance(current);
 											p.props = {};
 											for( c in cdbSheet.columns ) {
-												var d = ide.database.getDefault(c);
+												var d = cdbSheet.base.getDefault(c);
 												if( d != null )
 													Reflect.setField(p.props, c.name, d);
 											}
@@ -922,9 +922,6 @@ class Level3D extends FileView {
 		var all = contexts.keys();
 		for(elt in all) {
 			var ctx = contexts[elt];
-			var cls = Type.getClass(elt);
-			if(!(cls == hide.prefab.Model || cls == hide.prefab.Box))
-				continue;
 			if(ctx.local3d != null) {
 				var o = ctx.local3d;
 				var meshes = getSelfMeshes(elt);