forked from bartvdbraak/blender
Replaced dynamic_casts for node type checks by simple 'special type' identifiers. RTTI has to be disabled in cycles for OSL.
This commit is contained in:
parent
acebddeb23
commit
0238d032b2
@ -55,6 +55,7 @@ ShaderNode::ShaderNode(const char *name_)
|
||||
name = name_;
|
||||
id = -1;
|
||||
bump = SHADER_BUMP_NONE;
|
||||
special_type = SHADER_SPECIAL_TYPE_NONE;
|
||||
}
|
||||
|
||||
ShaderNode::~ShaderNode()
|
||||
@ -298,8 +299,8 @@ void ShaderGraph::copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNod
|
||||
void ShaderGraph::remove_proxy_nodes(vector<bool>& removed)
|
||||
{
|
||||
foreach(ShaderNode *node, nodes) {
|
||||
ProxyNode *proxy = dynamic_cast<ProxyNode*>(node);
|
||||
if (proxy) {
|
||||
if (node->special_type == SHADER_SPECIAL_TYPE_PROXY) {
|
||||
ProxyNode *proxy = static_cast<ProxyNode*>(node);
|
||||
ShaderInput *input = proxy->inputs[0];
|
||||
ShaderOutput *output = proxy->outputs[0];
|
||||
|
||||
@ -330,9 +331,8 @@ void ShaderGraph::remove_proxy_nodes(vector<bool>& removed)
|
||||
}
|
||||
|
||||
/* remove useless mix closures nodes */
|
||||
MixClosureNode *mix = dynamic_cast<MixClosureNode*>(node);
|
||||
|
||||
if(mix) {
|
||||
if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) {
|
||||
MixClosureNode *mix = static_cast<MixClosureNode*>(node);
|
||||
if(mix->outputs[0]->links.size() && mix->inputs[1]->link == mix->inputs[2]->link) {
|
||||
ShaderOutput *output = mix->inputs[1]->link;
|
||||
vector<ShaderInput*> inputs = mix->outputs[0]->links;
|
||||
|
@ -63,6 +63,17 @@ enum ShaderBump {
|
||||
SHADER_BUMP_DY
|
||||
};
|
||||
|
||||
/* Identifiers for some special node types.
|
||||
*
|
||||
* The graph needs to identify these in the clean function.
|
||||
* Cannot use dynamic_cast, as this is disabled for OSL. */
|
||||
|
||||
enum ShaderNodeSpecialType {
|
||||
SHADER_SPECIAL_TYPE_NONE,
|
||||
SHADER_SPECIAL_TYPE_PROXY,
|
||||
SHADER_SPECIAL_TYPE_MIX_CLOSURE
|
||||
};
|
||||
|
||||
/* Enum
|
||||
*
|
||||
* Utility class for enum values. */
|
||||
@ -167,6 +178,8 @@ public:
|
||||
ustring name; /* name, not required to be unique */
|
||||
int id; /* index in graph node array */
|
||||
ShaderBump bump; /* for bump mapping utility */
|
||||
|
||||
ShaderNodeSpecialType special_type; /* special node type */
|
||||
};
|
||||
|
||||
|
||||
|
@ -1036,6 +1036,7 @@ ProxyNode::ProxyNode(ShaderSocketType from_, ShaderSocketType to_)
|
||||
{
|
||||
from = from_;
|
||||
to = to_;
|
||||
special_type = SHADER_SPECIAL_TYPE_PROXY;
|
||||
|
||||
add_input("Input", from);
|
||||
add_output("Output", to);
|
||||
@ -1971,6 +1972,8 @@ void AddClosureNode::compile(OSLCompiler& compiler)
|
||||
MixClosureNode::MixClosureNode()
|
||||
: ShaderNode("mix_closure")
|
||||
{
|
||||
special_type = SHADER_SPECIAL_TYPE_MIX_CLOSURE;
|
||||
|
||||
add_input("Fac", SHADER_SOCKET_FLOAT, 0.5f);
|
||||
add_input("Closure1", SHADER_SOCKET_CLOSURE);
|
||||
add_input("Closure2", SHADER_SOCKET_CLOSURE);
|
||||
|
Loading…
Reference in New Issue
Block a user