[Bf-blender-cvs] [878c339] strand_nodes: First steps for the GLSL code generator and hair displacement nodes.

Lukas Tönne noreply at git.blender.org
Thu Jul 21 17:41:11 CEST 2016


Commit: 878c339cdeaaec6f55734d2ae497f1bdd29cb56f
Author: Lukas Tönne
Date:   Thu Jul 21 15:33:01 2016 +0200
Branches: strand_nodes
https://developer.blender.org/rB878c339cdeaaec6f55734d2ae497f1bdd29cb56f

First steps for the GLSL code generator and hair displacement nodes.

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

M	release/scripts/nodes/hair_nodes.py
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/blenkernel/intern/texture.c
M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/glsl/CMakeLists.txt
M	source/blender/blenvm/glsl/glsl_codegen.cc
M	source/blender/blenvm/glsl/glsl_codegen.h
A	source/blender/blenvm/glsl/glsl_types.cc
A	source/blender/blenvm/glsl/glsl_types.h
A	source/blender/blenvm/glsl/glsl_value.h
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/blenvm/util/util_string.h
M	source/blender/gpu/intern/gpu_strands_shader.c
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/render/intern/source/render_texture.c

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

diff --git a/release/scripts/nodes/hair_nodes.py b/release/scripts/nodes/hair_nodes.py
index 0d5b1fc..83fd4e1 100644
--- a/release/scripts/nodes/hair_nodes.py
+++ b/release/scripts/nodes/hair_nodes.py
@@ -91,6 +91,34 @@ class HairNodesNew(Operator):
 
 ###############################################################################
 
