Files
test/intern/cycles/scene/constant_fold.h
Charlie Jolly bfa0ee13d5 Node: Mix node
This patch is a response to T92588 and is implemented
as a Function/Shader node.

This node has support for Float, Vector and Color data types.

For Vector it supports uniform and non-uniform mixing.

For Color it now has the option to remove factor clamping.

It replaces the Mix RGB for Shader and Geometry node trees.

As discussed in T96219, this patch converts existing nodes
in .blend files. The old node is still available in the
Python API but hidden from the menus.

Reviewed By: HooglyBoogly, JacquesLucke, simonthommes, brecht

Maniphest Tasks: T92588

Differential Revision: https://developer.blender.org/D13749
2022-08-31 00:13:57 +01:00

63 lines
1.7 KiB
C++

/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#ifndef __CONSTANT_FOLD_H__
#define __CONSTANT_FOLD_H__
#include "kernel/svm/types.h"
#include "util/types.h"
CCL_NAMESPACE_BEGIN
class Scene;
class ShaderGraph;
class ShaderInput;
class ShaderNode;
class ShaderOutput;
class ConstantFolder {
public:
ShaderGraph *const graph;
ShaderNode *const node;
ShaderOutput *const output;
Scene *scene;
ConstantFolder(ShaderGraph *graph, ShaderNode *node, ShaderOutput *output, Scene *scene);
bool all_inputs_constant() const;
/* Constant folding helpers */
void make_constant(float value) const;
void make_constant(float3 value) const;
void make_constant_clamp(float value, bool clamp) const;
void make_constant_clamp(float3 value, bool clamp) const;
void make_zero() const;
void make_one() const;
/* Bypass node, relinking to another output socket. */
void bypass(ShaderOutput *output) const;
/* For closure nodes, discard node entirely or bypass to one of its inputs. */
void discard() const;
void bypass_or_discard(ShaderInput *input) const;
/* Bypass or make constant, unless we can't due to clamp being true. */
bool try_bypass_or_make_constant(ShaderInput *input, bool clamp = false) const;
/* Test if shader inputs of the current nodes have fixed values. */
bool is_zero(ShaderInput *input) const;
bool is_one(ShaderInput *input) const;
/* Specific nodes. */
void fold_mix(NodeMix type, bool clamp) const;
void fold_mix_color(NodeMix type, bool clamp_factor, bool clamp) const;
void fold_math(NodeMathType type) const;
void fold_vector_math(NodeVectorMathType type) const;
void fold_mapping(NodeMappingType type) const;
};
CCL_NAMESPACE_END
#endif /* __CONSTANT_FOLD_H__ */