Blender  V3.3
COM_ScaleOperation.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2011 Blender Foundation. */
3 
4 #pragma once
5 
7 
8 namespace blender::compositor {
9 
11  public:
12  static constexpr float DEFAULT_MAX_SCALE_CANVAS_SIZE = 12000;
13 
14  public:
16  {
17  sampler_ = (int)sampler;
18  }
19  void set_variable_size(bool variable_size)
20  {
21  variable_size_ = variable_size;
22  };
23 
25 
26  protected:
28 
30  {
31  return (sampler_ == -1) ? sampler : (PixelSampler)sampler_;
32  }
33 
35  int sampler_;
36  /* TODO(manzanilla): to be removed with tiled implementation. */
38 };
39 
41  public:
42  static constexpr float MIN_RELATIVE_SCALE = 0.0001f;
43 
44  protected:
45  static constexpr int IMAGE_INPUT_INDEX = 0;
46  static constexpr int X_INPUT_INDEX = 1;
47  static constexpr int Y_INPUT_INDEX = 2;
48 
54 
55  public:
57  ScaleOperation(DataType data_type);
58 
59  static float scale_coord(const float coord, const float center, const float relative_scale)
60  {
61  return center + (coord - center) * MAX2(relative_scale, MIN_RELATIVE_SCALE);
62  }
63 
64  static float scale_coord_inverted(const float coord,
65  const float center,
66  const float relative_scale)
67  {
68  return center + (coord - center) / MAX2(relative_scale, MIN_RELATIVE_SCALE);
69  }
70 
71  static void get_scale_offset(const rcti &input_canvas,
72  const rcti &scale_canvas,
73  float &r_scale_offset_x,
74  float &r_scale_offset_y);
75  static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y);
76  static void get_scale_area_of_interest(const rcti &input_canvas,
77  const rcti &scale_canvas,
78  float relative_scale_x,
79  float relative_scale_y,
80  const rcti &output_area,
81  rcti &r_input_area);
82  static void clamp_area_size_max(rcti &area, Size2f max_size);
83 
84  void init_data() override;
85  void init_execution() override;
86  void deinit_execution() override;
87 
88  void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
90  const rcti &area,
91  Span<MemoryBuffer *> inputs) override;
92 
93  void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
94 
95  protected:
96  virtual float get_relative_scale_x_factor(float width) = 0;
97  virtual float get_relative_scale_y_factor(float height) = 0;
98 
99  private:
100  bool is_scaling_variable();
101  float get_constant_scale(int input_op_idx, float factor);
102  float get_constant_scale_x(float width);
103  float get_constant_scale_y(float height);
104 };
105 
107  public:
109  ScaleRelativeOperation(DataType data_type);
111  ReadBufferOperation *read_operation,
112  rcti *output) override;
113  void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override;
114 
115  float get_relative_scale_x_factor(float UNUSED(width)) override
116  {
117  return 1.0f;
118  }
119 
121  {
122  return 1.0f;
123  }
124 };
125 
127  public:
129  ReadBufferOperation *read_operation,
130  rcti *output) override;
131  void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override;
132 
133  float get_relative_scale_x_factor(float width) override
134  {
135  return 1.0f / width;
136  }
137 
138  float get_relative_scale_y_factor(float height) override
139  {
140  return 1.0f / height;
141  }
142 };
143 
145  SocketReader *input_operation_;
146  int new_width_;
147  int new_height_;
148  float rel_x_;
149  float rel_y_;
150 
151  /* center is only used for aspect correction */
152  float offset_x_;
153  float offset_y_;
154  bool is_aspect_;
155  bool is_crop_;
156  /* set from other properties on initialization,
157  * check if we need to apply offset */
158  bool is_offset_;
159 
160  public:
164  ReadBufferOperation *read_operation,
165  rcti *output) override;
166  void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
167  void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override;
168 
169  void init_execution() override;
170  void deinit_execution() override;
172  {
173  new_width_ = width;
174  }
176  {
177  new_height_ = height;
178  }
179  void set_is_aspect(bool is_aspect)
180  {
181  is_aspect_ = is_aspect;
182  }
183  void set_is_crop(bool is_crop)
184  {
185  is_crop_ = is_crop;
186  }
187  void set_offset(float x, float y)
188  {
189  offset_x_ = x;
190  offset_y_ = y;
191  }
192 
193  void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
195  const rcti &area,
196  Span<MemoryBuffer *> inputs) override;
197 
198  private:
199  void init_data(const rcti &input_canvas);
200 };
201 
202 } // namespace blender::compositor
#define UNUSED(x)
#define MAX2(a, b)
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
PixelSampler get_effective_sampler(PixelSampler sampler)
void set_variable_size(bool variable_size)
static constexpr float DEFAULT_MAX_SCALE_CANVAS_SIZE
void set_sampler(PixelSampler sampler)
a MemoryBuffer contains access to the data of a chunk
NodeOperation contains calculation logic.
void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override
calculate a single pixel
float get_relative_scale_x_factor(float width) override
bool determine_depending_area_of_interest(rcti *input, ReadBufferOperation *read_operation, rcti *output) override
float get_relative_scale_y_factor(float height) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
bool determine_depending_area_of_interest(rcti *input, ReadBufferOperation *read_operation, rcti *output) override
void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override
calculate a single pixel
static void get_scale_offset(const rcti &input_canvas, const rcti &scale_canvas, float &r_scale_offset_x, float &r_scale_offset_y)
static void get_scale_area_of_interest(const rcti &input_canvas, const rcti &scale_canvas, float relative_scale_x, float relative_scale_y, const rcti &output_area, rcti &r_input_area)
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
virtual float get_relative_scale_x_factor(float width)=0
static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y)
static float scale_coord_inverted(const float coord, const float center, const float relative_scale)
virtual float get_relative_scale_y_factor(float height)=0
static constexpr float MIN_RELATIVE_SCALE
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
static void clamp_area_size_max(rcti &area, Size2f max_size)
static float scale_coord(const float coord, const float center, const float relative_scale)
float get_relative_scale_x_factor(float UNUSED(width)) override
bool determine_depending_area_of_interest(rcti *input, ReadBufferOperation *read_operation, rcti *output) override
float get_relative_scale_y_factor(float UNUSED(height)) override
void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override
calculate a single pixel
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
DataType
possible data types for sockets
Definition: COM_defines.h:30
ccl_global KernelShaderEvalInput ccl_global float * output
ccl_global KernelShaderEvalInput * input
static void area(int d1, int d2, int e1, int e2, float weights[2])
static bNodeSocketTemplate inputs[]