SampleImageNode.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using PixiEditor.ChangeableDocument.Changeables.Graph.Context;
  2. using PixiEditor.ChangeableDocument.Rendering;
  3. using Drawie.Backend.Core;
  4. using Drawie.Backend.Core.ColorsImpl;
  5. using Drawie.Backend.Core.Shaders.Generation;
  6. using Drawie.Backend.Core.Shaders.Generation.Expressions;
  7. using Drawie.Backend.Core.Surfaces;
  8. using Drawie.Numerics;
  9. namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  10. [NodeInfo("SampleImage")]
  11. public class SampleImageNode : Node
  12. {
  13. public InputProperty<Texture?> Image { get; }
  14. public FuncInputProperty<Float2> Coordinate { get; }
  15. public FuncOutputProperty<Half4> Color { get; }
  16. public InputProperty<ColorSampleMode> SampleMode { get; }
  17. public InputProperty<bool> NormalizedCoordinates { get; }
  18. public SampleImageNode()
  19. {
  20. Image = CreateInput<Texture>("Texture", "IMAGE", null);
  21. Coordinate = CreateFuncInput<Float2>("Coordinate", "UV", VecD.Zero);
  22. Color = CreateFuncOutput("Color", "COLOR", GetColor);
  23. SampleMode = CreateInput("SampleMode", "COLOR_SAMPLE_MODE", ColorSampleMode.ColorManaged);
  24. NormalizedCoordinates = CreateInput("NormalizedCoordinates", "NORMALIZED_COORDINATES", true);
  25. }
  26. private Half4 GetColor(FuncContext context)
  27. {
  28. if (Image.Value is null || Image.Value.IsDisposed)
  29. {
  30. return new Half4("");
  31. }
  32. if (context.HasContext)
  33. {
  34. Expression uv = context.GetValue(Coordinate);
  35. return context.SampleSurface(Image.Value.DrawingSurface, uv, SampleMode.Value, NormalizedCoordinates.Value);
  36. }
  37. Color color;
  38. VecD coordinate = context.GetValue(Coordinate).ConstantValue;
  39. VecI pixelCoordinate = (VecI)coordinate.Round();
  40. if(NormalizedCoordinates.Value)
  41. {
  42. VecD size = Image.Value.Size;
  43. pixelCoordinate = (VecI)(new VecD(coordinate.X * size.X, coordinate.Y * size.Y)).Round();
  44. }
  45. if (SampleMode.Value == ColorSampleMode.ColorManaged)
  46. {
  47. color = Image.Value.GetSRGBPixel(pixelCoordinate);
  48. }
  49. else
  50. {
  51. color = Image.Value.GetPixel(pixelCoordinate);
  52. }
  53. return new Half4("") { ConstantValue = color };
  54. }
  55. protected override void OnExecute(RenderContext context)
  56. {
  57. }
  58. public override Node CreateCopy() => new SampleImageNode();
  59. }