64 HdRenderParam *renderParam,
65 HdDirtyBits *dirtyBits,
66 const TfToken &reprToken)
70 if (*dirtyBits == HdChangeTracker::Clean) {
76#if PXR_VERSION >= 2102
77 Base::_UpdateInstancer(sceneDelegate, dirtyBits);
78 HdInstancer::_SyncInstancerAndParents(sceneDelegate->GetRenderIndex(), Base::GetInstancerId());
80 Base::_UpdateVisibility(sceneDelegate, dirtyBits);
84 if (*dirtyBits & HdChangeTracker::DirtyMaterialId) {
85#if HD_API_VERSION >= 37 && PXR_VERSION >= 2105
86 Base::SetMaterialId(sceneDelegate->GetMaterialId(Base::GetId()));
88 Base::_SetMaterialId(sceneDelegate->GetRenderIndex().GetChangeTracker(),
89 sceneDelegate->GetMaterialId(Base::GetId()));
93 sceneDelegate->GetRenderIndex().GetSprim(HdPrimTypeTokens->material,
94 Base::GetMaterialId()));
97 if (material && material->GetCyclesShader()) {
98 usedShaders[0] = material->GetCyclesShader();
101 usedShaders[0] =
lock.scene->default_surface;
104 for (
Node *shader : usedShaders) {
105 static_cast<Shader *
>(shader)->tag_used(
lock.scene);
108 _geom->set_used_shaders(usedShaders);
111 const SdfPath &
id = Base::GetId();
113 if (HdChangeTracker::IsPrimIdDirty(*dirtyBits,
id)) {
115 _instances[0]->set_pass_id(Base::GetPrimId() + 1);
118 if (HdChangeTracker::IsTransformDirty(*dirtyBits,
id)) {
119 _geomTransform = sceneDelegate->GetTransform(
id);
122 if (HdChangeTracker::IsTransformDirty(*dirtyBits,
id) ||
123 HdChangeTracker::IsInstancerDirty(*dirtyBits,
id)) {
125 sceneDelegate->GetRenderIndex().GetInstancer(Base::GetInstancerId()));
128 assert(_instances[0]->attributes.size() >= 1 &&
129 _instances[0]->attributes.front().name() == HdAovTokens->instanceId.GetString());
131 VtMatrix4dArray transforms;
133 transforms = instancer->ComputeInstanceTransforms(
id);
134 _instances[0]->attributes.front() = ParamValue(HdAovTokens->instanceId.GetString(), +0.0f);
138 transforms.push_back(GfMatrix4d(1.0));
139 _instances[0]->attributes.front() = ParamValue(HdAovTokens->instanceId.GetString(), -1.0f);
142 const size_t oldSize = _instances.size();
143 const size_t newSize = transforms.size();
146 for (
size_t i = newSize; i < oldSize; ++i) {
147 lock.scene->delete_node(_instances[i]);
149 _instances.resize(newSize);
150 for (
size_t i = oldSize; i < newSize; ++i) {
151 _instances[i] =
lock.scene->create_node<
Object>();
152 InitializeInstance(
static_cast<int>(i));
156 for (
size_t i = 0; i < transforms.size(); ++i) {
157 const float metersPerUnit =
162 _instances[i]->set_tfm(tfm);
166 if (HdChangeTracker::IsVisibilityDirty(*dirtyBits,
id)) {
167 for (
Object *instance : _instances) {
168 instance->set_visibility(Base::IsVisible() ? ~0 : 0);
174 bool rebuild =
false;
175 Populate(sceneDelegate, *dirtyBits, rebuild);
177 if (_geom->is_modified() || rebuild) {
178 _geom->tag_update(
lock.scene, rebuild);
181 for (
Object *instance : _instances) {
182 instance->tag_update(
lock.scene);
185 *dirtyBits = HdChangeTracker::Clean;