This is a question regarding primvar overrides for general prims vs instantiable prims.
This is a basic setup where we have primvar overrides authored at different levels of instancing, ranging from no instancing to two-level instancing.
#usda 1.0
(
defaultPrim = "World"
upAxis = "Y"
)
def Xform "assets"
{
token visibility = "invisible"
def Xform "cylinder" (
# Uncomment line below for two-level instancing
# instanceable = true
)
{
def Cylinder "mesh_0"
{
double radius = 0.4
uniform token[] xformOpOrder = ["xformOp:rotateXYZ"]
double3 xformOp:rotateXYZ = (90, 0, 0)
}
}
def Xform "sphere" (
# Uncomment line below for two-level instancing
# instanceable = true
)
{
def Sphere "mesh"
{
double radius = 0.7
}
}
def Xform "combined_asset" (
# Uncomment line below for single level instancing
# instanceable = true
)
{
def Xform "xform"
{
def "cylinder" (
prepend inherits = </assets/cylinder>
)
{
color3f[] primvars:displayColor = [(0, 1, 0)]
}
def "sphere" (
prepend inherits = </assets/sphere>
)
{
}
}
}
}
def "World"
{
def "combined_asset_0_0" (
prepend references = </assets/combined_asset>
)
{
double3 xformOp:translate = (0, 0, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
def "combined_asset_0_1" (
prepend references = </assets/combined_asset>
)
{
double3 xformOp:translate = (0, 3, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
def "combined_asset_1_0" (
prepend references = </assets/combined_asset>
)
{
color3f[] primvars:displayColor = [(1, 0, 0)]
double3 xformOp:translate = (3, 0, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
def "combined_asset_1_1" (
prepend references = </assets/combined_asset>
)
{
color3f[] primvars:displayColor = [(1, 0, 0)]
double3 xformOp:translate = (3, 3, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
}
For the no-instancing setup, the overrides for an asset referencing another prim are applied only if the override isn’t present in the reference. This produces the image below.
However, when the references are converted to instances (by uncommenting the lines in the snippet), the behaviour of the overrides are not immediately clear.
The native GL delegate in usdview produces same result for single level instances, but renders the assets as white for two level instancing. This behaviour is different from the HdStorm delegate in Houdini, which produces the same result for all cases, ranging from no instancing to two level instancing.