Implement setRulers() function to draw ruler labels.
This commit is contained in:
parent
fb16edd41f
commit
c4bfc25e2a
1 changed files with 88 additions and 0 deletions
|
|
@ -50,6 +50,11 @@
|
||||||
gridColorMajor,
|
gridColorMajor,
|
||||||
gridColorMinor,
|
gridColorMinor,
|
||||||
gridView,
|
gridView,
|
||||||
|
rulersView,
|
||||||
|
rulerXFirst = null,
|
||||||
|
rulerXLast = null,
|
||||||
|
rulerYFirst = null,
|
||||||
|
rulerYLast = null,
|
||||||
viewControl,
|
viewControl,
|
||||||
trackPlane,
|
trackPlane,
|
||||||
platform,
|
platform,
|
||||||
|
|
@ -229,6 +234,78 @@
|
||||||
return was;
|
return was;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setRulers(drawX, drawY, offsetCenter) {
|
||||||
|
let x = platform.scale.x,
|
||||||
|
y = isRound ? platform.scale.z : platform.scale.y,
|
||||||
|
z = isRound ? platform.scale.y : platform.scale.z,
|
||||||
|
w = x / 2,
|
||||||
|
h = y / 2,
|
||||||
|
d = z / 2,
|
||||||
|
zp = -d - platformZOff + gridZOff,
|
||||||
|
oldRulersView = rulersView,
|
||||||
|
labelSize = gridUnitMinor * 1.4;
|
||||||
|
|
||||||
|
let canvasInMesh = function(w, h, textAlign, textBaseline) {
|
||||||
|
let canvas = document.createElement('canvas'),
|
||||||
|
ctx = canvas.getContext('2d'),
|
||||||
|
scale = 8,
|
||||||
|
plane,
|
||||||
|
canvasTexture,
|
||||||
|
material,
|
||||||
|
mesh;
|
||||||
|
|
||||||
|
canvas.width = w * scale;
|
||||||
|
canvas.height = h * scale;
|
||||||
|
ctx.scale(scale, scale);
|
||||||
|
ctx.fillStyle = '#333333';
|
||||||
|
ctx.font = labelSize + 'px sans-serif';
|
||||||
|
ctx.textAlign = textAlign;
|
||||||
|
ctx.textBaseline = textBaseline;
|
||||||
|
plane = new THREE.PlaneGeometry(w, h);
|
||||||
|
canvasTexture = new THREE.CanvasTexture(canvas);
|
||||||
|
canvasTexture.minFilter = THREE.LinearFilter;
|
||||||
|
// set 'transparent' to false to debug mesh bounds
|
||||||
|
material = new THREE.MeshBasicMaterial({transparent: true, map: canvasTexture});
|
||||||
|
mesh = new THREE.Mesh(plane, material);
|
||||||
|
return {ctx: ctx, mesh: mesh};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawX || drawY) {
|
||||||
|
rulersView = new THREE.Group();
|
||||||
|
} else {
|
||||||
|
rulersView = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawX) {
|
||||||
|
let xPadding = labelSize * 4;
|
||||||
|
let canvas = canvasInMesh(x + xPadding, labelSize, 'center', 'top');
|
||||||
|
|
||||||
|
for (let i = rulerXFirst; i <= rulerXLast; i += gridUnitMajor) {
|
||||||
|
let label = offsetCenter ? i - (rulerXLast + rulerXFirst) / 2 : i;
|
||||||
|
canvas.ctx.fillText('' + label, i + xPadding / 2, 0);
|
||||||
|
}
|
||||||
|
canvas.mesh.position.set(0, - h - labelSize / 2 - 5, zp);
|
||||||
|
rulersView.add(canvas.mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawY) {
|
||||||
|
let yPadding = labelSize;
|
||||||
|
let canvas = canvasInMesh(labelSize * 4, y + yPadding, 'end', 'middle');
|
||||||
|
|
||||||
|
for (let i = rulerYFirst; i <= rulerYLast; i += gridUnitMajor) {
|
||||||
|
let label = offsetCenter ? i - (rulerYLast + rulerYFirst) / 2 :
|
||||||
|
rulerYFirst + rulerYLast - i;
|
||||||
|
canvas.ctx.fillText('' + label, labelSize * 4, i + yPadding / 2);
|
||||||
|
}
|
||||||
|
canvas.mesh.position.set(-w - labelSize * 2 - 5, 0, zp);
|
||||||
|
rulersView.add(canvas.mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oldRulersView) Space.scene.remove(oldRulersView);
|
||||||
|
if (rulersView) Space.scene.add(rulersView);
|
||||||
|
Space.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
function setGrid(unitMajor, unitMinor, colorMajor, colorMinor) {
|
function setGrid(unitMajor, unitMinor, colorMajor, colorMinor) {
|
||||||
if (!unitMajor) return;
|
if (!unitMajor) return;
|
||||||
let oldGridView = gridView;
|
let oldGridView = gridView;
|
||||||
|
|
@ -249,12 +326,20 @@
|
||||||
d = z / 2,
|
d = z / 2,
|
||||||
zp = -d - platformZOff + gridZOff,
|
zp = -d - platformZOff + gridZOff,
|
||||||
majors = [], minors = unitMinor ? [] : null, i;
|
majors = [], minors = unitMinor ? [] : null, i;
|
||||||
|
|
||||||
|
rulerXFirst = null;
|
||||||
|
rulerXLast = null;
|
||||||
|
rulerYFirst = null;
|
||||||
|
rulerYLast = null;
|
||||||
|
|
||||||
for (i = -xo; i <= xo; i += unitMinor) {
|
for (i = -xo; i <= xo; i += unitMinor) {
|
||||||
let oh = isRound ? Math.sqrt(1-(i/xo)*(i/xo)) * h : h,
|
let oh = isRound ? Math.sqrt(1-(i/xo)*(i/xo)) * h : h,
|
||||||
dM = Math.abs(i % unitMajor);
|
dM = Math.abs(i % unitMajor);
|
||||||
if (i < -w || i > w) continue;
|
if (i < -w || i > w) continue;
|
||||||
if (dM < 1 || Math.abs(unitMajor - dM) < 0.1) {
|
if (dM < 1 || Math.abs(unitMajor - dM) < 0.1) {
|
||||||
majors.append({x:i, y:-oh, z:zp}).append({x:i, y:oh, z:zp});
|
majors.append({x:i, y:-oh, z:zp}).append({x:i, y:oh, z:zp});
|
||||||
|
if (rulerXFirst === null) rulerXFirst = i + w;
|
||||||
|
rulerXLast = i + w;
|
||||||
} else {
|
} else {
|
||||||
minors.append({x:i, y:-oh, z:zp}).append({x:i, y:oh, z:zp});
|
minors.append({x:i, y:-oh, z:zp}).append({x:i, y:oh, z:zp});
|
||||||
}
|
}
|
||||||
|
|
@ -265,6 +350,8 @@
|
||||||
if (i < -h || i > h) continue;
|
if (i < -h || i > h) continue;
|
||||||
if (dM < 1 || Math.abs(unitMajor - dM) < 0.1) {
|
if (dM < 1 || Math.abs(unitMajor - dM) < 0.1) {
|
||||||
majors.append({x:-ow, y:i, z:zp}).append({x:ow, y:i, z:zp});
|
majors.append({x:-ow, y:i, z:zp}).append({x:ow, y:i, z:zp});
|
||||||
|
if (rulerYFirst === null) rulerYFirst = i + h;
|
||||||
|
rulerYLast = i + h;
|
||||||
} else {
|
} else {
|
||||||
minors.append({x:-ow, y:i, z:zp}).append({x:ow, y:i, z:zp});
|
minors.append({x:-ow, y:i, z:zp}).append({x:ow, y:i, z:zp});
|
||||||
}
|
}
|
||||||
|
|
@ -618,6 +705,7 @@
|
||||||
setSize: setPlatformSizeUpdateGrid,
|
setSize: setPlatformSizeUpdateGrid,
|
||||||
setColor: setPlatformColor,
|
setColor: setPlatformColor,
|
||||||
setOrigin: setOrigin,
|
setOrigin: setOrigin,
|
||||||
|
setRulers: setRulers,
|
||||||
setGrid: setGrid,
|
setGrid: setGrid,
|
||||||
add: function(o) { WORLD.add(o) },
|
add: function(o) { WORLD.add(o) },
|
||||||
remove: function(o) { WORLD.remove(o) },
|
remove: function(o) { WORLD.remove(o) },
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue