This reverts commit 33409f9f1c, as it breaks
panning in the image editor.
Fixes T96543
123 lines
3.8 KiB
C++
123 lines
3.8 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2021 Blender Foundation. */
|
|
|
|
/** \file
|
|
* \ingroup draw_engine
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "image_private.hh"
|
|
|
|
namespace blender::draw::image_engine {
|
|
|
|
class SpaceNodeAccessor : public AbstractSpaceAccessor {
|
|
SpaceNode *snode;
|
|
|
|
public:
|
|
SpaceNodeAccessor(SpaceNode *snode) : snode(snode)
|
|
{
|
|
}
|
|
|
|
Image *get_image(Main *bmain) override
|
|
{
|
|
return BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node");
|
|
}
|
|
|
|
ImageUser *get_image_user() override
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
ImBuf *acquire_image_buffer(Image *image, void **lock) override
|
|
{
|
|
return BKE_image_acquire_ibuf(image, nullptr, lock);
|
|
}
|
|
|
|
void release_buffer(Image *image, ImBuf *ibuf, void *lock) override
|
|
{
|
|
BKE_image_release_ibuf(image, ibuf, lock);
|
|
}
|
|
|
|
void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *ibuf) override
|
|
{
|
|
if ((snode->flag & SNODE_USE_ALPHA) != 0) {
|
|
/* Show RGBA */
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_SHOW_ALPHA | IMAGE_DRAW_FLAG_APPLY_ALPHA;
|
|
}
|
|
else if ((snode->flag & SNODE_SHOW_ALPHA) != 0) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_SHUFFLING;
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 0.0f, 1.0f);
|
|
}
|
|
else if ((snode->flag & SNODE_SHOW_R) != 0) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_SHUFFLING;
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA;
|
|
}
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
|
|
}
|
|
else if ((snode->flag & SNODE_SHOW_G) != 0) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_SHUFFLING;
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA;
|
|
}
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
}
|
|
else if ((snode->flag & SNODE_SHOW_B) != 0) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_SHUFFLING;
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA;
|
|
}
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 1.0f, 0.0f);
|
|
}
|
|
else /* RGB */ {
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
|
r_shader_parameters.flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA;
|
|
}
|
|
}
|
|
}
|
|
|
|
void get_gpu_textures(Image *image,
|
|
ImageUser *iuser,
|
|
ImBuf *ibuf,
|
|
GPUTexture **r_gpu_texture,
|
|
bool *r_owns_texture,
|
|
GPUTexture **r_tex_tile_data) override
|
|
{
|
|
*r_gpu_texture = BKE_image_get_gpu_texture(image, iuser, ibuf);
|
|
*r_owns_texture = false;
|
|
*r_tex_tile_data = nullptr;
|
|
}
|
|
|
|
bool use_tile_drawing() const override
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* The backdrop of the node editor isn't drawn in screen space UV space. But is locked with the
|
|
* screen.
|
|
*/
|
|
void init_ss_to_texture_matrix(const ARegion *region,
|
|
const float image_resolution[2],
|
|
float r_uv_to_texture[4][4]) const override
|
|
{
|
|
unit_m4(r_uv_to_texture);
|
|
float display_resolution[2];
|
|
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) /
|
|
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;
|
|
r_uv_to_texture[3][0] = translate_x;
|
|
r_uv_to_texture[3][1] = translate_y;
|
|
}
|
|
};
|
|
|
|
} // namespace blender::draw::image_engine
|