Files
2026-05-19 22:34:07 +08:00

566 lines
22 KiB
Python

from .modules.Rodin_Mainsite import process_full_generation, full_polygen_pipeline, QUALITY_MESH_DEFAULT, QUALITY_MESH_OPTIONS
RODIN_GEN_1_5_PARAS = {
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"PBR"}),
"Polygon_count": (["4K-Quad", "8K-Quad", "18K-Quad", "50K-Quad", "200K-Quad", "200K-Triangle"], {"default": "18K-Quad"}),
}
RODIN_GEN_2_PARAS = {
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"PBR"}),
"Polygon_count": (["4K-Quad", "8K-Quad", "18K-Quad", "50K-Quad", "200K-Quad", "2K-Triangle", "20K-Triangle", "150K-Triangle", "500K-Triangle", "1M-Triangle"], {"default": "500K-Triangle"}),
"TAPose": ("BOOLEAN", {"default": False}),
}
class mLoadRodinAPIKEY:
RETURN_TYPES = ("APIKEY",)
RETURN_NAMES = ("api_key",)
FUNCTION = "main_func"
CATEGORY = "Mesh/Rodin"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("STRING", {"default": "Get your API KEY from: https://hyper3d.ai/api-dashboard", "multiline": True})
},
}
async def main_func(self, api_key):
return (api_key,)
class mRodin3D_bbox_controlnet():
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("bbox",)
FUNCTION = "main_func"
CATEGORY = "Mesh/Rodin"
@classmethod
def INPUT_TYPES(s):
return {
"required":{
"Width": ("INT", {"default": 100, "min": 1, "max": 300, "step": 1, "display": "number"}),
"Height": ("INT", {"default": 100, "min": 1, "max": 300, "step": 1, "display": "number"}),
"Length": ("INT", {"default": 100, "min": 1, "max": 300, "step": 1, "display": "number"}),
},
}
async def main_func(self, Width, Height, Length):
bbox_control = str([Width, Height, Length])
# print(bbox_control)
return (bbox_control,)
class Rodin3D_simple():
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("model_path",)
FUNCTION = "main_func"
OUTPUT_NODE = True
CATEGORY = "Mesh/Rodin"
class mRodin3D_Regular(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
**RODIN_GEN_1_5_PARAS,
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, Polygon_count, bbox = None, height_cm = None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Regular",
seed=seed_,
quality=None,
geometry_file_format="glb",
material=Material_Type,
texture_mode=None,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=False,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm
)
return (model_path,)
class mRodin3D_Detail(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
**RODIN_GEN_1_5_PARAS,
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, Polygon_count, bbox = None, height_cm = None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Detail",
seed=seed_,
quality=None,
geometry_file_format="glb",
material=Material_Type,
texture_mode=None,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=False,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm
)
return (model_path,)
class mRodin3D_Smooth(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
**RODIN_GEN_1_5_PARAS,
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, Polygon_count, bbox = None, height_cm = None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Smooth",
seed=seed_,
quality=None,
geometry_file_format="glb",
material=Material_Type,
texture_mode=None,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=False,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm
)
return (model_path,)
class mRodin3D_Sketch(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded"], {"default":"PBR"}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, bbox=None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Sketch",
seed=seed_,
quality=None,
geometry_file_format="glb",
material=Material_Type,
texture_mode=None,
quality_override=None,
mesh_mode=None,
ta_pose=False,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=None,
)
return (model_path,)
class mRodin3D_Gen2(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
**RODIN_GEN_2_PARAS,
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, Polygon_count, TAPose, height_cm=None, bbox=None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Gen-2",
seed=seed_,
quality=None,
geometry_file_format="glb",
material=Material_Type,
texture_mode=None,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path,)
class mRodin3D_Gen_2_5_Fast_Image(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"tier": (["Gen-2.5-Extreme-Low", "Gen-2.5-Low", "Gen-2.5-Medium", "Gen-2.5-High"], {"default":"Gen-2.5-Low"}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"geometry_file_format": (["glb", "usdz"], {"default":"glb"}),
"mesh_faces": ("INT", {"default": 20000, "min": 1000, "max": 20000, "step": 1, "display": "number", }),
"texture_mode": (["extreme-low", "low", "medium", "high", "Default"], {"default":"Default"}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, tier, api_key, seed_, Material_Type, TAPose, geometry_file_format, mesh_faces, texture_mode, height_cm=None, bbox=None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier=tier,
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=mesh_faces,
mesh_mode="Raw",
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path,)
class mRodin3D_Gen_2_5_Fast_Text(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"prompt": ("STRING", {"forceInput": False, "multiline": True}),
"tier": (["Gen-2.5-Extreme-Low", "Gen-2.5-Low", "Gen-2.5-Medium", "Gen-2.5-High"], {"default":"Gen-2.5-Low"}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"geometry_file_format": (["glb", "usdz"], {"default":"glb"}),
"mesh_faces": ("INT", {"default": 20000, "min": 1000, "max": 20000, "step": 1, "display": "number", }),
"texture_mode": (["extreme-low", "low", "medium", "high", "Default"], {"default":"Default"}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, prompt, tier, api_key, seed_, Material_Type, TAPose, geometry_file_format, mesh_faces, texture_mode, height_cm=None, bbox=None):
model_path, _ = await process_full_generation(
api_key=api_key,
images=None,
prompt = prompt,
tier=tier,
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=mesh_faces,
mesh_mode="Raw",
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path,)
class mRodin3D_Gen_2_5_Regular_Image(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"tier": (["Gen-2.5-Low", "Gen-2.5-Medium", "Gen-2.5-High"], {"default":"Gen-2.5-High"}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"Polygon_count": (["4K-Quad", "8K-Quad", "18K-Quad", "50K-Quad", "2K-Triangle", "20K-Triangle", "150K-Triangle", "500K-Triangle", "1M-Triangle", "Default"], {"default": "Default"}),
"geometry_file_format": (["glb", "usdz"], {"default":"glb"}),
"texture_mode": (["extreme-low", "low", "medium", "high", "Default"], {"default":"Default"}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, tier, api_key, seed_, Material_Type, TAPose, geometry_file_format, Polygon_count, texture_mode, height_cm=None, bbox=None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
if Polygon_count != "Default":
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
else:
quality_override, mesh_mode = QUALITY_MESH_DEFAULT[tier]
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier=tier,
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path,)
class mRodin3D_Gen_2_5_Regular_Text(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"prompt": ("STRING", {"forceInput": False, "multiline": True}),
"tier": (["Gen-2.5-Low", "Gen-2.5-Medium", "Gen-2.5-High"], {"default":"Gen-2.5-High"}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"Polygon_count": (["4K-Quad", "8K-Quad", "18K-Quad", "50K-Quad", "2K-Triangle", "20K-Triangle", "150K-Triangle", "500K-Triangle", "1M-Triangle", "Default"], {"default": "Default"}),
"geometry_file_format": (["glb", "usdz"], {"default":"glb"}),
"texture_mode": (["extreme-low", "low", "medium", "high", "Default"], {"default":"Default"}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, prompt, tier, api_key, seed_, Material_Type, TAPose, geometry_file_format, Polygon_count, texture_mode, height_cm=None, bbox=None):
if Polygon_count != "Default":
quality_override, mesh_mode = QUALITY_MESH_OPTIONS[Polygon_count]
else:
quality_override, mesh_mode = QUALITY_MESH_DEFAULT[tier]
model_path, _ = await process_full_generation(
api_key=api_key,
images=None,
prompt = prompt,
tier=tier,
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=quality_override,
mesh_mode=mesh_mode,
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=False,
geometry_instruct_mode='faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path,)
class mRodin3D_Gen_2_5_ExtremeHigh_Image(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"images": ("IMAGE", {"forceInput": True, "multiline": True}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"mesh_mode": (["Raw", "Quad"], {"default":"Raw"}),
"mesh_faces": ("INT", {"default": 1000000, "min": 20000, "max": 2000000, "step": 1, "display": "number", }),
"geometry_file_format": (["glb", "usdz", "fbx", "obj", "stl"], {"default":"glb"}),
"texture_mode": (["legacy", "extreme-low", "low", "medium", "high"], {"default":"high"}),
"is_micro": ("BOOLEAN", {"default": False}),
"Creative": ("BOOLEAN", {"default": False}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, images, api_key, seed_, Material_Type, TAPose, mesh_mode, mesh_faces, geometry_file_format, texture_mode, is_micro, Creative, height_cm=None, bbox=None):
num_images = images.shape[0]
m_images = []
for i in range(num_images):
m_images.append(images[i])
model_path, _ = await process_full_generation(
api_key=api_key,
images=m_images,
prompt = None,
tier="Gen-2.5-Extreme-High",
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=mesh_faces,
mesh_mode=mesh_mode,
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=is_micro,
geometry_instruct_mode= 'creative' if Creative else 'faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path, )
class mRodin3D_Gen_2_5_ExtremeHigh_Text(Rodin3D_simple):
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"api_key": ("APIKEY", {"forceInput": True, "multiline": True}),
"prompt": ("STRING", {"forceInput": False, "multiline": True}),
"seed_": ("INT", {"default": 0, "min": 0, "max": 65535, "step": 1, "display": "number", }),
"Material_Type": (["PBR", "Shaded", "All", "None"], {"default":"Shaded"}),
"mesh_mode": (["Raw", "Quad"], {"default":"Raw"}),
"mesh_faces": ("INT", {"default": 1000000, "min": 20000, "max": 2000000, "step": 1, "display": "number", }),
"geometry_file_format": (["glb", "usdz", "fbx", "obj", "stl"], {"default":"glb"}),
"texture_mode": (["legacy", "extreme-low", "low", "medium", "high"], {"default":"high"}),
"is_micro": ("BOOLEAN", {"default": False}),
"Creative": ("BOOLEAN", {"default": False}),
"TAPose": ("BOOLEAN", {"default": False}),
},
"optional":{
"bbox": ("STRING",{"forceInput":True,"multiline": True}),
"height_cm":("INT", {"forceInput":True}),
},
}
async def main_func(self, prompt, api_key, seed_, Material_Type, TAPose, mesh_mode, mesh_faces, geometry_file_format, texture_mode, is_micro, Creative, height_cm=None, bbox=None):
model_path, _ = await process_full_generation(
api_key=api_key,
images=None,
prompt = prompt,
tier="Gen-2.5-Extreme-High",
seed=seed_,
quality=None,
geometry_file_format=geometry_file_format,
material=Material_Type,
texture_mode=texture_mode,
quality_override=mesh_faces,
mesh_mode=mesh_mode,
ta_pose=TAPose,
hd_texture=False,
model_early_export=False,
is_micro=is_micro,
geometry_instruct_mode= 'creative' if Creative else 'faithful',
bbox=bbox,
height_cm=height_cm,
)
return (model_path, )