[Bf-blender-cvs] [4645051] object_nodes: Switch texture nodes to a pynodes implementation.

Lukas Tönne noreply at git.blender.org
Fri May 13 11:24:04 CEST 2016


Commit: 464505174ba231fd29ce2ae3d1d764ecbf6eaa36
Author: Lukas Tönne
Date:   Fri May 13 11:15:54 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB464505174ba231fd29ce2ae3d1d764ecbf6eaa36

Switch texture nodes to a pynodes implementation.

This also removes the static bNodeTree type definition C, because
BVM requires some functions that are best defined in python (and it
would have been switched eventually anyway).

===================================================================

M	release/scripts/nodes/group_nodes.py
A	release/scripts/nodes/texture_nodes.py
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/editors/space_node/drawnode.c
M	source/blender/editors/space_node/node_edit.c
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/NOD_texture.h
M	source/blender/nodes/texture/node_texture_tree.c

===================================================================

diff --git a/release/scripts/nodes/group_nodes.py b/release/scripts/nodes/group_nodes.py
index 54ec30b..8bc10e1 100644
--- a/release/scripts/nodes/group_nodes.py
+++ b/release/scripts/nodes/group_nodes.py
@@ -230,7 +230,7 @@ def ancestor_trees(root_tree, all_trees):
 
 
 def make_node_group_types(prefix, treetype, node_base):
-    ntree_idname = treetype.bl_idname
+    ntree_idname = treetype.bl_rna.identifier
     groupnode_idname = '%sGroupNode' % prefix
 
     class NodeGroupNew(Operator):
@@ -617,7 +617,7 @@ def GroupNodeCategory(prefix, gnode, ginput, goutput):
 
         all_trees = context.blend_data.node_groups
         ancestors = ancestor_trees(ntree, all_trees)
