[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35927] branches/particles-2010: First steps towards modifier nodes.
Lukas Toenne
lukas.toenne at googlemail.com
Thu Mar 31 22:59:56 CEST 2011
Revision: 35927
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35927
Author: lukastoenne
Date: 2011-03-31 20:59:55 +0000 (Thu, 31 Mar 2011)
Log Message:
-----------
First steps towards modifier nodes.
Modifier node trees are created as true ID data blocks, i.e. they are created and selected in the node editor space independently from any object selection (similar to image editor). Any modifier node tree can then be linked to objects in their modifier panel. When a node tree is linked to an object it will replace the modifier stack to create the final derived mesh.
Modifier nodes introduce a new socket type for meshes (using a yellow-greenish color atm). These sockets denote the output of derived mesh data by modifier nodes, just like stack-based modifiers have. The main difference is that node modifiers can also have multiple inputs and/or outputs, leading to a wide range of new possibilities. As a test case a "join" node has been added, which takes two mesh inputs and merges them together in a single output.
Node outputs now also have a new button (with the eye icon), which is supposed to replace viewer nodes (currently only used by modifier nodes). Instead of creating a viewer node and linking it to an output, the view button can be activated to show intermediate results. For the final result a special output node is still the better choice, as it allows more fine-tuning and doesn't have to change connections as often as the viewer.
Modified Paths:
--------------
branches/particles-2010/source/blender/blenkernel/BKE_node.h
branches/particles-2010/source/blender/blenkernel/intern/DerivedMesh.c
branches/particles-2010/source/blender/blenkernel/intern/node.c
branches/particles-2010/source/blender/editors/space_node/drawnode.c
branches/particles-2010/source/blender/editors/space_node/node_draw.c
branches/particles-2010/source/blender/editors/space_node/node_edit.c
branches/particles-2010/source/blender/editors/space_node/node_header.c
branches/particles-2010/source/blender/editors/space_node/node_intern.h
branches/particles-2010/source/blender/editors/space_node/space_node.c
branches/particles-2010/source/blender/editors/transform/transform_generics.c
branches/particles-2010/source/blender/makesdna/DNA_node_types.h
branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
branches/particles-2010/source/blender/nodes/CMakeLists.txt
branches/particles-2010/source/blender/nodes/MOD_node.h
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_common.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_image.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_math.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_value.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_mesh.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_transform.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodetree.c
branches/particles-2010/source/blender/nodes/intern/MOD_util.c
branches/particles-2010/source/blender/nodes/intern/MOD_util.h
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_common.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_material.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_math.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_output.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_value.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_at.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_common.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_image.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_math.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_output.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
branches/particles-2010/source/blender/nodes/intern/node_common.c
branches/particles-2010/source/blender/nodes/intern/node_exec.c
branches/particles-2010/source/blender/nodes/intern/node_exec.h
branches/particles-2010/source/blender/nodes/intern/node_util.h
Added Paths:
-----------
branches/particles-2010/release/scripts/ui/properties_modifier_node.py
branches/particles-2010/source/blender/nodes/intern/MOD_exec.c
branches/particles-2010/source/blender/nodes/intern/MOD_exec.h
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_common.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_join.c
branches/particles-2010/source/blender/nodes/intern/node_socket.c
branches/particles-2010/source/blender/nodes/intern/node_socket.h
Added: branches/particles-2010/release/scripts/ui/properties_modifier_node.py
===================================================================
--- branches/particles-2010/release/scripts/ui/properties_modifier_node.py (rev 0)
+++ branches/particles-2010/release/scripts/ui/properties_modifier_node.py 2011-03-31 20:59:55 UTC (rev 35927)
@@ -0,0 +1,72 @@
+# ##### 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.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import bpy
+
+
+class DATA_PT_modifier_node(bpy.types.Panel):
+ bl_space_type = 'NODE_EDITOR'
+ bl_region_type = 'UI'
+ #bl_context = "modifier"
+ bl_label = "Properties"
+
+ @classmethod
+ def poll(cls, context):
+ return (context.active_node)
+
+ def draw(self, context):
+ layout = self.layout
+
+ node = context.active_node
+
+ # match enum type to our functions, avoids a lookup table.
+ getattr(self, node.type)(layout, node)
+
+ # the mt.type enum is (ab)used for a lookup on function names
+ # ...to avoid lengthy if statements
+ # so each type must have a function here.
+
+ def MESH(self, layout, node):
+ col = layout.column()
+ col.prop(node, "use_external")
+ if (node.use_external):
+ col.template_ID(node, "external_mesh")
+
+ def TRANSFORM(self, layout, node):
+ col = layout.column()
+ row = col.row(align=1)
+ row.prop(node, "translate")
+ row = col.row(align=1)
+ row.prop(node, "rotate")
+ row = col.row(align=1)
+ row.prop(node, "scale")
+
+ def JOIN(self, layout, node):
+ pass
+
+
+def register():
+ bpy.utils.register_module(__name__)
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
+
+if __name__ == "__main__":
+ register()
Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-03-31 20:57:17 UTC (rev 35926)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-03-31 20:59:55 UTC (rev 35927)
@@ -87,12 +87,20 @@
struct bNodeSocket *sock; /* used to hold verified socket */
} bNodeSocketTemplate;
-/* Symbols for sockets */
-typedef enum NodeSocketSymbol {
- SOCK_CIRCLE,
- SOCK_SQUARE
-} NodeSocketSymbol;
+typedef struct bNodeSocketConverter {
+ char ui_name[32];
+} bNodeSocketConverter;
+typedef struct bNodeSocketType {
+ int type;
+ char ui_name[32];
+ char ui_description[128];
+ int ui_icon;
+ char ui_color[4];
+
+ int (*get_converters)(int type, struct bNodeSocketConverter **conv, int *totconv);
+} bNodeSocketType;
+
typedef struct bNodeTemplate {
int type;
@@ -102,6 +110,8 @@
typedef struct bNodeType {
void *next,*prev;
+ short needs_free; /* set for allocated types that need to be freed */
+
int type;
char name[32];
float width, minwidth, maxwidth;
@@ -129,8 +139,8 @@
void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
- void (*freestoragefunc)(struct bNode *);
- void (*copystoragefunc)(struct bNode *, struct bNode *);
+ void (*freestoragefunc)(struct bNode *node);
+ void (*copystoragefunc)(struct bNode *node, struct bNode *target);
struct bNodeTemplate (*templatefunc)(struct bNode *);
int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
@@ -194,6 +204,7 @@
#define NODE_CLASS_MATH_ROTATION 19
#define NODE_CLASS_PARTICLES 25
#define NODE_CLASS_TRANSFORM 30
+#define NODE_CLASS_COMBINE 31
#define NODE_CLASS_LAYOUT 100
/* enum values for input/output */
@@ -236,6 +247,7 @@
struct bNodeTreeType *ntreeGetType(int type);
struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree);
+struct bNodeSocketType *ntreeGetSocketType(int type);
struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
void ntreeInitTypes(struct bNodeTree *ntree);
@@ -256,7 +268,11 @@
void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+/* XXX old trees handle output flags automatically based on special output node types and last active selection.
+ * new tree types have a per-output socket flag to indicate the final output to use explicitly.
+ */
void ntreeSetOutput(struct bNodeTree *ntree);
+void ntreeSetViewerOutput(struct bNodeTree *ntree, struct bNodeSocket *output);
void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
void ntreeClearPreview(struct bNodeTree *ntree);
@@ -270,6 +286,11 @@
/* ************** GENERIC API, NODES *************** */
+struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
+struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
+void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
+void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
+
void nodeAddToPreview(struct bNode *, float *, int, int, int);
struct bNode *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
@@ -285,7 +306,7 @@
void nodeAssignInputPanel(struct bNode *node, struct bNodeSocket *socket, struct bNodeSocketPanel *panel);
void nodeAssignOutputPanel(struct bNode *node, struct bNodeSocket *socket, struct bNodeSocketPanel *panel);
-void nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
+void nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ;
void nodeMakeDynamicType(struct bNode *node);
int nodeDynamicUnlinkText(struct ID *txtid);
@@ -336,8 +357,8 @@
void nodeEditClear(struct bNode *node);
/* Init a new node type struct with default values and callbacks */
-void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag,
- struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
+void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
+void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp));
@@ -365,13 +386,6 @@
void (*freeexecfunc)(struct bNode *node, void *nodedata),
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
-/* ************** INTERNAL EDITOR FUNCTIONS *************** */
-
-struct bNodeSocket *node_add_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, const char *name, int type);
-struct bNodeSocket *node_insert_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
-void node_remove_socket(struct bNodeTree *ntree, ListBase *lb, struct bNodeSocket *sock);
-void node_remove_all_sockets(struct bNodeTree *ntree, struct bNode *node);
-
/* ************** COMMON NODES *************** */
#define NODE_GROUP 2
@@ -625,10 +639,11 @@
#define MOD_NODE_MESH 1000
/* transform */
-#define MOD_NODE_TRANSLATE 1101
-#define MOD_NODE_ROTATE 1102
-#define MOD_NODE_SCALE 1103
+#define MOD_NODE_TRANSFORM 1100
+/* combine */
+#define MOD_NODE_JOIN 1200
+
/* API */
struct DerivedMesh *ntreeModifierExecTree(struct bNodeTree *ntree, struct Scene *scene, struct Object *ob, float (*inputVertexCos)[3]);
Modified: branches/particles-2010/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/DerivedMesh.c 2011-03-31 20:57:17 UTC (rev 35926)
+++ branches/particles-2010/source/blender/blenkernel/intern/DerivedMesh.c 2011-03-31 20:59:55 UTC (rev 35927)
@@ -1694,12 +1694,19 @@
*deform_r = CDDM_from_mesh(me, ob);
}
- if(inputVertexCos)
- deformedVerts = inputVertexCos;
- else
- deformedVerts = mesh_getVertexCos(me, &numVerts);
+ dm = ntreeModifierExecTree(ob->modifier_nodetree, scene, ob, inputVertexCos);
- dm = ntreeModifierExecTree(ob->modifier_nodetree, scene, ob, inputVertexCos);
+ if (dm) {
+ numVerts = dm->getNumVerts(dm);
+ deformedVerts = MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv");
+ dm->getVertCos(dm, deformedVerts);
+ }
+ else {
+ if(inputVertexCos)
+ deformedVerts = inputVertexCos;
+ else
+ deformedVerts = mesh_getVertexCos(me, &numVerts);
+ }
}
else {
if(!skipVirtualArmature) {
Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-03-31 20:57:17 UTC (rev 35926)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-03-31 20:59:55 UTC (rev 35927)
@@ -72,6 +72,7 @@
#include "intern/node_common.h"
#include "intern/node_exec.h"
+#include "intern/node_socket.h"
#include "CMP_node.h"
#include "SHD_node.h"
@@ -116,6 +117,24 @@
return node_get_type(ntree, ntree->nodetype);
}
+bNodeSocketType *ntreeGetSocketType(int type)
+{
+ static bNodeSocketType *types[NUM_SOCKET_TYPES]= {NULL};
+ static int types_init = 1;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list