forked from blender/blender
Fix visibility of instancer object #40
|
@ -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;
|
||||
|
|
|
@ -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_) {
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue