Godot VisualShaderNodeCustom C#

50 Views Asked by At

I'm relatively new to Godot (came from Unity after all the trouble) but got around pretty good. I'm currently doing alot of shaders and since I use some functionality at different spots I thought it might be a good idea to convert my ExpressionNodes to VisualShaderNodeCustom - but I can't seem to get it to work. My custom ShaderNode "ColorStepsNode" does not appear under "Add node", it is located under res://addons/colorStepsNode/ColorStepsNode.cs

using Godot;
using Godot.Collections;

[Tool]
[GlobalClass]
public partial class ColorStepsNode : VisualShaderNodeCustom
{

    // *** GENERAL
    public override string _GetName()
    {
        return "ColorSteps";
    }

    public override string _GetCategory()
    {
        return "Custom";
    }

    public override string _GetDescription()
    {
        return "Converts float value between 0.0 and [StepsCount] to fixed steps in grey scale (depth)";
    }

    // *** INPUTS
    public override int _GetInputPortCount()
    {
        // int colorSteps, float value
        return 2;
    }

    public override string _GetInputPortName(int port)
    {
        switch (port)
        {
            case 0:
               return "colorSteps";
            case 1:
                return "value";
        }

        throw new System.Exception("unknown portIndex in GetInputPortName in ColorStepsNode.");
    }

    public override PortType _GetInputPortType(int port)
    {
        switch (port)
        {
            case 0:
                return PortType.ScalarInt;
            case 1:
                return PortType.Scalar;
        }

        throw new System.Exception("unknown portIndex in GetInputPortType in ColorStepsNode.");
    }

    // *** OUTPUTS
    public override int _GetOutputPortCount()
    {
        return 1;
    }

    public override string _GetOutputPortName(int port)
    {
        if (port == 0)
        {
            return "output";
        }

        throw new System.Exception("unknown portIndex in GetOutputPortName in ColorStepsNode.");
    }

    public override PortType _GetReturnIconType()
    {
        return PortType.Scalar;
    }

    public override PortType _GetOutputPortType(int port)
    {
        if (port == 0)
        {
            return PortType.Scalar;
        }

        throw new System.Exception("unknown portIndex in GetOutputPortType in ColorStepsNode.");
    }

    // *** FUNCTIONALITY
    public override string _GetGlobalCode(Shader.Mode mode)
    {
       return "";
    }

    public override string _GetCode(Array<string> inputVars, Array<string> outputVars, Shader.Mode mode, VisualShader.Type type)
    {
        string colorSteps = inputVars[0];
        string value = inputVars[1];
        string output = outputVars[0];

        string code = $"float colorStepSize = 1.0 / float({colorSteps});" +
                      $"float steppedValue = ({value} - fract({value})) * colorStepSize;" +
                      $"{output} = steppedValue - (colorStepSize / 2.0);";

        return code;
    }

}

I tried everything I could find, but sometimes finding stuff for Godot or especially for Godoto C# is hard/impossible. Thank you for your help in advance!

EDIT: This is the original expression: ExpressionNode in ShaderEditor

0

There are 0 best solutions below