diff options
author | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-09-12 18:42:13 +0300 |
---|---|---|
committer | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-09-12 18:42:13 +0300 |
commit | 2ea82e86ca60c1c268c6074ecba10524cebd97ed (patch) | |
tree | bf355c2a930f584685f68a833ce620ad15e63a70 /source/blender | |
parent | f80018b5f7497d7ed0fe79783c4cd76f05ec1c7c (diff) |
Shading: Add Vertex Color node.
This patch adds a new Vertex Color node. The node also returns the alpha
of the vertex color layer as an output.
Reviewers: brecht
Differential Revision: https://developer.blender.org/D5767
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 15 | ||||
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 11 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material_library.h | 7 | ||||
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_vertex_color.glsl | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_node_types.h | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_nodetree.c | 13 | ||||
-rw-r--r-- | source/blender/nodes/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/nodes/NOD_shader.h | 1 | ||||
-rw-r--r-- | source/blender/nodes/NOD_static_types.h | 1 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_vertex_color.c | 58 |
13 files changed, 118 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 98710394079..f88aebd312c 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -978,6 +978,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, #define SH_NODE_CLAMP 703 #define SH_NODE_TEX_WHITE_NOISE 704 #define SH_NODE_VOLUME_INFO 705 +#define SH_NODE_VERTEX_COLOR 706 /* custom defines options for Material node */ #define SH_NODE_MAT_DIFF 1 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index c5e16b2d3cd..6e45130ce44 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3914,6 +3914,7 @@ static void registerShaderNodes(void) register_node_type_sh_tex_coord(); register_node_type_sh_particle_info(); register_node_type_sh_bump(); + register_node_type_sh_vertex_color(); register_node_type_sh_background(); register_node_type_sh_bsdf_anisotropic(); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 6055a503b7b..8a4cbb3c71a 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -998,6 +998,18 @@ static void node_shader_buts_uvmap(uiLayout *layout, bContext *C, PointerRNA *pt } } +static void node_shader_buts_vertex_color(uiLayout *layout, bContext *C, PointerRNA *ptr) +{ + PointerRNA obptr = CTX_data_pointer_get(C, "active_object"); + if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) { + PointerRNA dataptr = RNA_pointer_get(&obptr, "data"); + uiItemPointerR(layout, ptr, "layer_name", &dataptr, "vertex_colors", "", ICON_GROUP_VCOL); + } + else { + uiItemL(layout, "No mesh in active object.", ICON_ERROR); + } +} + static void node_shader_buts_uvalongstroke(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiItemR(layout, ptr, "use_tips", 0, NULL, 0); @@ -1299,6 +1311,9 @@ static void node_shader_set_butfunc(bNodeType *ntype) case SH_NODE_UVMAP: ntype->draw_buttons = node_shader_buts_uvmap; break; + case SH_NODE_VERTEX_COLOR: + ntype->draw_buttons = node_shader_buts_vertex_color; + break; case SH_NODE_UVALONGSTROKE: ntype->draw_buttons = node_shader_buts_uvalongstroke; break; diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index aea96dac2e3..8d2355ff5ac 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -313,6 +313,7 @@ data_to_c_simple(shaders/material/gpu_shader_material_vector_curves.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_vector_displacement.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_vector_math.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_velvet.glsl SRC) +data_to_c_simple(shaders/material/gpu_shader_material_vertex_color.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_volume_absorption.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_volume_info.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_volume_principled.glsl SRC) diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 8b68bcd5889..242b0ed2e31 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -1080,6 +1080,15 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u "\treturn mix(c1, c2, step(vec3(0.04045), c));\n" "}\n\n"); + BLI_dynstr_append(ds, + "vec4 srgba_to_linear_attr(vec4 c) {\n" + "\tc = max(c, vec4(0.0));\n" + "\tvec4 c1 = c * (1.0 / 12.92);\n" + "\tvec4 c2 = pow((c + 0.055) * (1.0 / 1.055), vec4(2.4));\n" + "\tvec4 final = mix(c1, c2, step(vec4(0.04045), c));" + "\treturn vec4(final.xyz, c.a);\n" + "}\n\n"); + /* Prototype because defined later. */ BLI_dynstr_append(ds, "vec2 hair_get_customdata_vec2(const samplerBuffer);\n" @@ -1184,7 +1193,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u } else if (input->attr_type == CD_MCOL) { BLI_dynstr_appendf(ds, - "\tvar%d%s = srgb_to_linear_attr(att%d);\n", + "\tvar%d%s = srgba_to_linear_attr(att%d);\n", input->attr_id, use_geom ? "g" : "", input->attr_id); diff --git a/source/blender/gpu/intern/gpu_material_library.h b/source/blender/gpu/intern/gpu_material_library.h index 06544d27af9..3a38eb5c600 100644 --- a/source/blender/gpu/intern/gpu_material_library.h +++ b/source/blender/gpu/intern/gpu_material_library.h @@ -114,6 +114,7 @@ extern char datatoc_gpu_shader_material_vector_curves_glsl[]; extern char datatoc_gpu_shader_material_vector_displacement_glsl[]; extern char datatoc_gpu_shader_material_vector_math_glsl[]; extern char datatoc_gpu_shader_material_velvet_glsl[]; +extern char datatoc_gpu_shader_material_vertex_color_glsl[]; extern char datatoc_gpu_shader_material_volume_absorption_glsl[]; extern char datatoc_gpu_shader_material_volume_info_glsl[]; extern char datatoc_gpu_shader_material_volume_principled_glsl[]; @@ -527,6 +528,11 @@ static GPUMaterialLibrary gpu_shader_material_velvet_library = { .dependencies = {&gpu_shader_material_diffuse_library, NULL}, }; +static GPUMaterialLibrary gpu_shader_material_vertex_color_library = { + .code = datatoc_gpu_shader_material_vertex_color_glsl, + .dependencies = {NULL}, +}; + static GPUMaterialLibrary gpu_shader_material_volume_absorption_library = { .code = datatoc_gpu_shader_material_volume_absorption_glsl, .dependencies = {NULL}, @@ -638,6 +644,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = { &gpu_shader_material_vector_displacement_library, &gpu_shader_material_vector_math_library, &gpu_shader_material_velvet_library, + &gpu_shader_material_vertex_color_library, &gpu_shader_material_volume_absorption_library, &gpu_shader_material_volume_info_library, &gpu_shader_material_volume_principled_library, diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vertex_color.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vertex_color.glsl new file mode 100644 index 00000000000..551b838daf8 --- /dev/null +++ b/source/blender/gpu/shaders/material/gpu_shader_material_vertex_color.glsl @@ -0,0 +1,5 @@ +void node_vertex_color(vec4 vertexColor, out vec4 outColor, out float outAlpha) +{ + outColor = vertexColor; + outAlpha = vertexColor.a; +} diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 6b46c5887b4..0287a1510fe 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -997,6 +997,10 @@ typedef struct NodeShaderUVMap { char uv_map[64]; } NodeShaderUVMap; +typedef struct NodeShaderVertexColor { + char layer_name[64]; +} NodeShaderVertexColor; + typedef struct NodeShaderTexIES { int mode; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 3d90d566315..913324e4997 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4867,6 +4867,19 @@ static void def_sh_uvmap(StructRNA *srna) RNA_def_struct_sdna_from(srna, "bNode", NULL); } +static void def_sh_vertex_color(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeShaderVertexColor", "storage"); + + prop = RNA_def_property(srna, "layer_name", PROP_STRING, PROP_NONE); + RNA_def_property_ui_text(prop, "Vertex Color", "Vertex Color"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); + + RNA_def_struct_sdna_from(srna, "bNode", NULL); +} + static void def_sh_uvalongstroke(StructRNA *srna) { PropertyRNA *prop; diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index ea2968f4917..57a4ace997c 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -206,6 +206,7 @@ set(SRC shader/nodes/node_shader_valToRgb.c shader/nodes/node_shader_value.c shader/nodes/node_shader_vectTransform.c + shader/nodes/node_shader_vertex_color.c shader/nodes/node_shader_vector_displacement.c shader/nodes/node_shader_vector_math.c shader/nodes/node_shader_volume_absorption.c diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h index 30673e7cd31..a004090d03d 100644 --- a/source/blender/nodes/NOD_shader.h +++ b/source/blender/nodes/NOD_shader.h @@ -86,6 +86,7 @@ void register_node_type_sh_script(void); void register_node_type_sh_normal_map(void); void register_node_type_sh_tangent(void); void register_node_type_sh_vect_transform(void); +void register_node_type_sh_vertex_color(void); void register_node_type_sh_ambient_occlusion(void); void register_node_type_sh_background(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index d14511504f0..f3bc5a0cafa 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -121,6 +121,7 @@ DefNode(ShaderNode, SH_NODE_VECT_TRANSFORM, def_sh_vect_transform, "VEC DefNode(ShaderNode, SH_NODE_SEPHSV, 0, "SEPHSV", SeparateHSV, "Separate HSV", "" ) DefNode(ShaderNode, SH_NODE_COMBHSV, 0, "COMBHSV", CombineHSV, "Combine HSV", "" ) DefNode(ShaderNode, SH_NODE_UVMAP, def_sh_uvmap, "UVMAP", UVMap, "UV Map", "" ) +DefNode(ShaderNode, SH_NODE_VERTEX_COLOR, def_sh_vertex_color, "VERTEX_COLOR", VertexColor, "Vertex Color", "" ) DefNode(ShaderNode, SH_NODE_UVALONGSTROKE, def_sh_uvalongstroke, "UVALONGSTROKE", UVAlongStroke, "UV Along Stroke", "" ) DefNode(ShaderNode, SH_NODE_SEPXYZ, 0, "SEPXYZ", SeparateXYZ, "Separate XYZ", "" ) DefNode(ShaderNode, SH_NODE_COMBXYZ, 0, "COMBXYZ", CombineXYZ, "Combine XYZ", "" ) diff --git a/source/blender/nodes/shader/nodes/node_shader_vertex_color.c b/source/blender/nodes/shader/nodes/node_shader_vertex_color.c new file mode 100644 index 00000000000..8848fc37c66 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_vertex_color.c @@ -0,0 +1,58 @@ +/* + * 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. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + */ + +#include "../node_shader_util.h" + +static bNodeSocketTemplate sh_node_vertex_color_out[] = { + {SOCK_RGBA, 0, N_("Color")}, + {SOCK_FLOAT, 0, N_("Alpha")}, + {-1, 0, ""}, +}; + +static void node_shader_init_vertex_color(bNodeTree *UNUSED(ntree), bNode *node) +{ + NodeShaderVertexColor *vertexColor = MEM_callocN(sizeof(NodeShaderVertexColor), + "NodeShaderVertexColor"); + node->storage = vertexColor; +} + +static int node_shader_gpu_vertex_color(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + GPUNodeStack *in, + GPUNodeStack *out) +{ + NodeShaderVertexColor *vertexColor = (NodeShaderVertexColor *)node->storage; + GPUNodeLink *vertexColorLink = GPU_attribute(CD_MCOL, vertexColor->layer_name); + return GPU_stack_link(mat, node, "node_vertex_color", in, out, vertexColorLink); +} + +void register_node_type_sh_vertex_color(void) +{ + static bNodeType ntype; + + sh_node_type_base(&ntype, SH_NODE_VERTEX_COLOR, "Vertex Color", NODE_CLASS_INPUT, 0); + node_type_socket_templates(&ntype, NULL, sh_node_vertex_color_out); + node_type_init(&ntype, node_shader_init_vertex_color); + node_type_storage( + &ntype, "NodeShaderVertexColor", node_free_standard_storage, node_copy_standard_storage); + node_type_gpu(&ntype, node_shader_gpu_vertex_color); + + nodeRegisterType(&ntype); +} |