mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
151 lines
3.3 KiB
JavaScript
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;
|