forked from bartvdbraak/blender
Shading: Add Volume Info node.
The Volume Info node provides the Color, Desnity, Flame, and Temperature of smoke domains. Reviewers: brecht Differential Revision: https://developer.blender.org/D5551
This commit is contained in:
parent
133dfdd704
commit
e83f092201
@ -607,6 +607,9 @@ static ShaderNode *add_node(Scene *scene,
|
|||||||
else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
|
else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
|
||||||
node = new HairInfoNode();
|
node = new HairInfoNode();
|
||||||
}
|
}
|
||||||
|
else if (b_node.is_a(&RNA_ShaderNodeVolumeInfo)) {
|
||||||
|
node = new VolumeInfoNode();
|
||||||
|
}
|
||||||
else if (b_node.is_a(&RNA_ShaderNodeBump)) {
|
else if (b_node.is_a(&RNA_ShaderNodeBump)) {
|
||||||
BL::ShaderNodeBump b_bump_node(b_node);
|
BL::ShaderNodeBump b_bump_node(b_node);
|
||||||
BumpNode *bump = new BumpNode();
|
BumpNode *bump = new BumpNode();
|
||||||
|
@ -4168,6 +4168,90 @@ void HairInfoNode::compile(OSLCompiler &compiler)
|
|||||||
compiler.add(this, "node_hair_info");
|
compiler.add(this, "node_hair_info");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Volume Info */
|
||||||
|
|
||||||
|
NODE_DEFINE(VolumeInfoNode)
|
||||||
|
{
|
||||||
|
NodeType *type = NodeType::add("volume_info", create, NodeType::SHADER);
|
||||||
|
|
||||||
|
SOCKET_OUT_COLOR(color, "Color");
|
||||||
|
SOCKET_OUT_FLOAT(density, "Density");
|
||||||
|
SOCKET_OUT_FLOAT(flame, "Flame");
|
||||||
|
SOCKET_OUT_FLOAT(temperature, "Temperature");
|
||||||
|
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
VolumeInfoNode::VolumeInfoNode() : ShaderNode(node_type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The requested attributes are not updated after node expansion.
|
||||||
|
* So we explicitly request the required attributes.
|
||||||
|
*/
|
||||||
|
void VolumeInfoNode::attributes(Shader *shader, AttributeRequestSet *attributes)
|
||||||
|
{
|
||||||
|
if (shader->has_volume) {
|
||||||
|
if (!output("Color")->links.empty()) {
|
||||||
|
attributes->add(ATTR_STD_VOLUME_COLOR);
|
||||||
|
}
|
||||||
|
if (!output("Density")->links.empty()) {
|
||||||
|
attributes->add(ATTR_STD_VOLUME_DENSITY);
|
||||||
|
}
|
||||||
|
if (!output("Flame")->links.empty()) {
|
||||||
|
attributes->add(ATTR_STD_VOLUME_FLAME);
|
||||||
|
}
|
||||||
|
if (!output("Temperature")->links.empty()) {
|
||||||
|
attributes->add(ATTR_STD_VOLUME_TEMPERATURE);
|
||||||
|
}
|
||||||
|
attributes->add(ATTR_STD_GENERATED_TRANSFORM);
|
||||||
|
}
|
||||||
|
ShaderNode::attributes(shader, attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VolumeInfoNode::expand(ShaderGraph *graph)
|
||||||
|
{
|
||||||
|
ShaderOutput *color_out = output("Color");
|
||||||
|
if (!color_out->links.empty()) {
|
||||||
|
AttributeNode *attr = new AttributeNode();
|
||||||
|
attr->attribute = "color";
|
||||||
|
graph->add(attr);
|
||||||
|
graph->relink(color_out, attr->output("Color"));
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderOutput *density_out = output("Density");
|
||||||
|
if (!density_out->links.empty()) {
|
||||||
|
AttributeNode *attr = new AttributeNode();
|
||||||
|
attr->attribute = "density";
|
||||||
|
graph->add(attr);
|
||||||
|
graph->relink(density_out, attr->output("Fac"));
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderOutput *flame_out = output("Flame");
|
||||||
|
if (!flame_out->links.empty()) {
|
||||||
|
AttributeNode *attr = new AttributeNode();
|
||||||
|
attr->attribute = "flame";
|
||||||
|
graph->add(attr);
|
||||||
|
graph->relink(flame_out, attr->output("Fac"));
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderOutput *temperature_out = output("Temperature");
|
||||||
|
if (!temperature_out->links.empty()) {
|
||||||
|
AttributeNode *attr = new AttributeNode();
|
||||||
|
attr->attribute = "temperature";
|
||||||
|
graph->add(attr);
|
||||||
|
graph->relink(temperature_out, attr->output("Fac"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VolumeInfoNode::compile(SVMCompiler &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void VolumeInfoNode::compile(OSLCompiler &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/* Value */
|
/* Value */
|
||||||
|
|
||||||
NODE_DEFINE(ValueNode)
|
NODE_DEFINE(ValueNode)
|
||||||
|
@ -961,6 +961,21 @@ class HairInfoNode : public ShaderNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class VolumeInfoNode : public ShaderNode {
|
||||||
|
public:
|
||||||
|
SHADER_NODE_CLASS(VolumeInfoNode)
|
||||||
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
||||||
|
bool has_attribute_dependency()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool has_spatial_varying()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void expand(ShaderGraph *graph);
|
||||||
|
};
|
||||||
|
|
||||||
class ValueNode : public ShaderNode {
|
class ValueNode : public ShaderNode {
|
||||||
public:
|
public:
|
||||||
SHADER_NODE_CLASS(ValueNode)
|
SHADER_NODE_CLASS(ValueNode)
|
||||||
|
@ -186,6 +186,7 @@ shader_node_categories = [
|
|||||||
NodeItem("ShaderNodeAmbientOcclusion"),
|
NodeItem("ShaderNodeAmbientOcclusion"),
|
||||||
NodeItem("ShaderNodeObjectInfo"),
|
NodeItem("ShaderNodeObjectInfo"),
|
||||||
NodeItem("ShaderNodeHairInfo"),
|
NodeItem("ShaderNodeHairInfo"),
|
||||||
|
NodeItem("ShaderNodeVolumeInfo"),
|
||||||
NodeItem("ShaderNodeParticleInfo"),
|
NodeItem("ShaderNodeParticleInfo"),
|
||||||
NodeItem("ShaderNodeCameraData"),
|
NodeItem("ShaderNodeCameraData"),
|
||||||
NodeItem("ShaderNodeUVMap"),
|
NodeItem("ShaderNodeUVMap"),
|
||||||
|
@ -979,6 +979,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
|
|||||||
#define SH_NODE_MAP_RANGE 702
|
#define SH_NODE_MAP_RANGE 702
|
||||||
#define SH_NODE_CLAMP 703
|
#define SH_NODE_CLAMP 703
|
||||||
#define SH_NODE_TEX_WHITE_NOISE 704
|
#define SH_NODE_TEX_WHITE_NOISE 704
|
||||||
|
#define SH_NODE_VOLUME_INFO 705
|
||||||
|
|
||||||
/* custom defines options for Material node */
|
/* custom defines options for Material node */
|
||||||
#define SH_NODE_MAT_DIFF 1
|
#define SH_NODE_MAT_DIFF 1
|
||||||
|
@ -3960,6 +3960,7 @@ static void registerTextureNodes(void)
|
|||||||
register_node_type_sh_tangent();
|
register_node_type_sh_tangent();
|
||||||
register_node_type_sh_normal_map();
|
register_node_type_sh_normal_map();
|
||||||
register_node_type_sh_hair_info();
|
register_node_type_sh_hair_info();
|
||||||
|
register_node_type_sh_volume_info();
|
||||||
|
|
||||||
register_node_type_tex_checker();
|
register_node_type_tex_checker();
|
||||||
register_node_type_tex_texture();
|
register_node_type_tex_texture();
|
||||||
|
@ -2322,6 +2322,35 @@ void node_attribute_volume_temperature(
|
|||||||
outcol = vec4(outf, outf, outf, 1.0);
|
outcol = vec4(outf, outf, outf, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void node_volume_info(sampler3D densitySampler,
|
||||||
|
sampler3D flameSampler,
|
||||||
|
vec2 temperature,
|
||||||
|
out vec4 outColor,
|
||||||
|
out float outDensity,
|
||||||
|
out float outFlame,
|
||||||
|
out float outTemprature)
|
||||||
|
{
|
||||||
|
#if defined(MESH_SHADER) && defined(VOLUMETRICS)
|
||||||
|
vec3 p = volumeObjectLocalCoord;
|
||||||
|
#else
|
||||||
|
vec3 p = vec3(0.0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec4 density = texture(densitySampler, p);
|
||||||
|
outDensity = density.a;
|
||||||
|
|
||||||
|
/* Density is premultiplied for interpolation, divide it out here. */
|
||||||
|
if (density.a > 1e-8) {
|
||||||
|
density.rgb /= density.a;
|
||||||
|
}
|
||||||
|
outColor = vec4(density.rgb * volumeColor, 1.0);
|
||||||
|
|
||||||
|
float flame = texture(flameSampler, p).r;
|
||||||
|
outFlame = flame;
|
||||||
|
|
||||||
|
outTemprature = (flame > 0.01) ? temperature.x + flame * (temperature.y - temperature.x) : 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
void node_attribute(vec3 attr, out vec4 outcol, out vec3 outvec, out float outf)
|
void node_attribute(vec3 attr, out vec4 outcol, out vec3 outvec, out float outf)
|
||||||
{
|
{
|
||||||
outcol = vec4(attr, 1.0);
|
outcol = vec4(attr, 1.0);
|
||||||
|
@ -209,6 +209,7 @@ set(SRC
|
|||||||
shader/nodes/node_shader_vectTransform.c
|
shader/nodes/node_shader_vectTransform.c
|
||||||
shader/nodes/node_shader_vector_displacement.c
|
shader/nodes/node_shader_vector_displacement.c
|
||||||
shader/nodes/node_shader_volume_absorption.c
|
shader/nodes/node_shader_volume_absorption.c
|
||||||
|
shader/nodes/node_shader_volume_info.c
|
||||||
shader/nodes/node_shader_volume_principled.c
|
shader/nodes/node_shader_volume_principled.c
|
||||||
shader/nodes/node_shader_volume_scatter.c
|
shader/nodes/node_shader_volume_scatter.c
|
||||||
shader/nodes/node_shader_wavelength.c
|
shader/nodes/node_shader_wavelength.c
|
||||||
|
@ -81,6 +81,7 @@ void register_node_type_sh_layer_weight(void);
|
|||||||
void register_node_type_sh_tex_coord(void);
|
void register_node_type_sh_tex_coord(void);
|
||||||
void register_node_type_sh_particle_info(void);
|
void register_node_type_sh_particle_info(void);
|
||||||
void register_node_type_sh_hair_info(void);
|
void register_node_type_sh_hair_info(void);
|
||||||
|
void register_node_type_sh_volume_info(void);
|
||||||
void register_node_type_sh_script(void);
|
void register_node_type_sh_script(void);
|
||||||
void register_node_type_sh_normal_map(void);
|
void register_node_type_sh_normal_map(void);
|
||||||
void register_node_type_sh_tangent(void);
|
void register_node_type_sh_tangent(void);
|
||||||
|
@ -96,6 +96,7 @@ DefNode(ShaderNode, SH_NODE_LIGHT_FALLOFF, 0, "LIG
|
|||||||
DefNode(ShaderNode, SH_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "" )
|
DefNode(ShaderNode, SH_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "" )
|
||||||
DefNode(ShaderNode, SH_NODE_PARTICLE_INFO, 0, "PARTICLE_INFO", ParticleInfo, "Particle Info", "" )
|
DefNode(ShaderNode, SH_NODE_PARTICLE_INFO, 0, "PARTICLE_INFO", ParticleInfo, "Particle Info", "" )
|
||||||
DefNode(ShaderNode, SH_NODE_HAIR_INFO, 0, "HAIR_INFO", HairInfo, "Hair Info", "" )
|
DefNode(ShaderNode, SH_NODE_HAIR_INFO, 0, "HAIR_INFO", HairInfo, "Hair Info", "" )
|
||||||
|
DefNode(ShaderNode, SH_NODE_VOLUME_INFO, 0, "VOLUME_INFO", VolumeInfo, "Volume Info", "" )
|
||||||
DefNode(ShaderNode, SH_NODE_WIREFRAME, def_sh_tex_wireframe, "WIREFRAME", Wireframe, "Wireframe", "" )
|
DefNode(ShaderNode, SH_NODE_WIREFRAME, def_sh_tex_wireframe, "WIREFRAME", Wireframe, "Wireframe", "" )
|
||||||
DefNode(ShaderNode, SH_NODE_WAVELENGTH, 0, "WAVELENGTH", Wavelength, "Wavelength", "" )
|
DefNode(ShaderNode, SH_NODE_WAVELENGTH, 0, "WAVELENGTH", Wavelength, "Wavelength", "" )
|
||||||
DefNode(ShaderNode, SH_NODE_BLACKBODY, 0, "BLACKBODY", Blackbody, "Blackbody", "" )
|
DefNode(ShaderNode, SH_NODE_BLACKBODY, 0, "BLACKBODY", Blackbody, "Blackbody", "" )
|
||||||
|
56
source/blender/nodes/shader/nodes/node_shader_volume_info.c
Normal file
56
source/blender/nodes/shader/nodes/node_shader_volume_info.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* 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_volume_info_out[] = {
|
||||||
|
{SOCK_RGBA, 0, N_("Color")},
|
||||||
|
{SOCK_FLOAT, 0, N_("Density")},
|
||||||
|
{SOCK_FLOAT, 0, N_("Flame")},
|
||||||
|
{SOCK_FLOAT, 0, N_("Temperature")},
|
||||||
|
{-1, 0, ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int node_shader_gpu_volume_info(GPUMaterial *mat,
|
||||||
|
bNode *node,
|
||||||
|
bNodeExecData *UNUSED(execdata),
|
||||||
|
GPUNodeStack *in,
|
||||||
|
GPUNodeStack *out)
|
||||||
|
{
|
||||||
|
|
||||||
|
return GPU_stack_link(mat,
|
||||||
|
node,
|
||||||
|
"node_volume_info",
|
||||||
|
in,
|
||||||
|
out,
|
||||||
|
GPU_builtin(GPU_VOLUME_DENSITY),
|
||||||
|
GPU_builtin(GPU_VOLUME_FLAME),
|
||||||
|
GPU_builtin(GPU_VOLUME_TEMPERATURE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_node_type_sh_volume_info(void)
|
||||||
|
{
|
||||||
|
static bNodeType ntype;
|
||||||
|
|
||||||
|
sh_node_type_base(&ntype, SH_NODE_VOLUME_INFO, "Volume Info", NODE_CLASS_INPUT, 0);
|
||||||
|
node_type_socket_templates(&ntype, NULL, sh_node_volume_info_out);
|
||||||
|
node_type_gpu(&ntype, node_shader_gpu_volume_info);
|
||||||
|
|
||||||
|
nodeRegisterType(&ntype);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user