# Blender USD Importer Design
```mermaid
classDiagram
USDPrimReader <|-- USDXformReader
USDPrimReader: -Object* object_
USDPrimReader: -UsdPrim prim_
USDPrimReader: -USDPrimReader* parent_reader_
USDPrimReader: +object() Object*
USDPrimReader: +object(Object)
USDPrimReader: +prim() UsdPrim
USDPrimReader: +parent() USDPrimReader
USDPrimReader: +parent(USDPrimReader*)
USDPrimReader: +valid() bool
USDPrimReader: +create_object(bmain, time)
USDPrimReader: +read_object_data(bmain, time)
<<abstract>> USDPrimReader
USDStageReader "0" --> "*" USDPrimReader : contains
class USDStageReader{
-UsdStageRefPtr stage_
-vector<USDPrimReader*> readers_
-map<SdfPath, vector<USDPrimReader*>> proto_readers_
+valid() bool
+collect_readers(bmain, params, settings)
+readers()
+proto_readers()
}
class USDXformReader{
+create_object(bmain, time)
+read_object_data(bmain, time)
+read_matrix(mat[4][4], time, scale, is_constant)
}
class USDMaterialReader {
-USDImportParams params_
-Bmain *bmain_
+add_material(usd_material) Material*
}
USDXformReader <|-- USDGeomReader
class USDGeomReader{
+create_object(bmain, time)
+read_object_data(bmain, time)
+read_mesh(existing_mesh, time, read_flag, vel_scale, err_str)
+topology_changed() bool
+add_cache_modifier()
+add_subdiv_modifier()
}
USDXformReader <|-- USDLightReader
class USDLightReader{
+create_object(bmain, time)
+read_object_data(bmain, time)
}
USDXformReader <|-- USDCameraReader
class USDCameraReader{
+create_object(bmain, time)
+read_object_data(bmain, time)
}
USDXformReader <|-- USDVolumeReader
class USDVolumeReader{
-UsdVolVolume volume_
+create_object(bmain, time)
+read_object_data(bmain, time)
}
USDXformReader <|-- USDInstanceReader
class USDInstanceReader{
+valid()
+create_object(bmain, time)
+read_object_data(bmain, time)
+set_instance_collection(collection)
+proto_path() SdfPath
}
USDGeomReader <|-- USDMeshReader
USDMaterialReader <-- USDMeshReader
class USDMeshReader {
+create_object(bmain, time)
+read_object_data(bmain, time)
+read_mesh(existing_mesh, time, read_flag, vel_scale, err_str)
+topology_changed() bool
}
USDGeomReader <|-- USDCurvesReader
class USDCurvesReader {
+valid() bool
+create_object(bmain, time)
+read_object_data(bmain, time)
+read_mesh(existing_mesh, time, read_flag, vel_scale, err_str)
}
USDGeomReader <|-- USDNurbsReader
class USDNurbsReader {
+valid() bool
+create_object(bmain, time)
+read_object_data(bmain, time)
+read_mesh(existing_mesh, time, read_flag, vel_scale, err_str)
}
```
## Reader Class Descriptions
### USDStageReader
Implements logic for iterating over the USD stage and creating the USDPrimReader instances for convering USD prims to the corresponding Blender object types. If the Instancing import option is enabled, this class also provides functionality for traversing the stage's "master" prims to generate readers for converting scenegraph instance prototypes.
### USDPrimReader
Abstract base class for all readers that create Blender objects from USD schemas. It wraps a single UsdPrim.
### USDXformReader
Derives from USDPrimReader. Base class for all readers that create Blender objects that can compute a transform and create a transform cache constraint. By default, this reader creates a Blender Empty object. It typically wraps UsdGeomXformable schema prims. However, it may also wrap UsdGeomScope prims, in which case the matrix computation returns the identity. The reason for this exception was a design decision to represent USD scopes as Blender empties for organizing the scene, since Blender doesn't otherwise have an object type directly analogous to UsdGeomScope.
### USDGeomReader
Derives from USDXformReader. Base class for readers that can create a mesh and apply cache and subdiv modifiers.
### USDMeshReader
Derives from USDGeomReader. Wraps the UsdGeomMesh schema. Creates a Blender Mesh object.
### USDCurvesReader
Derives from USDGeomReader. Wraps the UsdGeomBasisCurves schema. Creates a Blender Curve object.
### USDNurbsReader
Derives from USDGeomReader. Wraps the UsdGeomNurbsCurves schema. Creates a Blender Curve object.
### USDInstanceReader
Derives from USDXformReader. Wraps a USD prim that is an instance (typically a UsdGeomXformable). Creates a Blender object that stores a collection instance.
### USDCameraReader
Derives from USDXformReader. Wraps the UsdGeomCamera schema. Creates a Blender Camera object.
### USDLightReader
Derives from USDXformReader. Wraps the UsdLuxLight schema. Creates a Blender Light object.
### USDVolumeReader
Derives from USDXformReader. Wraps the UsdVolVolumes schema. Creates a Blender Volume object.
### USDMaterialReader
Stnadalone utility class for converting UsdShadeMaterial prims to Blender Materials. Currently used in USDMeshReader and contains experimental code for converting USD Preview Surface shaders to Blender Principled BSDF shader networks.