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 16 additions and 15 deletions
Showing only changes of commit 3dc02d52df - Show all commits

View File

@ -55,9 +55,6 @@ bool BlenderSceneDelegate::GetVisible(pxr::SdfPath const &id)
pxr::SdfPath BlenderSceneDelegate::GetInstancerId(pxr::SdfPath const &prim_id)
{
CLOG_INFO(LOG_BSD, 3, "%s", prim_id.GetText());
if (prim_id.GetParentPath() == GetDelegateID()) {
return pxr::SdfPath();
}
InstancerData *i_data = instancer_data(prim_id.GetParentPath());
if (i_data) {
return i_data->p_id;
@ -69,7 +66,8 @@ pxr::SdfPathVector BlenderSceneDelegate::GetInstancerPrototypes(pxr::SdfPath con
{
CLOG_INFO(LOG_BSD, 3, "%s", instancer_id.GetText());
pxr::SdfPathVector paths;
paths.push_back(instancer_id.GetParentPath());
InstancerData *i_data = instancer_data(instancer_id);
paths.push_back(i_data->m_data->p_id);
return paths;
}
@ -196,23 +194,28 @@ void BlenderSceneDelegate::add_update_object(Object *object)
void BlenderSceneDelegate::add_update_instancer(Object *object)
{
pxr::SdfPath id = InstancerData::prim_id(this, object);
InstancerData *i_data = instancer_data(id, true);
InstancerData *i_data = instancer_data(id);
if (i_data) {
i_data->update();
return;
}
objects[id] = InstancerData::create(this, object);
i_data = instancer_data(id, true);
i_data = instancer_data(id);
i_data->update_visibility(view3d);
}
ObjectData *BlenderSceneDelegate::object_data(pxr::SdfPath const &id)
{
auto it = objects.find(id);
if (it == objects.end()) {
return nullptr;
if (it != objects.end()) {
return it->second.get();
}
return it->second.get();
it = objects.find(id.GetParentPath());
if (it != objects.end()) {
InstancerData *i_data = (InstancerData *)it->second.get();
return i_data->m_data.get();
}
return nullptr;
}
MeshData *BlenderSceneDelegate::mesh_data(pxr::SdfPath const &id)
@ -234,12 +237,9 @@ MaterialData *BlenderSceneDelegate::material_data(pxr::SdfPath const &id)
return it->second.get();
}
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id, bool base_prim)
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id)
{
if (base_prim) {
return dynamic_cast<InstancerData *>(object_data(id));
}
return dynamic_cast<InstancerData *>(object_data(id.GetParentPath()));
return dynamic_cast<InstancerData *>(object_data(id));
}
InstancerData *BlenderSceneDelegate::instancer_data(Object *object)

View File

@ -58,7 +58,7 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
MeshData *mesh_data(pxr::SdfPath const &id);
LightData *light_data(pxr::SdfPath const &id);
MaterialData *material_data(pxr::SdfPath const &id);
InstancerData *instancer_data(pxr::SdfPath const &id, bool base_prim = false);
InstancerData *instancer_data(pxr::SdfPath const &id);
InstancerData *instancer_data(Object *object);
void add_update_object(Object *object);

View File

@ -101,6 +101,7 @@ pxr::VtValue MaterialData::get_data(pxr::TfToken const &key) const
pxr::VtValue MaterialData::material_resource()
{
return material_network_map;
if (material_network_map.IsEmpty()) {
const std::string &path = mtlx_path.GetResolvedPath();
if (!path.empty()) {