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

Convert: add localContext to caching result for localParams

Yuxiao Mao 1 hónapja
szülő
commit
80c0327b16
2 módosított fájl, 40 hozzáadás és 11 törlés
  1. 27 8
      hxd/fs/Convert.hx
  2. 13 3
      hxd/fs/FileConverter.hx

+ 27 - 8
hxd/fs/Convert.hx

@@ -52,7 +52,15 @@ class Convert {
 		return false;
 	}
 
-	public function computeLocalParams():Dynamic {
+	/**
+		Context will be cached and passed to computeLocalParams next time if file hash has not changed.
+		This function will be called after each call to computeLocalParams for refresh the cache.
+	**/
+	public function getLocalContext():Dynamic {
+		return null;
+	}
+
+	public function computeLocalParams(context:Dynamic):Dynamic {
 		return null;
 	}
 
@@ -98,6 +106,7 @@ class Convert {
 #if (sys || nodejs)
 class ConvertFBX2HMD extends Convert {
 	var fbx : hxd.fmt.fbx.Data.FbxNode;
+	var matNames : Array<String>;
 
 	public function new() {
 		super("fbx", "hmd");
@@ -106,20 +115,30 @@ class ConvertFBX2HMD extends Convert {
 	override function cleanup() {
 		super.cleanup();
 		fbx = null;
+		matNames = null;
 	}
 
 	override function hasLocalParams():Bool {
 		return (params != null && params.collide != null);
 	}
 
-	override function computeLocalParams():Dynamic {
+	override function getLocalContext():Dynamic {
+		return { matNames : matNames };
+	}
+
+	override function computeLocalParams(context:Dynamic):Dynamic {
 		// Parse fbx to find used materials
-		fbx = try hxd.fmt.fbx.Parser.parse(srcBytes) catch (e:Dynamic) throw Std.string(e) + " in " + srcPath;
-		var matNodes = hxd.fmt.fbx.Data.FbxTools.getAll(fbx, "Objects.Material");
-		var matNames = [];
-		for( o in matNodes ) {
-			var name = hxd.fmt.fbx.Data.FbxTools.getName(o);
-			matNames.push(name);
+		if( context != null && context.matNames != null && Std.isOfType(context.matNames, Array) ) {
+			matNames = context.matNames;
+		}
+		if( matNames == null ) {
+			fbx = try hxd.fmt.fbx.Parser.parse(srcBytes) catch (e:Dynamic) throw Std.string(e) + " in " + srcPath;
+			var matNodes = hxd.fmt.fbx.Data.FbxTools.getAll(fbx, "Objects.Material");
+			matNames = [];
+			for( o in matNodes ) {
+				var name = hxd.fmt.fbx.Data.FbxTools.getName(o);
+				matNames.push(name);
+			}
 		}
 		// Parse material.props to find material config
 		var ignoredMaterials = [];

+ 13 - 3
hxd/fs/FileConverter.hx

@@ -35,7 +35,7 @@ class FileConverter {
 	var tmpDir : String;
 	var configs : Map<String,ConvertConfig> = new Map();
 	var defaultConfig : ConvertConfig;
-	var cache : Map<String,Array<{ out : String, time : Int, hash : String, ver : Null<Int>, milliseconds : Null<Int>, localParamsHash : Null<String> }>>;
+	var cache : Map<String,Array<{ out : String, time : Int, hash : String, ver : Null<Int>, milliseconds : Null<Int>, localParamsHash : Null<String>, localContextJson : Null<String> }>>;
 	var cacheTime : Float;
 
 	static var extraConfigs:Array<Dynamic> = [];
@@ -311,7 +311,8 @@ class FileConverter {
 				hash : "",
 				ver: conv.version,
 				milliseconds : #if js 0 #else null #end,
-				localParamsHash: null
+				localParamsHash: null,
+				localContextJson: null,
 			};
 			entry.push(match);
 		}
@@ -345,13 +346,20 @@ class FileConverter {
 		var hash = haxe.crypto.Sha1.make(content).toHex();
 		conv.srcBytes = content;
 		conv.hash = hash;
-		var localParams = hasLocalParams ? conv.computeLocalParams() : null;
+		var localContext : Dynamic = null;
+		if( match.ver == conv.version && match.hash == hash && match.localContextJson != null ) {
+			localContext = try { haxe.Json.parse(match.localContextJson); } catch(e) { null; }
+		}
+		var localParams = hasLocalParams ? conv.computeLocalParams(localContext) : null;
 		conv.localParams = localParams;
 		var localParamsHash = localParams == null ? null : haxe.crypto.Sha1.make(haxe.io.Bytes.ofString(formatValue(localParams))).toHex();
+		localContext = conv.getLocalContext();
+		var localContextJson = localContext == null ? null : haxe.Json.stringify(localContext);
 		if( alreadyGen && match.hash == hash && match.localParamsHash == localParamsHash ) {
 			conv.cleanup();
 			match.time = time;
 			match.milliseconds = milliseconds;
+			match.localContextJson = localContextJson;
 			saveCache();
 			return; // not changed (hash)
 		}
@@ -370,6 +378,8 @@ class FileConverter {
 		match.milliseconds = milliseconds;
 		match.hash = hash;
 		match.localParamsHash = localParamsHash;
+		match.localContextJson = localContextJson;
+
 		saveCache();
 	}