2023-08-16 00:20:26 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2021 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2021-11-05 13:25:00 +01:00
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
|
* \ingroup draw_engine
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "image_private.hh"
|
|
|
|
|
|
|
|
|
|
namespace blender::draw::image_engine {
|
|
|
|
|
|
|
|
|
|
class SpaceNodeAccessor : public AbstractSpaceAccessor {
|
|
|
|
|
SpaceNode *snode;
|
|
|
|
|
|
|
|
|
|
public:
|
2023-03-29 16:50:54 +02:00
|
|
|
SpaceNodeAccessor(SpaceNode *snode) : snode(snode) {}
|
2021-11-05 13:25:00 +01:00
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-28 11:23:22 +01:00
|
|
|
void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *ibuf) override
|
2021-11-05 13:25:00 +01:00
|
|
|
{
|
|
|
|
|
if ((snode->flag & SNODE_USE_ALPHA) != 0) {
|
|
|
|
|
/* Show RGBA */
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::ShowAlpha | ImageDrawFlags::ApplyAlpha;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
else if ((snode->flag & SNODE_SHOW_ALPHA) != 0) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
|
2021-11-05 13:25:00 +01:00
|
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
|
}
|
|
|
|
|
else if ((snode->flag & SNODE_SHOW_R) != 0) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
|
2021-11-05 13:25:00 +01:00
|
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
|
|
|
|
|
}
|
|
|
|
|
else if ((snode->flag & SNODE_SHOW_G) != 0) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
|
2021-11-05 13:25:00 +01:00
|
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
|
|
|
}
|
|
|
|
|
else if ((snode->flag & SNODE_SHOW_B) != 0) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::Shuffling;
|
2021-11-05 13:25:00 +01:00
|
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
copy_v4_fl4(r_shader_parameters.shuffle, 0.0f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
}
|
|
|
|
|
else /* RGB */ {
|
|
|
|
|
if (IMB_alpha_affects_rgb(ibuf)) {
|
2022-12-09 12:12:55 +01:00
|
|
|
r_shader_parameters.flags |= ImageDrawFlags::ApplyAlpha;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-28 08:37:12 +01:00
|
|
|
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,
|
2023-03-21 08:27:05 +01:00
|
|
|
const float image_offset[2],
|
2022-01-28 08:37:12 +01:00
|
|
|
const float image_resolution[2],
|
|
|
|
|
float r_uv_to_texture[4][4]) const override
|
2021-11-05 13:25:00 +01:00
|
|
|
{
|
2022-01-28 08:37:12 +01:00
|
|
|
unit_m4(r_uv_to_texture);
|
|
|
|
|
float display_resolution[2];
|
2023-03-21 08:27:05 +01:00
|
|
|
float image_display_offset[2];
|
2022-01-28 08:37:12 +01:00
|
|
|
mul_v2_v2fl(display_resolution, image_resolution, snode->zoom);
|
2023-03-21 08:27:05 +01:00
|
|
|
mul_v2_v2fl(image_display_offset, image_offset, snode->zoom);
|
2022-01-28 08:37:12 +01:00
|
|
|
const float scale_x = display_resolution[0] / region->winx;
|
|
|
|
|
const float scale_y = display_resolution[1] / region->winy;
|
2023-03-21 08:27:05 +01:00
|
|
|
const float translate_x = ((region->winx - display_resolution[0]) * 0.5f + snode->xof +
|
|
|
|
|
image_display_offset[0]) /
|
2022-03-19 00:36:07 +01:00
|
|
|
region->winx;
|
2023-03-21 08:27:05 +01:00
|
|
|
const float translate_y = ((region->winy - display_resolution[1]) * 0.5f + snode->yof +
|
|
|
|
|
image_display_offset[1]) /
|
2022-03-19 00:36:07 +01:00
|
|
|
region->winy;
|
2022-01-28 08:37:12 +01:00
|
|
|
|
|
|
|
|
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;
|
2021-11-05 13:25:00 +01:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace blender::draw::image_engine
|