The specializes
Composition Arc is a bit weird. The USD glossary does
a decent job of explaining how it works but I was hoping to put it in
simpler terms. Both for my understanding and others.
It may be an over-simplification but specializes
is a way of
preventing and "protecting" changes that are made to a specialized Prim.
This folder shows a scenario where specializes
is used to prevent
edits from other, stronger layers.
There's 3 layers:
settings.usda modelling.usda layout.usda
settings.usda has some camera settings that layout.usda is expected to use. They do this by referencing the camera and changing its settings, directly. The layout.usda layer also brings in modelling.usda so that it can reference a model and place it into their scene.
The problem is, a modeller makes a mistake and authors an opinion onto the cameras in settings.usda. If you look at the code in layout.usda and then open it as a stage, you'll see the results of this change.
The </_class_CameraSettings> class gets overridden by
modelling and its value make it into the final USD stage. The
</_class_CameraSettingsSpecialized> class is also overridden by
modelling but the value that modelling authored doesn't make it onto
the final USD stage. Why? Because </_class_CameraSettingsSpecialized>
is specialized and its authored focalLength
property is defined in
the specialized Prim. So the value for focalLength
that was authored
in settings.usda makes it all the way into layout.usda even though the
modelling.usda Layer tried to override focalLength
in between.
If the same situation happened and </_class_CameraSettingsSpecialized>
used inherits
instead of specializes
, the value for focaLength
would have been overridden in modelling.usda.
Asute users of USD will point out that the above scenario can also be solved even if </_class_CameraSettingsSpecialized> used inherits
if you include @./settings.usda
in the subLayers
of layout.usda like so:
(
subLayers = [
@./settings.usda@,
@./modelling.usda@,
]
)
This also works and should probably be preferred whenever possible. That
said, just consider the specializes
solution when there's no other
option.