36 input_descriptor.
type = type;
47 this->
get_input().domain().transformation,
48 input_center_translation + this->compute_corrective_translation());
53 output_center_translation);
57 output_transformation;
59 if (this->
context().use_gpu()) {
60 this->realize_on_domain_gpu(inverse_transformation);
63 this->realize_on_domain_cpu(inverse_transformation);
67float2 RealizeOnDomainOperation::compute_corrective_translation()
72 return float2(std::numeric_limits<float>::epsilon() * 10e3f);
82 return float2(((input_size[0] ^ output_size[0]) & 1) ? -0.5f : 0.0f,
83 ((input_size[1] ^ output_size[1]) & 1) ? -0.5f : 0.0f);
86void RealizeOnDomainOperation::realize_on_domain_gpu(
const float3x3 &inverse_transformation)
88 gpu::Shader *shader = this->
context().
get_shader(this->get_realization_shader_name());
97 const RealizationOptions realization_options =
input.get_realization_options();
98 const bool use_bilinear =
ELEM(
108 input.bind_as_texture(shader,
"input_tx");
112 output.allocate_texture(domain);
113 output.bind_as_image(shader,
"domain_img");
117 input.unbind_as_texture();
122const char *RealizeOnDomainOperation::get_realization_shader_name()
127 return "compositor_realize_on_domain_bicubic_float";
131 return "compositor_realize_on_domain_bicubic_float4";
133 return "compositor_realize_on_domain_bicubic_float2";
149 return "compositor_realize_on_domain_float";
153 return "compositor_realize_on_domain_float4";
155 return "compositor_realize_on_domain_float2";
173void RealizeOnDomainOperation::realize_on_domain_cpu(
const float3x3 &inverse_transformation)
179 output.allocate_texture(domain);
181 const RealizationOptions realization_options =
input.get_realization_options();
184 float2 coordinates = float2(texel) + float2(0.5f);
189 coordinates = (inverse_transformation * float3(coordinates, 1.0f)).xy();
193 const int2 input_size = input.domain().size;
194 float2 normalized_coordinates = coordinates / float2(input_size);
196 float4 sample = input.sample(normalized_coordinates,
197 realization_options.interpolation,
198 realization_options.extension_x,
199 realization_options.extension_y);
200 output.store_pixel_generic_type(texel, sample);
206 return target_domain_;
223 if (realize_translation) {
254 math::min(transformed_lower_left_corner, transformed_lower_right_corner),
255 math::min(transformed_upper_left_corner, transformed_upper_right_corner));
257 math::max(transformed_lower_left_corner, transformed_lower_right_corner),
258 math::max(transformed_upper_left_corner, transformed_upper_right_corner));
265 const int2 new_size = integer_upper_bound - integer_lower_bound;
273 if (realize_translation) {
281 const Result &input_result,
283 const Domain &operation_domain)
305 const Domain target_domain = use_operation_domain ? operation_domain : input_result.
domain();
307 const bool should_realize_translation = input_descriptor.
realization_mode ==
309 const Domain realized_target_domain =
311 context, target_domain, should_realize_translation);
#define BLI_assert_unreachable()
int GPU_max_texture_size()
void GPU_shader_uniform_mat3_as_mat4(blender::gpu::Shader *sh, const char *name, const float data[3][3])
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_texture_extend_mode_y(blender::gpu::Texture *texture, GPUSamplerExtendMode extend_mode)
void GPU_texture_extend_mode_x(blender::gpu::Texture *texture, GPUSamplerExtendMode extend_mode)
void GPU_texture_anisotropic_filter(blender::gpu::Texture *texture, bool use_aniso)
void GPU_texture_filter_mode(blender::gpu::Texture *texture, bool use_filter)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result create_result(ResultType type, ResultPrecision precision)
gpu::Shader * get_shader(const char *info_name, ResultPrecision precision)
static bool is_equal(const Domain &a, const Domain &b, const float epsilon=0.0f)
Context & context() const
RealizeOnDomainOperation(Context &context, Domain target_domain, ResultType type)
static SimpleOperation * construct_if_needed(Context &context, const Result &input_result, const InputDescriptor &input_descriptor, const Domain &operation_domain)
static Domain compute_realized_transformation_domain(Context &context, const Domain &domain, const bool realize_translation=false)
Domain compute_domain() override
static bool is_single_value_only_type(ResultType type)
const Domain & domain() const
bool is_single_value() const
void declare_input_descriptor(InputDescriptor descriptor)
void populate_result(Result result)
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
GPUSamplerExtendMode map_extension_mode_to_extend_mode(const ExtensionMode &mode)
static constexpr float transformation_tolerance
void parallel_for(const int2 range, const Function &function)
T clamp(const T &a, const T &min, const T &max)
T min(const T &a, const T &b)
CartesianBasis invert(const CartesianBasis &basis)
MatBase< T, NumCol, NumRow > translate(const MatBase< T, NumCol, NumRow > &mat, const VectorT &translation)
MatT from_origin_transform(const MatT &transform, const VectorT origin)
bool is_equal(const MatBase< T, NumCol, NumRow > &a, const MatBase< T, NumCol, NumRow > &b, const T epsilon=T(0))
T max(const T &a, const T &b)
MatT from_location(const typename MatT::loc_type &location)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
MatBase< float, 2, 2 > float2x2
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
MatBase< float, 3, 3 > float3x3
static MatBase identity()