BLEN-359: Implement updates for instances in viewport #20

Merged
Bogdan Nagirniak merged 20 commits from BLEN-359_1 into hydra-render 2023-04-05 11:47:37 +02:00
4 changed files with 24 additions and 10 deletions
Showing only changes of commit 54b843eb6d - Show all commits

View File

@ -200,10 +200,10 @@ void BlenderSceneDelegate::add_update_object(Object *object)
void BlenderSceneDelegate::add_update_instancer(DupliObject *dupli) void BlenderSceneDelegate::add_update_instancer(DupliObject *dupli)
{ {
pxr::SdfPath id = InstancerData::prim_id(this, dupli->ob); pxr::SdfPath id = InstancerData::prim_id(this, dupli->ob);
InstancerData *i_data = (InstancerData *)mesh_data(id); InstancerData *i_data = instancer_data(id, true);
if (!i_data) { if (!i_data) {
objects[id] = InstancerData::create(this, dupli->ob); objects[id] = InstancerData::create(this, dupli->ob);
i_data = (InstancerData *)mesh_data(id); i_data = instancer_data(id, true);
// i_data->update_visibility(view3d); // i_data->update_visibility(view3d);
} }
@ -238,8 +238,11 @@ MaterialData *BlenderSceneDelegate::material_data(pxr::SdfPath const &id)
return it->second.get(); return it->second.get();
} }
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id) InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id, bool base_mesh)
{ {
if (base_mesh) {
return dynamic_cast<InstancerData *>(object_data(id));
}
return dynamic_cast<InstancerData *>(object_data(id.GetParentPath())); return dynamic_cast<InstancerData *>(object_data(id.GetParentPath()));
} }

View File

@ -61,7 +61,7 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
MeshData *mesh_data(pxr::SdfPath const &id); MeshData *mesh_data(pxr::SdfPath const &id);
LightData *light_data(pxr::SdfPath const &id); LightData *light_data(pxr::SdfPath const &id);
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, bool base_mesh=false);
void add_update_object(Object *object); void add_update_object(Object *object);
void add_update_instancer(DupliObject *dupli); void add_update_instancer(DupliObject *dupli);

View File

@ -57,26 +57,36 @@ void InstancerData::init()
CLOG_INFO(LOG_BSD, 2, "%s", id->name); CLOG_INFO(LOG_BSD, 2, "%s", id->name);
MeshData::init(); MeshData::init();
/* USD hides the prototype mesh when instancing in contrary to the Blender,
so we must add it back implicitly */
transforms.clear(); transforms.clear();
transforms.push_back(GfMatrix4d(1.0));
} }
GfMatrix4d InstancerData::transform() GfMatrix4d InstancerData::transform()
{ {
return GfMatrix4d(1.0); /* transform of the first instance */
return transforms[0];
} }
VtValue InstancerData::get_data(TfToken const &key) const VtValue InstancerData::get_data(TfToken const &key) const
{ {
CLOG_INFO(LOG_BSD, 3, "%s [%s]", id->name, key.GetText());
if (key == HdInstancerTokens->instanceTransform) { if (key == HdInstancerTokens->instanceTransform) {
pxr::VtMatrix4dArray t = transforms;
/* USD hides the prototype mesh when instancing in contrary to the Blender,
so we must add it back implicitly */
t[0] = pxr::GfMatrix4d(1.0);
return VtValue(transforms); return VtValue(transforms);
} }
return MeshData::get_data(key); return MeshData::get_data(key);
} }
HdPrimvarDescriptorVector InstancerData::instancer_primvar_descriptors(HdInterpolation interpolation) pxr::GfMatrix4d InstancerData::instancer_transform()
{
return pxr::GfMatrix4d(1.0);
}
HdPrimvarDescriptorVector InstancerData::instancer_primvar_descriptors(
HdInterpolation interpolation)
{ {
HdPrimvarDescriptorVector primvars; HdPrimvarDescriptorVector primvars;
if (interpolation == HdInterpolationInstance) { if (interpolation == HdInterpolationInstance) {
@ -114,7 +124,7 @@ size_t InstancerData::sample_instancer_primvar(TfToken const &key,
void InstancerData::add_instance(DupliObject *dupli) void InstancerData::add_instance(DupliObject *dupli)
{ {
CLOG_INFO(LOG_BSD, 2, "%s [%d]", id->name, dupli->random_id); CLOG_INFO(LOG_BSD, 2, "%s [%d]", id->name, dupli->random_id);
transforms.push_back(transform().GetInverse() * gf_matrix_from_transform(dupli->mat)); transforms.push_back(/*ObjectData::transform().GetInverse() **/ gf_matrix_from_transform(dupli->mat));
} }
void InstancerData::insert() void InstancerData::insert()

View File

@ -24,6 +24,7 @@ public:
pxr::VtValue get_data(pxr::TfToken const &key) const override; pxr::VtValue get_data(pxr::TfToken const &key) const override;
pxr::GfMatrix4d transform() override; pxr::GfMatrix4d transform() override;
pxr::GfMatrix4d instancer_transform();
pxr::HdPrimvarDescriptorVector instancer_primvar_descriptors(pxr::HdInterpolation interpolation); pxr::HdPrimvarDescriptorVector instancer_primvar_descriptors(pxr::HdInterpolation interpolation);
pxr::VtIntArray instance_indices(); pxr::VtIntArray instance_indices();
size_t sample_instancer_primvar(pxr::TfToken const &key, size_t sample_instancer_primvar(pxr::TfToken const &key,