+class HairInputNode(HairNodeBase, ObjectNode):
+    '''Hair inputs'''
+    bl_idname = 'HairInputNode'
+    bl_label = 'Hair'
+
+    def init(self, context):
+        self.outputs.new('NodeSocketVector', "Location")
+        self.outputs.new('NodeSocketFloat', "Parameter")
+        self.outputs.new('TransformSocket', "Target")
+
+    def compile(self, compiler):
+        compiler.map_output(0, compiler.graph_input("location"))
+        compiler.map_output(1, compiler.graph_input("parameter"))
+        compiler.map_output(2, compiler.graph_input("target"))
+
+class HairDeformNode(HairNodeBase, ObjectNode):
+    '''Hair displacement result'''
+    bl_idname = 'HairDeformNode'
+    bl_label = 'Hair Displacement'
+
+    def init(self, context):
+        self.inputs.new('NodeSocketVector', "Target")
+
+    def compile(self, compiler):
+        compiler.map_input(0, compiler.graph_output("offset"))
+
+###############################################################################
+
 def register():
     bpy.utils.register_module(__name__)
     gnode, ginput, goutput = group_nodes.make_node_group_types(
@@ -98,6 +126,7 @@ def register():
 
     node_categories = [
         HairNodeCategory("GEO_INPUT", "Input", items=[
+            NodeItem("HairInputNode"),
             NodeItem(ginput.bl_idname),
             NodeItem("ObjectValueFloatNode"),
             NodeItem("ObjectValueIntNode"),
@@ -105,6 +134,7 @@ def register():
             NodeItem("ObjectValueColorNode"),
             ]),
         HairNodeCategory("GEO_OUTPUT", "Output", items=[
+            NodeItem("HairDeformNode"),
             NodeItem(goutput.bl_idname),
             ]),
         HairNodeCategory("GEO_CONVERTER", "Converter", items=[
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 70ce07a..c18f466 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1728,7 +1728,7 @@ static DerivedMesh *mesh_calc_modifier_nodes(Scene *UNUSED(scene), Object *ob, b
 	Mesh *me = ob->data;
 	DerivedMesh *dm, *result;
 	
-	struct BVMFunction *fn = BVM_gen_modifier_function_llvm(ntree, true);
+	struct BVMFunction *fn = BVM_gen_modifier_function_llvm(ntree, NULL, true);
 	if (fn) {
 		struct BVMEvalGlobals *globals = BVM_globals_create();
 		BVM_globals_add_nodetree_relations(globals, ntree);
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 7bebf22..fdfac58 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -212,7 +212,7 @@ static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene,
 					BVM_globals_add_nodetree_relations(effctx->eval_globals, ff_ntree);
 					
 					EffectorCache *eff = new_effector_cache(effctx, scene, ob, NULL, ob->pd);
-					eff->function = BVM_gen_forcefield_function_bvm(ff_ntree, true);
+					eff->function = BVM_gen_forcefield_function_bvm(ff_ntree, NULL, true);
 				}
 				
 				break;
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index cd457c7..c2c6e99 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -1153,7 +1153,7 @@ const DupliGenerator gen_dupli_particles = {
 
 static void make_duplis_nodetree(struct bNodeTree *ntree, const DupliContext *dupctx)
 {
-	struct BVMFunction *fn = BVM_gen_dupli_function_bvm(ntree, true);
+	struct BVMFunction *fn = BVM_gen_dupli_function_bvm(ntree, NULL, true);
 	
 	if (fn) {
 		struct BVMEvalGlobals *globals = BVM_globals_create();
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 684ed7d..974f7f4 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -1543,7 +1543,7 @@ void BKE_texture_get_value_ex(
 	}
 
 	if (texture->use_nodes && texture->nodetree) {
-		struct BVMFunction *fn = BVM_gen_texture_function_llvm(texture->nodetree, true);
+		struct BVMFunction *fn = BVM_gen_texture_function_llvm(texture->nodetree, NULL, true);
 		if (fn) {
 			struct BVMEvalContext *context = BVM_context_create();
 			
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index d9cb19a..53bf633 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -139,7 +139,7 @@ void BVM_function_llvm_cache_remove(void *key);
 struct Object;
 struct EffectedPoint;
 
-struct BVMFunction *BVM_gen_forcefield_function_bvm(struct bNodeTree *btree, bool use_cache);
+struct BVMFunction *BVM_gen_forcefield_function_bvm(struct bNodeTree *btree, const char *name, bool use_cache);
 void BVM_debug_forcefield_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 void BVM_eval_forcefield_bvm(struct BVMEvalGlobals *globals, struct BVMEvalContext *context, struct BVMFunction *fn,
@@ -150,8 +150,8 @@ void BVM_eval_forcefield_bvm(struct BVMEvalGlobals *globals, struct BVMEvalConte
 struct Tex;
 struct TexResult;
 
-struct BVMFunction *BVM_gen_texture_function_bvm(struct bNodeTree *btree, bool use_cache);
-struct BVMFunction *BVM_gen_texture_function_llvm(struct bNodeTree *btree, bool use_cache);
+struct BVMFunction *BVM_gen_texture_function_bvm(struct bNodeTree *btree, const char *name, bool use_cache);
+struct BVMFunction *BVM_gen_texture_function_llvm(struct bNodeTree *btree, const char *name, bool use_cache);
 
 void BVM_debug_texture_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
@@ -173,8 +173,8 @@ void BVM_eval_texture_llvm(struct BVMEvalGlobals *globals, struct BVMEvalContext
 struct DerivedMesh;
 struct Mesh;
 
-struct BVMFunction *BVM_gen_modifier_function_bvm(struct bNodeTree *btree, bool use_cache);
-struct BVMFunction *BVM_gen_modifier_function_llvm(struct bNodeTree *btree, bool use_cache);
+struct BVMFunction *BVM_gen_modifier_function_bvm(struct bNodeTree *btree, const char *name, bool use_cache);
+struct BVMFunction *BVM_gen_modifier_function_llvm(struct bNodeTree *btree, const char *name, bool use_cache);
 void BVM_debug_modifier_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 struct DerivedMesh *BVM_eval_modifier_bvm(struct BVMEvalGlobals *globals,
@@ -192,7 +192,7 @@ struct DerivedMesh *BVM_eval_modifier_llvm(struct BVMEvalGlobals *globals,
 
 struct DupliContainer;
 
-struct BVMFunction *BVM_gen_dupli_function_bvm(struct bNodeTree *btree, bool use_cache);
+struct BVMFunction *BVM_gen_dupli_function_bvm(struct bNodeTree *btree, const char *name, bool use_cache);
 void BVM_debug_dupli_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 void BVM_eval_dupli_bvm(struct BVMEvalGlobals *globals,
@@ -203,7 +203,7 @@ void BVM_eval_dupli_bvm(struct BVMEvalGlobals *globals,
 
 /* ------------------------------------------------------------------------- */
 
-char *BVM_gen_hair_deform_function_glsl(struct bNodeTree *btree);
+char *BVM_gen_hair_deform_function_glsl(struct bNodeTree *btree, const char *name);
 void BVM_debug_hair_deform_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 #ifdef __cplusplus
diff --git a/source/blender/blenvm/glsl/CMakeLists.txt b/source/blender/blenvm/glsl/CMakeLists.txt
index 8e684e8..610bc74 100644
--- a/source/blender/blenvm/glsl/CMakeLists.txt
+++ b/source/blender/blenvm/glsl/CMakeLists.txt
@@ -43,6 +43,9 @@ set(INC_SYS
 set(SRC
 	glsl_codegen.cc
 	glsl_codegen.h
+	glsl_types.cc
+	glsl_types.h
+	glsl_value.h
 )
 
 blender_add_lib(bf_blenvm_glsl "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/blenvm/glsl/glsl_codegen.cc b/source/blender/blenvm/glsl/glsl_codegen.cc
index 2197f70..9095c4f 100644
--- a/source/blender/blenvm/glsl/glsl_codegen.cc
+++ b/source/blender/blenvm/glsl/glsl_codegen.cc
@@ -39,6 +39,7 @@ extern "C" {
 #include "node_graph.h"
 
 #include "glsl_codegen.h"
+#include "glsl_types.h"
 
 namespace blenvm {
 
@@ -66,15 +67,19 @@ ValueHandle GLSLCodeGenerator::get_handle(const GLSLValue *value)
 	return (ValueHandle)value;
 }
 
-GLSLValue *GLSLCodeGenerator::create_value(const TypeSpec *typespec, const string &name, bool make_unique)
+GLSLValue *GLSLCodeGenerator::get_value(ValueHandle handle)
 {
-	string varname = name;
-	if (make_unique) {
-		stringstream ss;
-		ss << varname << "_" << (m_values.size() + 1);
-	}
+	return (GLSLValue *)handle;
+}
+
+GLSLValue *GLSLCodeGenerator::create_value(const TypeSpec *UNUSED(typespec), const string &name, bool make_unique)
+{
+	stringstream varname;
+	varname << name;
+	if (make_unique)
+		varname << "_" << (m_values.size() + 1);
 	
-	m_values.push_back(GLSLValue(varname));
+	m_values.push_back(GLSLValue(varname.str()));
 	GLSLValue *value = &m_values.back();
 	
 	return value;
@@ -90,25 +95,68 @@ void GLSLCodeGenerator::debug_function(FILE *file)
 	fwrite(s.c_str(), sizeof(char), s.size(), file);
 }
 
-void GLSLCodeGenerator::node_graph_begin(const string &UNUSED(name), const NodeGraph *graph, bool UNUSED(use_globals))
+void GLSLCodeGenerator::node_graph_begin(const string &name, const NodeGraph *graph, bool UNUSED(use_globals))
 {
+	m_code << "void " << name;
+	
+	m_code << "(";
 	/* storage for function arguments */
 	size_t num_inputs = graph->inputs.size();
 	for (int i = 0; i < num_inputs; ++i) {
 		const NodeGraph::Input *input = graph->get_input(i);
 		const TypeSpec *typespec = input->typedesc.get_typespec();
+		
 		/* Note: argument names are unique! */
 		GLSLValue *value = create_value(typespec, input->name, false);
 		m_input_args.push_back(value);
+		
+		if (i > 0)
+			m_code << ", ";
+		m_code << "in " << bvm_glsl_get_type(typespec, true)<< " " << value->name();
 	}
+	
+	size_t num_outputs = graph->ou

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list