Forráskód Böngészése

more work on hide instances / data files + custom file tree icons & ranges display

Nicolas Cannasse 5 éve
szülő
commit
2cb35f80b7

+ 3 - 0
bin/defaultProps.json

@@ -113,6 +113,9 @@
 
 	"sceneeditor.newgroups" : ["2D|hrt.prefab.Object2D","3D|hrt.prefab.Object3D","RFX|hrt.prefab.rfx.RendererFX"],
 
+	"sceneeditor.icons" : {},
+	"sceneeditor.ranges" : {},
+
 	// l3d config
 	"l3d.groundLayer": "ground",
 	"l3d.cdbLevel": "level",

BIN
bin/res/icons/unknown.png


+ 13 - 12
hide/comp/SceneEditor.hx

@@ -436,12 +436,21 @@ class SceneEditor {
 
 		// BUILD scene tree
 
+		var icons = new Map();
+		var iconsConfig = view.config.get("sceneeditor.icons");
+		for( f in Reflect.fields(iconsConfig) )
+			icons.set(f, Reflect.field(iconsConfig,f));
+
 		function makeItem(o:PrefabElement, ?state) : hide.comp.IconTree.IconTreeItem<PrefabElement> {
 			var p = o.getHideProps();
+			var icon = p.icon;
+			var ct = o.getCdbModel();
+			if( ct != null && icons.exists(ct.name) )
+				icon = icons.get(ct.name);
 			var r : hide.comp.IconTree.IconTreeItem<PrefabElement> = {
 				value : o,
 				text : o.name,
-				icon : "fa fa-"+p.icon,
+				icon : "fa fa-"+icon,
 				children : o.children.length > 0,
 				state: state
 			};
@@ -646,17 +655,9 @@ class SceneEditor {
 		var ctx = contexts[elt];
 		if( ctx == null )
 			return;
-		var obj3d = Std.downcast(elt, Object3D);
-		if( obj3d != null ) {
-			var int = obj3d.makeInteractive(ctx);
-			initInteractive(elt,int);
-		} else {
-			var obj2d = Std.downcast(elt, Object2D);
-			if( obj2d != null ) {
-				var int = obj2d.makeInteractive(ctx);
-				initInteractive(elt,int);
-			}
-		}
+		var int = elt.makeInteractive(ctx);
+		if( int == null ) return;
+		initInteractive(elt,cast int);
 	}
 
 	function initInteractive( elt : PrefabElement, int : {

+ 1 - 1
hide/prefab/ContextShared.hx

@@ -2,7 +2,7 @@ package hide.prefab;
 
 class ContextShared extends hrt.prefab.ContextShared {
 	#if editor
-	var scene : hide.comp.Scene;
+	public var scene : hide.comp.Scene;
 
 	public function new(scene) {
 		super();

+ 1 - 1
hide/ui/View.hx

@@ -120,7 +120,7 @@ class View<T> extends hide.comp.Component {
 		});
 		container.on("destroy",function(e) {
 			if( !onBeforeClose() ) {
-				e.preventDefault();
+				try e.preventDefault() catch( _ : Dynamic ) {};
 				return;
 			}
 			destroy();

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

@@ -187,10 +187,8 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 				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);
+				var refSheet = refCol == null ? null : type.base.getSheet(refCol.sheet);
+				var idCol = refCol == null ? null : Instance.findIDColumn(refSheet);
 
 				function make(name) {
 					var p = new hrt.prefab.l3d.Instance(current == null ? sceneData : current);
@@ -203,7 +201,7 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 					return p;
 				}
 
-				if(idCol != null) {
+				if(idCol != null && refSheet.props.dataFiles == null ) {
 					var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
 					for(line in refSheet.lines) {
 						var kind : String = Reflect.getProperty(line, idCol.name);
@@ -284,6 +282,8 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 			editor.undo = properties.undo;
 			editor.onChange = function(pname) {
 				edit.onChange(e, 'props.$pname');
+				var e = Std.instance(e, hrt.prefab.l3d.Instance);
+				if( e != null ) e.addRanges(context.shared.contexts.get(e));
 			}
 		}
 	}

+ 0 - 4
hrt/prefab/Object2D.hx

@@ -109,10 +109,6 @@ class Object2D extends Prefab {
 
 	#if editor
 
-	public function makeInteractive(ctx : Context) : h2d.Interactive {
-		return null;
-	}
-
 	override function edit( ctx : EditContext ) {
 		var props = new hide.Element('
 			<div class="group" name="Position">

+ 6 - 2
hrt/prefab/Object3D.hx

@@ -143,7 +143,7 @@ class Object3D extends Prefab {
 		return true;
 	}
 
-	public function makeInteractive( ctx : Context ) : h3d.scene.Interactive {
+	override function makeInteractive( ctx : Context ) : hxd.SceneEvents.Interactive {
 		var local3d = ctx.local3d;
 		if(local3d == null)
 			return null;
@@ -151,6 +151,7 @@ class Object3D extends Prefab {
 		var invRootMat = local3d.getAbsPos().clone();
 		invRootMat.invert();
 		var bounds = new h3d.col.Bounds();
+		var visibleMeshes = [];
 		for(mesh in meshes) {
 			if(mesh.ignoreCollide)
 				continue;
@@ -168,8 +169,11 @@ class Object3D extends Prefab {
 			var lb = mesh.primitive.getBounds().clone();
 			lb.transform(localMat);
 			bounds.add(lb);
+			visibleMeshes.push(mesh);
 		}
-		var meshCollider = new h3d.col.Collider.GroupCollider([for(m in meshes) {
+		if( visibleMeshes.length == 0 )
+			return null;
+		var meshCollider = new h3d.col.Collider.GroupCollider([for(m in visibleMeshes) {
 			var c : h3d.col.Collider = try m.getGlobalCollider() catch(e: Dynamic) null;
 			if(c != null) c;
 		}]);

+ 8 - 0
hrt/prefab/Prefab.hx

@@ -89,6 +89,14 @@ class Prefab {
 	public function setSelected( ctx : Context, b : Bool ) {
 		return true;
 	}
+
+	/**
+		Allows the prefab to create an interactive so it can be selected in the scene.
+	**/
+	public function makeInteractive( ctx : Context ) : hxd.SceneEvents.Interactive {
+		return null;
+	}
+
 	#end
 
 	/**

+ 79 - 16
hrt/prefab/l3d/Instance.hx

@@ -13,10 +13,9 @@ class Instance extends Object3D {
 		#if editor
 		var ctx = super.makeInstance(ctx);
 		var kind = getCdbKind(this);
-		if(kind == null || kind.idx == null)
-			return ctx;
+		var unknown = kind == null || kind.idx == null;
 
-		var modelPath = findModelPath(kind.sheet, kind.idx.obj);
+		var modelPath = unknown ? null : findModelPath(kind.sheet, kind.idx.obj);
 		if(modelPath != null) {
 			try {
 				if(hrt.prefab.Library.getPrefabType(modelPath) != null) {
@@ -36,21 +35,81 @@ class Instance extends Object3D {
 			}
 		}
 		else {
-			var tile = findTile(kind.sheet, kind.idx.obj).center();
+			var tile = unknown ? getDefaultTile().center() : findTile(kind.sheet, kind.idx.obj).center();
 			var objFollow = new h2d.ObjectFollower(ctx.local3d, ctx.shared.root2d);
 			objFollow.followVisibility = true;
 			var bmp = new h2d.Bitmap(tile, objFollow);
 			ctx.local2d = objFollow;
-			var mesh = new h3d.scene.Mesh(h3d.prim.Cube.defaultUnitCube(), ctx.local3d);
-			mesh.scale(0.5);
-			var mat = mesh.material;
-			mat.color.setColor(0xff00ff);
-			mat.shadows = false;
 		}
+		addRanges(ctx, true);
 		#end
 		return ctx;
 	}
 
+	#if editor
+
+	public function addRanges( ctx : Context, init = false ) {
+		if( !init ) {
+			for( r in ctx.shared.getObjects(this,h3d.scene.Object) )
+				if( r.name == "RANGE")
+					r.remove();
+		}
+		// add ranges
+		var shared = Std.downcast(ctx.shared, hide.prefab.ContextShared);
+		if( shared != null && shared.editorDisplay ) {
+			var sheet = getCdbModel();
+			if( sheet != null ) {
+				var ranges = Reflect.field(shared.scene.config.get("sceneeditor.ranges"), sheet.name);
+				if( ranges != null ) {
+					for( key in Reflect.fields(ranges) ) {
+						var color = Std.parseInt(Reflect.field(ranges,key));
+						var value : Dynamic = props;
+						for( p in key.split(".") )
+							value = Reflect.field(value, p);
+						if( value != null ) {
+							var mesh = new h3d.scene.Mesh(h3d.prim.Cylinder.defaultUnitCylinder(128), ctx.local3d);
+							mesh.name = "RANGE";
+							mesh.ignoreCollide = true;
+							mesh.ignoreBounds = true;
+							mesh.material.mainPass.culling = None;
+							mesh.material.name = "RANGE";
+							mesh.setScale(value * 2);
+							mesh.scaleZ = 0.01;
+							mesh.material.color.setColor(color|0xFF000000);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	override function setSelected(ctx:Context, b:Bool):Bool {
+		var b = super.setSelected(ctx, b);
+		for( m in ctx.shared.getMaterials(this) )
+			if( m.name == "RANGE" )
+				m.removePass(m.getPass("highlight"));
+		return b;
+	}
+
+	override function makeInteractive(ctx:Context):hxd.SceneEvents.Interactive {
+		var int = super.makeInteractive(ctx);
+		if( int == null ) {
+			// no meshes ? do we have an icon instead...
+			var follow = Std.downcast(ctx.local2d, h2d.ObjectFollower);
+			if( follow != null ) {
+				var bmp = Std.downcast(follow.getChildAt(0), h2d.Bitmap);
+				if( bmp != null ) {
+					var i = new h2d.Interactive(bmp.tile.width, bmp.tile.height, bmp);
+					i.x = bmp.tile.dx;
+					i.y = bmp.tile.dy;
+					int = i;
+				}
+			}
+		}
+		return int;
+	}
+	#end
+
 	override function removeInstance(ctx:Context):Bool {
 		if(!super.removeInstance(ctx))
 			return false;
@@ -125,12 +184,6 @@ class Instance extends Object3D {
 
 	#if editor
 
-	override function edit( ctx : EditContext ) {
-		super.edit(ctx);
-		var sheet = getCdbModel();
-		if( sheet == null ) return;
-	}
-
 	override function getHideProps() : HideProps {
 		return { icon : "circle", name : "Instance" };
 	}
@@ -153,7 +206,17 @@ class Instance extends Object3D {
 			if(tile != null)
 				return makeTile(tile);
 		}
-		return h2d.Tile.fromColor(0xFF00FF, 16, 16, 0.8).sub(0, 0, 8, 8);
+		return getDefaultTile();
+	}
+
+	static function getDefaultTile() : h2d.Tile {
+		var engine = h3d.Engine.getCurrent();
+		var t = @:privateAccess engine.resCache.get(Instance);
+		if( t == null ) {
+			t = hxd.res.Any.fromBytes("",sys.io.File.getBytes(hide.Ide.inst.getPath("${HIDE}/res/icons/unknown.png"))).toTile();
+			@:privateAccess engine.resCache.set(Instance, t);
+		}
+		return t.clone();
 	}
 
 	static function makeTile(p:cdb.Types.TilePos) : h2d.Tile {

+ 1 - 6
hrt/prefab/l3d/MeshGenerator.hx

@@ -177,7 +177,7 @@ class MeshGenerator extends Object3D {
 		#if editor
 		var int = ctx.local3d.find(o -> Std.downcast(o, h3d.scene.Interactive));
 		if(int != null) {
-			var dummy = makeInteractive(ctx);
+			var dummy = Std.downcast(makeInteractive(ctx), h3d.scene.Interactive);
 			int.preciseShape = dummy.preciseShape;
 			dummy.remove();
 		}
@@ -263,11 +263,6 @@ class MeshGenerator extends Object3D {
 
 	#if editor
 
-	override function makeInteractive( ctx : Context ) : h3d.scene.Interactive {
-		var int = super.makeInteractive(ctx);
-		return int;
-	}
-
 	function generate( ctx : EditContext, mp : MeshPart, maxDepth : Int, curDepth : Int) {
 		if( curDepth >  maxDepth ) return;
 		curDepth++;