Infinite Grid: View angle fade

and show Z axis in special persp views
This commit is contained in:
Clément Foucault
2017-04-03 21:37:40 +02:00
parent 4a8aaab0b2
commit ccaa21df6d
2 changed files with 32 additions and 10 deletions

View File

@@ -315,7 +315,7 @@ static void OBJECT_engine_init(void *vedata)
}
/* Z axis if needed */
if ((rv3d->view == RV3D_VIEW_USER) && show_axis_z) {
if (((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) && show_axis_z) {
e_data.zpos_flag = SHOW_AXIS_Z;
float zvec[4] = {0.0f, 0.0f, -1.0f, 0.0f};
@@ -323,10 +323,10 @@ static void OBJECT_engine_init(void *vedata)
/* z axis : chose the most facing plane */
if (fabsf(zvec[0]) < fabsf(zvec[1])) {
e_data.zpos_flag |= (PLANE_XZ | SHOW_AXIS_X);
e_data.zpos_flag |= PLANE_XZ;
}
else {
e_data.zpos_flag |= (PLANE_YZ | SHOW_AXIS_Y);
e_data.zpos_flag |= PLANE_YZ;
}
e_data.zneg_flag = e_data.zpos_flag;
@@ -502,6 +502,8 @@ static void OBJECT_cache_init(void *vedata)
psl->grid = DRW_pass_create("Infinite Grid Pass", state);
struct Batch *quad = DRW_cache_fullscreen_quad_get();
static float mat[4][4];
unit_m4(mat);
/* Create 3 quads to render ordered transparency Z axis */
DRWShadingGroup *grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
@@ -511,15 +513,15 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_vec4(grp, "gridSettings", e_data.grid_settings, 1);
DRW_shgroup_uniform_float(grp, "gridOneOverLogSubdiv", &e_data.grid_settings[4], 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo, 0);
DRW_shgroup_call_add(grp, quad, NULL);
DRW_shgroup_call_add(grp, quad, mat);
grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.grid_flag, 1);
DRW_shgroup_call_add(grp, quad, NULL);
DRW_shgroup_call_add(grp, quad, mat);
grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.zpos_flag, 1);
DRW_shgroup_call_add(grp, quad, NULL);
DRW_shgroup_call_add(grp, quad, mat);
}
{
@@ -690,8 +692,8 @@ static void DRW_shgroup_lamp(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl
}
float (*shapemat)[4], (*spotblendmat)[4];
shapemat = (float (*)[4])*la_mats;
spotblendmat = (float (*)[4])*la_mats + 16;
shapemat = (float (*)[4])(*la_mats);
spotblendmat = (float (*)[4])(*la_mats + 16);
/* Don't draw the center if it's selected or active */
if (theme_id == TH_GROUP)

View File

@@ -8,6 +8,7 @@ out vec4 FragColor;
uniform mat4 ProjectionMatrix;
uniform vec3 cameraPos;
uniform vec3 eye;
uniform vec4 gridSettings;
uniform float gridOneOverLogSubdiv;
@@ -60,13 +61,32 @@ void main()
float dist, fade;
/* if persp */
if (ProjectionMatrix[3][3] == 0.0) {
dist = distance(cameraPos, wPos);
fade = 1.0 - smoothstep(0.0, gridDistance, dist - gridDistance);
vec3 viewvec = cameraPos - wPos;
dist = length(viewvec);
viewvec /= dist;
float angle;
if ((gridFlag & PLANE_XZ) > 0)
angle = viewvec.y;
else if ((gridFlag & PLANE_YZ) > 0)
angle = viewvec.x;
else
angle = viewvec.z;
angle = 1.0 - abs(angle);
fade = 1.0 - angle * angle;
fade *= 1.0 - smoothstep(0.0, gridDistance, dist - gridDistance);
}
else {
dist = abs(gl_FragCoord.z * 2.0 - 1.0);
fade = 1.0 - smoothstep(0.0, 0.5, dist - 0.5);
dist = 1.0; /* avoid branch after */
if ((gridFlag & PLANE_XY) > 0) {
float angle = 1.0 - abs(eye.z);
fade *= 1.0 - angle * angle * angle;
dist = 1.0 + angle * 2.0;
}
}
if ((gridFlag & GRID) > 0) {