Browse Source

split database management from material setup

Nicolas Cannasse 8 years ago
parent
commit
a0021de3b1
2 changed files with 86 additions and 68 deletions
  1. 81 0
      h3d/mat/MaterialDatabase.hx
  2. 5 68
      h3d/mat/MaterialSetup.hx

+ 81 - 0
h3d/mat/MaterialDatabase.hx

@@ -0,0 +1,81 @@
+package h3d.mat;
+
+class MaterialDatabase {
+
+	public var file(default, null) : String;
+	var db : Dynamic;
+
+	public function new( file : String ) {
+		this.file = file;
+	}
+
+	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);
+		return path;
+	}
+
+	function load() {
+		db = try haxe.Json.parse(hxd.res.Loader.currentInstance.load(file).toText()) catch( e : hxd.res.NotFound ) {};
+	}
+
+	function save() {
+		#if sys
+		var path = haxe.macro.Compiler.getDefine("resourcesPath");
+		if( path == null ) path = "res";
+		sys.io.File.saveContent(path + "/" + file, haxe.Json.stringify(db, "\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 saveProps( material : Material, setup : MaterialSetup ) {
+		if( db == null ) load();
+		var path = getPath(material, setup);
+		var root : Dynamic = db;
+		var prevs = [];
+		for( i in 0...path.length - 1 ) {
+			var next = Reflect.field(root, path[i]);
+			if( next == null ) {
+				next = {};
+				Reflect.setField(root, path[i], next);
+			}
+			prevs.push(root);
+			root = next;
+		}
+		var name = path.pop();
+		Reflect.deleteField(root, name);
+
+		var currentProps = material.props;
+		setup.initModelMaterial(material); // reset to default
+		if( Std.string(material.props) == Std.string(currentProps) ) {
+			// cleanup
+			while( path.length > 0 ) {
+				var name = path.pop();
+				var root = prevs.pop();
+				if( Reflect.fields(Reflect.field(root, name)).length != 0 )
+					break;
+				Reflect.deleteField(root, name);
+			}
+		} else {
+			Reflect.setField(root, name, currentProps);
+		}
+		material.props = currentProps;
+		save();
+	}
+
+}

+ 5 - 68
h3d/mat/MaterialSetup.hx

@@ -18,8 +18,11 @@ private typedef DefaultProps = {
 class MaterialSetup {
 class MaterialSetup {
 
 
 	public var name(default,null) : String;
 	public var name(default,null) : String;
+	var database : MaterialDatabase;
 
 
 	public function new(name) {
 	public function new(name) {
+		if( database == null )
+			database = new MaterialDatabase("materials.json");
 		this.name = name;
 		this.name = name;
 	}
 	}
 
 
@@ -32,73 +35,13 @@ class MaterialSetup {
 	}
 	}
 
 
 	public function initModelMaterial( material : Material ) {
 	public function initModelMaterial( material : Material ) {
-		var props = getStoredProps(getMaterialDBPath(material));
+		var props = database.loadProps(material, this);
 		if( props == null ) props = getDefaults();
 		if( props == null ) props = getDefaults();
 		material.props = props;
 		material.props = props;
 	}
 	}
 
 
-	function getMaterialDBPath( material : Material ) {
-		var path = material.model.entry.path.split("/");
-		path.pop();
-		path.push(material.name);
-		path.unshift(name);
-		return path;
-	}
-
 	public function saveModelMaterial( material : Material ) {
 	public function saveModelMaterial( material : Material ) {
-		if( materialDB == null ) loadDB();
-		var path = getMaterialDBPath(material);
-		var root : Dynamic = materialDB;
-		var prevs = [];
-		for( i in 0...path.length - 1 ) {
-			var next = Reflect.field(root, path[i]);
-			if( next == null ) {
-				next = {};
-				Reflect.setField(root, path[i], next);
-			}
-			prevs.push(root);
-			root = next;
-		}
-		var name = path.pop();
-		Reflect.deleteField(root, name);
-
-		var currentProps = material.props;
-		initModelMaterial(material); // reset to default
-		if( Std.string(material.props) == Std.string(currentProps) ) {
-			// cleanup
-			while( path.length > 0 ) {
-				var name = path.pop();
-				var root = prevs.pop();
-				if( Reflect.fields(Reflect.field(root, name)).length != 0 )
-					break;
-				Reflect.deleteField(root, name);
-			}
-		} else {
-			Reflect.setField(root, name, currentProps);
-			material.props = currentProps;
-		}
-		saveDB();
-	}
-
-	function saveDB() {
-		#if sys
-		var path = haxe.macro.Compiler.getDefine("resourcesPath");
-		if( path == null ) path = "res";
-		sys.io.File.saveContent(path + "/" + dbPath, haxe.Json.stringify(materialDB, "\t"));
-		#else
-		throw "Can't save material props database " + dbPath;
-		#end
-	}
-
-	function getStoredProps( path : Array<String> ) {
-		if( materialDB == null ) loadDB();
-		var root : Dynamic = materialDB;
-		while( path.length > 0 ) {
-			root = Reflect.field(root, path.shift());
-			if( root == null )
-				return null;
-		}
-		return root;
+		database.saveProps(material, this);
 	}
 	}
 
 
 	public function getDefaults( ?type : String ) : Any {
 	public function getDefaults( ?type : String ) : Any {
@@ -178,10 +121,4 @@ class MaterialSetup {
 
 
 	public static var current = new MaterialSetup("Default");
 	public static var current = new MaterialSetup("Default");
 
 
-	static var dbPath = "materials.json";
-	static var materialDB : Dynamic;
-	static function loadDB() {
-		materialDB = try haxe.Json.parse(hxd.res.Loader.currentInstance.load(dbPath).toText()) catch( e : hxd.res.NotFound ) {};
-	}
-
 }
 }