New Grid: small modification
Fix wrong coord picked when display only one axis. Small optimizations here and there.
This commit is contained in:
@@ -167,7 +167,7 @@ static struct {
|
||||
struct GPUShader *outline_fade_sh;
|
||||
struct GPUShader *grid_sh;
|
||||
float camera_pos[3];
|
||||
float grid_settings[4];
|
||||
float grid_settings[5];
|
||||
float grid_mat[4][4];
|
||||
int grid_flag;
|
||||
int zpos_flag;
|
||||
@@ -322,7 +322,7 @@ static void OBJECT_engine_init(void *vedata)
|
||||
mul_m4_v4(viewinvmat, zvec);
|
||||
|
||||
/* z axis : chose the most facing plane */
|
||||
if (fabsf(zvec[0]) > fabsf(zvec[1])) {
|
||||
if (fabsf(zvec[0]) < fabsf(zvec[1])) {
|
||||
e_data.zpos_flag |= (PLANE_XZ | SHOW_AXIS_X);
|
||||
}
|
||||
else {
|
||||
@@ -344,7 +344,7 @@ static void OBJECT_engine_init(void *vedata)
|
||||
}
|
||||
}
|
||||
else {
|
||||
e_data.zneg_flag = e_data.zpos_flag = 0;
|
||||
e_data.zneg_flag = e_data.zpos_flag = CLIP_ZNEG | CLIP_ZPOS;
|
||||
}
|
||||
|
||||
winmat[3][2] -= offs;
|
||||
@@ -354,6 +354,7 @@ static void OBJECT_engine_init(void *vedata)
|
||||
e_data.grid_settings[1] = grid_res; /* gridResolution */
|
||||
e_data.grid_settings[2] = grid_scale; /* gridScale */
|
||||
e_data.grid_settings[3] = v3d->gridsubdiv; /* gridSubdiv */
|
||||
e_data.grid_settings[4] = (v3d->gridsubdiv > 1) ? 1.0f / log(v3d->gridsubdiv) : 0.0; /* 1/log(gridSubdiv) */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -509,6 +510,7 @@ static void OBJECT_cache_init(void *vedata)
|
||||
DRW_shgroup_uniform_mat4(grp, "ViewProjectionOffsetMatrix", (float *)e_data.grid_mat);
|
||||
DRW_shgroup_uniform_vec3(grp, "cameraPos", e_data.camera_pos, 1);
|
||||
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);
|
||||
|
||||
|
@@ -9,6 +9,7 @@ out vec4 FragColor;
|
||||
uniform mat4 ProjectionMatrix;
|
||||
uniform vec3 cameraPos;
|
||||
uniform vec4 gridSettings;
|
||||
uniform float gridOneOverLogSubdiv;
|
||||
|
||||
#define gridDistance gridSettings.x
|
||||
#define gridResolution gridSettings.y
|
||||
@@ -56,26 +57,21 @@ void main()
|
||||
{
|
||||
vec3 fwidthCos = fwidth(wPos);
|
||||
|
||||
float fade, grid_res;
|
||||
float dist, fade;
|
||||
/* if persp */
|
||||
if (ProjectionMatrix[3][3] == 0.0) {
|
||||
float dist = distance(cameraPos, wPos);
|
||||
float dist_norm = dist / (2.0 * gridDistance);
|
||||
grid_res = log(dist * gridResolution) / log(gridSubdiv);
|
||||
dist = distance(cameraPos, wPos);
|
||||
fade = 1.0 - smoothstep(0.0, gridDistance, dist - gridDistance);
|
||||
}
|
||||
else {
|
||||
float dist = abs(gl_FragCoord.z * 2.0 - 1.0);
|
||||
grid_res = log(gridResolution) / log(gridSubdiv);
|
||||
dist = abs(gl_FragCoord.z * 2.0 - 1.0);
|
||||
fade = 1.0 - smoothstep(0.0, 0.5, dist - 0.5);
|
||||
}
|
||||
|
||||
/* fix division by 0 (log(1) = 0) */
|
||||
if (gridSubdiv == 1.0) {
|
||||
grid_res = 0.0;
|
||||
dist = 1.0; /* avoid branch after */
|
||||
}
|
||||
|
||||
if ((gridFlag & GRID) > 0) {
|
||||
float grid_res = log(dist * gridResolution) * gridOneOverLogSubdiv;
|
||||
|
||||
float blend = fract(-max(grid_res, 0.0));
|
||||
float lvl = floor(grid_res);
|
||||
|
||||
@@ -98,27 +94,27 @@ void main()
|
||||
|
||||
if ((gridFlag & AXIS_X) > 0) {
|
||||
float xAxis;
|
||||
if ((gridFlag & AXIS_Y) > 0) {
|
||||
xAxis = axis(wPos.y, fwidthCos.y, 0.1);
|
||||
if ((gridFlag & PLANE_XZ) > 0) {
|
||||
xAxis = axis(wPos.z, fwidthCos.z, 0.1);
|
||||
}
|
||||
else {
|
||||
xAxis = axis(wPos.z, fwidthCos.z, 0.1);
|
||||
xAxis = axis(wPos.y, fwidthCos.y, 0.1);
|
||||
}
|
||||
FragColor = mix(FragColor, colorGridAxisX, xAxis);
|
||||
}
|
||||
if ((gridFlag & AXIS_Y) > 0) {
|
||||
float yAxis;
|
||||
if ((gridFlag & AXIS_X) > 0) {
|
||||
yAxis = axis(wPos.x, fwidthCos.x, 0.1);
|
||||
if ((gridFlag & PLANE_YZ) > 0) {
|
||||
yAxis = axis(wPos.z, fwidthCos.z, 0.1);
|
||||
}
|
||||
else {
|
||||
yAxis = axis(wPos.z, fwidthCos.z, 0.1);
|
||||
yAxis = axis(wPos.x, fwidthCos.x, 0.1);
|
||||
}
|
||||
FragColor = mix(FragColor, colorGridAxisY, yAxis);
|
||||
}
|
||||
if ((gridFlag & AXIS_Z) > 0) {
|
||||
float zAxis;
|
||||
if ((gridFlag & AXIS_Y) > 0) {
|
||||
if ((gridFlag & PLANE_YZ) > 0) {
|
||||
zAxis = axis(wPos.y, fwidthCos.y, 0.1);
|
||||
}
|
||||
else {
|
||||
|
@@ -57,7 +57,7 @@ void main()
|
||||
if ((gridFlag & CLIP_Z_POS) > 0) {
|
||||
realPos.z = max(realPos.z, 0.0);
|
||||
}
|
||||
else if ((gridFlag & CLIP_Z_NEG) > 0) {
|
||||
if ((gridFlag & CLIP_Z_NEG) > 0) {
|
||||
realPos.z = min(realPos.z, 0.0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user