[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