Source code for axe_usd.usd.material_builders.usd_preview

"""UsdPreviewSurface shader network builder."""

from pathlib import Path

from pxr import Sdf, UsdShade

from ...core.preview_texture_format import (
    PreviewTextureFormat,
    parse_preview_texture_format,
)
from .base import MaterialBuildContext, _connect_nodegraph_output

PREVIEW_TEXTURE_DIRNAME = "previewTextures"
PREVIEW_TEXTURE_SUFFIX = PreviewTextureFormat.JPG.extension


def _preview_texture_path(path: str, mat_name: str, extension: str) -> str:
    source_path = Path(path)
    if "<UDIM>" in path:
        preview_name = f"{mat_name}_BaseColor.<UDIM>{extension}"
    else:
        preview_name = f"{mat_name}_BaseColor{extension}"
    preview_dir = source_path.parent / PREVIEW_TEXTURE_DIRNAME
    preview_path = preview_dir / preview_name
    if source_path.is_absolute():
        return preview_path.as_posix()
    prefix = "./" if path.startswith("./") else ""
    return f"{prefix}{preview_path.as_posix()}"


[docs] class UsdPreviewBuilder: def __init__(self, context: MaterialBuildContext) -> None: self._context = context
[docs] def build(self, collect_path: str) -> UsdShade.Shader: stage = self._context.stage preview_format = parse_preview_texture_format( self._context.texture_format_overrides.for_renderer("usd_preview") ) nodegraph_path = f"{collect_path}/UsdPreviewNodeGraph" nodegraph = UsdShade.NodeGraph.Define(stage, nodegraph_path) shader_path = f"{nodegraph_path}/UsdPreviewSurface" shader = UsdShade.Shader.Define(stage, shader_path) shader.CreateIdAttr("UsdPreviewSurface") material = UsdShade.Material.Get(stage, collect_path) _connect_nodegraph_output( nodegraph, "surface", Sdf.ValueTypeNames.Token, shader, "surface" ) material.CreateSurfaceOutput().ConnectToSource( nodegraph.ConnectableAPI(), "surface" ) st_reader_path = f"{nodegraph_path}/TexCoordReader" st_reader = UsdShade.Shader.Define(stage, st_reader_path) st_reader.CreateIdAttr("UsdPrimvarReader_float2") st_reader.CreateInput("varname", Sdf.ValueTypeNames.Token).Set("st") def _define_texture(texture_name: str, file_path: str) -> UsdShade.Shader: texture_prim_path = f"{nodegraph_path}/{texture_name}" texture_prim = UsdShade.Shader.Define(stage, texture_prim_path) texture_prim.CreateIdAttr("UsdUVTexture") texture_prim.CreateInput("file", Sdf.ValueTypeNames.Asset).Set(file_path) texture_prim.CreateInput("wrapS", Sdf.ValueTypeNames.Token).Set("repeat") texture_prim.CreateInput("wrapT", Sdf.ValueTypeNames.Token).Set("repeat") texture_prim.CreateInput("st", Sdf.ValueTypeNames.Float2).ConnectToSource( st_reader.ConnectableAPI(), "result" ) return texture_prim base_info = self._context.material_dict.get("basecolor") if base_info: path = base_info.get("path") if path: mat_name = base_info.get("mat_name", "") tex_filepath = _preview_texture_path( path, mat_name, preview_format.extension ) texture_prim = _define_texture("basecolorTexture", tex_filepath) shader.CreateInput( "diffuseColor", Sdf.ValueTypeNames.Float3 ).ConnectToSource( texture_prim.ConnectableAPI(), "rgb", ) return shader