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 14 additions and 69 deletions
Showing only changes of commit 42592f2356 - Show all commits

View File

@ -56,7 +56,7 @@ 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());
InstancerData *i_data = dynamic_cast<InstancerData *>(mesh_data(prim_id));
InstancerData *i_data = instancer_data(prim_id, true);
if (i_data) {
return i_data->instancer_id;
}
@ -86,19 +86,6 @@ pxr::GfMatrix4d BlenderSceneDelegate::GetInstancerTransform(pxr::SdfPath const &
return i_data->transform();
}
size_t BlenderSceneDelegate::SamplePrimvar(pxr::SdfPath const &id,
pxr::TfToken const &key,
size_t max_sample_count,
float *sample_times,
pxr::VtValue *sample_values)
{
InstancerData *i_data = instancer_data(id);
if (i_data) {
return i_data->sample_instancer_primvar(key, max_sample_count, sample_times, sample_values);
}
return 0;
}
void BlenderSceneDelegate::update_collection(bool remove, bool visibility)
{
if (visibility) {
@ -241,9 +228,9 @@ MaterialData *BlenderSceneDelegate::material_data(pxr::SdfPath const &id)
return it->second.get();
}
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id, bool base_mesh)
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id, bool base_prim)
{
if (base_mesh) {
if (base_prim) {
return dynamic_cast<InstancerData *>(object_data(id));
}
return dynamic_cast<InstancerData *>(object_data(id.GetParentPath()));
@ -403,15 +390,16 @@ pxr::GfMatrix4d BlenderSceneDelegate::GetTransform(pxr::SdfPath const &id)
if (obj_data) {
return obj_data->transform();
}
// TODO: add a separate object for instancer for cleaner handling code
else if (id.GetName() == "Instancer") {
if (MeshData *mesh = mesh_data(id.GetParentPath())) {
return mesh->transform().GetInverse();
}
}
if (id == WorldData::prim_id(this)) {
return world_data->transform();
}
InstancerData *i_data = instancer_data(id);
if (i_data) {
return i_data->transform();
}
return pxr::GfMatrix4d();
}

View File

@ -48,11 +48,6 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
pxr::VtIntArray GetInstanceIndices(pxr::SdfPath const &instancer_id,
pxr::SdfPath const &prototype_id) override;
pxr::GfMatrix4d GetInstancerTransform(pxr::SdfPath const &instancer_id) override;
size_t SamplePrimvar(pxr::SdfPath const &id,
pxr::TfToken const &key,
size_t max_sample_count,
float *sample_times,
pxr::VtValue *sample_values) override;
EngineType engine_type;
@ -61,7 +56,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_mesh=false);
InstancerData *instancer_data(pxr::SdfPath const &id, bool base_prim=false);
void add_update_object(Object *object);
void add_update_instancer(DupliObject *dupli);

View File

@ -62,8 +62,9 @@ void InstancerData::init()
GfMatrix4d InstancerData::transform()
{
return pxr::GfMatrix4d(1.0);
/* transform of the first instance */
return transforms[0];
//return transforms[0];
}
bool InstancerData::update_visibility(View3D *view3d)
@ -87,16 +88,11 @@ VtValue InstancerData::get_data(TfToken const &key) const
CLOG_INFO(LOG_BSD, 3, "%s [%s]", id->name, key.GetText());
if (key == HdInstancerTokens->instanceTransform) {
return VtValue(calc_instance_transforms());
return VtValue(transforms);
}
return MeshData::get_data(key);
}
pxr::GfMatrix4d InstancerData::instancer_transform()
{
return pxr::GfMatrix4d(1.0);
}
HdPrimvarDescriptorVector InstancerData::instancer_primvar_descriptors(
HdInterpolation interpolation)
{
@ -117,22 +113,6 @@ VtIntArray InstancerData::instance_indices()
return ret;
}
size_t InstancerData::sample_instancer_primvar(TfToken const &key,
size_t maxSampleCount,
float *sampleTimes,
VtValue *sampleValues)
{
CLOG_INFO(LOG_BSD, 3, "%s [%s]", id->name, key.GetText());
if (key == HdInstancerTokens->instanceTransform) {
if (maxSampleCount > 0) {
sampleTimes[0] = 0.0f;
sampleValues[0] = transforms;
return 1;
}
}
return 0;
}
void InstancerData::add_instance(DupliObject *dupli)
{
CLOG_INFO(LOG_BSD, 2, "%s [%d]", id->name, dupli->random_id);
@ -168,16 +148,4 @@ void InstancerData::update()
MeshData::update();
}
pxr::VtMatrix4dArray InstancerData::calc_instance_transforms() const
{
pxr::VtMatrix4dArray ret;
/* USD hides the prototype mesh when instancing in contrary to the Blender,
so we must add it back implicitly */
ret.push_back(pxr::GfMatrix4d(1.0));
for (size_t i = 1; i < transforms.size(); ++i) {
ret.push_back(transforms[0].GetInverse() * transforms[i]);
}
return ret;
}
} // namespace blender::render::hydra

View File

@ -25,20 +25,14 @@ public:
pxr::GfMatrix4d transform() override;
bool update_visibility(View3D *view3d) override;
pxr::GfMatrix4d instancer_transform();
pxr::HdPrimvarDescriptorVector instancer_primvar_descriptors(pxr::HdInterpolation interpolation);
pxr::VtIntArray instance_indices();
size_t sample_instancer_primvar(pxr::TfToken const &key,
size_t maxSampleCount,
float *sampleTimes,
pxr::VtValue *sampleValues);
void add_instance(DupliObject *dupli);
pxr::SdfPath instancer_id;
private:
pxr::VtMatrix4dArray calc_instance_transforms() const;
pxr::VtMatrix4dArray transforms;
};