diff options
Diffstat (limited to 'source/blender/draw/engines/overlay/overlay_grid.c')
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_grid.c | 356 |
1 files changed, 174 insertions, 182 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c index 3d42765a5e5..55013d0429b 100644 --- a/source/blender/draw/engines/overlay/overlay_grid.c +++ b/source/blender/draw/engines/overlay/overlay_grid.c @@ -19,32 +19,22 @@ #include "overlay_private.h" -enum { - SHOW_AXIS_X = (1 << 0), - SHOW_AXIS_Y = (1 << 1), - SHOW_AXIS_Z = (1 << 2), - SHOW_GRID = (1 << 3), - PLANE_XY = (1 << 4), - PLANE_XZ = (1 << 5), - PLANE_YZ = (1 << 6), - CLIP_ZPOS = (1 << 7), - CLIP_ZNEG = (1 << 8), - GRID_BACK = (1 << 9), - GRID_CAMERA = (1 << 10), - PLANE_IMAGE = (1 << 11), - CUSTOM_GRID = (1 << 12), -}; +BLI_STATIC_ASSERT(SI_GRID_STEPS_LEN == OVERLAY_GRID_STEPS_LEN, "") void OVERLAY_grid_init(OVERLAY_Data *vedata) { OVERLAY_PrivateData *pd = vedata->stl->pd; - OVERLAY_ShadingData *shd = &pd->shdata; + OVERLAY_GridData *grid = &pd->grid_data; const DRWContextState *draw_ctx = DRW_context_state_get(); - shd->grid_flag = 0; - shd->zneg_flag = 0; - shd->zpos_flag = 0; - shd->grid_line_size = max_ff(0.0f, U.pixelsize - 1.0f) * 0.5f; + float *grid_axes = pd->grid.grid_axes; + float *zplane_axes = pd->grid.zplane_axes; + float grid_steps[SI_GRID_STEPS_LEN] = { + 0.001f, 0.01f, 0.1f, 1.0f, 10.0f, 100.0f, 1000.0f, 10000.0f}; + OVERLAY_GridBits grid_flag = 0, zneg_flag = 0, zpos_flag = 0; + grid->line_size = max_ff(0.0f, U.pixelsize - 1.0f) * 0.5f; + /* Default, nothing is drawn. */ + pd->grid.grid_flag = pd->grid.zneg_flag = pd->grid.zpos_flag = 0; if (pd->space_type == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; @@ -58,231 +48,233 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata) SI_OVERLAY_SHOW_GRID_BACKGROUND) != 0) : true; if (background_enabled) { - shd->grid_flag = GRID_BACK | PLANE_IMAGE; + grid_flag = GRID_BACK | PLANE_IMAGE; } const bool draw_grid = is_uv_edit || !ED_space_image_has_buffer(sima); if (background_enabled && draw_grid) { - shd->grid_flag |= SHOW_GRID; + grid_flag |= SHOW_GRID; if (is_uv_edit && (sima->flag & SI_CUSTOM_GRID) != 0) { - shd->grid_flag |= CUSTOM_GRID; + grid_flag |= CUSTOM_GRID; } } - shd->grid_distance = 1.0f; - copy_v3_fl3(shd->grid_size, 1.0f, 1.0f, 1.0f); + grid->distance = 1.0f; + copy_v3_fl3(grid->size, 1.0f, 1.0f, 1.0f); if (is_uv_edit) { - shd->grid_size[0] = (float)sima->tile_grid_shape[0]; - shd->grid_size[1] = (float)sima->tile_grid_shape[1]; + grid->size[0] = (float)sima->tile_grid_shape[0]; + grid->size[1] = (float)sima->tile_grid_shape[1]; } - const int grid_size = SI_GRID_STEPS_LEN; - shd->zoom_factor = ED_space_image_zoom_level(v2d, grid_size); - ED_space_image_grid_steps(sima, shd->grid_steps, grid_size); - - return; - } - - View3D *v3d = draw_ctx->v3d; - Scene *scene = draw_ctx->scene; - RegionView3D *rv3d = draw_ctx->rv3d; - - const bool show_axis_x = (pd->v3d_gridflag & V3D_SHOW_X) != 0; - const bool show_axis_y = (pd->v3d_gridflag & V3D_SHOW_Y) != 0; - const bool show_axis_z = (pd->v3d_gridflag & V3D_SHOW_Z) != 0; - const bool show_floor = (pd->v3d_gridflag & V3D_SHOW_FLOOR) != 0; - const bool show_ortho_grid = (pd->v3d_gridflag & V3D_SHOW_ORTHO_GRID) != 0; - - if (pd->hide_overlays || !(pd->v3d_gridflag & (V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_Z | - V3D_SHOW_FLOOR | V3D_SHOW_ORTHO_GRID))) { - return; - } - - float viewinv[4][4], wininv[4][4]; - float viewmat[4][4], winmat[4][4]; - DRW_view_winmat_get(NULL, winmat, false); - DRW_view_winmat_get(NULL, wininv, true); - DRW_view_viewmat_get(NULL, viewmat, false); - DRW_view_viewmat_get(NULL, viewinv, true); - - /* If perspective view or non-axis aligned view. */ - if (winmat[3][3] == 0.0f || rv3d->view == RV3D_VIEW_USER) { - if (show_axis_x) { - shd->grid_flag |= PLANE_XY | SHOW_AXIS_X; - } - if (show_axis_y) { - shd->grid_flag |= PLANE_XY | SHOW_AXIS_Y; - } - if (show_floor) { - shd->grid_flag |= PLANE_XY | SHOW_GRID; - } + grid->zoom_factor = ED_space_image_zoom_level(v2d, SI_GRID_STEPS_LEN); + ED_space_image_grid_steps(sima, grid_steps, SI_GRID_STEPS_LEN); } else { - if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT)) { - shd->grid_flag = PLANE_YZ | SHOW_AXIS_Y | SHOW_AXIS_Z | SHOW_GRID | GRID_BACK; + /* SPACE_VIEW3D */ + View3D *v3d = draw_ctx->v3d; + Scene *scene = draw_ctx->scene; + RegionView3D *rv3d = draw_ctx->rv3d; + + const bool show_axis_x = (pd->v3d_gridflag & V3D_SHOW_X) != 0; + const bool show_axis_y = (pd->v3d_gridflag & V3D_SHOW_Y) != 0; + const bool show_axis_z = (pd->v3d_gridflag & V3D_SHOW_Z) != 0; + const bool show_floor = (pd->v3d_gridflag & V3D_SHOW_FLOOR) != 0; + const bool show_ortho_grid = (pd->v3d_gridflag & V3D_SHOW_ORTHO_GRID) != 0; + + if (pd->hide_overlays || !(pd->v3d_gridflag & (V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_Z | + V3D_SHOW_FLOOR | V3D_SHOW_ORTHO_GRID))) { + return; } - else if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM)) { - shd->grid_flag = PLANE_XY | SHOW_AXIS_X | SHOW_AXIS_Y | SHOW_GRID | GRID_BACK; + + float viewinv[4][4], wininv[4][4]; + float viewmat[4][4], winmat[4][4]; + DRW_view_winmat_get(NULL, winmat, false); + DRW_view_winmat_get(NULL, wininv, true); + DRW_view_viewmat_get(NULL, viewmat, false); + DRW_view_viewmat_get(NULL, viewinv, true); + + /* If perspective view or non-axis aligned view. */ + if (winmat[3][3] == 0.0f || rv3d->view == RV3D_VIEW_USER) { + if (show_axis_x) { + grid_flag |= PLANE_XY | SHOW_AXIS_X; + } + if (show_axis_y) { + grid_flag |= PLANE_XY | SHOW_AXIS_Y; + } + if (show_floor) { + grid_flag |= PLANE_XY | SHOW_GRID; + } } - else if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_FRONT, RV3D_VIEW_BACK)) { - shd->grid_flag = PLANE_XZ | SHOW_AXIS_X | SHOW_AXIS_Z | SHOW_GRID | GRID_BACK; + else { + if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT)) { + grid_flag = PLANE_YZ | SHOW_AXIS_Y | SHOW_AXIS_Z | SHOW_GRID | GRID_BACK; + } + else if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM)) { + grid_flag = PLANE_XY | SHOW_AXIS_X | SHOW_AXIS_Y | SHOW_GRID | GRID_BACK; + } + else if (show_ortho_grid && ELEM(rv3d->view, RV3D_VIEW_FRONT, RV3D_VIEW_BACK)) { + grid_flag = PLANE_XZ | SHOW_AXIS_X | SHOW_AXIS_Z | SHOW_GRID | GRID_BACK; + } } - } - shd->grid_axes[0] = (float)((shd->grid_flag & (PLANE_XZ | PLANE_XY)) != 0); - shd->grid_axes[1] = (float)((shd->grid_flag & (PLANE_YZ | PLANE_XY)) != 0); - shd->grid_axes[2] = (float)((shd->grid_flag & (PLANE_YZ | PLANE_XZ)) != 0); + grid_axes[0] = (float)((grid_flag & (PLANE_XZ | PLANE_XY)) != 0); + grid_axes[1] = (float)((grid_flag & (PLANE_YZ | PLANE_XY)) != 0); + grid_axes[2] = (float)((grid_flag & (PLANE_YZ | PLANE_XZ)) != 0); - /* Z axis if needed */ - if (((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) && show_axis_z) { - shd->zpos_flag = SHOW_AXIS_Z; + /* Z axis if needed */ + if (((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) && show_axis_z) { + zpos_flag = SHOW_AXIS_Z; - float zvec[3], campos[3]; - negate_v3_v3(zvec, viewinv[2]); - copy_v3_v3(campos, viewinv[3]); + float zvec[3], campos[3]; + negate_v3_v3(zvec, viewinv[2]); + copy_v3_v3(campos, viewinv[3]); + + /* z axis : chose the most facing plane */ + if (fabsf(zvec[0]) < fabsf(zvec[1])) { + zpos_flag |= PLANE_XZ; + } + else { + zpos_flag |= PLANE_YZ; + } + + zneg_flag = zpos_flag; + + /* Persp : If camera is below floor plane, we switch clipping + * Ortho : If eye vector is looking up, we switch clipping */ + if (((winmat[3][3] == 0.0f) && (campos[2] > 0.0f)) || + ((winmat[3][3] != 0.0f) && (zvec[2] < 0.0f))) { + zpos_flag |= CLIP_ZPOS; + zneg_flag |= CLIP_ZNEG; + } + else { + zpos_flag |= CLIP_ZNEG; + zneg_flag |= CLIP_ZPOS; + } - /* z axis : chose the most facing plane */ - if (fabsf(zvec[0]) < fabsf(zvec[1])) { - shd->zpos_flag |= PLANE_XZ; + zplane_axes[0] = (float)((zpos_flag & (PLANE_XZ | PLANE_XY)) != 0); + zplane_axes[1] = (float)((zpos_flag & (PLANE_YZ | PLANE_XY)) != 0); + zplane_axes[2] = (float)((zpos_flag & (PLANE_YZ | PLANE_XZ)) != 0); } else { - shd->zpos_flag |= PLANE_YZ; + zneg_flag = zpos_flag = CLIP_ZNEG | CLIP_ZPOS; } - shd->zneg_flag = shd->zpos_flag; + float dist; + if (rv3d->persp == RV3D_CAMOB && v3d->camera && v3d->camera->type == OB_CAMERA) { + Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera); + dist = ((Camera *)(camera_object->data))->clip_end; + grid_flag |= GRID_CAMERA; + zneg_flag |= GRID_CAMERA; + zpos_flag |= GRID_CAMERA; + } + else { + dist = v3d->clip_end; + } - /* Persp : If camera is below floor plane, we switch clipping - * Ortho : If eye vector is looking up, we switch clipping */ - if (((winmat[3][3] == 0.0f) && (campos[2] > 0.0f)) || - ((winmat[3][3] != 0.0f) && (zvec[2] < 0.0f))) { - shd->zpos_flag |= CLIP_ZPOS; - shd->zneg_flag |= CLIP_ZNEG; + if (winmat[3][3] == 0.0f) { + copy_v3_fl(grid->size, dist); } else { - shd->zpos_flag |= CLIP_ZNEG; - shd->zneg_flag |= CLIP_ZPOS; + float viewdist = 1.0f / min_ff(fabsf(winmat[0][0]), fabsf(winmat[1][1])); + copy_v3_fl(grid->size, viewdist * dist); } - shd->zplane_axes[0] = (float)((shd->zpos_flag & (PLANE_XZ | PLANE_XY)) != 0); - shd->zplane_axes[1] = (float)((shd->zpos_flag & (PLANE_YZ | PLANE_XY)) != 0); - shd->zplane_axes[2] = (float)((shd->zpos_flag & (PLANE_YZ | PLANE_XZ)) != 0); - } - else { - shd->zneg_flag = shd->zpos_flag = CLIP_ZNEG | CLIP_ZPOS; - } + grid->distance = dist / 2.0f; - float dist; - if (rv3d->persp == RV3D_CAMOB && v3d->camera && v3d->camera->type == OB_CAMERA) { - Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera); - dist = ((Camera *)(camera_object->data))->clip_end; - shd->grid_flag |= GRID_CAMERA; - shd->zneg_flag |= GRID_CAMERA; - shd->zpos_flag |= GRID_CAMERA; - } - else { - dist = v3d->clip_end; - } + ED_view3d_grid_steps(scene, v3d, rv3d, grid_steps); - if (winmat[3][3] == 0.0f) { - copy_v3_fl(shd->grid_size, dist); - } - else { - float viewdist = 1.0f / min_ff(fabsf(winmat[0][0]), fabsf(winmat[1][1])); - copy_v3_fl(shd->grid_size, viewdist * dist); + if ((v3d->flag & (V3D_XR_SESSION_SURFACE | V3D_XR_SESSION_MIRROR)) != 0) { + /* The calculations for the grid parameters assume that the view matrix has no scale + * component, which may not be correct if the user is "shrunk" or "enlarged" by zooming in or + * out. Therefore, we need to compensate the values here. */ + /* Assumption is uniform scaling (all column vectors are of same length). */ + float viewinvscale = len_v3(viewinv[0]); + grid->distance *= viewinvscale; + } } - shd->grid_distance = dist / 2.0f; - - ED_view3d_grid_steps(scene, v3d, rv3d, shd->grid_steps); - - if ((v3d->flag & (V3D_XR_SESSION_SURFACE | V3D_XR_SESSION_MIRROR)) != 0) { - /* The calculations for the grid parameters assume that the view matrix has no scale component, - * which may not be correct if the user is "shrunk" or "enlarged" by zooming in or out. - * Therefore, we need to compensate the values here. */ - float viewinvscale = len_v3( - viewinv[0]); /* Assumption is uniform scaling (all column vectors are of same length). */ - shd->grid_distance *= viewinvscale; + /* Convert to UBO alignment. */ + for (int i = 0; i < SI_GRID_STEPS_LEN; i++) { + grid->steps[i][0] = grid_steps[i]; } + pd->grid.grid_flag = grid_flag; + pd->grid.zneg_flag = zneg_flag; + pd->grid.zpos_flag = zpos_flag; } -void OVERLAY_grid_cache_init(OVERLAY_Data *vedata) +void OVERLAY_grid_cache_init(OVERLAY_Data *ved) { - OVERLAY_StorageList *stl = vedata->stl; + OVERLAY_StorageList *stl = ved->stl; OVERLAY_PrivateData *pd = stl->pd; - OVERLAY_ShadingData *shd = &pd->shdata; + OVERLAY_GridData *grid = &pd->grid_data; - OVERLAY_PassList *psl = vedata->psl; + OVERLAY_PassList *psl = ved->psl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); psl->grid_ps = NULL; - if ((shd->grid_flag == 0 && shd->zpos_flag == 0) || !DRW_state_is_fbo()) { + if ((pd->grid.grid_flag == 0 && pd->grid.zpos_flag == 0) || !DRW_state_is_fbo()) { return; } + if (ved->instance->grid_ubo == NULL) { + ved->instance->grid_ubo = GPU_uniformbuf_create(sizeof(OVERLAY_GridData)); + } + GPU_uniformbuf_update(ved->instance->grid_ubo, &pd->grid_data); + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA; DRW_PASS_CREATE(psl->grid_ps, state); DRWShadingGroup *grp; GPUShader *sh; struct GPUBatch *geom = DRW_cache_grid_get(); - const float line_zero = 0; - static const float grid_steps_default[8] = {0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0}; - if (pd->space_type == SPACE_IMAGE) { float mat[4][4]; - /* add quad background */ + /* Add quad background. */ sh = OVERLAY_shader_grid_background(); - grp = DRW_shgroup_create(sh, psl->grid_ps); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->grid_ps); float color_back[4]; interp_v4_v4v4(color_back, G_draw.block.color_background, G_draw.block.color_grid, 0.5); DRW_shgroup_uniform_vec4_copy(grp, "color", color_back); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); unit_m4(mat); - mat[0][0] = shd->grid_size[0]; - mat[1][1] = shd->grid_size[1]; - mat[2][2] = shd->grid_size[2]; + mat[0][0] = grid->size[0]; + mat[1][1] = grid->size[1]; + mat[2][2] = grid->size[2]; DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat); } - sh = OVERLAY_shader_grid(); - - /* Create 3 quads to render ordered transparency Z axis */ - grp = DRW_shgroup_create(sh, psl->grid_ps); - DRW_shgroup_uniform_int(grp, "gridFlag", &shd->zneg_flag, 1); - DRW_shgroup_uniform_vec3(grp, "planeAxes", shd->zplane_axes, 1); - DRW_shgroup_uniform_float(grp, "gridDistance", &shd->grid_distance, 1); - DRW_shgroup_uniform_float_copy(grp, "lineKernel", shd->grid_line_size); - DRW_shgroup_uniform_vec3(grp, "gridSize", shd->grid_size, 1); - DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_float(grp, "gridSteps", grid_steps_default, 8); - if (shd->zneg_flag & SHOW_AXIS_Z) { - DRW_shgroup_call(grp, geom, NULL); - } + { + DRWShadingGroup *grp; - grp = DRW_shgroup_create(sh, psl->grid_ps); - DRW_shgroup_uniform_int(grp, "gridFlag", &shd->grid_flag, 1); - DRW_shgroup_uniform_float_copy(grp, "zoomFactor", shd->zoom_factor); - DRW_shgroup_uniform_vec3(grp, "planeAxes", shd->grid_axes, 1); - DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_float_copy(grp, "lineKernel", line_zero); - DRW_shgroup_uniform_float(grp, "gridSteps", shd->grid_steps, ARRAY_SIZE(shd->grid_steps)); - if (shd->grid_flag) { - DRW_shgroup_call(grp, geom, NULL); - } + sh = OVERLAY_shader_grid(); - grp = DRW_shgroup_create(sh, psl->grid_ps); - DRW_shgroup_uniform_int(grp, "gridFlag", &shd->zpos_flag, 1); - DRW_shgroup_uniform_vec3(grp, "planeAxes", shd->zplane_axes, 1); - DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_float_copy(grp, "lineKernel", line_zero); - DRW_shgroup_uniform_float(grp, "gridSteps", grid_steps_default, 8); - if (shd->zpos_flag & SHOW_AXIS_Z) { - DRW_shgroup_call(grp, geom, NULL); + /* Create 3 quads to render ordered transparency Z axis */ + grp = DRW_shgroup_create(sh, psl->grid_ps); + DRW_shgroup_uniform_block(grp, "grid_buf", ved->instance->grid_ubo); + DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_texture_ref(grp, "depth_tx", &dtxl->depth); + + DRW_shgroup_uniform_int_copy(grp, "grid_flag", pd->grid.zneg_flag); + DRW_shgroup_uniform_vec3_copy(grp, "plane_axes", pd->grid.zplane_axes); + if (pd->grid.zneg_flag & SHOW_AXIS_Z) { + DRW_shgroup_call(grp, geom, NULL); + } + + grp = DRW_shgroup_create_sub(grp); + DRW_shgroup_uniform_int_copy(grp, "grid_flag", pd->grid.grid_flag); + DRW_shgroup_uniform_vec3_copy(grp, "plane_axes", pd->grid.grid_axes); + if (pd->grid.grid_flag) { + DRW_shgroup_call(grp, geom, NULL); + } + + grp = DRW_shgroup_create_sub(grp); + DRW_shgroup_uniform_int_copy(grp, "grid_flag", pd->grid.zpos_flag); + DRW_shgroup_uniform_vec3_copy(grp, "plane_axes", pd->grid.zplane_axes); + if (pd->grid.zpos_flag & SHOW_AXIS_Z) { + DRW_shgroup_call(grp, geom, NULL); + } } if (pd->space_type == SPACE_IMAGE) { @@ -293,12 +285,12 @@ void OVERLAY_grid_cache_init(OVERLAY_Data *vedata) float mat[4][4]; /* add wire border */ sh = OVERLAY_shader_grid_image(); - grp = DRW_shgroup_create(sh, psl->grid_ps); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->grid_ps); DRW_shgroup_uniform_vec4_copy(grp, "color", theme_color); unit_m4(mat); - for (int x = 0; x < shd->grid_size[0]; x++) { + for (int x = 0; x < grid->size[0]; x++) { mat[3][0] = x; - for (int y = 0; y < shd->grid_size[1]; y++) { + for (int y = 0; y < grid->size[1]; y++) { mat[3][1] = y; DRW_shgroup_call_obmat(grp, DRW_cache_quad_wires_get(), mat); } |