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;
}