Snap system: Adds support to Clip Planes and uses a clip plane to simulate occlusion

This patch adds support for clip_planes (ie ignore what is behind a face)...

The idea is to first execute a raycast to get the polygon to which the mouse cursor points.
Then a snap test is done on the vertices or edges of the polygon.
Then with the normal and location obtained in raycast a new clip_plane is created and the snap over the whole scene is processed ignoring the elements behind the clip_plane.

Here 2 gif of how the previous patch would work on blender2.79:

{F497176}

{F497177}

Reviewers: mont29, campbellbarton

Reviewed By: campbellbarton

Subscribers: bliblubli

Tags: #bf_blender_2.8

Differential Revision: https://developer.blender.org/D2527
This commit is contained in:
Germano Cavalcante 2018-05-16 10:31:27 -03:00
parent 6a4ba9133c
commit 2ba0951e52
4 changed files with 417 additions and 209 deletions

View File

@ -107,6 +107,7 @@ typedef void (*BVHTree_RangeQuery)(void *userdata, int index, const float co[3],
typedef void (*BVHTree_NearestProjectedCallback)(
void *userdata, int index,
const struct DistProjectedAABBPrecalc *precalc,
const float (*clip_plane)[4], const int clip_plane_len,
BVHTreeNearest *nearest);

View File

@ -2040,7 +2040,10 @@ static void bvhtree_nearest_projected_dfs_recursive(
{
if (node->totnode == 0) {
if (data->callback) {
data->callback(data->userdata, node->index, &data->precalc, &data->nearest);
data->callback(
data->userdata, node->index, &data->precalc,
NULL, 0,
&data->nearest);
}
else {
data->nearest.index = node->index;
@ -2089,7 +2092,10 @@ static void bvhtree_nearest_projected_with_clipplane_test_dfs_recursive(
{
if (node->totnode == 0) {
if (data->callback) {
data->callback(data->userdata, node->index, &data->precalc, &data->nearest);
data->callback(
data->userdata, node->index, &data->precalc,
data->clip_plane, data->clip_plane_len,
&data->nearest);
}
else {
data->nearest.index = node->index;

View File

@ -1201,6 +1201,7 @@ bool snapObjectsTransform(
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
.use_occlusion_test = t->scene->toolsettings->snap_mode != SCE_SNAP_MODE_FACE,
},
mval, dist_px, NULL,
r_loc, r_no, NULL,

File diff suppressed because it is too large Load Diff