Files
2026-07-13 13:13:17 +08:00

56 lines
1.9 KiB
C#

using T3.Core.DataTypes.ShaderGraph;
namespace Lib.field.space;
[Guid("1a933eb2-a89b-4694-ae04-60d86779cf28")]
internal sealed class ReflectField : Instance<ReflectField>
,IGraphNodeOp
{
[Output(Guid = "47166966-b53a-4b85-ac62-a6f956b7de23")]
public readonly Slot<ShaderGraphNode> Result = new();
public ReflectField()
{
ShaderNode = new ShaderGraphNode(this, null, InputField);
Result.Value = ShaderNode;
Result.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
ShaderNode.Update(context);
}
public ShaderGraphNode ShaderNode { get; }
void IGraphNodeOp.AddDefinitions(CodeAssembleContext c)
{
c.Globals["pReflect"] = """
// https://mercury.sexy/hg_sdf/
// Reflect space at a plane
void pReflect(inout float3 p, float3 planeNormal, float offset) {
float t = dot(p, planeNormal)+offset;
if (t < 0) {
p = p - (2*t)*planeNormal;
}
//return sgn(t);
}
""";
}
public void GetPreShaderCode(CodeAssembleContext c, int inputIndex)
{
c.AppendCall($"pReflect(p{c}.xyz, normalize({ShaderNode}PlaneNormal), {ShaderNode}Offset);");
}
[Input(Guid = "c617549d-b67d-454c-91f5-bc1d6e9a66b7")]
public readonly InputSlot<ShaderGraphNode> InputField = new();
[GraphParam]
[Input(Guid = "AFD3834B-9EF0-4D7A-B0A3-A93CB4193D40")]
public readonly InputSlot<Vector3> PlaneNormal = new();
[GraphParam]
[Input(Guid = "D184A675-A5AB-42F9-B3F9-D275B0C7BEE8")]
public readonly InputSlot<float> Offset = new();
}