DRW: show image empty frame when the 'side' is hidden

This behavior matches back-face culled mesh objects,
where the wire outline doesn't depend on the viewing angle.

Applying this before empty visibility check for view framing,
since it's strange if viewing all gives different results
depending on back-face culling.
This commit is contained in:
Campbell Barton 2019-03-07 11:26:28 +11:00
parent e1a62fa1a6
commit a3d647558e
4 changed files with 22 additions and 12 deletions

View File

@ -349,7 +349,8 @@ bool BKE_object_modifier_update_subframe(
void BKE_object_type_set_empty_for_versioning(struct Object *ob);
bool BKE_object_empty_image_is_visible_in_view3d(const struct Object *ob, const struct RegionView3D *rv3d);
bool BKE_object_empty_image_frame_is_visible_in_view3d(const struct Object *ob, const struct RegionView3D *rv3d);
bool BKE_object_empty_image_data_is_visible_in_view3d(const struct Object *ob, const struct RegionView3D *rv3d);
#ifdef __cplusplus
}

View File

@ -2849,9 +2849,23 @@ void BKE_object_empty_draw_type_set(Object *ob, const int value)
}
}
bool BKE_object_empty_image_is_visible_in_view3d(const Object *ob, const RegionView3D *rv3d)
bool BKE_object_empty_image_frame_is_visible_in_view3d(const Object *ob, const RegionView3D *rv3d)
{
char visibility_flag = ob->empty_image_visibility_flag;
const char visibility_flag = ob->empty_image_visibility_flag;
if (rv3d->is_persp) {
return (visibility_flag & OB_EMPTY_IMAGE_HIDE_PERSPECTIVE) == 0;
}
else {
return (visibility_flag & OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC) == 0;
}
}
bool BKE_object_empty_image_data_is_visible_in_view3d(const Object *ob, const RegionView3D *rv3d)
{
/* Caller is expected to check this. */
BLI_assert(BKE_object_empty_image_frame_is_visible_in_view3d(ob, rv3d));
const char visibility_flag = ob->empty_image_visibility_flag;
if ((visibility_flag & (OB_EMPTY_IMAGE_HIDE_BACK | OB_EMPTY_IMAGE_HIDE_FRONT)) != 0) {
float eps, dot;
@ -2880,12 +2894,7 @@ bool BKE_object_empty_image_is_visible_in_view3d(const Object *ob, const RegionV
}
}
if (rv3d->is_persp) {
return (visibility_flag & OB_EMPTY_IMAGE_HIDE_PERSPECTIVE) == 0;
}
else {
return (visibility_flag & OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC) == 0;
}
return true;
}
bool BKE_object_minmax_dupli(Depsgraph *depsgraph, Scene *scene, Object *ob, float r_min[3], float r_max[3], const bool use_hidden)

View File

@ -919,7 +919,7 @@ static void DRW_shgroup_empty_image(
{
/* TODO: 'StereoViews', see draw_empty_image. */
if (!BKE_object_empty_image_is_visible_in_view3d(ob, rv3d)) {
if (!BKE_object_empty_image_frame_is_visible_in_view3d(ob, rv3d)) {
return;
}
@ -945,7 +945,7 @@ static void DRW_shgroup_empty_image(
/* OPTI(fclem) We need sorting only for transparent images. If an image as no alpha channel and
* ob->col[3] == 1.0f, we could remove it from the sorting pass. */
if (tex && (ob->color[3] > 0.0f)) {
if (tex && (ob->color[3] > 0.0f) && BKE_object_empty_image_data_is_visible_in_view3d(ob, rv3d)) {
DRWShadingGroup *grp = DRW_shgroup_create(sh_data->object_empty_image, sgl->image_empties);
DRW_shgroup_uniform_texture(grp, "image", tex);
/* TODO(fclem) implement DRW_shgroup_uniform_vec2_copy */

View File

@ -118,7 +118,7 @@ static bool WIDGETGROUP_empty_image_poll(const bContext *C, wmGizmoGroupType *UN
Object *ob = base->object;
if (ob->type == OB_EMPTY) {
if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
return BKE_object_empty_image_is_visible_in_view3d(ob, rv3d);
return BKE_object_empty_image_frame_is_visible_in_view3d(ob, rv3d);
}
}
}