function evaluateRBS3D_Deg2UniformClosed_Deg3UniformClosed_NdPts_NdWts_debug (out, t0, t1) {
  var h, m, a, b;
  var size0 = this.size[0];
  var size1 = this.size[1];
  var x = this.points.data;
  var xOffset = this.points.offset;
  var xStride0 = this.points.stride[0];
  var xStride1 = this.points.stride[1];
  var xStride2 = this.points.stride[2];
  var w = this.weights.data;
  var wOffset = this.weights.offset;
  var wStride0 = this.weights.stride[0];
  var wStride1 = this.weights.stride[1];
  
  // Directly compute knot interval for dimension 0

  knotIndex0 = (t0 | 0) % size0;
  
  // Compute and clamp knots for dimension 0

  var k0_0 = knotIndex0 + -1;
  var k0_1 = knotIndex0 + 0;
  var k0_2 = knotIndex0 + 1;
  var k0_3 = knotIndex0 + 2;
  
  // Wrap the B-Spline parameter for closed boundary
  t0 %= size0;
  
  // Directly compute knot interval for dimension 1

  knotIndex1 = (t1 | 0) % size1;
  
  // Compute and clamp knots for dimension 1

  var k1_0 = knotIndex1 + -2;
  var k1_1 = knotIndex1 + -1;
  var k1_2 = knotIndex1 + 0;
  var k1_3 = knotIndex1 + 1;
  var k1_4 = knotIndex1 + 2;
  var k1_5 = knotIndex1 + 3;
  
  // Wrap the B-Spline parameter for closed boundary
  t1 %= size1;
  
  // Fetch weights

  var w0_0 = w[wOffset + wStride0 * ((knotIndex0 + -2 + size0) % size0) + wStride1 * ((knotIndex1 + -3 + size1) % size1)];
  var w0_1 = w[wOffset + wStride0 * ((knotIndex0 + -2 + size0) % size0) + wStride1 * ((knotIndex1 + -2 + size1) % size1)];
  var w0_2 = w[wOffset + wStride0 * ((knotIndex0 + -2 + size0) % size0) + wStride1 * ((knotIndex1 + -1 + size1) % size1)];
  var w0_3 = w[wOffset + wStride0 * ((knotIndex0 + -2 + size0) % size0) + wStride1 * (knotIndex1)];
  var w1_0 = w[wOffset + wStride0 * ((knotIndex0 + -1 + size0) % size0) + wStride1 * ((knotIndex1 + -3 + size1) % size1)];
  var w1_1 = w[wOffset + wStride0 * ((knotIndex0 + -1 + size0) % size0) + wStride1 * ((knotIndex1 + -2 + size1) % size1)];
  var w1_2 = w[wOffset + wStride0 * ((knotIndex0 + -1 + size0) % size0) + wStride1 * ((knotIndex1 + -1 + size1) % size1)];
  var w1_3 = w[wOffset + wStride0 * ((knotIndex0 + -1 + size0) % size0) + wStride1 * (knotIndex1)];
  var w2_0 = w[wOffset + wStride0 * (knotIndex0) + wStride1 * ((knotIndex1 + -3 + size1) % size1)];
  var w2_1 = w[wOffset + wStride0 * (knotIndex0) + wStride1 * ((knotIndex1 + -2 + size1) % size1)];
  var w2_2 = w[wOffset + wStride0 * (knotIndex0) + wStride1 * ((knotIndex1 + -1 + size1) % size1)];
  var w2_3 = w[wOffset + wStride0 * (knotIndex0) + wStride1 * (knotIndex1)];
  
  // Fetch points and project into homogeneous (weighted) coordinates

  var x0_0_0 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (0)] * w0_0;
  var x0_0_1 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (1)] * w0_0;
  var x0_0_2 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (2)] * w0_0;
  var x0_1_0 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (0)] * w0_1;
  var x0_1_1 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (1)] * w0_1;
  var x0_1_2 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (2)] * w0_1;
  var x0_2_0 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (0)] * w0_2;
  var x0_2_1 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (1)] * w0_2;
  var x0_2_2 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (2)] * w0_2;
  var x0_3_0 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (0)] * w0_3;
  var x0_3_1 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (1)] * w0_3;
  var x0_3_2 = x[xOffset + xStride0 * ((knotIndex0 + -2 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (2)] * w0_3;
  var x1_0_0 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (0)] * w1_0;
  var x1_0_1 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (1)] * w1_0;
  var x1_0_2 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (2)] * w1_0;
  var x1_1_0 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (0)] * w1_1;
  var x1_1_1 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (1)] * w1_1;
  var x1_1_2 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (2)] * w1_1;
  var x1_2_0 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (0)] * w1_2;
  var x1_2_1 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (1)] * w1_2;
  var x1_2_2 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (2)] * w1_2;
  var x1_3_0 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (0)] * w1_3;
  var x1_3_1 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (1)] * w1_3;
  var x1_3_2 = x[xOffset + xStride0 * ((knotIndex0 + -1 + size0) % size0) + xStride1 * (knotIndex1) + xStride2 * (2)] * w1_3;
  var x2_0_0 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (0)] * w2_0;
  var x2_0_1 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (1)] * w2_0;
  var x2_0_2 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -3 + size1) % size1) + xStride2 * (2)] * w2_0;
  var x2_1_0 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (0)] * w2_1;
  var x2_1_1 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (1)] * w2_1;
  var x2_1_2 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -2 + size1) % size1) + xStride2 * (2)] * w2_1;
  var x2_2_0 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (0)] * w2_2;
  var x2_2_1 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (1)] * w2_2;
  var x2_2_2 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * ((knotIndex1 + -1 + size1) % size1) + xStride2 * (2)] * w2_2;
  var x2_3_0 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * (knotIndex1) + xStride2 * (0)] * w2_3;
  var x2_3_1 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * (knotIndex1) + xStride2 * (1)] * w2_3;
  var x2_3_2 = x[xOffset + xStride0 * (knotIndex0) + xStride1 * (knotIndex1) + xStride2 * (2)] * w2_3;
  

  // Perform De Boor's algorithm
  
  // Degree 3 evaluation in dimension 1, step 1

  a = (t1 - k1_2) / (k1_5 - k1_2);
  b = 1 - a;
  w0_3 = b * w0_2 + a * w0_3;
  w1_3 = b * w1_2 + a * w1_3;
  w2_3 = b * w2_2 + a * w2_3;
  x0_3_0 = b * x0_2_0 + a * x0_3_0;
  x0_3_1 = b * x0_2_1 + a * x0_3_1;
  x0_3_2 = b * x0_2_2 + a * x0_3_2;
  x1_3_0 = b * x1_2_0 + a * x1_3_0;
  x1_3_1 = b * x1_2_1 + a * x1_3_1;
  x1_3_2 = b * x1_2_2 + a * x1_3_2;
  x2_3_0 = b * x2_2_0 + a * x2_3_0;
  x2_3_1 = b * x2_2_1 + a * x2_3_1;
  x2_3_2 = b * x2_2_2 + a * x2_3_2;
  

  a = (t1 - k1_1) / (k1_4 - k1_1);
  b = 1 - a;
  w0_2 = b * w0_1 + a * w0_2;
  w1_2 = b * w1_1 + a * w1_2;
  w2_2 = b * w2_1 + a * w2_2;
  x0_2_0 = b * x0_1_0 + a * x0_2_0;
  x0_2_1 = b * x0_1_1 + a * x0_2_1;
  x0_2_2 = b * x0_1_2 + a * x0_2_2;
  x1_2_0 = b * x1_1_0 + a * x1_2_0;
  x1_2_1 = b * x1_1_1 + a * x1_2_1;
  x1_2_2 = b * x1_1_2 + a * x1_2_2;
  x2_2_0 = b * x2_1_0 + a * x2_2_0;
  x2_2_1 = b * x2_1_1 + a * x2_2_1;
  x2_2_2 = b * x2_1_2 + a * x2_2_2;
  

  a = (t1 - k1_0) / (k1_3 - k1_0);
  b = 1 - a;
  w0_1 = b * w0_0 + a * w0_1;
  w1_1 = b * w1_0 + a * w1_1;
  w2_1 = b * w2_0 + a * w2_1;
  x0_1_0 = b * x0_0_0 + a * x0_1_0;
  x0_1_1 = b * x0_0_1 + a * x0_1_1;
  x0_1_2 = b * x0_0_2 + a * x0_1_2;
  x1_1_0 = b * x1_0_0 + a * x1_1_0;
  x1_1_1 = b * x1_0_1 + a * x1_1_1;
  x1_1_2 = b * x1_0_2 + a * x1_1_2;
  x2_1_0 = b * x2_0_0 + a * x2_1_0;
  x2_1_1 = b * x2_0_1 + a * x2_1_1;
  x2_1_2 = b * x2_0_2 + a * x2_1_2;
  

  
  // Degree 3 evaluation in dimension 1, step 2

  a = (t1 - k1_2) / (k1_4 - k1_2);
  b = 1 - a;
  w0_3 = b * w0_2 + a * w0_3;
  w1_3 = b * w1_2 + a * w1_3;
  w2_3 = b * w2_2 + a * w2_3;
  x0_3_0 = b * x0_2_0 + a * x0_3_0;
  x0_3_1 = b * x0_2_1 + a * x0_3_1;
  x0_3_2 = b * x0_2_2 + a * x0_3_2;
  x1_3_0 = b * x1_2_0 + a * x1_3_0;
  x1_3_1 = b * x1_2_1 + a * x1_3_1;
  x1_3_2 = b * x1_2_2 + a * x1_3_2;
  x2_3_0 = b * x2_2_0 + a * x2_3_0;
  x2_3_1 = b * x2_2_1 + a * x2_3_1;
  x2_3_2 = b * x2_2_2 + a * x2_3_2;
  

  a = (t1 - k1_1) / (k1_3 - k1_1);
  b = 1 - a;
  w0_2 = b * w0_1 + a * w0_2;
  w1_2 = b * w1_1 + a * w1_2;
  w2_2 = b * w2_1 + a * w2_2;
  x0_2_0 = b * x0_1_0 + a * x0_2_0;
  x0_2_1 = b * x0_1_1 + a * x0_2_1;
  x0_2_2 = b * x0_1_2 + a * x0_2_2;
  x1_2_0 = b * x1_1_0 + a * x1_2_0;
  x1_2_1 = b * x1_1_1 + a * x1_2_1;
  x1_2_2 = b * x1_1_2 + a * x1_2_2;
  x2_2_0 = b * x2_1_0 + a * x2_2_0;
  x2_2_1 = b * x2_1_1 + a * x2_2_1;
  x2_2_2 = b * x2_1_2 + a * x2_2_2;
  

  
  // Degree 3 evaluation in dimension 1, step 3

  a = (t1 - k1_2) / (k1_3 - k1_2);
  b = 1 - a;
  w0_3 = b * w0_2 + a * w0_3;
  w1_3 = b * w1_2 + a * w1_3;
  w2_3 = b * w2_2 + a * w2_3;
  x0_3_0 = b * x0_2_0 + a * x0_3_0;
  x0_3_1 = b * x0_2_1 + a * x0_3_1;
  x0_3_2 = b * x0_2_2 + a * x0_3_2;
  x1_3_0 = b * x1_2_0 + a * x1_3_0;
  x1_3_1 = b * x1_2_1 + a * x1_3_1;
  x1_3_2 = b * x1_2_2 + a * x1_3_2;
  x2_3_0 = b * x2_2_0 + a * x2_3_0;
  x2_3_1 = b * x2_2_1 + a * x2_3_1;
  x2_3_2 = b * x2_2_2 + a * x2_3_2;
  

  
  // Degree 2 evaluation in dimension 0, step 1

  a = (t0 - k0_1) / (k0_3 - k0_1);
  b = 1 - a;
  w2_3 = b * w1_3 + a * w2_3;
  x2_3_0 = b * x1_3_0 + a * x2_3_0;
  x2_3_1 = b * x1_3_1 + a * x2_3_1;
  x2_3_2 = b * x1_3_2 + a * x2_3_2;
  

  a = (t0 - k0_0) / (k0_2 - k0_0);
  b = 1 - a;
  w1_3 = b * w0_3 + a * w1_3;
  x1_3_0 = b * x0_3_0 + a * x1_3_0;
  x1_3_1 = b * x0_3_1 + a * x1_3_1;
  x1_3_2 = b * x0_3_2 + a * x1_3_2;
  

  
  // Degree 2 evaluation in dimension 0, step 2

  a = (t0 - k0_1) / (k0_2 - k0_1);
  b = 1 - a;
  w2_3 = b * w1_3 + a * w2_3;
  x2_3_0 = b * x1_3_0 + a * x2_3_0;
  x2_3_1 = b * x1_3_1 + a * x2_3_1;
  x2_3_2 = b * x1_3_2 + a * x2_3_2;
  

  
  // Project back from homogeneous coordinates and return final output

  out[0] = x2_3_0 / w2_3;
  out[1] = x2_3_1 / w2_3;
  out[2] = x2_3_2 / w2_3;
  return out;
}
uDegree
2
vDegree
3
uPoints
6
vPoints
6
uBoundary
vBoundary
uFrequency
4
vFrequency
4
minorRadius
1
majorRadius
3
weightStrength
0
twist
0
hull