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 GPUShader *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(
105 realization_options.repeat_x ?
109 realization_options.repeat_y ?
113 input.bind_as_texture(shader,
"input_tx");
117 output.allocate_texture(domain);
118 output.bind_as_image(shader,
"domain_img");
122 input.unbind_as_texture();
127const char *RealizeOnDomainOperation::get_realization_shader_name()
132 return "compositor_realize_on_domain_bicubic_float";
136 return "compositor_realize_on_domain_bicubic_float4";
148 return "compositor_realize_on_domain_float";
152 return "compositor_realize_on_domain_float4";
166void RealizeOnDomainOperation::realize_on_domain_cpu(
const float3x3 &inverse_transformation)
172 output.allocate_texture(domain);
174 const RealizationOptions realization_options =
input.get_realization_options();
177 float2 coordinates = float2(texel) + float2(0.5f);
182 coordinates = (inverse_transformation * float3(coordinates, 1.0f)).xy();
186 const int2 input_size = input.domain().size;
187 float2 normalized_coordinates = coordinates / float2(input_size);
190 switch (realization_options.interpolation) {
191 case Interpolation::Nearest:
192 sample = input.sample_nearest_wrap(
193 normalized_coordinates, realization_options.repeat_x, realization_options.repeat_y);
195 case Interpolation::Bilinear:
196 sample = input.sample_bilinear_wrap(
197 normalized_coordinates, realization_options.repeat_x, realization_options.repeat_y);
199 case Interpolation::Bicubic:
200 sample = input.sample_cubic_wrap(
201 normalized_coordinates, realization_options.repeat_x, realization_options.repeat_y);
210 return target_domain_;
255 math::min(transformed_lower_left_corner, transformed_lower_right_corner),
256 math::min(transformed_upper_left_corner, transformed_upper_right_corner));
258 math::max(transformed_lower_left_corner, transformed_lower_right_corner),
259 math::max(transformed_upper_left_corner, transformed_upper_right_corner));
266 const int2 new_size = integer_upper_bound - integer_lower_bound;
279 const Result &input_result,
281 const Domain &operation_domain)
303 const Domain target_domain = use_operation_domain ? operation_domain : input_result.
domain();
305 const Domain realized_target_domain =
#define BLI_assert_unreachable()
int GPU_max_texture_size()
void GPU_shader_bind(GPUShader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_uniform_mat3_as_mat4(GPUShader *sh, const char *name, const float data[3][3])
void GPU_texture_extend_mode_y(GPUTexture *texture, GPUSamplerExtendMode extend_mode)
void GPU_texture_extend_mode_x(GPUTexture *texture, GPUSamplerExtendMode extend_mode)
@ GPU_SAMPLER_EXTEND_MODE_REPEAT
@ GPU_SAMPLER_EXTEND_MODE_CLAMP_TO_BORDER
void GPU_texture_filter_mode(GPUTexture *texture, bool use_filter)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result create_result(ResultType type, ResultPrecision precision)
GPUShader * 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)
Domain compute_domain() override
static Domain compute_realized_transformation_domain(Context &context, const Domain &domain)
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(GPUShader *shader, int2 threads_range, int2 local_size=int2(16))
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()