diff options
author | Brecht Van Lommel <brecht@blender.org> | 2022-03-19 02:36:07 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-03-19 02:37:30 +0300 |
commit | 7fed213ba40d6f36282b09245ea459b22d4f6c5b (patch) | |
tree | 8538ed2d0723684af69c5dd9897cbc7547b478cb /source | |
parent | 356073c13e16489ba13f3988478ec0749af9fdf1 (diff) |
Revert "Compositor: Support backdrop offset for the Viewer node"
This reverts commit 33409f9f1cd42e899f2706fe7878e5e89b50d617, as it breaks
panning in the image editor.
Fixes T96543
Diffstat (limited to 'source')
12 files changed, 57 insertions, 74 deletions
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc index 7f0eaecfff7..bc7e08ee98a 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cc +++ b/source/blender/compositor/operations/COM_ViewerOperation.cc @@ -10,10 +10,10 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "DNA_node_types.h" - namespace blender::compositor { +static int MAX_VIEWER_TRANSLATION_PADDING = 12000; + ViewerOperation::ViewerOperation() { this->set_image(nullptr); @@ -137,12 +137,23 @@ void ViewerOperation::init_image() return; } - if (ibuf->x != get_width() || ibuf->y != get_height()) { + int padding_x = abs(canvas_.xmin) * 2; + int padding_y = abs(canvas_.ymin) * 2; + if (padding_x > MAX_VIEWER_TRANSLATION_PADDING) { + padding_x = MAX_VIEWER_TRANSLATION_PADDING; + } + if (padding_y > MAX_VIEWER_TRANSLATION_PADDING) { + padding_y = MAX_VIEWER_TRANSLATION_PADDING; + } + + display_width_ = get_width() + padding_x; + display_height_ = get_height() + padding_y; + if (ibuf->x != display_width_ || ibuf->y != display_height_) { imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); - ibuf->x = get_width(); - ibuf->y = get_height(); + ibuf->x = display_width_; + ibuf->y = display_height_; /* zero size can happen if no image buffers exist to define a sensible resolution */ if (ibuf->x > 0 && ibuf->y > 0) { imb_addrectfloatImBuf(ibuf); @@ -176,13 +187,11 @@ void ViewerOperation::update_image(const rcti *rect) return; } - image_->display_offset_x = canvas_.xmin; - image_->display_offset_y = canvas_.ymin; float *buffer = output_buffer_; IMB_partial_display_buffer_update(ibuf_, buffer, nullptr, - get_width(), + display_width_, 0, 0, view_settings_, @@ -215,23 +224,32 @@ void ViewerOperation::update_memory_buffer_partial(MemoryBuffer *UNUSED(output), return; } + const int offset_x = area.xmin + (canvas_.xmin > 0 ? canvas_.xmin * 2 : 0); + const int offset_y = area.ymin + (canvas_.ymin > 0 ? canvas_.ymin * 2 : 0); MemoryBuffer output_buffer( - output_buffer_, COM_DATA_TYPE_COLOR_CHANNELS, get_width(), get_height()); + output_buffer_, COM_DATA_TYPE_COLOR_CHANNELS, display_width_, display_height_); const MemoryBuffer *input_image = inputs[0]; - output_buffer.copy_from(input_image, area); + output_buffer.copy_from(input_image, area, offset_x, offset_y); if (use_alpha_input_) { const MemoryBuffer *input_alpha = inputs[1]; - output_buffer.copy_from(input_alpha, area, 0, COM_DATA_TYPE_VALUE_CHANNELS, 3); + output_buffer.copy_from( + input_alpha, area, 0, COM_DATA_TYPE_VALUE_CHANNELS, offset_x, offset_y, 3); } if (depth_buffer_) { MemoryBuffer depth_buffer( - depth_buffer_, COM_DATA_TYPE_VALUE_CHANNELS, get_width(), get_height()); + depth_buffer_, COM_DATA_TYPE_VALUE_CHANNELS, display_width_, display_height_); const MemoryBuffer *input_depth = inputs[2]; - depth_buffer.copy_from(input_depth, area); + depth_buffer.copy_from(input_depth, area, offset_x, offset_y); } - update_image(&area); + rcti display_area; + BLI_rcti_init(&display_area, + offset_x, + offset_x + BLI_rcti_size_x(&area), + offset_y, + offset_y + BLI_rcti_size_y(&area)); + update_image(&display_area); } void ViewerOperation::clear_display_buffer() diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h index ed9e5871eae..1ad6cc51269 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.h +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -35,6 +35,9 @@ class ViewerOperation : public MultiThreadedOperation { SocketReader *alpha_input_; SocketReader *depth_input_; + int display_width_; + int display_height_; + public: ViewerOperation(); void init_execution() override; diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh index af3ec24d085..46482ab6668 100644 --- a/source/blender/draw/engines/image/image_drawing_mode.hh +++ b/source/blender/draw/engines/image/image_drawing_mode.hh @@ -129,6 +129,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD { GPUShader *shader = IMAGE_shader_depth_get(); DRWShadingGroup *shgrp = DRW_shgroup_create(shader, instance_data.passes.depth_pass); + float image_mat[4][4]; unit_m4(image_mat); diff --git a/source/blender/draw/engines/image/image_engine.cc b/source/blender/draw/engines/image/image_engine.cc index 09efaea3e71..e972d21cda4 100644 --- a/source/blender/draw/engines/image/image_engine.cc +++ b/source/blender/draw/engines/image/image_engine.cc @@ -99,11 +99,8 @@ class ImageEngine { /* Setup the matrix to go from screen UV coordinates to UV texture space coordinates. */ float image_resolution[2] = {image_buffer ? image_buffer->x : 1024.0f, image_buffer ? image_buffer->y : 1024.0f}; - float image_display_offset[2] = {(float)instance_data->image->display_offset_x, - (float)instance_data->image->display_offset_y}; - space->init_ss_to_texture_matrix(draw_ctx->region, - image_display_offset, - image_resolution, instance_data->ss_to_texture); + space->init_ss_to_texture_matrix( + draw_ctx->region, image_resolution, instance_data->ss_to_texture); const Scene *scene = DRW_context_state_get()->scene; instance_data->sh_params.update(space.get(), scene, instance_data->image, image_buffer); diff --git a/source/blender/draw/engines/image/image_instance_data.hh b/source/blender/draw/engines/image/image_instance_data.hh index 02ca86312c6..682b93a80b3 100644 --- a/source/blender/draw/engines/image/image_instance_data.hh +++ b/source/blender/draw/engines/image/image_instance_data.hh @@ -21,7 +21,7 @@ /** * \brief max allowed textures to use by the ScreenSpaceDrawingMode. * - * 1 texture is used to reduce uploading screen space textures when translating the image. + * 4 textures are used to reduce uploading screen space textures when translating the image. */ constexpr int SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN = 1; diff --git a/source/blender/draw/engines/image/image_space.hh b/source/blender/draw/engines/image/image_space.hh index a2f923a7118..7a11d14b567 100644 --- a/source/blender/draw/engines/image/image_space.hh +++ b/source/blender/draw/engines/image/image_space.hh @@ -77,7 +77,6 @@ class AbstractSpaceAccessor { * (0..1) to texture space UV coordinates. */ virtual void init_ss_to_texture_matrix(const ARegion *region, - const float image_display_offset[2], const float image_resolution[2], float r_uv_to_texture[4][4]) const = 0; diff --git a/source/blender/draw/engines/image/image_space_image.hh b/source/blender/draw/engines/image/image_space_image.hh index 264129e0728..40aa117514c 100644 --- a/source/blender/draw/engines/image/image_space_image.hh +++ b/source/blender/draw/engines/image/image_space_image.hh @@ -148,8 +148,7 @@ class SpaceImageAccessor : public AbstractSpaceAccessor { } void init_ss_to_texture_matrix(const ARegion *region, - const float image_display_offset[2], - const float image_resolution[2], + const float UNUSED(image_resolution[2]), float r_uv_to_texture[4][4]) const override { unit_m4(r_uv_to_texture); diff --git a/source/blender/draw/engines/image/image_space_node.hh b/source/blender/draw/engines/image/image_space_node.hh index 4057f7b78cf..6f38dcb86aa 100644 --- a/source/blender/draw/engines/image/image_space_node.hh +++ b/source/blender/draw/engines/image/image_space_node.hh @@ -99,7 +99,6 @@ class SpaceNodeAccessor : public AbstractSpaceAccessor { * screen. */ void init_ss_to_texture_matrix(const ARegion *region, - const float image_display_offset[2], const float image_resolution[2], float r_uv_to_texture[4][4]) const override { @@ -108,10 +107,10 @@ class SpaceNodeAccessor : public AbstractSpaceAccessor { mul_v2_v2fl(display_resolution, image_resolution, snode->zoom); const float scale_x = display_resolution[0] / region->winx; const float scale_y = display_resolution[1] / region->winy; - const float translate_x = ((region->winx - display_resolution[0]) * 0.5f + snode->xof + image_display_offset[0]) / - region->winx ; - const float translate_y = ((region->winy - display_resolution[1]) * 0.5f + snode->yof + image_display_offset[1]) / - region->winy; + const float translate_x = ((region->winx - display_resolution[0]) * 0.5f + snode->xof) / + region->winx; + const float translate_y = ((region->winy - display_resolution[1]) * 0.5f + snode->yof) / + region->winy; r_uv_to_texture[0][0] = scale_x; r_uv_to_texture[1][1] = scale_y; diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index ad647cf019d..365a17c0a04 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -1499,10 +1499,8 @@ void draw_nodespace_back_pix(const bContext &C, if (ibuf) { /* somehow the offset has to be calculated inverse */ wmOrtho2_region_pixelspace(®ion); - const float offset_x = snode.xof + ima->display_offset_x; - const float offset_y = snode.yof + ima->display_offset_y; - const float x = (region.winx - snode.zoom * ibuf->x) / 2 + offset_x; - const float y = (region.winy - snode.zoom * ibuf->y) / 2 + offset_y; + const float x = (region.winx - snode.zoom * ibuf->x) / 2 + snode.xof; + const float y = (region.winy - snode.zoom * ibuf->y) / 2 + snode.yof; /** \note draw selected info on backdrop */ if (snode.edittree) { diff --git a/source/blender/editors/space_node/node_gizmo.cc b/source/blender/editors/space_node/node_gizmo.cc index 832ec36ab34..4f27f9baabc 100644 --- a/source/blender/editors/space_node/node_gizmo.cc +++ b/source/blender/editors/space_node/node_gizmo.cc @@ -38,39 +38,25 @@ namespace blender::ed::space_node { static void node_gizmo_calc_matrix_space(const SpaceNode *snode, const ARegion *region, - const float image_offset[2], float matrix_space[4][4]) { unit_m4(matrix_space); mul_v3_fl(matrix_space[0], snode->zoom); mul_v3_fl(matrix_space[1], snode->zoom); - const float offset_x = snode->xof + image_offset[0]; - const float offset_y = snode->yof + image_offset[1]; - matrix_space[3][0] = (region->winx / 2) + offset_x; - matrix_space[3][1] = (region->winy / 2) + offset_y; + matrix_space[3][0] = (region->winx / 2) + snode->xof; + matrix_space[3][1] = (region->winy / 2) + snode->yof; } static void node_gizmo_calc_matrix_space_with_image_dims(const SpaceNode *snode, const ARegion *region, - const float image_offset[2], const float image_dims[2], float matrix_space[4][4]) { unit_m4(matrix_space); mul_v3_fl(matrix_space[0], snode->zoom * image_dims[0]); mul_v3_fl(matrix_space[1], snode->zoom * image_dims[1]); - const float offset_x = snode->xof + image_offset[0]; - const float offset_y = snode->yof + image_offset[1]; - matrix_space[3][0] = ((region->winx / 2) + offset_x) - ((image_dims[0] / 2.0f) * snode->zoom); - matrix_space[3][1] = ((region->winy / 2) + offset_y) - ((image_dims[1] / 2.0f) * snode->zoom); -} - -static void get_viewer_image_offset(const bContext *C, float r_offset[2]) -{ - Main *bmain = CTX_data_main(C); - const Image *image = BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node"); - r_offset[0] = image->display_offset_x; - r_offset[1] = image->display_offset_y; + matrix_space[3][0] = ((region->winx / 2) + snode->xof) - ((image_dims[0] / 2.0f) * snode->zoom); + matrix_space[3][1] = ((region->winy / 2) + snode->yof) - ((image_dims[1] / 2.0f) * snode->zoom); } /** \} */ @@ -141,13 +127,11 @@ static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmGizmoGroup * Main *bmain = CTX_data_main(C); wmGizmo *cage = ((wmGizmoWrapper *)gzgroup->customdata)->gizmo; const ARegion *region = CTX_wm_region(C); - - Image *ima = BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node"); - /* Center is always at the origin. */ - const float origin[3] ={ (region->winx / 2) + (float)ima->display_offset_x, - (region->winy / 2) + (float)ima->display_offset_y}; + /* center is always at the origin */ + const float origin[3] = {float(region->winx / 2), float(region->winy / 2), 0.0f}; void *lock; + Image *ima = BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node"); ImBuf *ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock); if (ibuf) { @@ -356,9 +340,7 @@ static void WIDGETGROUP_node_crop_draw_prepare(const bContext *C, wmGizmoGroup * SpaceNode *snode = CTX_wm_space_node(C); - float image_offset[2]; - get_viewer_image_offset(C, image_offset); - node_gizmo_calc_matrix_space(snode, region, image_offset, gz->matrix_space); + node_gizmo_calc_matrix_space(snode, region, gz->matrix_space); } static void WIDGETGROUP_node_crop_refresh(const bContext *C, wmGizmoGroup *gzgroup) @@ -471,10 +453,8 @@ static void WIDGETGROUP_node_sbeam_draw_prepare(const bContext *C, wmGizmoGroup SpaceNode *snode = CTX_wm_space_node(C); - float image_offset[2]; - get_viewer_image_offset(C, image_offset); node_gizmo_calc_matrix_space_with_image_dims( - snode, region, image_offset, sbeam_group->state.dims, gz->matrix_space); + snode, region, sbeam_group->state.dims, gz->matrix_space); } static void WIDGETGROUP_node_sbeam_refresh(const bContext *C, wmGizmoGroup *gzgroup) @@ -580,12 +560,9 @@ static void WIDGETGROUP_node_corner_pin_draw_prepare(const bContext *C, wmGizmoG SpaceNode *snode = CTX_wm_space_node(C); - float image_offset[2]; - get_viewer_image_offset(C, image_offset); - float matrix_space[4][4]; node_gizmo_calc_matrix_space_with_image_dims( - snode, region, image_offset, cpin_group->state.dims, matrix_space); + snode, region, cpin_group->state.dims, matrix_space); for (int i = 0; i < 4; i++) { wmGizmo *gz = cpin_group->gizmos[i]; diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index af93c4d823c..82b850653be 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -352,14 +352,9 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params) case ND_FRAME: ED_area_tag_refresh(area); break; - case ND_COMPO_RESULT: { + case ND_COMPO_RESULT: ED_area_tag_redraw(area); - /* Backdrop image offset is calculated during compositing so gizmos need to be updated - * afterwards. */ - const ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_WINDOW); - WM_gizmomap_tag_refresh(region->gizmo_map); break; - } case ND_TRANSFORM_DONE: if (ED_node_is_compositor(snode)) { if (snode->flag & SNODE_AUTO_RENDER) { diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 8f327d12735..06b589d4f76 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -199,9 +199,6 @@ typedef struct Image { char eye; char views_format; - /** Displayed offset in backdrop for viewer nodes in pixel space. */ - int display_offset_x, display_offset_y; - /* ImageTile list for UDIMs. */ int active_tile_index; ListBase tiles; |