import { settings, isObject } from '../core.mjs';
import { PointsCreator } from '../base/base3d.mjs';
/** @summary direct draw function for TPolyMarker3D object
* @private */
async function drawPolyMarker3D() {
const fp = this.$fp || this.getFramePainter();
delete this.$fp;
if (!isObject(fp) || !fp.grx || !fp.gry || !fp.grz)
return this;
const poly = this.getObject(), sizelimit = 50000, fP = poly.fP;
let step = 1, numselect = 0;
for (let i = 0; i < fP.length; i += 3) {
if ((fP[i] < fp.scale_xmin) || (fP[i] > fp.scale_xmax) ||
(fP[i+1] < fp.scale_ymin) || (fP[i+1] > fp.scale_ymax) ||
(fP[i+2] < fp.scale_zmin) || (fP[i+2] > fp.scale_zmax)) continue;
++numselect;
}
if ((settings.OptimizeDraw > 0) && (numselect > sizelimit)) {
step = Math.floor(numselect/sizelimit);
if (step <= 2) step = 2;
}
const size = Math.floor(numselect/step),
pnts = new PointsCreator(size, fp.webgl, fp.size_x3d/100),
index = new Int32Array(size);
let select = 0, icnt = 0;
for (let i = 0; i < fP.length; i += 3) {
if ((fP[i] < fp.scale_xmin) || (fP[i] > fp.scale_xmax) ||
(fP[i+1] < fp.scale_ymin) || (fP[i+1] > fp.scale_ymax) ||
(fP[i+2] < fp.scale_zmin) || (fP[i+2] > fp.scale_zmax)) continue;
if (step > 1) {
select = (select+1) % step;
if (select !== 0) continue;
}
index[icnt++] = i;
pnts.addPoint(fp.grx(fP[i]), fp.gry(fP[i+1]), fp.grz(fP[i+2]));
}
return pnts.createPoints({ color: this.getColor(poly.fMarkerColor), style: poly.fMarkerStyle }).then(mesh => {
mesh.tip_color = (poly.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;
mesh.tip_name = poly.fName || 'Poly3D';
mesh.poly = poly;
mesh.fp = fp;
mesh.scale0 = 0.7*pnts.scale;
mesh.index = index;
fp.add3DMesh(mesh, this, true);
mesh.tooltip = function(intersect) {
let indx = Math.floor(intersect.index / this.nvertex);
if ((indx < 0) || (indx >= this.index.length))
return null;
indx = this.index[indx];
const fp2 = this.fp,
grx = fp2.grx(this.poly.fP[indx]),
gry = fp2.gry(this.poly.fP[indx+1]),
grz = fp2.grz(this.poly.fP[indx+2]);
return {
x1: grx - this.scale0,
x2: grx + this.scale0,
y1: gry - this.scale0,
y2: gry + this.scale0,
z1: grz - this.scale0,
z2: grz + this.scale0,
color: this.tip_color,
lines: [this.tip_name,
'pnt: ' + indx/3,
'x: ' + fp2.axisAsText('x', this.poly.fP[indx]),
'y: ' + fp2.axisAsText('y', this.poly.fP[indx+1]),
'z: ' + fp2.axisAsText('z', this.poly.fP[indx+2])
]
};
};
fp.render3D(100); // set timeout to be able draw other points
return this;
});
}
export { drawPolyMarker3D };