Update nodes.py

This commit is contained in:
kijai 2025-01-27 16:12:16 +02:00
parent 5b19d811ab
commit a53d0e3f56

100
nodes.py
View File

@ -144,7 +144,7 @@ class DownloadAndLoadHy3DDelightModel:
}, },
} }
RETURN_TYPES = ("DELIGHTMODEL",) RETURN_TYPES = ("HY3DDIFFUSERSPIPE",)
RETURN_NAMES = ("delight_pipe", ) RETURN_NAMES = ("delight_pipe", )
FUNCTION = "loadmodel" FUNCTION = "loadmodel"
CATEGORY = "Hunyuan3DWrapper" CATEGORY = "Hunyuan3DWrapper"
@ -184,7 +184,7 @@ class Hy3DDelightImage:
def INPUT_TYPES(s): def INPUT_TYPES(s):
return { return {
"required": { "required": {
"delight_pipe": ("DELIGHTMODEL",), "delight_pipe": ("HY3DDIFFUSERSPIPE",),
"image": ("IMAGE", ), "image": ("IMAGE", ),
"steps": ("INT", {"default": 50, "min": 1}), "steps": ("INT", {"default": 50, "min": 1}),
"width": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 16}), "width": ("INT", {"default": 512, "min": 64, "max": 4096, "step": 16}),
@ -192,6 +192,9 @@ class Hy3DDelightImage:
"cfg_image": ("FLOAT", {"default": 1.5, "min": 0.0, "max": 100.0, "step": 0.01}), "cfg_image": ("FLOAT", {"default": 1.5, "min": 0.0, "max": 100.0, "step": 0.01}),
"cfg_text": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.01}), "cfg_text": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.01}),
"seed": ("INT", {"default": 42, "min": 0, "max": 0xffffffffffffffff}), "seed": ("INT", {"default": 42, "min": 0, "max": 0xffffffffffffffff}),
},
"optional": {
"scheduler": ("NOISESCHEDULER",),
} }
} }
@ -200,11 +203,19 @@ class Hy3DDelightImage:
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "Hunyuan3DWrapper" CATEGORY = "Hunyuan3DWrapper"
def process(self, delight_pipe, image, width, height, cfg_image, cfg_text, steps, seed): def process(self, delight_pipe, image, width, height, cfg_image, cfg_text, steps, seed, scheduler=None):
device = mm.get_torch_device() device = mm.get_torch_device()
offload_device = mm.unet_offload_device() offload_device = mm.unet_offload_device()
if scheduler is not None:
if not hasattr(self, "default_scheduler"):
self.default_scheduler = delight_pipe.scheduler
delight_pipe.scheduler = scheduler
else:
if hasattr(self, "default_scheduler"):
delight_pipe.scheduler = self.default_scheduler
image = image.permute(0, 3, 1, 2).to(device) image = image.permute(0, 3, 1, 2).to(device)
image = delight_pipe( image = delight_pipe(
@ -233,7 +244,7 @@ class DownloadAndLoadHy3DPaintModel:
}, },
} }
RETURN_TYPES = ("HY3DPAINTMODEL",) RETURN_TYPES = ("HY3DDIFFUSERSPIPE",)
RETURN_NAMES = ("multiview_pipe", ) RETURN_NAMES = ("multiview_pipe", )
FUNCTION = "loadmodel" FUNCTION = "loadmodel"
CATEGORY = "Hunyuan3DWrapper" CATEGORY = "Hunyuan3DWrapper"
@ -586,13 +597,63 @@ class Hy3DRenderMultiViewDepth:
depth_maps.append(depth_map) depth_maps.append(depth_map)
return depth_maps return depth_maps
class Hy3DDiffusersSchedulerConfig:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("HY3DDIFFUSERSPIPE",),
"scheduler": (available_schedulers,
{
"default": 'Euler A'
}),
"sigmas": (["default", "karras", "exponential", "beta"],),
},
}
RETURN_TYPES = ("NOISESCHEDULER",)
RETURN_NAMES = ("diffusers_scheduler",)
FUNCTION = "process"
CATEGORY = "Hunyuan3DWrapper"
def process(self, pipeline, scheduler, sigmas):
scheduler_config = dict(pipeline.scheduler.config)
if scheduler in scheduler_mapping:
if scheduler == "DPM++SDE":
scheduler_config["algorithm_type"] = "sde-dpmsolver++"
else:
scheduler_config.pop("algorithm_type", None)
if sigmas == "default":
scheduler_config["use_karras_sigmas"] = False
scheduler_config["use_exponential_sigmas"] = False
scheduler_config["use_beta_sigmas"] = False
elif sigmas == "karras":
scheduler_config["use_karras_sigmas"] = True
scheduler_config["use_exponential_sigmas"] = False
scheduler_config["use_beta_sigmas"] = False
elif sigmas == "exponential":
scheduler_config["use_karras_sigmas"] = False
scheduler_config["use_exponential_sigmas"] = True
scheduler_config["use_beta_sigmas"] = False
elif sigmas == "beta":
scheduler_config["use_karras_sigmas"] = False
scheduler_config["use_exponential_sigmas"] = False
scheduler_config["use_beta_sigmas"] = True
noise_scheduler = scheduler_mapping[scheduler].from_config(scheduler_config)
else:
raise ValueError(f"Unknown scheduler: {scheduler}")
return (noise_scheduler,)
class Hy3DSampleMultiView: class Hy3DSampleMultiView:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return { return {
"required": { "required": {
"pipeline": ("HY3DPAINTMODEL",), "pipeline": ("HY3DDIFFUSERSPIPE",),
"ref_image": ("IMAGE", ), "ref_image": ("IMAGE", ),
"normal_maps": ("IMAGE", ), "normal_maps": ("IMAGE", ),
"position_maps": ("IMAGE", ), "position_maps": ("IMAGE", ),
@ -602,10 +663,7 @@ class Hy3DSampleMultiView:
}, },
"optional": { "optional": {
"camera_config": ("HY3DCAMERA",), "camera_config": ("HY3DCAMERA",),
"scheduler": (available_schedulers, "scheduler": ("NOISESCHEDULER",),
{
"default": 'Euler A'
}),
} }
} }
@ -614,7 +672,7 @@ class Hy3DSampleMultiView:
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "Hunyuan3DWrapper" CATEGORY = "Hunyuan3DWrapper"
def process(self, pipeline, ref_image, normal_maps, position_maps, view_size, seed, steps, camera_config=None, scheduler="Euler A"): def process(self, pipeline, ref_image, normal_maps, position_maps, view_size, seed, steps, camera_config=None, scheduler=None):
device = mm.get_torch_device() device = mm.get_torch_device()
mm.soft_empty_cache() mm.soft_empty_cache()
torch.manual_seed(seed) torch.manual_seed(seed)
@ -655,17 +713,13 @@ class Hy3DSampleMultiView:
callback = ComfyProgressCallback(total_steps=steps) callback = ComfyProgressCallback(total_steps=steps)
scheduler_config = dict(pipeline.scheduler.config) if scheduler is not None:
if not hasattr(self, "default_scheduler"):
if scheduler in scheduler_mapping: self.default_scheduler = pipeline.scheduler
if scheduler == "DPM++SDE": pipeline.scheduler = scheduler
scheduler_config["algorithm_type"] = "sde-dpmsolver++"
else:
scheduler_config.pop("algorithm_type", None)
noise_scheduler = scheduler_mapping[scheduler].from_config(scheduler_config)
pipeline.scheduler = noise_scheduler
else: else:
raise ValueError(f"Unknown scheduler: {scheduler}") if hasattr(self, "default_scheduler"):
pipeline.scheduler = self.default_scheduler
multiview_images = pipeline( multiview_images = pipeline(
input_image, input_image,
@ -1166,7 +1220,8 @@ NODE_CLASS_MAPPINGS = {
"Hy3DSetMeshPBRTextures": Hy3DSetMeshPBRTextures, "Hy3DSetMeshPBRTextures": Hy3DSetMeshPBRTextures,
"Hy3DSetMeshPBRAttributes": Hy3DSetMeshPBRAttributes, "Hy3DSetMeshPBRAttributes": Hy3DSetMeshPBRAttributes,
"Hy3DVAEDecode": Hy3DVAEDecode, "Hy3DVAEDecode": Hy3DVAEDecode,
"Hy3DRenderSingleView": Hy3DRenderSingleView "Hy3DRenderSingleView": Hy3DRenderSingleView,
"Hy3DDiffusersSchedulerConfig": Hy3DDiffusersSchedulerConfig
} }
NODE_DISPLAY_NAME_MAPPINGS = { NODE_DISPLAY_NAME_MAPPINGS = {
"Hy3DModelLoader": "Hy3DModelLoader", "Hy3DModelLoader": "Hy3DModelLoader",
@ -1191,5 +1246,6 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"Hy3DSetMeshPBRTextures": "Hy3D Set Mesh PBR Textures", "Hy3DSetMeshPBRTextures": "Hy3D Set Mesh PBR Textures",
"Hy3DSetMeshPBRAttributes": "Hy3D Set Mesh PBR Attributes", "Hy3DSetMeshPBRAttributes": "Hy3D Set Mesh PBR Attributes",
"Hy3DVAEDecode": "Hy3D VAE Decode", "Hy3DVAEDecode": "Hy3D VAE Decode",
"Hy3DRenderSingleView": "Hy3D Render SingleView" "Hy3DRenderSingleView": "Hy3D Render SingleView",
"Hy3DDiffusersSchedulerConfig": "Hy3D Diffusers Scheduler Config"
} }