75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import fcbh.utils
 | |
| 
 | |
| def reshape_latent_to(target_shape, latent):
 | |
|     if latent.shape[1:] != target_shape[1:]:
 | |
|         latent.movedim(1, -1)
 | |
|         latent = fcbh.utils.common_upscale(latent, target_shape[3], target_shape[2], "bilinear", "center")
 | |
|         latent.movedim(-1, 1)
 | |
|     return fcbh.utils.repeat_to_batch_size(latent, target_shape[0])
 | |
| 
 | |
| 
 | |
| class LatentAdd:
 | |
|     @classmethod
 | |
|     def INPUT_TYPES(s):
 | |
|         return {"required": { "samples1": ("LATENT",), "samples2": ("LATENT",)}}
 | |
| 
 | |
|     RETURN_TYPES = ("LATENT",)
 | |
|     FUNCTION = "op"
 | |
| 
 | |
|     CATEGORY = "latent/advanced"
 | |
| 
 | |
|     def op(self, samples1, samples2):
 | |
|         samples_out = samples1.copy()
 | |
| 
 | |
|         s1 = samples1["samples"]
 | |
|         s2 = samples2["samples"]
 | |
| 
 | |
|         s2 = reshape_latent_to(s1.shape, s2)
 | |
|         samples_out["samples"] = s1 + s2
 | |
|         return (samples_out,)
 | |
| 
 | |
| class LatentSubtract:
 | |
|     @classmethod
 | |
|     def INPUT_TYPES(s):
 | |
|         return {"required": { "samples1": ("LATENT",), "samples2": ("LATENT",)}}
 | |
| 
 | |
|     RETURN_TYPES = ("LATENT",)
 | |
|     FUNCTION = "op"
 | |
| 
 | |
|     CATEGORY = "latent/advanced"
 | |
| 
 | |
|     def op(self, samples1, samples2):
 | |
|         samples_out = samples1.copy()
 | |
| 
 | |
|         s1 = samples1["samples"]
 | |
|         s2 = samples2["samples"]
 | |
| 
 | |
|         s2 = reshape_latent_to(s1.shape, s2)
 | |
|         samples_out["samples"] = s1 - s2
 | |
|         return (samples_out,)
 | |
| 
 | |
| class LatentMultiply:
 | |
|     @classmethod
 | |
|     def INPUT_TYPES(s):
 | |
|         return {"required": { "samples": ("LATENT",),
 | |
|                               "multiplier": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
 | |
|                              }}
 | |
| 
 | |
|     RETURN_TYPES = ("LATENT",)
 | |
|     FUNCTION = "op"
 | |
| 
 | |
|     CATEGORY = "latent/advanced"
 | |
| 
 | |
|     def op(self, samples, multiplier):
 | |
|         samples_out = samples.copy()
 | |
| 
 | |
|         s1 = samples["samples"]
 | |
|         samples_out["samples"] = s1 * multiplier
 | |
|         return (samples_out,)
 | |
| 
 | |
| NODE_CLASS_MAPPINGS = {
 | |
|     "LatentAdd": LatentAdd,
 | |
|     "LatentSubtract": LatentSubtract,
 | |
|     "LatentMultiply": LatentMultiply,
 | |
| }
 |