29 {0,
nullptr, 0,
nullptr,
nullptr},
43 .structure_type(StructureType::Dynamic);
49 .structure_type(StructureType::Dynamic);
53 .default_value({0.5f, 0.5f})
59 .default_value({0.2f, 0.1f})
64 b.add_output<
decl::Float>(
"Mask").structure_type(StructureType::Dynamic);
69template<CMPNodeMaskType MaskType>
74 const int2 &domain_size,
77 const float cos_angle,
78 const float sin_angle)
82 uv.y *=
float(domain_size.y) /
float(domain_size.x);
89 float output_mask_value = 0.0f;
98 output_mask_value =
is_inside ? base_mask_value * value : 0.0f;
101 output_mask_value =
is_inside ? (base_mask_value > 0.0f ? 0.0f : value) : base_mask_value;
127 if (this->
context().use_gpu()) {
171 return "compositor_ellipse_mask_add";
173 return "compositor_ellipse_mask_subtract";
175 return "compositor_ellipse_mask_multiply";
177 return "compositor_ellipse_mask_not";
180 return "compositor_ellipse_mask_add";
192 const int2 domain_size = domain.
size;
268 if (
get_input(
"Mask").is_single_value()) {
294 const MenuValue menu_value =
input.get_single_value_default(default_menu_value);
313 ntype.
ui_name =
"Ellipse Mask";
315 "Create elliptical mask suitable for use as a simple matte or vignette mask";
318 ntype.
declare = file_ns::cmp_node_ellipsemask_declare;
#define CMP_NODE_MASK_ELLIPSE
void GPU_shader_uniform_1f(blender::gpu::Shader *sh, const char *name, float value)
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_uniform_2fv(blender::gpu::Shader *sh, const char *name, const float data[2])
void GPU_shader_uniform_2iv(blender::gpu::Shader *sh, const char *name, const int data[2])
#define NOD_REGISTER_NODE(REGISTER_FUNC)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
gpu::Shader * get_shader(const char *info_name, ResultPrecision precision)
NodeOperation(Context &context, DNode node)
Result & get_result(StringRef identifier)
Context & context() const
Result & get_input(StringRef identifier) const
void share_data(const Result &source)
T get_single_value_default(const T &default_value) const
void store_pixel(const int2 &texel, const T &pixel_value)
void allocate_texture(const Domain domain, const bool from_pool=true, const std::optional< ResultStorageType > storage_type=std::nullopt)
void unbind_as_texture() const
void bind_as_texture(gpu::Shader *shader, const char *texture_name) const
const Domain & domain() const
T load_pixel(const int2 &texel) const
void unbind_as_image() const
void bind_as_image(gpu::Shader *shader, const char *image_name, bool read=false) const
bool is_single_value() const
CMPNodeMaskType get_operation()
Domain compute_domain() override
const char * get_shader_name()
NodeOperation(Context &context, DNode node)
#define CMP_NODE_MASKTYPE_MULTIPLY
#define CMP_NODE_MASKTYPE_ADD
#define CMP_NODE_MASKTYPE_NOT
#define CMP_NODE_MASKTYPE_SUBTRACT
static bool is_inside(int x, int y, int cols, int rows)
void node_register_type(bNodeType &ntype)
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
void parallel_for(const int2 range, const Function &function)
T cos(const AngleRadianBase< T > &a)
T clamp(const T &a, const T &min, const T &max)
bool is_any_zero(const T &a)
T length(const VecBase< T, Size > &a)
T sin(const AngleRadianBase< T > &a)
T max(const T &a, const T &b)
static const EnumPropertyItem operation_items[]
static void cmp_node_ellipsemask_declare(NodeDeclarationBuilder &b)
static NodeOperation * get_compositor_operation(Context &context, DNode node)
static void ellipse_mask(const Result &base_mask, const Result &value_mask, Result &output_mask, const int2 &texel, const int2 &domain_size, const float2 &location, const float2 &radius, const float cos_angle, const float sin_angle)
MatBase< float, 2, 2 > float2x2
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
static void register_node_type_cmp_ellipsemask()
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
std::string ui_description
NodeGetCompositorOperationFunction get_compositor_operation
const char * enum_name_legacy
NodeDeclareFunction declare