This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/draw/engines/image/image_space_node.hh
2021-11-10 00:55:38 +11:00

139 lines
4.4 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* 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);
}
bool has_view_override() const override
{
return true;
}
DRWView *create_view_override(const ARegion *region) override
{
/* Setup a screen pixel view. The backdrop of the node editor doesn't follow the region. */
float winmat[4][4], viewmat[4][4];
orthographic_m4(viewmat, 0.0, region->winx, 0.0, region->winy, 0.0, 1.0);
unit_m4(winmat);
return DRW_view_create(viewmat, winmat, nullptr, nullptr, nullptr);
}
void get_shader_parameters(ShaderParameters &r_shader_parameters,
ImBuf *ibuf,
bool UNUSED(is_tiled)) 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;
}
void get_image_mat(const ImBuf *image_buffer,
const ARegion *region,
float r_mat[4][4]) const override
{
unit_m4(r_mat);
const float ibuf_width = image_buffer->x;
const float ibuf_height = image_buffer->y;
r_mat[0][0] = ibuf_width * snode->zoom;
r_mat[1][1] = ibuf_height * snode->zoom;
r_mat[3][0] = (region->winx - snode->zoom * ibuf_width) / 2 + snode->xof;
r_mat[3][1] = (region->winy - snode->zoom * ibuf_height) / 2 + snode->yof;
}
};
} // namespace blender::draw::image_engine