36
36
/* **************** Z COMBINE ******************** */
37
37
/* lazy coder note: node->custom2 is abused to send signal */
38
static bNodeSocketTemplate cmp_node_zcombine_in[]= {
39
{ SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
40
{ SOCK_FLOAT, 1, "Z", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
41
{ SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
42
{ SOCK_FLOAT, 1, "Z", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
45
static bNodeSocketTemplate cmp_node_zcombine_out[]= {
46
{ SOCK_RGBA, 0, "Image"},
47
{ SOCK_FLOAT, 0, "Z"},
51
static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
58
// use alpha in combine operation
61
out[0]= malpha*src2[0] + alpha*src1[0];
62
out[1]= malpha*src2[1] + alpha*src1[1];
63
out[2]= malpha*src2[2] + alpha*src1[2];
64
out[3]= malpha*src2[3] + alpha*src1[3];
67
// do combination based solely on z value
68
copy_v4_v4(out, src1);
73
// use alpha in combine operation
76
out[0]= malpha*src1[0] + alpha*src2[0];
77
out[1]= malpha*src1[1] + alpha*src2[1];
78
out[2]= malpha*src1[2] + alpha*src2[2];
79
out[3]= malpha*src1[3] + alpha*src2[3];
82
// do combination based solely on z value
83
copy_v4_v4(out, src1);
91
static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
100
static void do_zcombine_add(bNode *node, float *out, float *col1, float *col2, float *acol)
106
// use alpha in combine operation, antialiased mask in used here just as hint for the z value
109
malpha= 1.0f - alpha;
112
out[0]= malpha*col1[0] + alpha*col2[0];
113
out[1]= malpha*col1[1] + alpha*col2[1];
114
out[2]= malpha*col1[2] + alpha*col2[2];
115
out[3]= malpha*col1[3] + alpha*col2[3];
119
malpha= 1.0f - alpha;
122
out[0]= malpha*col2[0] + alpha*col1[0];
123
out[1]= malpha*col2[1] + alpha*col1[1];
124
out[2]= malpha*col2[2] + alpha*col1[2];
125
out[3]= malpha*col2[3] + alpha*col1[3];
129
// do combination based solely on z value but with antialiased mask
131
malpha= 1.0f - alpha;
133
out[0]= malpha*col1[0] + alpha*col2[0];
134
out[1]= malpha*col1[1] + alpha*col2[1];
135
out[2]= malpha*col1[2] + alpha*col2[2];
136
out[3]= malpha*col1[3] + alpha*col2[3];
140
static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
142
RenderData *rd= data;
143
CompBuf *cbuf= in[0]->data;
146
/* stack order in: col z col z */
147
/* stack order out: col z */
148
if (out[0]->hasoutput==0 && out[1]->hasoutput==0)
151
/* no input image; do nothing now */
152
if (in[0]->data==NULL) {
156
if (out[1]->hasoutput) {
157
/* copy or make a buffer for for the first z value, here we write result in */
159
zbuf= dupalloc_compbuf(in[1]->data);
162
int tot= cbuf->x*cbuf->y;
164
zbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1);
165
for (zval= zbuf->rect; tot; tot--, zval++)
166
*zval= in[1]->vec[0];
168
/* lazy coder hack */
177
if (rd->scemode & R_FULL_SAMPLE) {
178
/* make output size of first input image */
179
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs
181
composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, zbuf, in[1]->vec, in[2]->data, in[2]->vec,
182
in[3]->data, in[3]->vec, do_zcombine, CB_RGBA, CB_VAL, CB_RGBA, CB_VAL);
184
out[0]->data= stackbuf;
187
/* make output size of first input image */
188
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
195
/* make a mask based on comparison, optionally write zvalue */
196
mbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1);
197
composit2_pixel_processor(node, mbuf, zbuf, in[1]->vec, in[3]->data, in[3]->vec, do_zcombine_mask, CB_VAL, CB_VAL);
199
/* convert to char */
200
aabuf= MEM_mallocN(cbuf->x*cbuf->y, "aa buf");
202
for (x= cbuf->x*cbuf->y-1; x>=0; x--)
203
if (fp[x]==0.0f) aabuf[x]= 0;
206
antialias_tagbuf(cbuf->x, cbuf->y, aabuf);
208
/* convert to float */
210
for (x= cbuf->x*cbuf->y-1; x>=0; x--)
212
fp[x]= (1.0f/255.0f)*(float)aabuf[x];
214
composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[2]->data, in[2]->vec, mbuf, NULL,
215
do_zcombine_add, CB_RGBA, CB_RGBA, CB_VAL);
220
out[0]->data= stackbuf;
38
static bNodeSocketTemplate cmp_node_zcombine_in[] = {
39
{ SOCK_RGBA, 1, N_("Image"), 1.0f, 1.0f, 1.0f, 1.0f},
40
{ SOCK_FLOAT, 1, N_("Z"), 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
41
{ SOCK_RGBA, 1, N_("Image"), 1.0f, 1.0f, 1.0f, 1.0f},
42
{ SOCK_FLOAT, 1, N_("Z"), 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
45
static bNodeSocketTemplate cmp_node_zcombine_out[] = {
46
{ SOCK_RGBA, 0, N_("Image")},
47
{ SOCK_FLOAT, 0, N_("Z")},
225
51
void register_node_type_cmp_zcombine(bNodeTreeType *ttype)