Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-04-30 11:43:21 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-04-30 11:43:21 +0400
commit9151d46d7dbab7c978604656c146245aaf8f4ce3 (patch)
tree567c74224cbaec49ed7de0c64a209053fd04c1aa /source/blender/nodes
parent16f06d4fe4bc9317a505a15112d7250152aa36d0 (diff)
Tomato: initial commit of mask editing tools into SVN
- Added new dtaablock called Mask which might be re-used in any area. Currently editing of masks happens in clip editor and they might be used in compositor nodes only. - Added new mode to clip clip editor to interact with masks. Implemented basic tools to create shapes, splines and points. Also implemented idea of UW points for feather which means feather points are have got U coordinate along spline (which is measured from 0 to 1) and W is it's weight meaning distance from main spline. - Spline points might be parented to movie tracks. Interface for this isn't best yet. - Rasterisaztion of masks happens in compositor node (Input -> Mask) Input image of this ode is used as reference for mask resolution. Currently all splines of all shapes are rasterizing independently which means shapes with holes are not supported. Also feather rasterization is not implemented. Rasterized was implemented by Pete Larbell, thanks! Do not consider this is something finished, there's still lots of things to be done (especially from interface and usability points of view).
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/CMakeLists.txt2
-rw-r--r--source/blender/nodes/NOD_composite.h2
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mask.c124
4 files changed, 132 insertions, 0 deletions
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 9bcbc91265c..5320d9f65cc 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -35,6 +35,7 @@ set(INC
../makesrna
../render/extern/include
../../../intern/guardedalloc
+ ../../../intern/raskter
)
set(INC_SYS
@@ -81,6 +82,7 @@ set(SRC
composite/nodes/node_composite_mapUV.c
composite/nodes/node_composite_mapValue.c
composite/nodes/node_composite_math.c
+ composite/nodes/node_composite_mask.c
composite/nodes/node_composite_mixrgb.c
composite/nodes/node_composite_movieclip.c
composite/nodes/node_composite_moviedistortion.c
diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h
index 284b89bc095..4378c6a1d36 100644
--- a/source/blender/nodes/NOD_composite.h
+++ b/source/blender/nodes/NOD_composite.h
@@ -50,6 +50,7 @@ void register_node_type_cmp_value(struct bNodeTreeType *ttype);
void register_node_type_cmp_rgb(struct bNodeTreeType *ttype);
void register_node_type_cmp_curve_time(struct bNodeTreeType *ttype);
void register_node_type_cmp_movieclip(struct bNodeTreeType *ttype);
+void register_node_type_cmp_usermask(struct bNodeTreeType *ttype);
void register_node_type_cmp_composite(struct bNodeTreeType *ttype);
void register_node_type_cmp_viewer(struct bNodeTreeType *ttype);
@@ -115,6 +116,7 @@ void register_node_type_cmp_mapuv(struct bNodeTreeType *ttype);
void register_node_type_cmp_transform(struct bNodeTreeType *ttype);
void register_node_type_cmp_stabilize2d(struct bNodeTreeType *ttype);
void register_node_type_cmp_moviedistortion(struct bNodeTreeType *ttype);
+void register_node_type_cmp_mask(struct bNodeTreeType *ttype);
void register_node_type_cmp_glare(struct bNodeTreeType *ttype);
void register_node_type_cmp_tonemap(struct bNodeTreeType *ttype);
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
index 049b5dd8178..ca8922eaf64 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -872,6 +872,10 @@ int ntreeCompositTagAnimated(bNodeTree *ntree)
nodeUpdate(ntree, node);
tagged= 1;
}
+ else if (node->type==CMP_NODE_MASK) {
+ nodeUpdate(ntree, node);
+ tagged= 1;
+ }
}
return tagged;
diff --git a/source/blender/nodes/composite/nodes/node_composite_mask.c b/source/blender/nodes/composite/nodes/node_composite_mask.c
new file mode 100644
index 00000000000..2c49be48f7d
--- /dev/null
+++ b/source/blender/nodes/composite/nodes/node_composite_mask.c
@@ -0,0 +1,124 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2012 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Blender Foundation,
+ * Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/composite/nodes/node_composite_mask.c
+ * \ingroup cmpnodes
+ */
+
+#include "BLF_translation.h"
+
+#include "DNA_mask_types.h"
+
+#include "BKE_mask.h"
+
+// XXX: ...
+#include "../../../../intern/raskter/raskter.h"
+#include "node_composite_util.h"
+
+/* **************** Translate ******************** */
+
+static bNodeSocketTemplate cmp_node_mask_in[] = {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate cmp_node_mask_out[] = {
+ { SOCK_RGBA, 0, "Image"},
+ { -1, 0, "" }
+};
+
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ if (node->id) {
+ Mask *mask = (Mask *)node->id;
+ CompBuf *stackbuf;
+ RenderData *rd = data;
+ MaskShape *shape = mask->shapes.first;
+ float *res;
+ int sx, sy;
+
+ if (!out[0]->hasoutput) {
+ /* the node's output socket is not connected to anything...
+ * do not execute any further, just exit the node immediately
+ */
+ return;
+ }
+
+ if (in[0]->hasinput && in[0]->data) {
+ CompBuf *cbuf = typecheck_compbuf(in[0]->data, CB_RGBA);
+
+ sx = cbuf->x;
+ sy = cbuf->y;
+ }
+ else {
+ sx = (rd->size * rd->xsch) / 100;
+ sy = (rd->size * rd->ysch) / 100;
+ }
+
+ /* allocate the output buffer */
+ stackbuf = alloc_compbuf(sx, sy, CB_VAL, TRUE);
+ res = stackbuf->rect;
+
+ shape = mask->shapes.first;
+ while (shape) {
+ MaskSpline *spline = shape->splines.first;
+
+ while (spline) {
+ float *diff_points;
+ int tot_diff_point;
+
+ diff_points = BKE_mask_spline_differentiate(spline, &tot_diff_point);
+
+ if (tot_diff_point) {
+ PLX_raskterize(diff_points, tot_diff_point, res, sx, sy);
+
+ MEM_freeN(diff_points);
+ }
+
+ spline = spline->next;
+ }
+
+ shape = shape->next;
+ }
+
+ /* pass on output and free */
+ out[0]->data = stackbuf;
+ }
+}
+
+void register_node_type_cmp_mask(bNodeTreeType *ttype)
+{
+ static bNodeType ntype;
+
+ node_type_base(ttype, &ntype, CMP_NODE_MASK, "Mask", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_mask_in, cmp_node_mask_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(ttype, &ntype);
+}