瀏覽代碼

Use getObjects filters to prevent FX target shaders to be applied on the whole FXAnimation if target object has it in its hierarchy.

clementlandrin 9 月之前
父節點
當前提交
a8b7bca3f5
共有 2 個文件被更改,包括 11 次插入7 次删除
  1. 5 4
      hrt/prefab/Shader.hx
  2. 6 3
      hrt/prefab/fx/FX.hx

+ 5 - 4
hrt/prefab/Shader.hx

@@ -14,6 +14,7 @@ class Shader extends Prefab {
 	@:s var recursiveApply = true;
 
 	public var shader : hxsl.Shader;
+	public var filterObj : h3d.scene.Object -> Bool;
 
 	function new(parent, sh: ContextShared) {
 		super(parent, sh);
@@ -126,17 +127,17 @@ class Shader extends Prefab {
 			}
 			if( recursiveApply ) {
 				for( c in parent.flatten() )
-					for( o in shared.getObjects(c, h3d.scene.Object) )
+					for( o in shared.getObjects(c, h3d.scene.Object, filterObj) )
 						pushUnique(o);
 			} else if( parent.type == "object" ) {
 				// apply to all immediate children
 				for( c in parent.children )
-					for( o in shared.getObjects(c, h3d.scene.Object) )
+					for( o in shared.getObjects(c, h3d.scene.Object, filterObj) )
 						pushUnique(o);
 			} else {
 				var obj3d = Std.downcast(parent,hrt.prefab.Object3D);
 				if (obj3d != null)
-					objs = obj3d.getObjects(h3d.scene.Object);
+					objs = obj3d.getObjects(h3d.scene.Object, filterObj);
 			}
 			for( obj in objs )
 				for( m in obj.getMaterials(false) )
@@ -147,7 +148,7 @@ class Shader extends Prefab {
 	override function dispose() {
 		if( shared.current3d != null )
 			iterMaterials(function(obj,mat) if(checkMaterial(mat)) removeShader(obj, mat, shader));
-
+		filterObj = null;
 		super.dispose();
 	}
 

+ 6 - 3
hrt/prefab/fx/FX.hx

@@ -574,7 +574,7 @@ class FX extends Object3D implements BaseFX {
 	override function make( ?sh:hrt.prefab.Prefab.ContextMake) : Prefab  {
 		if ( shaderTargets != null) {
 			for ( target in shaderTargets ) {
-				var shadersRoot = find(Prefab, p -> target.name == p.name);
+				var shadersRoot = find(Prefab, p -> target.name == p.name && p.enabled);
 				if ( shadersRoot == null )
 					continue;
 				var newRoot = new hrt.prefab.Object3D(null, sh);
@@ -664,6 +664,8 @@ class FX extends Object3D implements BaseFX {
 	}
 
 	function applyShadersToTargets() {
+		var fxAnim : FXAnimation = cast local3d;
+
 		for ( target in shaderTargets ) {
 			if ( target.object == null )
 				continue;
@@ -674,11 +676,12 @@ class FX extends Object3D implements BaseFX {
 			if ( obj3d == null )
 				continue;
 			obj3d.local3d = target.object;
-			for ( s in obj3d.findAll(Shader) )
+			for ( s in obj3d.findAll(Shader) ) {
+				s.filterObj = o -> return o != fxAnim;
 				s.apply3d();
+			}
 		}
 
-		var fxAnim : FXAnimation = cast local3d;
 		fxAnim.onRemoveFun = function() {
 			for ( target in shaderTargets ) {
 				if ( target.object == null )