PrismPipeline / QuiltiX

QuiltiX is a graphical node editor to edit, and author MaterialX based materials of 3D assets
https://pypi.org/project/QuiltiX
Apache License 2.0
259 stars 27 forks source link

Graph nodes with multiple outputs create invalid nodegraph wrappers #87

Open kwokcb opened 1 month ago

kwokcb commented 1 month ago

Issue

The "auto create nodegraph around shader inputs" creates invalid MaterialX sometimes. It appears to not work for nodes with multiple outputs?

Example Case:

<?xml version="1.0"?>
<materialx version="1.38">
  <!-- Generated shader: Material_MR -->
  <gltf_pbr name="Material_MR" type="surfaceshader" nodedef="ND_gltf_pbr_surfaceshader">
    <input name="base_color" type="color3" nodename="image_base_color" output="outcolor" />
    <input name="metallic" type="float" nodename="extract_orm3" />
    <input name="roughness" type="float" nodename="extract_orm2" />
    <input name="occlusion" type="float" nodename="image_occlusion" />
    <input name="normal" type="vector3" nodename="image_normal" />
    <input name="emissive" type="color3" nodename="image_emissive" output="outcolor" />
  </gltf_pbr>
  <!-- Generated material: MAT_Material_MR -->
  <surfacematerial name="MAT_Material_MR" type="material">
    <input name="surfaceshader" type="surfaceshader" nodename="Material_MR" />
  </surfacematerial>
  <gltf_colorimage name="image_base_color" type="multioutput">
    <input name="file" type="filename" value="Default_albedo.jpg" colorspace="srgb_texture" />
    <output name="outcolor" type="color3" />
    <output name="outa" type="float" />
  </gltf_colorimage>
  <gltf_image name="image_orm" type="vector3">
    <input name="file" type="filename" value="Default_metalRoughness.jpg" />
  </gltf_image>
  <extract name="extract_orm" type="float">
    <input name="in" type="vector3" nodename="image_orm" />
    <input name="index" type="integer" value="0" />
  </extract>
  <extract name="extract_orm2" type="float">
    <input name="in" type="vector3" nodename="image_orm" />
    <input name="index" type="integer" value="1" />
  </extract>
  <extract name="extract_orm3" type="float">
    <input name="in" type="vector3" nodename="image_orm" />
    <input name="index" type="integer" value="2" />
  </extract>
  <gltf_normalmap name="image_normal" type="vector3">
    <input name="file" type="filename" value="Default_normal.jpg" />
  </gltf_normalmap>
  <gltf_image name="image_occlusion" type="float">
    <input name="file" type="filename" value="Default_AO.jpg" />
  </gltf_image>
  <gltf_colorimage name="image_emissive" type="multioutput">
    <input name="file" type="filename" value="Default_emissive.jpg" colorspace="srgb_texture" />
    <output name="outcolor" type="color3" />
    <output name="outa" type="float" />
  </gltf_colorimage>
  <!-- Generated material assignments -->
  <look name="look">
    <materialassign name="MAT_Material_MR" material="MAT_Material_MR" geom="/node_damagedHelmet__6514/mesh_helmet_LP_13930damagedHelmet" />
  </look>
</materialx>

Results in an invalid graph being created when performing MaterialX validation:

Graph is invalid: Mismatched types in port connections: <output name="output_image_base_color_outa" type="float" output="outcolor" nodename="image_base_color"> 
Mismatched types in port connection <output name="output_image_emissive_outa" type="float" output="outcolor" nodename="image_emissive".

Work-Around

Turn off this option before rendering / save to file.