[Bf-blender-cvs] [99c1b7b] strand_nodes: Added new node tree type for hair nodes.
Lukas Tönne
noreply at git.blender.org
Thu Jul 21 17:41:02 CEST 2016
Commit: 99c1b7b5f48a9834366944689db5c9652d0e18a1
Author: Lukas Tönne
Date: Tue Jul 19 13:24:59 2016 +0200
Branches: strand_nodes
https://developer.blender.org/rB99c1b7b5f48a9834366944689db5c9652d0e18a1
Added new node tree type for hair nodes.
===================================================================
M release/scripts/nodes/__init__.py
A release/scripts/nodes/hair_nodes.py
M release/scripts/nodes/object_nodes.py
M source/blender/editors/space_node/node_draw.c
===================================================================
diff --git a/release/scripts/nodes/__init__.py b/release/scripts/nodes/__init__.py
index e65021b..22cc2c7 100644
--- a/release/scripts/nodes/__init__.py
+++ b/release/scripts/nodes/__init__.py
@@ -29,6 +29,7 @@ _modules = [
"group_nodes",
"forcefield_nodes",
"geometry_nodes",
+ "hair_nodes",
"rigidbody_nodes",
"smokesim_nodes",
"object_nodes",
diff --git a/release/scripts/nodes/hair_nodes.py b/release/scripts/nodes/hair_nodes.py
new file mode 100644
index 0000000..0d5b1fc
--- /dev/null
+++ b/release/scripts/nodes/hair_nodes.py
@@ -0,0 +1,149 @@
+# ##### 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 mathutils import *
+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 HairNodeCategory(NodeCategory):
+ @classmethod
+ def poll(cls, context):
+ tree = context.space_data.edit_tree
+ return tree and tree.bl_idname == 'HairNodeTree'
+
+###############################################################################
+
+class HairNodeTree(NodeTreeBase, NodeTree):
+ '''Hair nodes'''
+ bl_idname = 'HairNodeTree'
+ bl_label = 'Hair Nodes'
+ bl_icon = 'MESH_DATA'
+
+ # does not show up in the editor header
+ @classmethod
+ def poll(cls, context):
+ return False
+
+ def init_default(self):
+ pass
+
+
+class HairNodeBase(NodeBase):
+ @classmethod
+ def poll(cls, ntree):
+ return ntree.bl_idname == 'HairNodeTree'
+
+###############################################################################
+
+class HairNodesNew(Operator):
+ """Create new hair node tree"""
+ bl_idname = "object_nodes.hair_nodes_new"
+ bl_label = "New"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ name = StringProperty(
+ name="Name",
+ default="HairNodes",
+ )
+
+ @classmethod
+ def make_node_tree(cls, name="HairNodes"):
+ ntree = bpy.data.node_groups.new(name, HairNodeTree.bl_idname)
+ if ntree:
+ ntree.init_default()
+ return ntree
+
+ def execute(self, context):
+ node = getattr(context, "node", None)
+ ntree = self.make_node_tree(self.name)
+ if ntree is None:
+ return {'CANCELLED'}
+ if node:
+ node.id = ntree
+ return {'FINISHED'}
+
+###############################################################################
+
+def register():
+ bpy.utils.register_module(__name__)
+ gnode, ginput, goutput = group_nodes.make_node_group_types(
+ "Hair", HairNodeTree, HairNodeBase)
+
+ node_categories = [
+ HairNodeCategory("GEO_INPUT", "Input", items=[
+ NodeItem(ginput.bl_idname),
+ NodeItem("ObjectValueFloatNode"),
+ NodeItem("ObjectValueIntNode"),
+ NodeItem("ObjectValueVectorNode"),
+ NodeItem("ObjectValueColorNode"),
+ ]),
+ HairNodeCategory("GEO_OUTPUT", "Output", items=[
+ NodeItem(goutput.bl_idname),
+ ]),
+ HairNodeCategory("GEO_CONVERTER", "Converter", items=[
+ NodeItem("ObjectSeparateVectorNode"),
+ NodeItem("ObjectCombineVectorNode"),
+ ]),
+ HairNodeCategory("GEO_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"),
+ ]),
+ HairNodeCategory("GEO_TEXTURE", "Texture", items=[
+ NodeItem("ImageSampleNode"),
+ NodeItem("ObjectTextureCloudsNode"),
+ NodeItem("ObjectTextureDistNoiseNode"),
+ NodeItem("ObjectTextureGaborNoiseNode"),
+ NodeItem("ObjectTextureMagicNode"),
+ NodeItem("ObjectTextureMarbleNode"),
+ NodeItem("ObjectTextureMusgraveNode"),
+ NodeItem("ObjectTextureStucciNode"),
+ NodeItem("ObjectTextureVoronoiNode"),
+ NodeItem("ObjectTextureWoodNode"),
+ ]),
+ HairNodeCategory("GEO_CURVE", "Curve", items=[
+ NodeItem("CurvePathNode"),
+ ]),
+ group_nodes.GroupNodeCategory("HAIR", gnode, ginput, goutput),
+ ]
+ nodeitems_utils.register_node_categories("HAIR_NODES", node_categories)
+
+def unregister():
+ nodeitems_utils.unregister_node_categories("HAIR_NODES")
+
+ bpy.utils.unregister_module(__name__)
diff --git a/release/scripts/nodes/object_nodes.py b/release/scripts/nodes/object_nodes.py
index 16c7cb1..c100223 100644
--- a/release/scripts/nodes/object_nodes.py
+++ b/release/scripts/nodes/object_nodes.py
@@ -27,6 +27,7 @@ from mathutils import *
from common_nodes import NodeTreeBase, NodeBase
from geometry_nodes import GeometryNodesNew
+from hair_nodes import HairNodesNew
from instancing_nodes import InstancingNodesNew
from forcefield_nodes import ForceFieldNodesNew
from smokesim_nodes import SmokeSimNodesNew
@@ -96,6 +97,37 @@ class GeometryNode(ObjectNodeBase, ObjectNode):
pass
+class HairNode(ObjectNodeBase, ObjectNode):
+ '''Hair'''
+ bl_idname = 'HairNode'
+ bl_label = 'Hair'
+ bl_icon = 'MESH_DATA'
+
+ bl_id_property_type = 'NODETREE'
+ def bl_id_property_poll(self, ntree):
+ return ntree.bl_idname == 'HairNodeTree'
+
+ def compile_dependencies(self, depsnode):
+ ntree = self.id
+ if ntree:
+ ntree.bvm_compile_dependencies(depsnode)
+
+ def eval_dependencies(self, depsnode):
+ ntree = self.id
+ if ntree:
+ ntree.bvm_eval_dependencies(depsnode)
+
+ def draw_buttons(self, context, layout):
+ layout.context_pointer_set("node", self)
+ layout.template_ID(self, "id", new=HairNodesNew.bl_idname)
+
+ def init(self, context):
+ pass
+
+ def compile(self, compiler):
+ pass
+
+
class InstancingNode(ObjectNodeBase, ObjectNode):
'''Instancing'''
bl_idname = 'InstancingNode'
@@ -272,6 +304,8 @@ def register():
ObjectNodeCategory("COMPONENTS", "Components", items=[
NodeItem("GeometryNode",
settings={"id": "bpy.types.OBJECT_NODES_OT_geometry_nodes_new.make_node_tree()"}),
+ NodeItem("HairNode",
+ settings={"id": "bpy.types.OBJECT_NODES_OT_hair_nodes_new.make_node_tree()"}),
NodeItem("ForceFieldNode",
settings={"id": "bpy.types.OBJECT_NODES_OT_forcefield_nodes_new.make_node_tree()"}),
NodeItem("InstancingNode",
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 95ba89b..748ff95 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -154,7 +154,8 @@ void ED_node_tag_update_id(ID *id)
* but for now this is the only real option.
*/
else if (STREQ(ntree->idname, "GeometryNodeTree") ||
- STREQ(ntree->idname, "InstancingNodeTree")) {
+ STREQ(ntree->idname, "InstancingNodeTree") ||
+ STREQ(ntree->idname, "HairNodeTree")) {
WM_main_add_notifier(NC_MATERIAL | ND_NODES, NULL);
}
else if (STREQ(ntree->idname, "TextureNodeTree")) {
More information about the Bf-blender-cvs
mailing list