Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-03-27 15:01:25 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-03-27 15:01:47 +0300
commitb33693cb44e8a1bde1933d2a516b3ed54c8021ea (patch)
tree7d62eb5b5a2a19ce1690984887b0989bd41f8a53
parentdeda6a43fc710f30ceb9e3b30d1f8d79180fe8d1 (diff)
New Grid: small modification
Fix wrong coord picked when display only one axis. Small optimizations here and there.
-rw-r--r--source/blender/draw/modes/object_mode.c8
-rw-r--r--source/blender/draw/modes/shaders/object_grid_frag.glsl32
-rw-r--r--source/blender/draw/modes/shaders/object_grid_vert.glsl2
3 files changed, 20 insertions, 22 deletions
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index cfea5b030f6..5be50cfa5cd 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -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);
diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl
index 8b890ea8692..0c5a1175052 100644
--- a/source/blender/draw/modes/shaders/object_grid_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl
@@ -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 {
diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl
index 5127bd81474..2da8e45c560 100644
--- a/source/blender/draw/modes/shaders/object_grid_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_vert.glsl
@@ -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);
}