We've reconsidered previous patch in IRC.

It's more useful to completely ignore alpha for display of straight
colors.

Supporting straight pipeline is possible, but not a topic for bcon4.
This commit is contained in:
Sergey Sharybin
2013-02-10 13:14:51 +00:00
parent 75cbb07507
commit 9a6c5d8b3e
9 changed files with 32 additions and 28 deletions

View File

@@ -41,7 +41,7 @@ void CompositorNode::convertToOperations(ExecutionSystem *graph, CompositorConte
compositorOperation->setSceneName(editorNode->id->name);
compositorOperation->setRenderData(context->getRenderData());
compositorOperation->setbNodeTree(context->getbNodeTree());
compositorOperation->setStraightAlpha(editorNode->custom2 & 1);
compositorOperation->setIgnoreAlpha(editorNode->custom2 & 1);
imageSocket->relinkConnections(compositorOperation->getInputSocket(0), 0, graph);
alphaSocket->relinkConnections(compositorOperation->getInputSocket(1));
depthSocket->relinkConnections(compositorOperation->getInputSocket(2));

View File

@@ -47,7 +47,7 @@ void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext *
viewerOperation->setChunkOrder((OrderOfChunks)editorNode->custom1);
viewerOperation->setCenterX(editorNode->custom3);
viewerOperation->setCenterY(editorNode->custom4);
viewerOperation->setStraightAlpha(editorNode->custom2 & 1);
viewerOperation->setIgnoreAlpha(editorNode->custom2 & 1);
viewerOperation->setViewSettings(context->getViewSettings());
viewerOperation->setDisplaySettings(context->getDisplaySettings());

View File

@@ -49,7 +49,7 @@ CompositorOperation::CompositorOperation() : NodeOperation()
this->m_alphaInput = NULL;
this->m_depthInput = NULL;
this->m_straightAlpha = false;
this->m_ignoreAlpha = false;
this->m_sceneName[0] = '\0';
}
@@ -140,12 +140,14 @@ void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber)
for (y = y1; y < y2 && (!breaked); y++) {
for (x = x1; x < x2 && (!breaked); x++) {
this->m_imageInput->read(color, x, y, COM_PS_NEAREST);
if (this->m_alphaInput != NULL) {
this->m_alphaInput->read(&(color[3]), x, y, COM_PS_NEAREST);
if (this->m_ignoreAlpha) {
color[3] = 1.0f;
}
else {
if (this->m_alphaInput != NULL) {
this->m_alphaInput->read(&(color[3]), x, y, COM_PS_NEAREST);
}
}
if (this->m_straightAlpha)
straight_to_premul_v4(color);
copy_v4_v4(buffer + offset4, color);

View File

@@ -66,8 +66,8 @@ private:
*/
SocketReader *m_depthInput;
/* node input has got straight alpha which shall be premultiplied */
bool m_straightAlpha;
/* Ignore any alpha input */
bool m_ignoreAlpha;
public:
CompositorOperation();
@@ -79,6 +79,6 @@ public:
void deinitExecution();
const CompositorPriority getRenderPriority() const { return COM_PRIORITY_MEDIUM; }
void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
void setStraightAlpha(bool value) { this->m_straightAlpha = value; }
void setIgnoreAlpha(bool value) { this->m_ignoreAlpha = value; }
};
#endif

View File

@@ -48,7 +48,7 @@ ViewerBaseOperation::ViewerBaseOperation() : NodeOperation()
this->m_doDepthBuffer = false;
this->m_viewSettings = NULL;
this->m_displaySettings = NULL;
this->m_straightAlpha = false;
this->m_ignoreAlpha = false;
}
void ViewerBaseOperation::initExecution()

View File

@@ -39,7 +39,7 @@ protected:
OrderOfChunks m_chunkOrder;
bool m_doDepthBuffer;
ImBuf *m_ibuf;
bool m_straightAlpha;
bool m_ignoreAlpha;
const ColorManagedViewSettings *m_viewSettings;
const ColorManagedDisplaySettings *m_displaySettings;
@@ -60,7 +60,7 @@ public:
OrderOfChunks getChunkOrder() { return this->m_chunkOrder; }
const CompositorPriority getRenderPriority() const;
bool isViewerOperation() { return true; }
void setStraightAlpha(bool value) { this->m_straightAlpha = value; }
void setIgnoreAlpha(bool value) { this->m_ignoreAlpha = value; }
void setViewSettings(const ColorManagedViewSettings *viewSettings) { this->m_viewSettings = viewSettings; }
void setDisplaySettings(const ColorManagedDisplaySettings *displaySettings) { this->m_displaySettings = displaySettings; }

View File

@@ -89,18 +89,20 @@ void ViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber)
for (y = y1; y < y2 && (!breaked); y++) {
for (x = x1; x < x2; x++) {
this->m_imageInput->read(&(buffer[offset4]), x, y, COM_PS_NEAREST);
if (this->m_alphaInput != NULL) {
this->m_alphaInput->read(alpha, x, y, COM_PS_NEAREST);
buffer[offset4 + 3] = alpha[0];
if (this->m_ignoreAlpha) {
buffer[offset4 + 3] = 1.0f;
}
else {
if (this->m_alphaInput != NULL) {
this->m_alphaInput->read(alpha, x, y, COM_PS_NEAREST);
buffer[offset4 + 3] = alpha[0];
}
}
if (m_depthInput) {
this->m_depthInput->read(depth, x, y, COM_PS_NEAREST);
depthbuffer[offset] = depth[0];
}
if (this->m_straightAlpha)
straight_to_premul_v4(buffer + offset4);
offset ++;
offset4 += 4;
}

View File

@@ -2656,12 +2656,12 @@ static void node_composit_buts_ellipsemask(uiLayout *layout, bContext *UNUSED(C)
static void node_composit_buts_composite(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiItemR(layout, ptr, "use_straight_alpha", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "use_alpha", 0, NULL, ICON_NONE);
}
static void node_composit_buts_viewer(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiItemR(layout, ptr, "use_straight_alpha", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "use_alpha", 0, NULL, ICON_NONE);
}
static void node_composit_buts_viewer_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)

View File

@@ -4084,9 +4084,9 @@ static void def_cmp_viewer(StructRNA *srna)
RNA_def_property_ui_text(prop, "Y", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "use_straight_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Straight Alpha", "Treat alpha input of this node as straight");
prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Use Alpha", "Colors are treated alpha premultiplied, or colors output straight (alpha gets set to 1)");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
@@ -4094,9 +4094,9 @@ static void def_cmp_composite(StructRNA *srna)
{
PropertyRNA *prop;
prop = RNA_def_property(srna, "use_straight_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Straight Alpha", "Treat alpha input of this node as straight");
prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Use Alpha", "Colors are treated alpha premultiplied, or colors output straight (alpha gets set to 1)");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}