egg = {
if (!tiling) return cube
const s = 1;
const geometry = new THREE.Geometry();
const uvs = flatten(tiling.map(tr => tr.uv))
const u_extent = d3.extent(uvs.map(uv => uv[0]))
const v_extent = d3.extent(uvs.map(uv => uv[1]))
const u = d3.scaleLinear().domain(u_extent).range([0,1])
const v = d3.scaleLinear().domain(v_extent).range([0,1])
tiling.forEach((tr, i) => {
const [ a, b, c ] = tr;
geometry.vertices.push(new THREE.Vector3(a[0]*s, a[1]*s, a[2]*s));
geometry.vertices.push(new THREE.Vector3(b[0]*s, b[1]*s, b[2]*s));
geometry.vertices.push(new THREE.Vector3(c[0]*s, c[1]*s, c[2]*s));
geometry.faces.push(new THREE.Face3(3*i, 3*i+1, 3*i+2));
const [ [au, av], [bu, bv], [cu, cv] ] = tr.uv;
geometry.faceVertexUvs[0].push([
new THREE.Vector2(u(au), v(av)),
new THREE.Vector2(u(bu), v(bv)),
new THREE.Vector2(u(cu), v(cv)),
]);
});
geometry.uvsNeedUpdate = true;
geometry.computeFaceNormals();
geometry.computeVertexNormals();
const material = normal_colors
? new THREE.MeshNormalMaterial({ side: THREE.DoubleSide, wireframe: false })
: b ? new THREE.MeshLambertMaterial({ color: 0xf4f4ed, side: THREE.DoubleSide })
: new THREE.MeshPhongMaterial({
color: 0xf4f4ed,
side: THREE.DoubleSide,
bumpMap: use_bump ? texture : undefined,
bumpScale: 1,
});
const mesh = new THREE.Mesh(geometry, material);
mesh.castShadow = true;
mesh.receiveShadow = true;
return mesh;
}