Initial commit. Not in build system so shouldn't interfere with anything at this...
[blender-staging.git] / source / blender / nodes / intern / CMP_nodes / CMP_valToRgb.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2006 Blender Foundation.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #include "../CMP_util.h"
31
32
33 /* **************** VALTORGB ******************** */
34 static bNodeSocketType cmp_node_valtorgb_in[]= {
35         {       SOCK_VALUE, 1, "Fac",                   0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
36         {       -1, 0, ""       }
37 };
38 static bNodeSocketType cmp_node_valtorgb_out[]= {
39         {       SOCK_RGBA, 0, "Image",                  0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
40         {       SOCK_VALUE, 0, "Alpha",                 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
41         {       -1, 0, ""       }
42 };
43
44 static void do_colorband_composit(bNode *node, float *out, float *in)
45 {
46         do_colorband(node->storage, in[0], out);
47 }
48
49 static void node_composit_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
50 {
51         /* stack order in: fac */
52         /* stack order out: col, alpha */
53         
54         if(out[0]->hasoutput==0 && out[1]->hasoutput==0) 
55                 return;
56         
57         if(node->storage) {
58                 /* input no image? then only color operation */
59                 if(in[0]->data==NULL) {
60                         do_colorband(node->storage, in[0]->vec[0], out[0]->vec);
61                 }
62                 else {
63                         /* make output size of input image */
64                         CompBuf *cbuf= in[0]->data;
65                         CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
66                         
67                         composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_colorband_composit, CB_VAL);
68                         
69                         out[0]->data= stackbuf;
70                         
71                         if(out[1]->hasoutput)
72                                 out[1]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A);
73
74                 }
75         }
76 }
77
78 static void node_composit_init_valtorgb(bNode* node)
79 {
80    node->storage= add_colorband(1);
81 }
82
83 bNodeType cmp_node_valtorgb= {
84         /* type code   */       CMP_NODE_VALTORGB,
85         /* name        */       "ColorRamp",
86         /* width+range */       240, 200, 300,
87         /* class+opts  */       NODE_CLASS_CONVERTOR, NODE_OPTIONS,
88         /* input sock  */       cmp_node_valtorgb_in,
89         /* output sock */       cmp_node_valtorgb_out,
90         /* storage     */       "ColorBand",
91         /* execfunc    */       node_composit_exec_valtorgb,
92    /* butfunc     */ node_buts_valtorgb,
93                      node_composit_init_valtorgb
94         
95 };
96
97
98 /* **************** RGBTOBW ******************** */
99 static bNodeSocketType cmp_node_rgbtobw_in[]= {
100         {       SOCK_RGBA, 1, "Image",                  0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
101         {       -1, 0, ""       }
102 };
103 static bNodeSocketType cmp_node_rgbtobw_out[]= {
104         {       SOCK_VALUE, 0, "Val",                   0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
105         {       -1, 0, ""       }
106 };
107
108 static void do_rgbtobw(bNode *node, float *out, float *in)
109 {
110         out[0]= in[0]*0.35f + in[1]*0.45f + in[2]*0.2f;
111 }
112
113 static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
114 {
115         /* stack order out: bw */
116         /* stack order in: col */
117         
118         if(out[0]->hasoutput==0)
119                 return;
120         
121         /* input no image? then only color operation */
122         if(in[0]->data==NULL) {
123                 do_rgbtobw(node, out[0]->vec, in[0]->vec);
124         }
125         else {
126                 /* make output size of input image */
127                 CompBuf *cbuf= in[0]->data;
128                 CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
129                 
130                 composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_rgbtobw, CB_RGBA);
131                 
132                 out[0]->data= stackbuf;
133         }
134 }
135
136 bNodeType cmp_node_rgbtobw= {
137         /* type code   */       CMP_NODE_RGBTOBW,
138         /* name        */       "RGB to BW",
139         /* width+range */       80, 40, 120,
140         /* class+opts  */       NODE_CLASS_CONVERTOR, 0,
141         /* input sock  */       cmp_node_rgbtobw_in,
142         /* output sock */       cmp_node_rgbtobw_out,
143         /* storage     */       "",
144         /* execfunc    */       node_composit_exec_rgbtobw,
145    /* butfunc     */ NULL,
146                      NULL
147         
148 };
149
150