option to use manual size input for scene

This commit is contained in:
Campbell Barton
2012-07-26 13:29:38 +00:00
parent 2b8fdedaf3
commit 733edf8628
6 changed files with 98 additions and 12 deletions

View File

@@ -46,8 +46,19 @@ void MaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext *co
// always connect the output image
MaskOperation *operation = new MaskOperation();
operation->setbNode(editorNode);
operation->setMaskWidth(data->xsch * data->size / 100.0f);
operation->setMaskHeight(data->ysch * data->size / 100.0f);
if (editorNode->custom1 & CMP_NODEFLAG_MASK_FIXED) {
operation->setMaskWidth(editorNode->custom3);
operation->setMaskHeight(editorNode->custom4);
}
else if (editorNode->custom1 & CMP_NODEFLAG_MASK_FIXED_SCENE) {
operation->setMaskWidth(editorNode->custom3 * (data->size / 100.0f));
operation->setMaskHeight(editorNode->custom4 * (data->size / 100.0f));
}
else {
operation->setMaskWidth(data->xsch * data->size / 100.0f);
operation->setMaskHeight(data->ysch * data->size / 100.0f);
}
if (outputMask->isConnected()) {
outputMask->relinkConnections(operation->getOutputSocket());

View File

@@ -145,12 +145,11 @@ void MaskOperation::initExecution()
{
if (this->m_mask) {
if (this->m_rasterMaskHandle == NULL) {
const int width = this->getWidth();
const int height = this->getHeight();
this->m_rasterMaskHandle = BKE_maskrasterize_handle_new();
BKE_maskrasterize_handle_init(this->m_rasterMaskHandle, this->m_mask, width, height, TRUE, this->m_do_smooth, this->m_do_feather);
BKE_maskrasterize_handle_init(this->m_rasterMaskHandle, this->m_mask,
this->m_maskWidth, this->m_maskHeight,
TRUE, this->m_do_smooth, this->m_do_feather);
}
}
}
@@ -183,8 +182,8 @@ void MaskOperation::determineResolution(unsigned int resolution[], unsigned int
void MaskOperation::executePixel(float *color, float x, float y, PixelSampler sampler)
{
const float xy[2] = {x / (float)this->m_maskWidth, y / (float)this->m_maskHeight};
if (this->m_rasterMaskHandle) {
const float xy[2] = {x * this->m_maskWidthInv, y * this->m_maskHeightInv};
color[0] = BKE_maskrasterize_handle_sample(this->m_rasterMaskHandle, xy);
}
else {

View File

@@ -46,8 +46,14 @@ extern "C" {
class MaskOperation : public NodeOperation {
protected:
Mask *m_mask;
int m_maskWidth;
int m_maskHeight;
/* note, these are used more like aspect,
* but they _do_ impact on mask detail */
int m_maskWidth;
int m_maskHeight;
float m_maskWidthInv; /* 1 / m_maskWidth */
float m_maskHeightInv; /* 1 / m_maskHeight */
int m_framenumber;
bool m_do_smooth;
bool m_do_feather;
@@ -74,8 +80,16 @@ public:
void setMask(Mask *mask) { this->m_mask = mask; }
void setMaskWidth(int width) { this->m_maskWidth = width; }
void setMaskHeight(int height) { this->m_maskHeight = height; }
void setMaskWidth(int width)
{
this->m_maskWidth = width;
this->m_maskWidthInv = 1.0f / (float)width;
}
void setMaskHeight(int height)
{
this->m_maskHeight = height;
this->m_maskHeightInv = 1.0f / (float)height;
}
void setFramenumber(int framenumber) { this->m_framenumber = framenumber; }
void setSmooth(bool smooth) { this->m_do_smooth = smooth; }
void setFeather(bool feather) { this->m_do_feather = feather; }

View File

@@ -2494,6 +2494,15 @@ static void node_composit_buts_mask(uiLayout *layout, bContext *C, PointerRNA *p
uiItemR(layout, ptr, "use_antialiasing", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "use_feather", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "size_source", 0, "", ICON_NONE);
{
bNode *node = ptr->data;
if (node->custom1 & (CMP_NODEFLAG_MASK_FIXED | CMP_NODEFLAG_MASK_FIXED_SCENE)) {
uiItemR(layout, ptr, "size_x", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "size_y", 0, NULL, ICON_NONE);
}
}
}
static void node_composit_buts_keyingscreen(uiLayout *layout, bContext *C, PointerRNA *ptr)

View File

@@ -376,7 +376,11 @@ enum {
enum {
CMP_NODEFLAG_MASK_AA = (1 << 0),
CMP_NODEFLAG_MASK_NO_FEATHER = (1 << 1)
CMP_NODEFLAG_MASK_NO_FEATHER = (1 << 1),
/* we may want multiple aspect options, exposed as an rna enum */
CMP_NODEFLAG_MASK_FIXED = (1 << 8),
CMP_NODEFLAG_MASK_FIXED_SCENE = (1 << 9)
};
enum {

View File

@@ -206,6 +206,30 @@ EnumPropertyItem prop_wave_items[] = {
#include "DNA_scene_types.h"
#include "WM_api.h"
static void rna_Node_custom3_set_as_int(PointerRNA *ptr, int value)
{
bNode *node = (bNode *)ptr->data;
node->custom3 = value;
}
static int rna_Node_custom3_get_as_int(PointerRNA *ptr)
{
bNode *node = (bNode *)ptr->data;
return (int)node->custom3;
}
static void rna_Node_custom4_set_as_int(PointerRNA *ptr, int value)
{
bNode *node = (bNode *)ptr->data;
node->custom4 = value;
}
static int rna_Node_custom4_get_as_int(PointerRNA *ptr)
{
bNode *node = (bNode *)ptr->data;
return (int)node->custom4;
}
static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
{
bNode *node = (bNode *)ptr->data;
@@ -3137,6 +3161,13 @@ static void def_cmp_mask(StructRNA *srna)
{
PropertyRNA *prop;
static EnumPropertyItem aspect_type_items[] = {
{0, "SCENE", 0, "Scene Size", ""},
{CMP_NODEFLAG_MASK_FIXED, "FIXED", 0, "Fixed", "Use pixel size for the buffer"},
{CMP_NODEFLAG_MASK_FIXED_SCENE, "FIXED_SCENE", 0, "Fixed/Scene", "Pixel size scaled by scene percentage"},
{0, NULL, 0, NULL, NULL}
};
prop = RNA_def_property(srna, "mask", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
RNA_def_property_struct_type(prop, "Mask");
@@ -3152,6 +3183,24 @@ static void def_cmp_mask(StructRNA *srna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "custom1", CMP_NODEFLAG_MASK_NO_FEATHER);
RNA_def_property_ui_text(prop, "Feather", "Use feather information from the mask");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "size_source", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, aspect_type_items);
RNA_def_property_ui_text(prop, "Size Source", "Where to get the mask size from for aspect/size information");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "size_x", PROP_INT, PROP_NONE);
RNA_def_property_int_funcs(prop, "rna_Node_custom3_get_as_int", "rna_Node_custom3_set_as_int", NULL);
RNA_def_property_range(prop, 1.0f, 10000.0f);
RNA_def_property_ui_text(prop, "X", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "size_y", PROP_INT, PROP_NONE);
RNA_def_property_int_funcs(prop, "rna_Node_custom4_get_as_int", "rna_Node_custom4_set_as_int", NULL);
RNA_def_property_range(prop, 1.0f, 10000.0f);
RNA_def_property_ui_text(prop, "Y", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void dev_cmd_transform(StructRNA *srna)