[Bf-blender-cvs] [b33693cb44e] blender2.8: New Grid: small modification

Clément Foucault noreply at git.blender.org
Mon Mar 27 14:08:56 CEST 2017


Commit: b33693cb44e8a1bde1933d2a516b3ed54c8021ea
Author: Clément Foucault
Date:   Mon Mar 27 14:01:25 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBb33693cb44e8a1bde1933d2a516b3ed54c8021ea

New Grid: small modification

Fix wrong coord picked when display only one axis.
Small optimizations here and there.

===================================================================

M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/shaders/object_grid_frag.glsl
M	source/blender/draw/modes/shaders/object_grid_vert.glsl

===================================================================

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);
 	}




More information about the Bf-blender-cvs mailing list