Browse Source

Improving Material libraries. Now using props.json file to list all available material libraries for each folder. Paths consistency renaming or moving material libraries using Hide features.

clementlandrin 2 years ago
parent
commit
35342f8901
4 changed files with 87 additions and 54 deletions
  1. 15 0
      hide/Ide.hx
  2. 32 0
      hide/comp/Scene.hx
  3. 39 30
      hide/view/FileTree.hx
  4. 1 24
      hide/view/Model.hx

+ 15 - 0
hide/Ide.hx

@@ -1038,6 +1038,21 @@ class Ide {
 			t();
 			t();
 	}
 	}
 
 
+	public function filterProps( callb : Dynamic -> Bool ) {
+		var exts = ["props", "json"];
+		var todo = [];
+		browseFiles(function(path) {
+			var ext = path.split(".").pop();
+			if( exts.indexOf(ext) < 0 ) return;
+			var content = parseJSON(sys.io.File.getContent(getPath(path)));
+			var changed = callb(content);
+			if( !changed ) return;
+			todo.push(function() sys.io.File.saveContent(getPath(path), toJSON(content)));
+		});
+		for( t in todo )
+			t();
+	}
+
 	function browseFiles( callb : String -> Void ) {
 	function browseFiles( callb : String -> Void ) {
 		function browseRec(path) {
 		function browseRec(path) {
 			if( path == ".tmp" ) return;
 			if( path == ".tmp" ) return;

+ 32 - 0
hide/comp/Scene.hx

@@ -474,4 +474,36 @@ class Scene extends Component implements h3d.IDrawable {
 		return @:privateAccess h3d.Engine.getCurrent().resCache.get(Scene);
 		return @:privateAccess h3d.Engine.getCurrent().resCache.get(Scene);
 	}
 	}
 
 
+	public function listMaterialFromLibraries( path : String ) {
+
+		var config = hide.Config.loadForFile(ide, path);
+
+		var paths : Array<String> = config.get("materialLibraries");
+		if( paths == null ) paths = [];
+
+		var materials = [];
+		function pathRec(p : String) {
+			var fullPath = ide.getPath(p);
+			if ( sys.FileSystem.isDirectory(fullPath) ) {
+				for(f in sys.FileSystem.readDirectory(fullPath) ) {
+					var fpath = p+"/"+f;
+					pathRec(fpath);
+				}
+			} else {
+				try {
+					var prefab = hxd.res.Loader.currentInstance.load(p).toPrefab().load();
+					var mats = prefab.getAll(hrt.prefab.Material);
+					for ( m in mats )
+						materials.push({ path : p, mat : m});
+				} catch ( e : hxd.res.NotFound ) {
+					ide.error('Material library ${p} not found, please update props.json');
+				}
+			}
+		}
+		for ( p in paths ) {
+			pathRec(p);
+		}
+		materials.sort((m1, m2) -> { return (m1.mat.name > m2.mat.name ? 1 : -1); });
+		return materials;
+	}
 }
 }

+ 39 - 30
hide/view/FileTree.hx

@@ -272,6 +272,38 @@ class FileTree extends FileView {
 			return p;
 			return p;
 		}
 		}
 
 
