* modified vieweroperation to not calculate based on the DO_NODE_OUTPUT

flag of the editorbNode.
This commit is contained in:
Jeroen Bakker 2012-06-04 18:07:29 +00:00
parent d46a6dc59c
commit 5024996eea
6 changed files with 57 additions and 44 deletions

@ -37,7 +37,7 @@ void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext *
Image *image = (Image*)this->getbNode()->id; Image *image = (Image*)this->getbNode()->id;
ImageUser * imageUser = (ImageUser*) this->getbNode()->storage; ImageUser * imageUser = (ImageUser*) this->getbNode()->storage;
bNode *editorNode = this->getbNode(); bNode *editorNode = this->getbNode();
if (imageSocket->isConnected() && (editorNode->flag & NODE_DO_OUTPUT)) { if (imageSocket->isConnected()) {
ViewerOperation *viewerOperation = new ViewerOperation(); ViewerOperation *viewerOperation = new ViewerOperation();
viewerOperation->setColorManagement(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT); viewerOperation->setColorManagement(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT);
viewerOperation->setColorPredivide(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE); viewerOperation->setColorPredivide(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);

@ -101,7 +101,10 @@ void BlurBaseOperation::deinitExecution()
void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers) void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers)
{ {
float result[4]; if (!this->sizeavailable) {
this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, memoryBuffers); float result[4];
this->size = result[0]; this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, memoryBuffers);
this->size = result[0];
this->sizeavailable = true;
}
} }

@ -26,13 +26,12 @@
FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation() FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation()
{ {
this->iirgaus = false; this->iirgaus = NULL;
} }
void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data)
{ {
MemoryBuffer *newData = (MemoryBuffer*)data; MemoryBuffer *newData = (MemoryBuffer*)data;
newData->read(color, x, y); newData->read(color, x, y);
} }
@ -51,10 +50,7 @@ bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, Re
} }
else { else {
if (this->iirgaus) { if (this->iirgaus) {
newInput.xmax = input->xmax + (sx); return false;
newInput.xmin = input->xmin - (sx);
newInput.ymax = input->ymax + (sy);
newInput.ymin = input->ymin - (sy);
} }
else { else {
newInput.xmin = 0; newInput.xmin = 0;
@ -66,38 +62,51 @@ bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, Re
} }
} }
void *FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) void FastGaussianBlurOperation::initExecution()
{ {
MemoryBuffer *newBuf = (MemoryBuffer*)this->inputProgram->initializeTileData(rect, memoryBuffers); BlurBaseOperation::initExecution();
MemoryBuffer *copy = newBuf->duplicate(); BlurBaseOperation::initMutex();
updateSize(memoryBuffers);
int c;
sx = data->sizex * this->size/2.0f;
sy = data->sizey * this->size/2.0f;
this->iirgaus = true;
if ((sx == sy) && (sx > 0.f)) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sx, c, 3);
}
else {
if (sx > 0.f) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sx, c, 1);
}
if (sy > 0.f) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sy, c, 2);
}
}
return copy;
} }
void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) void FastGaussianBlurOperation::deinitExecution()
{ {
MemoryBuffer *newData = (MemoryBuffer*)data; if (this->iirgaus) {
delete newData; delete this->iirgaus;
this->iirgaus = NULL;
}
BlurBaseOperation::deinitMutex();
}
void *FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
{
BLI_mutex_lock(this->getMutex());
if (!iirgaus) {
MemoryBuffer *newBuf = (MemoryBuffer*)this->inputProgram->initializeTileData(rect, memoryBuffers);
MemoryBuffer *copy = newBuf->duplicate();
updateSize(memoryBuffers);
int c;
sx = data->sizex * this->size/2.0f;
sy = data->sizey * this->size/2.0f;
if ((sx == sy) && (sx > 0.f)) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sx, c, 3);
}
else {
if (sx > 0.f) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sx, c, 1);
}
if (sy > 0.f) {
for (c=0; c<COM_NUMBER_OF_CHANNELS; ++c)
IIR_gauss(copy, sy, c, 2);
}
}
this->iirgaus = copy;
}
BLI_mutex_unlock(this->getMutex());
return iirgaus;
} }
void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, int chan, int xy) void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, int chan, int xy)

@ -30,7 +30,7 @@ class FastGaussianBlurOperation: public BlurBaseOperation {
private: private:
float sx; float sx;
float sy; float sy;
bool iirgaus; MemoryBuffer* iirgaus;
public: public:
FastGaussianBlurOperation(); FastGaussianBlurOperation();
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
@ -38,7 +38,8 @@ public:
static void IIR_gauss(MemoryBuffer *src, float sigma, int channel, int xy); static void IIR_gauss(MemoryBuffer *src, float sigma, int channel, int xy);
void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); void deinitExecution();
void initExecution();
}; };
#endif #endif

@ -50,8 +50,9 @@ ViewerBaseOperation::ViewerBaseOperation() : NodeOperation()
void ViewerBaseOperation::initExecution() void ViewerBaseOperation::initExecution()
{ {
// When initializing the tree during initial load the width and height can be zero. if (isActiveViewerOutput()) {
initImage(); initImage();
}
} }
void ViewerBaseOperation::initImage() void ViewerBaseOperation::initImage()
@ -79,7 +80,6 @@ void ViewerBaseOperation::initImage()
} }
void ViewerBaseOperation:: updateImage(rcti *rect) void ViewerBaseOperation:: updateImage(rcti *rect)
{ {
/// @todo: introduce new event to update smaller area
WM_main_add_notifier(NC_WINDOW|ND_DRAW, NULL); WM_main_add_notifier(NC_WINDOW|ND_DRAW, NULL);
} }

@ -42,7 +42,7 @@ protected:
bool doColorPredivide; bool doColorPredivide;
public: public:
bool isOutputOperation(bool rendering) const {return true;} bool isOutputOperation(bool rendering) const {return isActiveViewerOutput();}
void initExecution(); void initExecution();
void deinitExecution(); void deinitExecution();
void setImage(Image *image) {this->image = image;} void setImage(Image *image) {this->image = image;}