diff options
Diffstat (limited to 'source/blender/compositor/operations')
4 files changed, 41 insertions, 18 deletions
diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cc b/source/blender/compositor/operations/COM_PreviewOperation.cc index eedf561717a..6d1199ab118 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.cc +++ b/source/blender/compositor/operations/COM_PreviewOperation.cc @@ -34,7 +34,9 @@ #include "IMB_imbuf_types.h" PreviewOperation::PreviewOperation(const ColorManagedViewSettings *viewSettings, - const ColorManagedDisplaySettings *displaySettings) + const ColorManagedDisplaySettings *displaySettings, + const unsigned int defaultWidth, + const unsigned int defaultHeight) { this->addInputSocket(DataType::Color, COM_SC_NO_RESIZE); @@ -44,6 +46,8 @@ PreviewOperation::PreviewOperation(const ColorManagedViewSettings *viewSettings, this->m_divider = 1.0f; this->m_viewSettings = viewSettings; this->m_displaySettings = displaySettings; + this->m_defaultWidth = defaultWidth; + this->m_defaultHeight = defaultHeight; } void PreviewOperation::verifyPreview(bNodeInstanceHash *previews, bNodeInstanceKey key) @@ -123,30 +127,33 @@ bool PreviewOperation::determineDependingAreaOfInterest(rcti *input, return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } void PreviewOperation::determineResolution(unsigned int resolution[2], - unsigned int preferredResolution[2]) + unsigned int /*preferredResolution*/[2]) { - NodeOperation::determineResolution(resolution, preferredResolution); + /* Use default preview resolution as preferred ensuring it has size so that + * generated inputs (which don't have resolution on their own) are displayed */ + BLI_assert(this->m_defaultWidth > 0 && this->m_defaultHeight > 0); + unsigned int previewPreferredRes[2] = {this->m_defaultWidth, this->m_defaultHeight}; + NodeOperation::determineResolution(resolution, previewPreferredRes); /* If resolution is 0 there are two possible scenarios: * - Either node is not connected at all - * - It is connected to input which doesn't have own resolution (i.e. color input). + * - Or it is connected to an input which has no resolution. * * In the former case we rely on the execution system to not evaluate this node. * - * For the latter case we use 1 pixel preview, so that it's possible to see preview color in the - * preview. This is how final F12 render will behave (flood-fill final frame with the color). - * - * Having things consistent in terms that node preview is scaled down F12 render is a very - * natural thing to do. */ - int width = max_ii(1, resolution[0]); - int height = max_ii(1, resolution[1]); - + * The latter case would only happen if an input doesn't set any resolution ignoring output + * preferred resolution. In such case preview size will be 0 too. + */ + int width = resolution[0]; + int height = resolution[1]; this->m_divider = 0.0f; - if (width > height) { - this->m_divider = (float)COM_PREVIEW_SIZE / (width); - } - else { - this->m_divider = (float)COM_PREVIEW_SIZE / (height); + if (width > 0 && height > 0) { + if (width > height) { + this->m_divider = (float)COM_PREVIEW_SIZE / (width); + } + else { + this->m_divider = (float)COM_PREVIEW_SIZE / (height); + } } width = width * this->m_divider; height = height * this->m_divider; diff --git a/source/blender/compositor/operations/COM_PreviewOperation.h b/source/blender/compositor/operations/COM_PreviewOperation.h index eca50c5cda4..03ae6a6c42e 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.h +++ b/source/blender/compositor/operations/COM_PreviewOperation.h @@ -34,13 +34,17 @@ class PreviewOperation : public NodeOperation { bNodePreview *m_preview; SocketReader *m_input; float m_divider; + unsigned int m_defaultWidth; + unsigned int m_defaultHeight; const ColorManagedViewSettings *m_viewSettings; const ColorManagedDisplaySettings *m_displaySettings; public: PreviewOperation(const ColorManagedViewSettings *viewSettings, - const ColorManagedDisplaySettings *displaySettings); + const ColorManagedDisplaySettings *displaySettings, + unsigned int defaultWidth, + unsigned int defaultHeight); void verifyPreview(bNodeInstanceHash *previews, bNodeInstanceKey key); bool isOutputOperation(bool /*rendering*/) const diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc index e31f7ad8eba..ea5937d8afb 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cc +++ b/source/blender/compositor/operations/COM_ViewerOperation.cc @@ -118,6 +118,17 @@ void ViewerOperation::executeRegion(rcti *rect, unsigned int /*tileNumber*/) updateImage(rect); } +void ViewerOperation::determineResolution(unsigned int resolution[2], + unsigned int /*preferredResolution*/[2]) +{ + const int sceneRenderWidth = this->m_rd->xsch * this->m_rd->size / 100; + const int sceneRenderHeight = this->m_rd->ysch * this->m_rd->size / 100; + + unsigned int localPrefRes[2] = {static_cast<unsigned int>(sceneRenderWidth), + static_cast<unsigned int>(sceneRenderHeight)}; + NodeOperation::determineResolution(resolution, localPrefRes); +} + void ViewerOperation::initImage() { Image *ima = this->m_image; diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h index b4a7fbb4f4b..513c6eae487 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.h +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -51,6 +51,7 @@ class ViewerOperation : public NodeOperation { void initExecution(); void deinitExecution(); void executeRegion(rcti *rect, unsigned int tileNumber); + void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]); bool isOutputOperation(bool /*rendering*/) const { if (G.background) { |