Преглед изворни кода

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 година
родитељ
комит
35342f8901
4 измењених фајлова са 87 додато и 54 уклоњено
  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();
 	}
 
+	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 browseRec(path) {
 			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);
 	}
 
+	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;
 		}
 
+		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) {
 			changed = false;
 			p.source = filter(p.source);
@@ -279,40 +311,17 @@ class FileTree extends FileView {
 			if( h.onResourceRenamed != null )
 				h.onResourceRenamed(filter);
 			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;
 		});
 
+		ide.filterProps(function(content:Dynamic) {
+			changed = false;
+			filterContent(content);
+			return changed;
+		});
+
 		changed = false;
 		var tmpSheets = [];
 		for( sheet in ide.database.sheets ) {

+ 1 - 24
hide/view/Model.hx

@@ -202,30 +202,7 @@ class Model extends FileView {
 		<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 props : Dynamic =  h3d.mat.MaterialSetup.current.loadMaterialProps(m);