32 #ifdef COM_DEFOCUS_SEARCH
40 this->m_inputProgram =
nullptr;
41 this->m_inputBokehProgram =
nullptr;
42 this->m_inputSizeProgram =
nullptr;
43 this->m_maxBlur = 32.0f;
44 this->m_threshold = 1.0f;
45 this->m_do_size_scale =
false;
46 #ifdef COM_DEFOCUS_SEARCH
47 this->m_inputSearchProgram =
nullptr;
56 #ifdef COM_DEFOCUS_SEARCH
80 const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f;
82 data->maxBlurScalar = (int)(
data->size->get_max_value(rect2) * scalar);
83 CLAMP(
data->maxBlurScalar, 1.0f, this->m_maxBlur);
99 float *inputSizeFloatBuffer = inputSizeBuffer->
getBuffer();
100 float *inputProgramFloatBuffer = inputProgramBuffer->
getBuffer();
104 float multiplier_accum[4];
105 float color_accum[4];
108 const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f;
114 #ifdef COM_DEFOCUS_SEARCH
116 this->m_inputSearchProgram->read(search,
117 x / InverseSearchRadiusOperation::DIVIDER,
118 y / InverseSearchRadiusOperation::DIVIDER,
120 int minx = search[0];
121 int miny = search[1];
122 int maxx = search[2];
123 int maxy = search[3];
125 int minx =
MAX2(
x - maxBlurScalar, 0);
126 int miny =
MAX2(
y - maxBlurScalar, 0);
136 float size_center = tempSize[0] * scalar;
139 const int addYStepValue = addXStepValue;
142 if (size_center > this->m_threshold) {
143 for (
int ny = miny;
ny < maxy;
ny += addYStepValue) {
145 int offsetValueNy =
ny * inputSizeBuffer->
getWidth();
146 int offsetValueNxNy = offsetValueNy + (minx);
148 for (
int nx = minx; nx < maxx; nx += addXStepValue) {
149 if (nx !=
x ||
ny !=
y) {
150 float size =
MIN2(inputSizeFloatBuffer[offsetValueNxNy] * scalar, size_center);
151 if (
size > this->m_threshold) {
160 inputBokehBuffer->
read(bokeh, uv[0], uv[1]);
161 madd_v4_v4v4(color_accum, bokeh, &inputProgramFloatBuffer[offsetColorNxNy]);
166 offsetColorNxNy += addXStepColor;
167 offsetValueNxNy += addXStepValue;
172 output[0] = color_accum[0] / multiplier_accum[0];
173 output[1] = color_accum[1] / multiplier_accum[1];
174 output[2] = color_accum[2] / multiplier_accum[2];
175 output[3] = color_accum[3] / multiplier_accum[3];
178 if ((size_center > this->m_threshold) && (size_center < this->m_threshold * 2.0f)) {
180 float fac = (size_center - this->m_threshold) / this->m_threshold;
188 cl_mem clOutputBuffer,
190 std::list<cl_mem> *clMemToCleanUp,
191 std::list<cl_kernel> * )
197 cl_float threshold = this->m_threshold;
203 cl_float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f;
208 defocusKernel, 0, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputProgram);
210 defocusKernel, 1, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputBokehProgram);
212 defocusKernel, 2, 4, clMemToCleanUp, inputMemoryBuffers, this->m_inputSizeProgram);
215 clSetKernelArg(defocusKernel, 6,
sizeof(cl_int), &step);
216 clSetKernelArg(defocusKernel, 7,
sizeof(cl_int), &maxBlur);
217 clSetKernelArg(defocusKernel, 8,
sizeof(cl_float), &threshold);
218 clSetKernelArg(defocusKernel, 9,
sizeof(cl_float), &scalar);
226 this->m_inputProgram =
nullptr;
227 this->m_inputBokehProgram =
nullptr;
228 this->m_inputSizeProgram =
nullptr;
229 #ifdef COM_DEFOCUS_SEARCH
230 this->m_inputSearchProgram =
nullptr;
241 const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f;
242 int maxBlurScalar = this->m_maxBlur * scalar;
244 newInput.
xmax = input->
xmax + maxBlurScalar + 2;
245 newInput.
xmin = input->
xmin - maxBlurScalar + 2;
246 newInput.
ymax = input->
ymax + maxBlurScalar - 2;
247 newInput.
ymin = input->
ymin - maxBlurScalar - 2;
261 #ifdef COM_DEFOCUS_SEARCH
263 searchInput.
xmax = (input->
xmax / InverseSearchRadiusOperation::DIVIDER) + 1;
264 searchInput.
xmin = (input->
xmin / InverseSearchRadiusOperation::DIVIDER) - 1;
265 searchInput.
ymax = (input->
ymax / InverseSearchRadiusOperation::DIVIDER) + 1;
266 searchInput.
ymin = (input->
ymin / InverseSearchRadiusOperation::DIVIDER) - 1;
279 #ifdef COM_DEFOCUS_SEARCH
281 InverseSearchRadiusOperation::InverseSearchRadiusOperation()
285 this->flags.complex =
true;
286 this->m_inputRadius =
nullptr;
289 void InverseSearchRadiusOperation::initExecution()
291 this->m_inputRadius = this->getInputSocketReader(0);
294 void *InverseSearchRadiusOperation::initializeTileData(
rcti *rect)
299 int width = this->m_inputRadius->getWidth();
300 int height = this->m_inputRadius->getHeight();
303 for (
y = rect->
ymin; y < rect->ymax;
y++) {
304 for (
x = rect->
xmin; x < rect->xmax;
x++) {
305 int rx =
x * DIVIDER;
306 int ry =
y * DIVIDER;
348 void InverseSearchRadiusOperation::executePixelChunk(
float output[4],
int x,
int y,
void *
data)
354 void InverseSearchRadiusOperation::deinitializeTileData(
rcti *rect,
void *
data)
357 MemoryBuffer *mb = (MemoryBuffer *)
data;
362 void InverseSearchRadiusOperation::deinitExecution()
364 this->m_inputRadius =
nullptr;
367 void InverseSearchRadiusOperation::determineResolution(
unsigned int resolution[2],
368 unsigned int preferredResolution[2])
371 resolution[0] = resolution[0] / DIVIDER;
372 resolution[1] = resolution[1] / DIVIDER;
375 bool InverseSearchRadiusOperation::determineDependingAreaOfInterest(
379 newRect.
ymin = input->
ymin * DIVIDER - m_maxBlur;
380 newRect.
ymax = input->
ymax * DIVIDER + m_maxBlur;
381 newRect.
xmin = input->
xmin * DIVIDER - m_maxBlur;
382 newRect.
xmax = input->
xmax * DIVIDER + m_maxBlur;
typedef float(TangentPoint)[2]
MINLINE float min_ff(float a, float b)
MINLINE void add_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t)
MINLINE void madd_v4_v4v4(float r[4], const float a[4], const float b[4])
MINLINE void copy_v4_fl(float r[4], float f)
_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 GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble ny
_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
_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
Group RGB to Bright Vector Camera CLAMP
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
a MemoryBuffer contains access to the data of a chunk
void read(float *result, int x, int y, MemoryBufferExtend extend_x=MemoryBufferExtend::Clip, MemoryBufferExtend extend_y=MemoryBufferExtend::Clip)
void readNoCheck(float *result, int x, int y, MemoryBufferExtend extend_x=MemoryBufferExtend::Clip, MemoryBufferExtend extend_y=MemoryBufferExtend::Clip)
float get_max_value() const
const int getHeight() const
get the height of this MemoryBuffer
const int getWidth() const
get the width of this MemoryBuffer
float * getBuffer()
get the data of this MemoryBuffer
NodeOperation contains calculation logic.
virtual void * initializeTileData(rcti *)
void addInputSocket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
NodeOperation * getInputOperation(unsigned int inputSocketindex)
virtual MemoryBuffer * getInputMemoryBuffer(MemoryBuffer **)
void addOutputSocket(DataType datatype)
virtual void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2])
determine the resolution of this node
SocketReader * getInputSocketReader(unsigned int inputSocketindex)
virtual bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
device representing an GPU OpenCL device. an instance of this class represents a single cl_device
void COM_clAttachMemoryBufferOffsetToKernelParameter(cl_kernel kernel, int offsetIndex, MemoryBuffer *memoryBuffers)
cl_mem COM_clAttachMemoryBufferToKernelParameter(cl_kernel kernel, int parameterIndex, int offsetIndex, std::list< cl_mem > *cleanup, MemoryBuffer **inputMemoryBuffers, SocketReader *reader)
void COM_clEnqueueRange(cl_kernel kernel, MemoryBuffer *outputMemoryBuffer)
void COM_clAttachOutputMemoryBufferToKernelParameter(cl_kernel kernel, int parameterIndex, cl_mem clOutputMemoryBuffer)
void COM_clAttachSizeToKernelParameter(cl_kernel kernel, int offsetIndex, NodeOperation *operation)
cl_kernel COM_clCreateKernel(const char *kernelname, std::list< cl_kernel > *clKernelsToCleanUp)
void initExecution(QualityHelper helper)
void * initializeTileData(rcti *rect) override
void deinitExecution() override
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) override
void executePixel(float output[4], int x, int y, void *data) override
void initExecution() override
VariableSizeBokehBlurOperation()
void executeOpenCL(OpenCLDevice *device, MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer, MemoryBuffer **inputMemoryBuffers, std::list< cl_mem > *clMemToCleanUp, std::list< cl_kernel > *clKernelsToCleanUp) override
custom handle to add new tasks to the OpenCL command queue in order to execute a chunk on an GPUDevic...
void deinitializeTileData(rcti *rect, void *data) override
@ None
The bottom left of the input image is the bottom left of the working area of the node,...
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
constexpr int COM_DATA_TYPE_COLOR_CHANNELS
constexpr float COM_BLUR_BOKEH_PIXELS