[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