Support several instancers on one object #24

Merged
Bogdan Nagirniak merged 16 commits from BLEN-383 into hydra-render 2023-04-19 02:46:24 +02:00
3 changed files with 33 additions and 18 deletions
Showing only changes of commit a788c49c42 - Show all commits

View File

@ -65,15 +65,11 @@ pxr::GfMatrix4d BlenderSceneDelegate::GetInstancerTransform(pxr::SdfPath const &
return i_data->transform(); return i_data->transform();
} }
void BlenderSceneDelegate::add_update_object(Object *object) void BlenderSceneDelegate::update_objects(Object *object)
{ {
if ((object->transflag & OB_DUPLI) && InstancerData::supported(object)) { if (!ObjectData::supported(object)) {
add_update_instancer(object); return;
} }
for (auto &it : instancers) {
it.second->check_update(object);
}
pxr::SdfPath id = ObjectData::prim_id(this, object); pxr::SdfPath id = ObjectData::prim_id(this, object);
ObjectData *obj_data = object_data(id); ObjectData *obj_data = object_data(id);
if (obj_data) { if (obj_data) {
@ -88,12 +84,29 @@ void BlenderSceneDelegate::add_update_object(Object *object)
obj_data->update_visibility(view3d); obj_data->update_visibility(view3d);
} }
void BlenderSceneDelegate::add_update_instancer(Object *object) void BlenderSceneDelegate::update_instancers(Object *object)
{ {
/* Check object inside instancers */
for (auto &it : instancers) {
it.second->check_update(object);
}
pxr::SdfPath id = InstancerData::prim_id(this, object); pxr::SdfPath id = InstancerData::prim_id(this, object);
InstancerData *i_data = instancer_data(id); InstancerData *i_data = instancer_data(id);
if (i_data) { if (i_data) {
i_data->update(); if (object->transflag & OB_DUPLI) {
i_data->update();
}
else {
i_data->remove();
instancers.erase(id);
}
return;
}
if ((object->transflag & OB_DUPLI) == 0) {
return;
}
if (view3d && !BKE_object_is_visible_in_viewport(view3d, object)) {
return; return;
} }
instancers[id] = InstancerData::create(this, object); instancers[id] = InstancerData::create(this, object);
@ -311,10 +324,8 @@ void BlenderSceneDelegate::check_updates()
switch (GS(id->name)) { switch (GS(id->name)) {
case ID_OB: { case ID_OB: {
Object *object = (Object *)id; Object *object = (Object *)id;
if (!ObjectData::supported(object)) { update_objects(object);
break; update_instancers(object);
}
add_update_object(object);
} break; } break;
case ID_MA: { case ID_MA: {
@ -368,7 +379,8 @@ void BlenderSceneDelegate::add_new_objects()
continue; continue;
} }
add_update_object(object); update_objects(object);
update_instancers(object);
} }
ITER_END; ITER_END;
} }
@ -477,7 +489,10 @@ void BlenderSceneDelegate::update_visibility()
} }
if (!object_data(ObjectData::prim_id(this, object))) { if (!object_data(ObjectData::prim_id(this, object))) {
add_update_object(object); update_objects(object);
}
if (!instancer_data(InstancerData::prim_id(this, object))) {
update_instancers(object);
} }
} }
ITER_END; ITER_END;

View File

@ -60,8 +60,8 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
MaterialData *material_data(pxr::SdfPath const &id); MaterialData *material_data(pxr::SdfPath const &id);
InstancerData *instancer_data(pxr::SdfPath const &id); InstancerData *instancer_data(pxr::SdfPath const &id);
void add_update_object(Object *object); void update_objects(Object *object);
void add_update_instancer(Object *object); void update_instancers(Object *object);
void update_world(); void update_world();
void check_updates(); void check_updates();
void add_new_objects(); void add_new_objects();

View File

@ -127,7 +127,7 @@ void MaterialData::insert()
void MaterialData::remove() void MaterialData::remove()
{ {
ID_LOG(2, ""); CLOG_INFO(LOG_BSD, 2, "%s", p_id.GetText());
scene_delegate->GetRenderIndex().RemoveSprim(pxr::HdPrimTypeTokens->material, p_id); scene_delegate->GetRenderIndex().RemoveSprim(pxr::HdPrimTypeTokens->material, p_id);
} }