-        free_trees = [t for t in all_trees if (t.bl_idname == gnode.bl_ntree_idname) and (t != ntree) and (t not in ancestors)]
+        free_trees = [t for t in all_trees if (t.bl_rna.identifier == gnode.bl_ntree_idname) and (t != ntree) and (t not in ancestors)]
 
         for ntree in free_trees:
             yield NodeItem(gnode.bl_idname,
diff --git a/release/scripts/nodes/texture_nodes.py b/release/scripts/nodes/texture_nodes.py
new file mode 100644
index 0000000..6bb0de0
--- /dev/null
+++ b/release/scripts/nodes/texture_nodes.py
@@ -0,0 +1,176 @@
+# ##### 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-80 compliant>
+
+import bpy
+import nodeitems_utils
+from bpy.types import Operator, ObjectNode, NodeTree, Node
+from bpy.props import *
+from nodeitems_utils import NodeCategory, NodeItem
+from common_nodes import NodeTreeBase, NodeBase, DynamicSocketListNode, enum_property_copy, enum_property_value_prop
+import group_nodes
+
+###############################################################################
+
+
+# our own base class with an appropriate poll function,
+# so the categories only show up in our own tree type
+class TextureNodeCategory(NodeCategory):
+    @classmethod
+    def poll(cls, context):
+        tree = context.space_data.edit_tree
+        return tree and tree.bl_idname == 'TextureNodeTree'
+
+
+###############################################################################
+
+class TextureNodeTree(NodeTreeBase, NodeTree):
+    '''Texture nodes'''
+    bl_idname = 'TextureNodeTree'
+    bl_label = 'Texture Nodes'
+    bl_icon = 'TEXTURE'
+
+    @classmethod
+    def get_from_context(cls, context):
+        space = context.space_data
+
+        ntree = None
+        id_owner = None
+        id_from = None
+
+        if (space.texture_type == 'OBJECT'):
+            ob = context.active_object
+            if ob:
+                if ob.type == 'LAMP':
+                    id_from = ob.data
+                    id_owner = id_from.active_texture
+                else:
+                    id_from = ob.active_material
+                    ma = id_from.active_node_material if id_from else None
+                    if not ma:
+                        ma = id_from
+                    id_owner = ma.active_texture if ma else None
+                ntree = id_owner.node_tree if id_owner else None
+        
+        elif (space.texture_type == 'WORLD'):
+            scene = context.scene
+            id_from = scene.world
+            id_owner = id_from.active_texture if id_from else None
+            ntree = id_owner.node_tree if id_owner else None
+        
+        elif (space.texture_type == 'BRUSH'):
+            ob = context.active_object
+            if ob and ob.mode == 'SCULPT':
+                id_from = scene.tool_settings.sculpt.brush
+            else:
+                id_from = scene.tool_settings.image_paint.brush
+            id_owner = id_from.texture if id_from else None
+            ntree = id_owner.node_tree if id_owner else None
+        
+        elif (space.texture_type == 'LINESTYLE'):
+            rlayer = context.scene.render.layers.active
+            lineset = rlayer.freestyle.linesets.active if rlayer else None
+            id_from = lineset.linestyle if lineset else None
+            id_owner = id_from.active_texture if id_from else None
+            ntree = id_owner.node_tree if id_owner else None
+
+        return ntree, id_owner, id_from
+
+    def init_default(self):
+        out = self.nodes.new(TextureOutputNode.bl_idname)
+        out.location = (0, 20)
+
+###############################################################################
+
+class TextureNodeBase(NodeBase):
+    @classmethod
+    def poll(cls, ntree):
+        return ntree.bl_idname == 'TextureNodeTree'
+
+
+class TextureOutputNode(TextureNodeBase, ObjectNode, DynamicSocketListNode):
+    '''Texture output'''
+    bl_idname = 'TextureOutputNode'
+    bl_label = 'Output'
+
+    def init(self, context):
+        s = self.inputs.new('NodeSocketColor', "Color")
+        s.default_value = (1, 1, 1, 1)
+        s = self.inputs.new('NodeSocketVector', "Normal")
+        s.default_value = (0, 0, 1)
+
+    def compile(self, compiler):
+        compiler.map_input(0, compiler.graph_output("color"))
+        compiler.map_input(1, compiler.graph_output("normal"))
+
+###############################################################################
+
+def register():
+    gnode, ginput, goutput = group_nodes.make_node_group_types(
+        "Texture", TextureNodeTree, TextureNodeBase)
+    bpy.utils.register_module(__name__)
+
+    node_categories = [
+        TextureNodeCategory("TEX_INPUT", "Input", items=[
+            NodeItem(ginput.bl_idname),
+            NodeItem("ObjectValueFloatNode"),
+            NodeItem("ObjectValueIntNode"),
+            NodeItem("ObjectValueVectorNode"),
+            NodeItem("ObjectValueColorNode"),
+            ]),
+        TextureNodeCategory("TEX_OUTPUT", "Output", items=[
+            NodeItem("TextureOutputNode"),
+            NodeItem(goutput.bl_idname),
+            ]),
+        TextureNodeCategory("TEX_CONVERTER", "Converter", items=[
+            NodeItem("ObjectSeparateVectorNode"),
+            NodeItem("ObjectCombineVectorNode"),
+            ]),
+        TextureNodeCategory("TEX_MATH", "Math", items=[
+            NodeItem("ObjectMathNode"),
+            NodeItem("ObjectVectorMathNode"),
+            NodeItem("ObjectTranslationTransformNode"),
+            NodeItem("ObjectEulerTransformNode"),
+            NodeItem("ObjectAxisAngleTransformNode"),
+            NodeItem("ObjectScaleTransformNode"),
+            NodeItem("ObjectGetTranslationNode"),
+            NodeItem("ObjectGetEulerNode"),
+            NodeItem("ObjectGetAxisAngleNode"),
+            NodeItem("ObjectGetScaleNode"),
+            NodeItem("ObjectRandomNode"),
+            ]),
+        TextureNodeCategory("TEX_TEXTURE", "Texture", items=[
+            NodeItem("ImageSampleNode"),
+            NodeItem("ObjectTextureCloudsNode"),
+            NodeItem("ObjectTextureDistNoiseNode"),
+            NodeItem("ObjectTextureMagicNode"),
+            NodeItem("ObjectTextureMarbleNode"),
+            NodeItem("ObjectTextureMusgraveNode"),
+            NodeItem("ObjectTextureStucciNode"),
+            NodeItem("ObjectTextureVoronoiNode"),
+            NodeItem("ObjectTextureWoodNode"),
+            ]),
+        group_nodes.GroupNodeCategory("TEX", gnode, ginput, goutput),
+        ]
+    nodeitems_utils.register_node_categories("TEXTURE_NODES", node_categories)
+
+def unregister():
+    nodeitems_utils.unregister_node_categories("TEXTURE_NODES")
+
+    bpy.utils.unregister_module(__name__)
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 314ccaf..d2bcbe9 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3721,7 +3721,6 @@ void init_nodesystem(void)
 
 	register_node_tree_type_cmp();
 	register_node_tree_type_sh();
-	register_node_tree_type_tex();
 
 	register_node_type_frame();
 	register_node_type_reroute();
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 49d4bcf..70c3271 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -508,474 +508,6 @@ void BVM_eval_forcefield_bvm(struct BVMEvalGlobals *globals, struct BVMEvalConte
 
 namespace blenvm {
 
-struct bNodeCompiler {
-	typedef std::pair<bNode*, bNodeSocket*> bSocketPair;
-	typedef std::set<InputKey> InputSet;
-	typedef std::map<bSocketPair, InputSet> InputMap;
-	typedef std::map<bSocketPair, OutputKey> OutputMap;
-	
-	bNodeCompiler(NodeGraph *graph) :
-	    m_graph(graph),
-	    m_current_bnode(NULL)
-	{
-	}
-	
-	~bNodeCompiler()
-	{
-	}
-	
-	bNode *current_node() const { return m_current_bnode; }
-	void set_current_node(bNode *node) { m_current_bnode = node; }
-	
-	const InputMap &input_map() const { return m_input_map; }
-	const OutputMap &output_map() const { return m_output_map; }
-	
-	NodeInstance *add_node(const string &type,  const string &name = "")
-	{
-		return m_graph->add_node(type, name);
-	}
-	
-	OutputKey add_input_proxy(int index)
-	{
-		bNodeSocket *bsock = (bNodeSocket *)BLI_findlink(&m_current_bnode->inputs, index);
-		assert(bsock != NULL);
-		
-		NodeInstance *node = NULL;
-		switch (bsock->type) {
-			case SOCK_FLOAT: node = add_node("PASS_FLOAT"); break;
-			case SOCK_INT: node = add_node("PASS_INT"); break;
-			case SOCK_VECTOR: node = add_node("PASS_FLOAT3"); break;
-			case SOCK_RGBA: node = add_node("PASS_FLOAT4"); break;
-		}
-		map_input_socket(index, node->input("value"));
-		return node->output("value");
-	}
-	
-	void map_input_socket(int bindex

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list