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

ModelLibrary : - Fix dynamic shaders not being correctly applied

TothBenoit пре 8 месеци
родитељ
комит
c8686f1a1e
1 измењених фајлова са 15 додато и 12 уклоњено
  1. 15 12
      hrt/prefab/l3d/ModelLibrary.hx

+ 15 - 12
hrt/prefab/l3d/ModelLibrary.hx

@@ -219,25 +219,22 @@ class ModelLibraryInstance {
 			var materialClone = h3d.mat.MaterialSetup.current.createMaterial();
 			var materialClone = h3d.mat.MaterialSetup.current.createMaterial();
 			material.clone(materialClone);
 			material.clone(materialClone);
 
 
+			var shaderKey = "";
 			var props = h3d.mat.MaterialSetup.current.loadMaterialProps(material);
 			var props = h3d.mat.MaterialSetup.current.loadMaterialProps(material);
-			var prefab = null;
 			if ( props != null ) {
 			if ( props != null ) {
 				var ref = (props:Dynamic).__ref;
 				var ref = (props:Dynamic).__ref;
 				if ( ref != null ) {
 				if ( ref != null ) {
-					prefab = hxd.res.Loader.currentInstance.load(ref).toPrefab();
+					var prefab = hxd.res.Loader.currentInstance.load(ref).toPrefab();
 					hxd.fmt.hmd.Library.setupMaterialLibrary(path -> hxd.res.Loader.currentInstance.load(path).toTexture(),
 					hxd.fmt.hmd.Library.setupMaterialLibrary(path -> hxd.res.Loader.currentInstance.load(path).toTexture(),
 					materialClone, prefab, (props:Dynamic).name);
 					materialClone, prefab, (props:Dynamic).name);
+					var libMat = prefab.load().getOpt(hrt.prefab.Material, (props:Dynamic).name);
+					for ( c in libMat.children )
+						shaderKey += haxe.Json.stringify(@:privateAccess c.serialize());
 				}
 				}
 			}
 			}
 
 
-			var shaderKey = "";
 			var props = (material.props : PbrProps);
 			var props = (material.props : PbrProps);
-			var libMat = prefab != null ? prefab.load().getOpt(hrt.prefab.Material, (props:Dynamic).name) : null;
-			if ( libMat != null )
-				for ( c in libMat.children )
-					shaderKey += haxe.Json.stringify(@:privateAccess c.serialize());
 			var key = haxe.Json.stringify(props) + shaderKey + appendToKey;
 			var key = haxe.Json.stringify(props) + shaderKey + appendToKey;
-
 			var batchID = batchLookup.get(key);
 			var batchID = batchLookup.get(key);
 			if ( batchID == null ) {
 			if ( batchID == null ) {
 				batchID = batchCache.length;
 				batchID = batchCache.length;
@@ -1045,11 +1042,17 @@ class ModelLibrary extends Prefab {
 
 
 		if ( material != null ) {
 		if ( material != null ) {
 			for ( s in material.mainPass.getShaders())
 			for ( s in material.mainPass.getShaders())
-				if ( !isForbiddenShader(s) && batch.material.mainPass.getShader(Type.getClass(s)) == null )
-					batch.material.mainPass.addShader(s.clone());
+				if ( !isForbiddenShader(s) ) {
+					var shader = batch.material.mainPass.getShader(Type.getClass(s));
+					if ( shader == null || (s.toString() != shader.toString()))
+						batch.material.mainPass.addShader(s.clone());
+				}
 			for ( s in @:privateAccess material.mainPass.selfShaders )
 			for ( s in @:privateAccess material.mainPass.selfShaders )
-				if ( !isForbiddenShader(s) && batch.material.mainPass.getShader(Type.getClass(s)) == null )
-					@:privateAccess batch.material.mainPass.addSelfShader(s.clone());
+				if ( !isForbiddenShader(s) ) {
+					var shader = batch.material.mainPass.getShader(Type.getClass(s));
+					if ( shader == null || (s.toString() != shader.toString()))
+						@:privateAccess batch.material.mainPass.addSelfShader(s.clone());
+				}
 		}
 		}
 
 
 		if ( isStatic ) {
 		if ( isStatic ) {