ShadowEditor/editor/js/Sidebar.Geometry.LatheGeometry.js
2018-06-07 19:50:07 +08:00

151 lines
3.3 KiB
JavaScript

/**
* @author rfm1201
*/
Sidebar.Geometry.LatheGeometry = function (editor, object) {
var signals = editor.signals;
var container = new UI.Row();
var geometry = object.geometry;
var parameters = geometry.parameters;
// segments
var segmentsRow = new UI.Row();
var segments = new UI.Integer(parameters.segments).onChange(update);
segmentsRow.add(new UI.Text('段数').setWidth('90px'));
segmentsRow.add(segments);
container.add(segmentsRow);
// phiStart
var phiStartRow = new UI.Row();
var phiStart = new UI.Number(parameters.phiStart * 180 / Math.PI).onChange(update);
phiStartRow.add(new UI.Text('φ开始 (°)').setWidth('90px'));
phiStartRow.add(phiStart);
container.add(phiStartRow);
// phiLength
var phiLengthRow = new UI.Row();
var phiLength = new UI.Number(parameters.phiLength * 180 / Math.PI).onChange(update);
phiLengthRow.add(new UI.Text('φ长度(°)').setWidth('90px'));
phiLengthRow.add(phiLength);
container.add(phiLengthRow);
// points
var lastPointIdx = 0;
var pointsUI = [];
var pointsRow = new UI.Row();
pointsRow.add(new UI.Text('点').setWidth('90px'));
var points = new UI.Span().setDisplay('inline-block');
pointsRow.add(points);
var pointsList = new UI.Div();
points.add(pointsList);
for (var i = 0; i < parameters.points.length; i++) {
var point = parameters.points[i];
pointsList.add(createPointRow(point.x, point.y));
}
var addPointButton = new UI.Button('+').onClick(function () {
if (pointsUI.length === 0) {
pointsList.add(createPointRow(0, 0));
} else {
var point = pointsUI[pointsUI.length - 1];
pointsList.add(createPointRow(point.x.getValue(), point.y.getValue()));
}
update();
});
points.add(addPointButton);
container.add(pointsRow);
//
function createPointRow(x, y) {
var pointRow = new UI.Div();
var lbl = new UI.Text(lastPointIdx + 1).setWidth('20px');
var txtX = new UI.Number(x).setRange(0, Infinity).setWidth('40px').onChange(update);
var txtY = new UI.Number(y).setWidth('40px').onChange(update);
var idx = lastPointIdx;
var btn = new UI.Button('-').onClick(function () {
deletePointRow(idx);
});
pointsUI.push({ row: pointRow, lbl: lbl, x: txtX, y: txtY });
lastPointIdx++;
pointRow.add(lbl, txtX, txtY, btn);
return pointRow;
}
function deletePointRow(idx) {
if (!pointsUI[idx]) return;
pointsList.remove(pointsUI[idx].row);
pointsUI[idx] = null;
update();
}
function update() {
var points = [];
var count = 0;
for (var i = 0; i < pointsUI.length; i++) {
var pointUI = pointsUI[i];
if (!pointUI) continue;
points.push(new THREE.Vector2(pointUI.x.getValue(), pointUI.y.getValue()));
count++;
pointUI.lbl.setValue(count);
}
editor.execute(new SetGeometryCommand(object, new THREE[geometry.type](
points,
segments.getValue(),
phiStart.getValue() / 180 * Math.PI,
phiLength.getValue() / 180 * Math.PI
)));
}
return container;
};
Sidebar.Geometry.LatheBufferGeometry = Sidebar.Geometry.LatheGeometry;