Blender V5.0
image_space_node.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "DNA_screen_types.h"
12#include "DNA_space_types.h"
13
14#include "image_private.hh"
15
16namespace blender::image_engine {
17
19 SpaceNode *snode;
20
21 public:
22 SpaceNodeAccessor(SpaceNode *snode) : snode(snode) {}
23
24 ::Image *get_image(Main *bmain) override
25 {
26 return BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node");
27 }
28
30 {
31 return nullptr;
32 }
33
34 ImBuf *acquire_image_buffer(::Image *image, void **lock) override
35 {
36 return BKE_image_acquire_ibuf(image, nullptr, lock);
37 }
38
39 void release_buffer(::Image *image, ImBuf *ibuf, void *lock) override
40 {
41 BKE_image_release_ibuf(image, ibuf, lock);
42 }
43
44 void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *ibuf) override
45 {
46 if ((snode->flag & SNODE_USE_ALPHA) != 0) {
47 /* Show RGBA */
49 }
50 else if ((snode->flag & SNODE_SHOW_ALPHA) != 0) {
51 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
52 r_shader_parameters.shuffle = float4(0.0f, 0.0f, 0.0f, 1.0f);
53 }
54 else if ((snode->flag & SNODE_SHOW_R) != 0) {
55 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
56 if (IMB_alpha_affects_rgb(ibuf)) {
57 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
58 }
59 r_shader_parameters.shuffle = float4(1.0f, 0.0f, 0.0f, 0.0f);
60 }
61 else if ((snode->flag & SNODE_SHOW_G) != 0) {
62 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
63 if (IMB_alpha_affects_rgb(ibuf)) {
64 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
65 }
66 r_shader_parameters.shuffle = float4(0.0f, 1.0f, 0.0f, 0.0f);
67 }
68 else if ((snode->flag & SNODE_SHOW_B) != 0) {
69 r_shader_parameters.flags |= ImageDrawFlags::SHUFFLING;
70 if (IMB_alpha_affects_rgb(ibuf)) {
71 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
72 }
73 r_shader_parameters.shuffle = float4(0.0f, 0.0f, 1.0f, 0.0f);
74 }
75 else /* RGB */ {
76 if (IMB_alpha_affects_rgb(ibuf)) {
77 r_shader_parameters.flags |= ImageDrawFlags::APPLY_ALPHA;
78 }
79 }
80 }
81
82 bool use_tile_drawing() const override
83 {
84 return false;
85 }
86
92 const float image_offset[2],
93 const float image_resolution[2],
94 float r_uv_to_texture[4][4]) const override
95 {
96 unit_m4(r_uv_to_texture);
97 float display_resolution[2];
98 float image_display_offset[2];
99 mul_v2_v2fl(display_resolution, image_resolution, snode->zoom);
100 mul_v2_v2fl(image_display_offset, image_offset, snode->zoom);
101 const float scale_x = display_resolution[0] / region->winx;
102 const float scale_y = display_resolution[1] / region->winy;
103 const float translate_x = ((region->winx - display_resolution[0]) * 0.5f + snode->xof +
104 image_display_offset[0]) /
105 region->winx;
106 const float translate_y = ((region->winy - display_resolution[1]) * 0.5f + snode->yof +
107 image_display_offset[1]) /
108 region->winy;
109
110 r_uv_to_texture[0][0] = scale_x;
111 r_uv_to_texture[1][1] = scale_y;
112 r_uv_to_texture[3][0] = translate_x;
113 r_uv_to_texture[3][1] = translate_y;
114 }
115};
116
117} // namespace blender::image_engine
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
Image * BKE_image_ensure_viewer(Main *bmain, int type, const char *name)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void unit_m4(float m[4][4])
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
@ IMA_TYPE_COMPOSITE
@ SNODE_USE_ALPHA
@ SNODE_SHOW_B
@ SNODE_SHOW_G
@ SNODE_SHOW_R
@ SNODE_SHOW_ALPHA
bool IMB_alpha_affects_rgb(const ImBuf *ibuf)
Definition conversion.cc:66
volatile int lock
bool use_tile_drawing() const override
Is (wrap) repeat option enabled in the space.
void get_shader_parameters(ShaderParameters &r_shader_parameters, ImBuf *ibuf) override
void init_ss_to_texture_matrix(const ARegion *region, const float image_offset[2], const float image_resolution[2], float r_uv_to_texture[4][4]) const override
::Image * get_image(Main *bmain) override
ImBuf * acquire_image_buffer(::Image *image, void **lock) override
void release_buffer(::Image *image, ImBuf *ibuf, void *lock) override
VecBase< float, 4 > float4