class WellboreMesh {
constructor(interp) {
this.interp = interp;
this.length = interp.length;
}
generate(intervals = []) {
const vertices = [];
const triangles = [];
const vertexData = [];
const extraData = [];
let baseTris = 0;
let j = 0;
if(intervals.length <= 0) {
const path = this.interp.GetSection(0, 1);
this.generateSection(path, 0, 0, vertices, triangles, vertexData, extraData);
} else if (intervals.length > 0) {
let p = 0;
intervals.forEach(i => {
const path1 = this.interp.GetSection(p, i[0]);
baseTris = this.generateSection(path1, baseTris, 0, vertices, triangles, vertexData, extraData);
const path2 = this.interp.GetSection(i[0], i[1]);
baseTris = this.generateSection(path2, baseTris, 1, vertices, triangles, vertexData, extraData);
p = i[1];
})
// Add last path
const lastPath = this.interp.GetSection(intervals[intervals.length - 1][1], 1);
baseTris = this.generateSection(lastPath, baseTris, 0, vertices, triangles, vertexData, extraData);
}
return { vertices, triangles, vertexData, extraData };
}
// PRIVATE
// Generate a section of points
generateSection(section, currentBase, type, vertices, triangles, vertexData, extraData) {
let baseTris = currentBase;
function AppendVertices(point) {
const v1Norm = point.dir.rotateNeg90();
const v2Norm = point.dir.rotate90();
const v1 = point.pos.add(v1Norm.rescale(0.08));
const v2 = point.pos.add(v2Norm.rescale(0.08));
vertices.push(v1.x, v1.y, v2.x, v2.y);
extraData.push(type, type); // Push interval type
// Real distance [0, N], Upper/Lower [0, 1], Normal.x [-1, 1], Normal.y [-1, 1]
vertexData.push(point.dist, 1.0, v1Norm.x, v1Norm.y, point.dist, 0.0, v2Norm.x, v2Norm.y); // Add vertex data
}
// Append first two vertices
AppendVertices(section[0]);
// 0 2
//
// 1 3
// Iterate over path coordinates
for (let i = 1.0; i < section.length; i++) {
AppendVertices(section[i]);
triangles.push(baseTris, baseTris + 2, baseTris + 1, baseTris + 1, baseTris + 2, baseTris + 3);
baseTris += 2;
}
return baseTris + 2; // Return
}
generateCrossline(p, baseTris, vertices, triangles, vertexData, extraData) {
const pos = p.pos;
// 2 3
//
// 0 1
const dir = p.dir.rescale(.005);
const pNorm = dir.rotateNeg90().rescale(.2);
const ll = pos.sub(dir).sub(pNorm); // Lower left
const lr = pos.add(dir).sub(pNorm); // Lower right
const ul = pos.sub(dir).add(pNorm); // Upper left
const ur = pos.add(dir).add(pNorm); // Upper right
vertices.push(
ll.x, ll.y, lr.x, lr.y, ul.x, ul.y, ur.x, ur.y,
);
triangles.push(baseTris, baseTris + 2, baseTris + 3, baseTris, baseTris + 3, baseTris + 1);
extraData.push(0, 0, 0, 0); // Push interval type
// Real distance [0, N], Upper/Lower [0, 1], Normal.x [-1, 1], Normal.y [-1, 1]
vertexData.push(
p.dist, 0.0, 0, 0,
p.dist, 0.0, 0, 0,
p.dist, 1.0, 0, 0,
p.dist, 1.0, 0, 0,
); // Add vertex data
return baseTris + 4;
}
}