diff options
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 30 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 2 |
3 files changed, 33 insertions, 1 deletions
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 5913a037b87..2a54d24b412 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -522,6 +522,8 @@ void ED_view3d_distance_set(struct RegionView3D *rv3d, const float dist); float ED_scene_grid_scale(struct Scene *scene, const char **grid_unit); float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit); +float ED_view3d_grid_view_scale( + struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d, const char **grid_unit); void ED_scene_draw_fps(struct Scene *scene, const struct rcti *rect); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index bfd6679b513..9bda54fdfca 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -774,6 +774,36 @@ float ED_view3d_grid_scale(Scene *scene, View3D *v3d, const char **grid_unit) return v3d->grid * ED_scene_grid_scale(scene, grid_unit); } +/* Simulates the grid scale that is visualized by the shaders drawing functions. + * The actual code is seen in `object_grid_frag.glsl` when you get the `grid_res` value. + * Currently the simulation is done only when RV3D_VIEW_IS_AXIS. */ +float ED_view3d_grid_view_scale( + Scene *scene, View3D *v3d, RegionView3D *rv3d, const char **grid_unit) +{ + float grid_scale = ED_view3d_grid_scale(scene, v3d, grid_unit); + if (!rv3d->is_persp && RV3D_VIEW_IS_AXIS(rv3d->view)) { + /* Decrease the distance between grid snap points depending on zoom. */ + float grid_subdiv = v3d->gridsubdiv; + if (grid_subdiv > 1) { + float grid_distance = rv3d->dist; + float lvl = (logf(grid_distance / grid_scale) / logf(grid_subdiv)); + if (lvl < 0.0f) { + /* Negative values need an offset for correct casting. + * By convention, the minimum lvl is limited to -2 (see `objec_mode.c`) */ + if (lvl > -2.0f) { + lvl -= 1.0f; + } + else { + lvl = -2.0f; + } + } + grid_scale *= pow(grid_subdiv, (int)lvl - 1); + } + } + + return v3d->grid * grid_scale; +} + static void draw_view_axis(RegionView3D *rv3d, const rcti *rect) { const float k = U.rvisize * U.pixelsize; /* axis size */ diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index de41e6d3906..143c534d682 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4669,7 +4669,7 @@ static void initSnapSpatial(TransInfo *t, float r_snap[3]) if (rv3d) { View3D *v3d = t->sa->spacedata.first; r_snap[0] = 0.0f; - r_snap[1] = ED_view3d_grid_scale(t->scene, v3d, NULL) * 1.0f; + r_snap[1] = ED_view3d_grid_view_scale(t->scene, v3d, rv3d, NULL) * 1.0f; r_snap[2] = r_snap[1] * 0.1f; } } |