Require Class/basicSurface

basicSurface Subclass basicSurfaceFromSurface {
  Var P Q f-u f-v f-setup "uv {[basicSurface get uv]}"
  ClassVar {linkable-types basicSurface}
  ClassVar sf-u sf-v {frame 0}
  ClassVar {domain {Inherit}}

  Method SetValues {} {
    Vars f-u f-v f-setup uv frame sf-u sf-v
    set object [Self Reference Object]
    set point [Self Inherit point]
    set P [var P]
    set u [lindex $uv 0]
    set v [lindex $uv 1]

    if {$frame && [$object getDimension] != 3} \
      {Error "Frame-based actions only work when '$object' is in 3 dimensions"}

    set f-setup [list "uplevel {upvar \#0 $P $P}"]
    set f-v ${sf-v}

    set f-u [list \
      "set $P \[$object F \${$u} \${$v}\]" \
      {foreach _i [array names _X] {set _X($_i) 0}} \
      ${sf-u} \
      "set _P \[+ \${$P} \[$point\]\]" \
      {foreach _i [array names _X] {set _X($_i) [lindex $_P $_i]}} \
    ]
    if {$frame} {
      set Q [var Q]; lappend f-setup "uplevel {upvar \#0 $Q $Q}"
      set f-u [lreplace ${f-u} 3 3 \
        "set $Q \[$point\]" \
        "set _P \[+ \${$P} \[* \[Transpose\
           \[join \[$object NUV \${$u} \${$v}\] { }\]\] \${$Q}\]\]"]
    }
    set f-u [join ${f-u} \n]
    set f-setup [join ${f-setup} \n]
  }

  Method GetDomainList {D} {
    set object [Self Reference Object]
    uplevel [list basicSurface InheritSurfaceDomainList $D $object]
  }

  Method Inherit {var} {Self InheritReference $var}
}
