You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Better visual shader code generation
This commit is contained in:
@@ -33,6 +33,10 @@
|
|||||||
#include "core/vmap.h"
|
#include "core/vmap.h"
|
||||||
#include "servers/visual/shader_types.h"
|
#include "servers/visual/shader_types.h"
|
||||||
|
|
||||||
|
bool VisualShaderNode::is_simple_decl() const {
|
||||||
|
return simple_decl;
|
||||||
|
}
|
||||||
|
|
||||||
void VisualShaderNode::set_output_port_for_preview(int p_index) {
|
void VisualShaderNode::set_output_port_for_preview(int p_index) {
|
||||||
|
|
||||||
port_preview = p_index;
|
port_preview = p_index;
|
||||||
@@ -132,6 +136,7 @@ void VisualShaderNode::_bind_methods() {
|
|||||||
|
|
||||||
VisualShaderNode::VisualShaderNode() {
|
VisualShaderNode::VisualShaderNode() {
|
||||||
port_preview = -1;
|
port_preview = -1;
|
||||||
|
simple_decl = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
@@ -273,6 +278,7 @@ void VisualShaderNodeCustom::_bind_methods() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VisualShaderNodeCustom::VisualShaderNodeCustom() {
|
VisualShaderNodeCustom::VisualShaderNodeCustom() {
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
@@ -1157,8 +1163,21 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui
|
|||||||
output_vars.resize(vsnode->get_output_port_count());
|
output_vars.resize(vsnode->get_output_port_count());
|
||||||
String *outputs = output_vars.ptrw();
|
String *outputs = output_vars.ptrw();
|
||||||
|
|
||||||
|
if (vsnode->is_simple_decl()) { // less code to generate for some simple_decl nodes
|
||||||
for (int i = 0; i < output_count; i++) {
|
for (int i = 0; i < output_count; i++) {
|
||||||
|
String var_name = "n_out" + itos(node) + "p" + itos(i);
|
||||||
|
switch (vsnode->get_output_port_type(i)) {
|
||||||
|
case VisualShaderNode::PORT_TYPE_SCALAR: outputs[i] = "float " + var_name; break;
|
||||||
|
case VisualShaderNode::PORT_TYPE_VECTOR: outputs[i] = "vec3 " + var_name; break;
|
||||||
|
case VisualShaderNode::PORT_TYPE_BOOLEAN: outputs[i] = "bool " + var_name; break;
|
||||||
|
case VisualShaderNode::PORT_TYPE_TRANSFORM: outputs[i] = "mat4 " + var_name; break;
|
||||||
|
default: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < output_count; i++) {
|
||||||
outputs[i] = "n_out" + itos(node) + "p" + itos(i);
|
outputs[i] = "n_out" + itos(node) + "p" + itos(i);
|
||||||
switch (vsnode->get_output_port_type(i)) {
|
switch (vsnode->get_output_port_type(i)) {
|
||||||
case VisualShaderNode::PORT_TYPE_SCALAR: code += String() + "\tfloat " + outputs[i] + ";\n"; break;
|
case VisualShaderNode::PORT_TYPE_SCALAR: code += String() + "\tfloat " + outputs[i] + ";\n"; break;
|
||||||
@@ -1169,6 +1188,7 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Vector<VisualShader::DefaultTextureParam> params = vsnode->get_default_texture_parameters(type, node);
|
Vector<VisualShader::DefaultTextureParam> params = vsnode->get_default_texture_parameters(type, node);
|
||||||
for (int i = 0; i < params.size(); i++) {
|
for (int i = 0; i < params.size(); i++) {
|
||||||
@@ -2514,6 +2534,7 @@ VisualShaderNodeGroupBase::VisualShaderNodeGroupBase() {
|
|||||||
inputs = "";
|
inputs = "";
|
||||||
outputs = "";
|
outputs = "";
|
||||||
editable = false;
|
editable = false;
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Expression
|
////////////// Expression
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ class VisualShaderNode : public Resource {
|
|||||||
Map<int, Variant> default_input_values;
|
Map<int, Variant> default_input_values;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool simple_decl;
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -188,6 +189,8 @@ public:
|
|||||||
PORT_TYPE_MAX,
|
PORT_TYPE_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool is_simple_decl() const;
|
||||||
|
|
||||||
virtual String get_caption() const = 0;
|
virtual String get_caption() const = 0;
|
||||||
|
|
||||||
virtual int get_input_port_count() const = 0;
|
virtual int get_input_port_count() const = 0;
|
||||||
|
|||||||
@@ -440,7 +440,7 @@ String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShade
|
|||||||
case TYPE_COLOR: u += " : hint_albedo"; break;
|
case TYPE_COLOR: u += " : hint_albedo"; break;
|
||||||
case TYPE_NORMALMAP: u += " : hint_normal"; break;
|
case TYPE_NORMALMAP: u += " : hint_normal"; break;
|
||||||
}
|
}
|
||||||
return u + ";";
|
return u + ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return String();
|
return String();
|
||||||
@@ -621,6 +621,26 @@ String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader:
|
|||||||
|
|
||||||
void VisualShaderNodeTexture::set_source(Source p_source) {
|
void VisualShaderNodeTexture::set_source(Source p_source) {
|
||||||
source = p_source;
|
source = p_source;
|
||||||
|
switch (source) {
|
||||||
|
case SOURCE_TEXTURE:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case SOURCE_SCREEN:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case SOURCE_2D_TEXTURE:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case SOURCE_2D_NORMAL:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case SOURCE_DEPTH:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case SOURCE_PORT:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
emit_changed();
|
emit_changed();
|
||||||
emit_signal("editor_refresh_request");
|
emit_signal("editor_refresh_request");
|
||||||
}
|
}
|
||||||
@@ -913,6 +933,7 @@ void VisualShaderNodeCubeMap::_bind_methods() {
|
|||||||
VisualShaderNodeCubeMap::VisualShaderNodeCubeMap() {
|
VisualShaderNodeCubeMap::VisualShaderNodeCubeMap() {
|
||||||
texture_type = TYPE_DATA;
|
texture_type = TYPE_DATA;
|
||||||
source = SOURCE_TEXTURE;
|
source = SOURCE_TEXTURE;
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Scalar Op
|
////////////// Scalar Op
|
||||||
@@ -1217,6 +1238,35 @@ String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader:
|
|||||||
void VisualShaderNodeColorOp::set_operator(Operator p_op) {
|
void VisualShaderNodeColorOp::set_operator(Operator p_op) {
|
||||||
|
|
||||||
op = p_op;
|
op = p_op;
|
||||||
|
switch (op) {
|
||||||
|
case OP_SCREEN:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_DIFFERENCE:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_DARKEN:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_LIGHTEN:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_OVERLAY:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case OP_DODGE:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_BURN:
|
||||||
|
simple_decl = true;
|
||||||
|
break;
|
||||||
|
case OP_SOFT_LIGHT:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
case OP_HARD_LIGHT:
|
||||||
|
simple_decl = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
emit_changed();
|
emit_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1645,6 +1695,13 @@ String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShad
|
|||||||
void VisualShaderNodeVectorFunc::set_function(Function p_func) {
|
void VisualShaderNodeVectorFunc::set_function(Function p_func) {
|
||||||
|
|
||||||
func = p_func;
|
func = p_func;
|
||||||
|
if (func == FUNC_RGB2HSV) {
|
||||||
|
simple_decl = false;
|
||||||
|
} else if (func == FUNC_HSV2RGB) {
|
||||||
|
simple_decl = false;
|
||||||
|
} else {
|
||||||
|
simple_decl = true;
|
||||||
|
}
|
||||||
emit_changed();
|
emit_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1797,6 +1854,7 @@ void VisualShaderNodeColorFunc::_bind_methods() {
|
|||||||
VisualShaderNodeColorFunc::VisualShaderNodeColorFunc() {
|
VisualShaderNodeColorFunc::VisualShaderNodeColorFunc() {
|
||||||
func = FUNC_GRAYSCALE;
|
func = FUNC_GRAYSCALE;
|
||||||
set_input_port_default_value(0, Vector3());
|
set_input_port_default_value(0, Vector3());
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Transform Func
|
////////////// Transform Func
|
||||||
@@ -3309,6 +3367,7 @@ String VisualShaderNodeTextureUniform::get_input_port_default_hint(int p_port) c
|
|||||||
VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() {
|
VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() {
|
||||||
texture_type = TYPE_DATA;
|
texture_type = TYPE_DATA;
|
||||||
color_default = COLOR_DEFAULT_WHITE;
|
color_default = COLOR_DEFAULT_WHITE;
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Texture Uniform (Triplanar)
|
////////////// Texture Uniform (Triplanar)
|
||||||
@@ -3549,6 +3608,7 @@ VisualShaderNodeIf::VisualShaderNodeIf() {
|
|||||||
set_input_port_default_value(3, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(3, Vector3(0.0, 0.0, 0.0));
|
||||||
set_input_port_default_value(4, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(4, Vector3(0.0, 0.0, 0.0));
|
||||||
set_input_port_default_value(5, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(5, Vector3(0.0, 0.0, 0.0));
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Switch
|
////////////// Switch
|
||||||
@@ -3611,6 +3671,7 @@ VisualShaderNodeSwitch::VisualShaderNodeSwitch() {
|
|||||||
set_input_port_default_value(0, false);
|
set_input_port_default_value(0, false);
|
||||||
set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0));
|
set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0));
|
||||||
set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
|
||||||
|
simple_decl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Switch(scalar)
|
////////////// Switch(scalar)
|
||||||
@@ -3941,18 +4002,22 @@ void VisualShaderNodeCompare::set_comparison_type(ComparisonType p_type) {
|
|||||||
case CTYPE_SCALAR:
|
case CTYPE_SCALAR:
|
||||||
set_input_port_default_value(0, 0.0);
|
set_input_port_default_value(0, 0.0);
|
||||||
set_input_port_default_value(1, 0.0);
|
set_input_port_default_value(1, 0.0);
|
||||||
|
simple_decl = true;
|
||||||
break;
|
break;
|
||||||
case CTYPE_VECTOR:
|
case CTYPE_VECTOR:
|
||||||
set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
|
||||||
set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
|
set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
|
||||||
|
simple_decl = false;
|
||||||
break;
|
break;
|
||||||
case CTYPE_BOOLEAN:
|
case CTYPE_BOOLEAN:
|
||||||
set_input_port_default_value(0, false);
|
set_input_port_default_value(0, false);
|
||||||
set_input_port_default_value(1, false);
|
set_input_port_default_value(1, false);
|
||||||
|
simple_decl = true;
|
||||||
break;
|
break;
|
||||||
case CTYPE_TRANSFORM:
|
case CTYPE_TRANSFORM:
|
||||||
set_input_port_default_value(0, Transform());
|
set_input_port_default_value(0, Transform());
|
||||||
set_input_port_default_value(1, Transform());
|
set_input_port_default_value(1, Transform());
|
||||||
|
simple_decl = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
emit_changed();
|
emit_changed();
|
||||||
|
|||||||
Reference in New Issue
Block a user