瀏覽代碼

changed material database impl: per model .props file

ncannasse 7 年之前
父節點
當前提交
125b779e6c
共有 3 個文件被更改,包括 56 次插入41 次删除
  1. 48 33
      h3d/mat/MaterialDatabase.hx
  2. 7 7
      h3d/mat/MaterialSetup.hx
  3. 1 1
      hxd/fmt/hmd/Library.hx

+ 48 - 33
h3d/mat/MaterialDatabase.hx

@@ -2,52 +2,63 @@ package h3d.mat;
 
 class MaterialDatabase {
 
-	public var file(default, null) : String;
-	var db : Dynamic;
+	var db : Map<String,{ v : Dynamic }> = new Map();
 
-	public function new( file : String ) {
-		this.file = file;
+	public function new() {
 	}
 
-	function getPath( material : Material, setup : MaterialSetup ) {
-		var path = material.model == null ? [] : material.model.entry.path.split("/");
-		path.pop();
-		path.push(material.name);
-		path.unshift(setup.name);
+	function getFilePath( model : hxd.res.Resource ) {
+		var file = model.entry.path.split(".");
+		file.pop();
+		var path = file.join(".")+".props";
+		#if (sys || nodejs)
+		var fs = Std.instance(hxd.res.Loader.currentInstance.fs, hxd.fs.LocalFileSystem);
+		if( fs != null && !haxe.io.Path.isAbsolute(path) )
+			path = fs.baseDir + "/" + path;
+		#end
 		return path;
 	}
 
-	function load() {
-		db = try haxe.Json.parse(hxd.res.Loader.currentInstance.load(file).toText()) catch( e : hxd.res.NotFound ) { type : "materialDB" };
+	public function getModelData( model : hxd.res.Resource ) {
+		if( model == null )
+			return null;
+		var cached = db.get(model.entry.path);
+		if( cached != null )
+			return cached.v;
+		var file = getFilePath(model);
+		var value = try haxe.Json.parse(hxd.res.Loader.currentInstance.load(file).toText()) catch( e : hxd.res.NotFound ) {};
+		db.set(model.entry.path, { v : value });
+		return value;
 	}
 
-	function save() {
+	function saveData( model : hxd.res.Resource, data : Dynamic ) {
+		var file = getFilePath(model);
 		#if (sys || nodejs)
-		var fs = Std.instance(hxd.res.Loader.currentInstance.fs, hxd.fs.LocalFileSystem);
-		if( fs != null ) {
-			sys.io.File.saveContent(fs.baseDir + "/" + file, haxe.Json.stringify(db, "\t"));
-			return;
-		}
-		#end
+		if( data == null )
+			(try sys.FileSystem.deleteFile(file) catch( e : Dynamic ) {});
+		else
+			sys.io.File.saveContent(file, haxe.Json.stringify(data, "\t"));
+		#else
 		throw "Can't save material props database " + file;
+		#end
 	}
 
-	public function loadProps( material : Material, setup : MaterialSetup ) {
-		if( db == null ) load();
-		var path = getPath(material, setup);
-		var root : Dynamic = db;
-		while( path.length > 0 ) {
-			root = Reflect.field(root, path.shift());
-			if( root == null )
-				return null;
-		}
-		return root;
+	public function loadMatProps( material : Material, setup : MaterialSetup ) {
+		var p : Dynamic = getModelData(material.model);
+		if( p == null ) return p;
+		p = p.materials;
+		if( p == null ) return p;
+		p = Reflect.field(p, setup.name);
+		if( p == null ) return p;
+		return Reflect.field(p, material.name);
 	}
 
-	public function saveProps( material : Material, setup : MaterialSetup ) {
-		if( db == null ) load();
-		var path = getPath(material, setup);
-		var root : Dynamic = db;
+	public function saveMatProps( material : Material, setup : MaterialSetup ) {
+		var path = ["materials", setup.name, material.name];
+		var root : Dynamic = getModelData(material.model);
+		if( root == null )
+			return;
+		var realRoot = root;
 		var prevs = [];
 		for( i in 0...path.length - 1 ) {
 			var next = Reflect.field(root, path[i]);
@@ -75,7 +86,11 @@ class MaterialDatabase {
 		} else {
 			Reflect.setField(root, name, currentProps);
 		}
-		save();
+
+		var file = getFilePath(material.model);
+		if( Reflect.fields(realRoot).length == 0 )
+			realRoot = null;
+		saveData(material.model, realRoot);
 	}
 
 }

+ 7 - 7
h3d/mat/MaterialSetup.hx

@@ -8,7 +8,7 @@ class MaterialSetup {
 
 	public function new(name) {
 		if( database == null )
-			database = new MaterialDatabase("materials.json");
+			database = new MaterialDatabase();
 		this.name = name;
 	}
 
@@ -24,17 +24,17 @@ class MaterialSetup {
 		return @:privateAccess new h3d.mat.Material();
 	}
 
-	public function loadProps( mat : h3d.mat.Material ) {
-		return database.loadProps(mat, this);
-	}
-
 	public function getDefaults( ?kind : String ) {
 		if( emptyMat == null ) emptyMat = createMaterial();
 		return emptyMat.getDefaultProps(kind);
 	}
 
-	public function saveModelMaterial( material : Material ) {
-		database.saveProps(material, this);
+	public function loadMaterialProps( material : h3d.mat.Material ) {
+		return database.loadMatProps(material, this);
+	}
+
+	public function saveMaterialProps( material : Material ) {
+		database.saveMatProps(material, this);
 	}
 
 	/*

+ 1 - 1
hxd/fmt/hmd/Library.hx

@@ -274,7 +274,7 @@ class Library {
 			mat.normalMap = loadTexture(m.normalMap);
 		mat.blendMode = m.blendMode;
 		mat.model = resource;
-		var props = h3d.mat.MaterialSetup.current.loadProps(mat);
+		var props = h3d.mat.MaterialSetup.current.loadMaterialProps(mat);
 		if( props == null ) props = mat.getDefaultModelProps();
 		mat.props = props;
 		return mat;