Fix visibility of instancer object #40

Closed
Georgiy Markelov wants to merge 21 commits from BLEN-405 into hydra-render

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 33 additions and 36 deletions
Showing only changes of commit bb1f33635f - Show all commits

View File

@ -111,14 +111,26 @@ pxr::VtValue BlenderSceneDelegate::GetMaterialResource(pxr::SdfPath const &id)
bool BlenderSceneDelegate::GetVisible(pxr::SdfPath const &id)
{
CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 3, "%s", id.GetText());
//CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 3, "%s", id.GetText());
if (id == world_prim_id()) {
return true;
}
InstancerData *i_data = instancer_data(id, true);
if (i_data) {
return i_data->visible;
CLOG_INFO(LOG_RENDER_HYDRA_SCENE,
1,
"%s %s %d",
id.GetText(),
i_data->id->name,
i_data->visible);
}
CLOG_INFO(LOG_RENDER_HYDRA_SCENE,
1,
"%s %s %d",
id.GetText(),
object_data(id)->id->name,
object_data(id)->visible);
return object_data(id)->visible;
}
@ -324,6 +336,7 @@ void BlenderSceneDelegate::update_instancers(Object *object)
if (i_data) {
if (object->transflag & OB_DUPLI) {
i_data->update();
i_data->update_visibility();
}
else {
i_data->remove();
@ -338,6 +351,7 @@ void BlenderSceneDelegate::update_instancers(Object *object)
i_data = instancer_data(id);
i_data->init();
i_data->insert();
i_data->update_visibility();
}
void BlenderSceneDelegate::update_world()
@ -433,9 +447,9 @@ void BlenderSceneDelegate::add_new_objects()
DEGObjectIterSettings settings = {0};
settings.depsgraph = depsgraph;
settings.flags = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET;
if (engine_type == BlenderSceneDelegate::EngineType::VIEWPORT) {
settings.flags |= DEG_ITER_OBJECT_FLAG_VISIBLE;
}
//if (engine_type == BlenderSceneDelegate::EngineType::VIEWPORT) {
// settings.flags |= DEG_ITER_OBJECT_FLAG_VISIBLE;
//}
DEGObjectIterData data = {0};
data.settings = &settings;
data.graph = settings.depsgraph;

View File

@ -136,38 +136,25 @@ bool InstancerData::update_visibility()
bool dup_ret = update_duplicator_visibility();
bool inst_ret = update_instances_visibility();
visible = instances_visible;
if (dup_ret) {
for (Object *ob = (Object *)id; ob != nullptr; ob = ob->parent) {
Object *ob = ((Object *)id)->parent;
if (ob) {
InstancerData *obj_data = scene_delegate_->instancer_data(
scene_delegate_->instancer_prim_id(ob));
if (obj_data) {
auto &change_tracker = scene_delegate_->GetRenderIndex().GetChangeTracker();
change_tracker.MarkInstancerDirty(obj_data->prim_id,
pxr::HdChangeTracker::DirtyVisibility);
for (auto &it : obj_data->mesh_instances_) {
auto a = it.first.GetText();
auto b = prim_id.GetText();
auto c = scene_delegate_->object_prim_id(((Object *)id)).GetText();
auto d = obj_data->prim_id.GetText();
//if (it.first.GetParentPath().GetName() == prim_id.GetName() && ob == ((Object *)it.second.data->id)->parent) {
// it.second.data->visible = instances_visible;
// change_tracker.MarkRprimDirty(it.second.data->prim_id,
// pxr::HdChangeTracker::DirtyVisibility);
//}
// update its own instances on clicking "Show instancer" checkbox
if (it.first.GetName() == scene_delegate_->object_prim_id(((Object *)id)).GetName()) {
it.second.data->visible = duplicator_visible && obj_data->visible;
change_tracker.MarkRprimDirty(it.second.data->prim_id,
pxr::HdChangeTracker::DirtyVisibility);
}
}
}
obj_data->visible = duplicator_visible;
auto &change_tracker = scene_delegate_->GetRenderIndex().GetChangeTracker();
change_tracker.MarkInstancerDirty(prim_id, pxr::HdChangeTracker::DirtyVisibility);
}
if (scene_delegate_->engine_type == BlenderSceneDelegate::EngineType::FINAL) {
visible = instances_visible;
auto &change_tracker = scene_delegate_->GetRenderIndex().GetChangeTracker();
change_tracker.MarkInstancerDirty(prim_id, pxr::HdChangeTracker::DirtyVisibility);
}
}
if (!dup_ret && (ret || inst_ret)) {
//if (ret) {
if (ret || inst_ret) {
auto &change_tracker = scene_delegate_->GetRenderIndex().GetChangeTracker();
change_tracker.MarkInstancerDirty(prim_id, pxr::HdChangeTracker::DirtyVisibility);
for (auto &it : mesh_instances_) {

View File

@ -94,10 +94,6 @@ bool ObjectData::update_visibility()
visible = is_visible(scene_delegate_, (Object *)id);
//if (((Object *)id)->parent && scene_delegate_->engine_type == BlenderSceneDelegate::EngineType::FINAL) {
// visible = false;
//}
bool ret = visible != prev_visible;
if (ret) {
ID_LOG(2, "");
@ -108,7 +104,7 @@ bool ObjectData::update_visibility()
void ObjectData::update_parent()
{
Object *object = (Object *)id;
//if (parent_ != object->parent) {
if (parent_ != object->parent) {
ID_LOG(2, "");
parent_ = object->parent;
@ -121,7 +117,7 @@ void ObjectData::update_parent()
break;
}
}
//}
}
}
void ObjectData::write_transform()