+		function filterContent(content:Dynamic) {
+			var visited = new Array<Dynamic>();
+			function browseRec(obj:Dynamic) : Dynamic {
+				switch( Type.typeof(obj) ) {
+				case TObject:
+					if( visited.indexOf(obj) >= 0 ) return null;
+					visited.push(obj);
+					for( f in Reflect.fields(obj) ) {
+						var v : Dynamic = Reflect.field(obj, f);
+						v = browseRec(v);
+						if( v != null ) Reflect.setField(obj, f, v);
+					}
+				case TClass(Array):
+					if( visited.indexOf(obj) >= 0 ) return null;
+					visited.push(obj);
+					var arr : Array<Dynamic> = obj;
+					for( i in 0...arr.length ) {
+						var v : Dynamic = arr[i];
+						v = browseRec(v);
+						if( v != null ) arr[i] = v;
+					}
+				case TClass(String):
+					return filter(obj);
+				default:
+				}
+				return null;
+			}
+			for( f in Reflect.fields(content) ) {
+				var v = browseRec(Reflect.field(content,f));
+				if( v != null ) Reflect.setField(content,f,v);
+			}
+		}
 		ide.filterPrefabs(function(p:hrt.prefab.Prefab) {
 		ide.filterPrefabs(function(p:hrt.prefab.Prefab) {
 			changed = false;
 			changed = false;
 			p.source = filter(p.source);
 			p.source = filter(p.source);
@@ -279,40 +311,17 @@ class FileTree extends FileView {
 			if( h.onResourceRenamed != null )
 			if( h.onResourceRenamed != null )
 				h.onResourceRenamed(filter);
 				h.onResourceRenamed(filter);
 			else {
 			else {
-				var visited = new Array<Dynamic>();
-				function browseRec(obj:Dynamic) : Dynamic {
-					switch( Type.typeof(obj) ) {
-					case TObject:
-						if( visited.indexOf(obj) >= 0 ) return null;
-						visited.push(obj);
-						for( f in Reflect.fields(obj) ) {
-							var v : Dynamic = Reflect.field(obj, f);
-							v = browseRec(v);
-							if( v != null ) Reflect.setField(obj, f, v);
-						}
-					case TClass(Array):
-						if( visited.indexOf(obj) >= 0 ) return null;
-						visited.push(obj);
-						var arr : Array<Dynamic> = obj;
-						for( i in 0...arr.length ) {
-							var v : Dynamic = arr[i];
-							v = browseRec(v);
-							if( v != null ) arr[i] = v;
-						}
-					case TClass(String):
-						return filter(obj);
-					default:
-					}
-					return null;
-				}
-				for( f in Reflect.fields(p) ) {
-					var v = browseRec(Reflect.field(p,f));
-					if( v != null ) Reflect.setField(p,f,v);
-				}
+				filterContent(p);
 			}
 			}
 			return changed;
 			return changed;
 		});
 		});
 
 
+		ide.filterProps(function(content:Dynamic) {
+			changed = false;
+			filterContent(content);
+			return changed;
+		});
+
 		changed = false;
 		changed = false;
 		var tmpSheets = [];
 		var tmpSheets = [];
 		for( sheet in ide.database.sheets ) {
 		for( sheet in ide.database.sheets ) {

+ 1 - 24
hide/view/Model.hx

@@ -202,30 +202,7 @@ class Model extends FileView {
 		<br/>
 		<br/>
 		');
 		');
 
 
-		var materials : Array<{path:String, mat:hrt.prefab.Material}> = [];
-		var parts = getPath().split("/");
-		var dirs = [];
-		for ( p in parts ) {
-			if ( dirs.length != 0 ) {
-				dirs.push(dirs[dirs.length-1] + "/" + p);
-			} else {
-				dirs.push(p);
-			}
-		}
-		var baseDir = hxd.impl.Api.downcast(hxd.res.Loader.currentInstance.fs, hxd.fs.LocalFileSystem).baseDir;
-		for ( d in dirs ) {
-			try {
-				var path = d + "/materialLibrary.prefab";
-				path = path.split(baseDir)[1];
-				var prefab = hxd.res.Loader.currentInstance.load(path).toPrefab().load();
-				var mats = prefab.getAll(hrt.prefab.Material);
-				for ( m in mats ) {
-					materials.push( { path : path, mat : m } );
-				}
-			} catch(e: Dynamic) {
-			}
-		}
-		materials.sort((m1, m2) -> { return (m1.mat.name > m2.mat.name ? 1 : -1); });
+		var materials = scene.listMaterialFromLibraries(getPath());
 
 
 		var selected = null;
 		var selected = null;
 		var props : Dynamic =  h3d.mat.MaterialSetup.current.loadMaterialProps(m);
 		var props : Dynamic =  h3d.mat.MaterialSetup.current.loadMaterialProps(m);