2 things:
authorRobin Allen <roblovski@gmail.com>
Wed, 26 Nov 2008 13:07:24 +0000 (13:07 +0000)
committerRobin Allen <roblovski@gmail.com>
Wed, 26 Nov 2008 13:07:24 +0000 (13:07 +0000)
* Patch #17998
* tex_input_vec now takes 3-vector as first argument (was 4-vector).

source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/nodes/TEX_node.h
source/blender/nodes/intern/TEX_nodes/TEX_coord.c [new file with mode: 0644]
source/blender/nodes/intern/TEX_nodes/TEX_distance.c [new file with mode: 0644]
source/blender/nodes/intern/TEX_util.c

index fa3a654..1c5b6b1 100644 (file)
@@ -401,6 +401,8 @@ struct TexResult;
 #define TEX_NODE_ROTATE     114
 #define TEX_NODE_VIEWER     115
 #define TEX_NODE_TRANSLATE  116
+#define TEX_NODE_COORD      117
+#define TEX_NODE_DISTANCE   118
 
 /* 201-299 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
 #define TEX_NODE_PROC      200
index ae81a31..4c84c56 100644 (file)
@@ -2886,6 +2886,8 @@ static void registerTextureNodes(ListBase *ntypelist)
        nodeRegisterType(ntypelist, &tex_node_curve_time);
        nodeRegisterType(ntypelist, &tex_node_invert);
        nodeRegisterType(ntypelist, &tex_node_hue_sat);
+       nodeRegisterType(ntypelist, &tex_node_coord);
+       nodeRegisterType(ntypelist, &tex_node_distance);
        
        nodeRegisterType(ntypelist, &tex_node_output);
        nodeRegisterType(ntypelist, &tex_node_viewer);
index 6be2123..40cb65e 100644 (file)
@@ -52,6 +52,8 @@ extern bNodeType tex_node_curve_rgb;
 extern bNodeType tex_node_curve_time;
 extern bNodeType tex_node_invert;
 extern bNodeType tex_node_hue_sat;
+extern bNodeType tex_node_coord;
+extern bNodeType tex_node_distance;
 
 extern bNodeType tex_node_rotate;
 extern bNodeType tex_node_translate;
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
new file mode 100644 (file)
index 0000000..da487c1
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Mathias Panzenböck (panzi) <grosser.meister.morti@gmx.net>.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../TEX_util.h"
+
+static bNodeSocketType outputs[]= { 
+       { SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { -1, 0, "" }
+};
+
+static void vectorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+{
+       out[0] = coord[0];
+       out[1] = coord[1];
+       out[2] = coord[2];
+}
+
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+       tex_output(node, in, out[0], &vectorfn);
+       
+       tex_do_preview(node, out[0], data);
+}
+
+bNodeType tex_node_coord= {
+       /* *next,*prev */       NULL, NULL,
+       /* type code   */       TEX_NODE_COORD,
+       /* name        */       "Coordinates",
+       /* width+range */       120, 110, 160,
+       /* class+opts  */       NODE_CLASS_INPUT, NODE_OPTIONS,
+       /* input sock  */       NULL,
+       /* output sock */       outputs,
+       /* storage     */       "node_coord",
+       /* execfunc    */       exec,
+       /* butfunc     */       NULL,
+       /* initfunc    */       NULL,
+       /* freestoragefunc    */        NULL,
+       /* copystoragefunc    */        NULL,
+       /* id          */       NULL
+};
+
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
new file mode 100644 (file)
index 0000000..eb6f27e
--- /dev/null
@@ -0,0 +1,82 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Mathias Panzenböck (panzi) <grosser.meister.morti@gmx.net>.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include "../TEX_util.h"
+
+static bNodeSocketType inputs[]= {
+       { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { -1, 0, "" } 
+};
+
+static bNodeSocketType outputs[]= {
+       { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+       { -1, 0, "" }
+};
+
+static void valuefn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+{
+       float coord1[3], coord2[3];
+       float x, y, z;
+
+       tex_input_vec(coord1, in[0], coord, thread);
+       tex_input_vec(coord2, in[1], coord, thread);
+
+       x = coord2[0] - coord1[0];
+       y = coord2[1] - coord1[1];
+       z = coord2[2] - coord1[2];
+
+       *out = sqrt(x * x + y * y + z * z);
+}
+
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+       tex_output(node, in, out[0], &valuefn);
+       
+       tex_do_preview(node, out[0], data);
+}
+
+bNodeType tex_node_distance= {
+       /* *next,*prev */       NULL, NULL,
+       /* type code   */       TEX_NODE_DISTANCE,
+       /* name        */       "Distance",
+       /* width+range */       120, 110, 160,
+       /* class+opts  */       NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+       /* input sock  */       inputs,
+       /* output sock */       outputs,
+       /* storage     */       "node_distance",
+       /* execfunc    */       exec,
+       /* butfunc     */       NULL,
+       /* initfunc    */       NULL,
+       /* freestoragefunc    */        NULL,
+       /* copystoragefunc    */        NULL,
+       /* id          */       NULL
+};
+
+
index 10fe3ba..5620723 100644 (file)
@@ -46,25 +46,32 @@ void tex_call_delegate(TexDelegate *dg, float *out, float *coord, short thread)
        dg->fn(out, coord, dg->node, dg->in, thread);
 }
 
-void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread)
+void tex_input(float *out, int sz, bNodeStack *in, float *coord, short thread)
 {
        TexDelegate *dg = in->data;
        if(dg) {
-               tex_call_delegate(dg, out, coord, thread);
+               tex_call_delegate(dg, in->vec, coord, thread);
        
-               if(in->hasoutput && in->sockettype == SOCK_VALUE) {
-                       out[1] = out[2] = out[0];
-                       out[3] = 1;
-               }
-       }
-       else {
-               QUATCOPY(out, in->vec);
+               if(in->hasoutput && in->sockettype == SOCK_VALUE)
+                       in->vec[1] = in->vec[2] = in->vec[0];
        }
+       memcpy(out, in->vec, sz * sizeof(float));
+}
+
+void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread)
+{
+       tex_input(out, 3, in, coord, thread);
 }
 
 void tex_input_rgba(float *out, bNodeStack *in, float *coord, short thread)
 {
-       tex_input_vec(out, in, coord, thread);
+       tex_input(out, 4, in, coord, thread);
+       
+       if(in->hasoutput && in->sockettype == SOCK_VALUE)
+       {
+               out[1] = out[2] = out[0];
+               out[3] = 1;
+       }
        
        if(in->hasoutput && in->sockettype == SOCK_VECTOR) {
                out[0] = out[0] * .5f + .5f;
@@ -83,8 +90,8 @@ float tex_input_value(bNodeStack *in, float *coord, short thread)
 
 static void init_preview(bNode *node)
 {
-       int xsize = node->prvr.xmax - node->prvr.xmin;
-       int ysize = node->prvr.ymax - node->prvr.ymin;
+       int xsize = (int)(node->prvr.xmax - node->prvr.xmin);
+       int ysize = (int)(node->prvr.ymax - node->prvr.ymin);
        
        if(xsize == 0) {
                xsize = PREV_RES;