2
0
Эх сурвалжийг харах

Fix shader targets applied to fx

clementlandrin 8 сар өмнө
parent
commit
bdead1affb

+ 16 - 2
hrt/prefab/Material.hx

@@ -20,6 +20,8 @@ class Material extends Prefab {
 	@:s public var refMatLib : String;
 	@:s public var refMatLib : String;
 	@:s public var overrides : Array<Dynamic> = [];
 	@:s public var overrides : Array<Dynamic> = [];
 
 
+	public var filterObj : h3d.scene.Object -> Bool;
+
 	#if editor
 	#if editor
 	var previewSphere : h3d.scene.Object;
 	var previewSphere : h3d.scene.Object;
 	var gradientFollower : GradientFollower;
 	var gradientFollower : GradientFollower;
@@ -66,8 +68,20 @@ class Material extends Prefab {
 	public function getMaterials(local3d: h3d.scene.Object = null, includePreviewMats : Bool = false) {
 	public function getMaterials(local3d: h3d.scene.Object = null, includePreviewMats : Bool = false) {
 		if (local3d == null)
 		if (local3d == null)
 			local3d = findFirstLocal3d();
 			local3d = findFirstLocal3d();
-		var mats = local3d.getMaterials();
-		mats = mats.filter(m -> filter(m));
+		var mats = [];
+		if ( filterObj == null )
+			mats = local3d.getMaterials();
+		else {
+			function recObj(o : h3d.scene.Object) {
+				mats.concat(o.getMaterials(false));
+				for ( c in @:privateAccess o.children ) {
+					if ( !filterObj(c) )
+						continue;
+					recObj(c);
+				}
+			}
+			recObj(local3d);
+		}
 
 
 		#if editor
 		#if editor
 		if (this.previewSphere != null)
 		if (this.previewSphere != null)

+ 18 - 3
hrt/prefab/MaterialSelector.hx

@@ -13,12 +13,27 @@ class MaterialSelector extends hrt.prefab.Prefab {
 
 
 	@:s public var selections : Array<MaterialSelection> = [{
 	@:s public var selections : Array<MaterialSelection> = [{
 		passName : "all",
 		passName : "all",
-	}]; 
+	}];
+	public var filterObj : h3d.scene.Object -> Bool;
 
 
 	public function getPasses(local3d: h3d.scene.Object = null) : Array<SelectedPass> {
 	public function getPasses(local3d: h3d.scene.Object = null) : Array<SelectedPass> {
 		if (local3d == null)
 		if (local3d == null)
 			local3d = findFirstLocal3d();
 			local3d = findFirstLocal3d();
-		var mats = local3d.getMaterials();
+		var mats = [];
+		if ( filterObj == null )
+			mats = local3d.getMaterials();
+		else {
+			function recObj(o : h3d.scene.Object) {
+				mats.concat(o.getMaterials(false));
+				for ( c in @:privateAccess o.children ) {
+					if ( !filterObj(c) )
+						continue;
+					recObj(c);
+				}
+			}
+			recObj(local3d);
+		}
+
 		var passes = [];
 		var passes = [];
 		var selectionSorted = selections.copy();
 		var selectionSorted = selections.copy();
 		selectionSorted.sort((s1, s2) -> s1.passName == "all" ? return 1 : -1);
 		selectionSorted.sort((s1, s2) -> s1.passName == "all" ? return 1 : -1);
@@ -79,7 +94,7 @@ class MaterialSelector extends hrt.prefab.Prefab {
 		var add = new hide.Element('<li><p><a href="#">[+]</a></p></li>');
 		var add = new hide.Element('<li><p><a href="#">[+]</a></p></li>');
 		add.appendTo(list);
 		add.appendTo(list);
 		add.find("a").click(function(_) {
 		add.find("a").click(function(_) {
-			selections.push({ 
+			selections.push({
 				passName : "",
 				passName : "",
 			});
 			});
 			ctx.rebuildProperties();
 			ctx.rebuildProperties();

+ 9 - 1
hrt/prefab/Shader.hx

@@ -107,16 +107,24 @@ class Shader extends Prefab {
 
 
 		if( Std.isOfType(parent, Material) ) {
 		if( Std.isOfType(parent, Material) ) {
 			var material : Material = cast parent;
 			var material : Material = cast parent;
+			var prevFilterObj = material.filterObj;
+			if ( filterObj != null )
+				material.filterObj = filterObj;
 			for( m in material.getMaterials(true) )
 			for( m in material.getMaterials(true) )
-					callb(null, m);
+				callb(null, m);
+			material.filterObj = prevFilterObj;
 		} else if ( Std.isOfType(parent, MaterialSelector) ) {
 		} else if ( Std.isOfType(parent, MaterialSelector) ) {
 			var materialSelector = cast(parent, MaterialSelector);
 			var materialSelector = cast(parent, MaterialSelector);
+			var prevFilterObj = materialSelector.filterObj;
+			if ( filterObj != null )
+				materialSelector.filterObj = filterObj;
 			var passSelect = h3d.mat.MaterialSetup.current.createMaterial();
 			var passSelect = h3d.mat.MaterialSetup.current.createMaterial();
 			for ( p in materialSelector.getPasses() ) {
 			for ( p in materialSelector.getPasses() ) {
 				passSelect.name = p.all ? "" : PASS_SELECT;
 				passSelect.name = p.all ? "" : PASS_SELECT;
 				@:privateAccess passSelect.passes = p.pass;
 				@:privateAccess passSelect.passes = p.pass;
 				callb(null, passSelect);
 				callb(null, passSelect);
 			}
 			}
+			materialSelector.filterObj = prevFilterObj;
 		} else {
 		} else {
 			var objs = [];
 			var objs = [];
 			function pushUnique(obj : h3d.scene.Object ) {
 			function pushUnique(obj : h3d.scene.Object ) {