Flow along mesh?

Ok, a bit slow for surfaces… it creates a very complex surface.

But nevertheless amazing! I would be glad to have it as a new Rhino tool.

// Grasshopper Script Instance
// by By Daniel Piker 250604 v2
#region Usings
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using Rhino;
using Rhino.Geometry;
using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;
#endregion

public class Script_Instance : GH_ScriptInstance
{
    #region Notes
    /* 
      Members:
        RhinoDoc RhinoDocument
        GH_Document GrasshopperDocument
        IGH_Component Component
        int Iteration

      Methods (Virtual & overridable):
        Print(string text)
        Print(string format, params object[] args)
        Reflect(object obj)
        Reflect(object obj, string method_name)
    */
    #endregion

    private void RunScript(
		Mesh M1,
		Mesh M2,
		GeometryBase Geom,
		double thickness,
		ref object a)
    {       
        Mesh offset = M2.DuplicateMesh();
        OffsetMesh(ref offset, thickness);  
        var morph = new ThickMeshMorph(M1,M2,offset);
        morph.Morph(Geom);
        a = Geom;
    }

    void OffsetMesh(ref Mesh M, double d)
{
  M.Normals.ComputeNormals();
  var normals = M.Normals.ToFloatArray();
  for (int i = 0; i < M.Vertices.Count; i++)
  {
    double dist = d;    
    M.Vertices.SetVertex(i,
      M.Vertices[i].X + dist * normals[3 * i],
      M.Vertices[i].Y + dist * normals[3 * i + 1],
      M.Vertices[i].Z + dist * normals[3 * i + 2]);
  }
}
public class ThickMeshMorph : SpaceMorph
{
  Mesh RefMesh;
  Mesh TargetInner;
  Mesh TargetOuter;

  public ThickMeshMorph(Mesh RefMesh,Mesh TargetInner,Mesh TargetOuter)
  {
    this.RefMesh = RefMesh;    
    this.TargetInner = TargetInner;
    this.TargetOuter = TargetOuter;
  }

  public override Point3d MorphPoint(Point3d Pt)
  {
    MeshPoint mp = RefMesh.ClosestMeshPoint(Pt,0);   
    return (TargetInner.PointAt(mp) * (1 - Pt.Z) + TargetOuter.PointAt(mp) * Pt.Z);
  }
}
}