mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 02:19:58 +02:00
Merge pull request #3549 from ZappoMan/editToolsImprovements
add tick marks to planar ellipse/circle overlays
This commit is contained in:
commit
c56923d316
3 changed files with 157 additions and 5 deletions
|
@ -169,7 +169,14 @@ SelectionDisplay = (function () {
|
||||||
alpha: 0.2,
|
alpha: 0.2,
|
||||||
solid: true,
|
solid: true,
|
||||||
visible: false,
|
visible: false,
|
||||||
rotation: yawOverlayRotation
|
rotation: yawOverlayRotation,
|
||||||
|
hasTickMarks: true,
|
||||||
|
majorTickMarksAngle: 12.5,
|
||||||
|
minorTickMarksAngle: 0,
|
||||||
|
majorTickMarksLength: -0.25,
|
||||||
|
minorTickMarksLength: 0,
|
||||||
|
majorTickMarksColor: { red: 0, green: 0, blue: 0 },
|
||||||
|
minorTickMarksColor: { red: 0, green: 0, blue: 0 },
|
||||||
});
|
});
|
||||||
|
|
||||||
var rotateOverlayOuter = Overlays.addOverlay("circle3d", {
|
var rotateOverlayOuter = Overlays.addOverlay("circle3d", {
|
||||||
|
@ -179,7 +186,15 @@ SelectionDisplay = (function () {
|
||||||
alpha: 0.2,
|
alpha: 0.2,
|
||||||
solid: true,
|
solid: true,
|
||||||
visible: false,
|
visible: false,
|
||||||
rotation: yawOverlayRotation
|
rotation: yawOverlayRotation,
|
||||||
|
|
||||||
|
hasTickMarks: true,
|
||||||
|
majorTickMarksAngle: 45.0,
|
||||||
|
minorTickMarksAngle: 5,
|
||||||
|
majorTickMarksLength: 0.25,
|
||||||
|
minorTickMarksLength: 0.1,
|
||||||
|
majorTickMarksColor: { red: 0, green: 0, blue: 0 },
|
||||||
|
minorTickMarksColor: { red: 0, green: 0, blue: 0 },
|
||||||
});
|
});
|
||||||
|
|
||||||
var rotateOverlayCurrent = Overlays.addOverlay("circle3d", {
|
var rotateOverlayCurrent = Overlays.addOverlay("circle3d", {
|
||||||
|
@ -571,7 +586,7 @@ SelectionDisplay = (function () {
|
||||||
innerRadius: 0.9,
|
innerRadius: 0.9,
|
||||||
startAt: 0,
|
startAt: 0,
|
||||||
endAt: 360,
|
endAt: 360,
|
||||||
alpha: outerAlpha
|
alpha: outerAlpha,
|
||||||
});
|
});
|
||||||
|
|
||||||
Overlays.editOverlay(rotateOverlayCurrent,
|
Overlays.editOverlay(rotateOverlayCurrent,
|
||||||
|
@ -584,7 +599,7 @@ SelectionDisplay = (function () {
|
||||||
size: outerRadius,
|
size: outerRadius,
|
||||||
startAt: 0,
|
startAt: 0,
|
||||||
endAt: 0,
|
endAt: 0,
|
||||||
innerRadius: 0.9
|
innerRadius: 0.9,
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: we have not implemented the rotating handle/controls yet... so for now, these handles are hidden
|
// TODO: we have not implemented the rotating handle/controls yet... so for now, these handles are hidden
|
||||||
|
|
|
@ -21,8 +21,15 @@ Circle3DOverlay::Circle3DOverlay() :
|
||||||
_startAt(0.0f),
|
_startAt(0.0f),
|
||||||
_endAt(360.0f),
|
_endAt(360.0f),
|
||||||
_outerRadius(1.0f),
|
_outerRadius(1.0f),
|
||||||
_innerRadius(0.0f)
|
_innerRadius(0.0f),
|
||||||
|
_hasTickMarks(false),
|
||||||
|
_majorTickMarksAngle(0.0f),
|
||||||
|
_minorTickMarksAngle(0.0f),
|
||||||
|
_majorTickMarksLength(0.0f),
|
||||||
|
_minorTickMarksLength(0.0f)
|
||||||
{
|
{
|
||||||
|
_majorTickMarksColor.red = _majorTickMarksColor.green = _majorTickMarksColor.blue = (unsigned char)0;
|
||||||
|
_minorTickMarksColor.red = _minorTickMarksColor.green = _minorTickMarksColor.blue = (unsigned char)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Circle3DOverlay::~Circle3DOverlay() {
|
Circle3DOverlay::~Circle3DOverlay() {
|
||||||
|
@ -142,6 +149,66 @@ void Circle3DOverlay::render() {
|
||||||
glVertex2f(lastOuterPoint.x, lastOuterPoint.y);
|
glVertex2f(lastOuterPoint.x, lastOuterPoint.y);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// draw our tick marks
|
||||||
|
// for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise
|
||||||
|
// we just draw a line...
|
||||||
|
if (getHasTickMarks()) {
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
|
// draw our major tick marks
|
||||||
|
if (getMajorTickMarksAngle() > 0.0f && getMajorTickMarksLength() != 0.0f) {
|
||||||
|
|
||||||
|
xColor color = getMajorTickMarksColor();
|
||||||
|
glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
||||||
|
|
||||||
|
float angle = startAt;
|
||||||
|
float angleInRadians = glm::radians(angle);
|
||||||
|
float tickMarkLength = getMajorTickMarksLength();
|
||||||
|
float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius;
|
||||||
|
float endRadius = startRadius + tickMarkLength;
|
||||||
|
|
||||||
|
while (angle <= endAt) {
|
||||||
|
angleInRadians = glm::radians(angle);
|
||||||
|
|
||||||
|
glm::vec2 thisPointA(cos(angleInRadians) * startRadius, sin(angleInRadians) * startRadius);
|
||||||
|
glm::vec2 thisPointB(cos(angleInRadians) * endRadius, sin(angleInRadians) * endRadius);
|
||||||
|
|
||||||
|
glVertex2f(thisPointA.x, thisPointA.y);
|
||||||
|
glVertex2f(thisPointB.x, thisPointB.y);
|
||||||
|
|
||||||
|
angle += getMajorTickMarksAngle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw our minor tick marks
|
||||||
|
if (getMinorTickMarksAngle() > 0.0f && getMinorTickMarksLength() != 0.0f) {
|
||||||
|
|
||||||
|
xColor color = getMinorTickMarksColor();
|
||||||
|
glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
||||||
|
|
||||||
|
float angle = startAt;
|
||||||
|
float angleInRadians = glm::radians(angle);
|
||||||
|
float tickMarkLength = getMinorTickMarksLength();
|
||||||
|
float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius;
|
||||||
|
float endRadius = startRadius + tickMarkLength;
|
||||||
|
|
||||||
|
while (angle <= endAt) {
|
||||||
|
angleInRadians = glm::radians(angle);
|
||||||
|
|
||||||
|
glm::vec2 thisPointA(cos(angleInRadians) * startRadius, sin(angleInRadians) * startRadius);
|
||||||
|
glm::vec2 thisPointB(cos(angleInRadians) * endRadius, sin(angleInRadians) * endRadius);
|
||||||
|
|
||||||
|
glVertex2f(thisPointA.x, thisPointA.y);
|
||||||
|
glVertex2f(thisPointB.x, thisPointB.y);
|
||||||
|
|
||||||
|
angle += getMinorTickMarksAngle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
@ -173,6 +240,55 @@ void Circle3DOverlay::setProperties(const QScriptValue &properties) {
|
||||||
if (innerRadius.isValid()) {
|
if (innerRadius.isValid()) {
|
||||||
setInnerRadius(innerRadius.toVariant().toFloat());
|
setInnerRadius(innerRadius.toVariant().toFloat());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QScriptValue hasTickMarks = properties.property("hasTickMarks");
|
||||||
|
if (hasTickMarks.isValid()) {
|
||||||
|
setHasTickMarks(hasTickMarks.toVariant().toBool());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue majorTickMarksAngle = properties.property("majorTickMarksAngle");
|
||||||
|
if (majorTickMarksAngle.isValid()) {
|
||||||
|
setMajorTickMarksAngle(majorTickMarksAngle.toVariant().toFloat());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue minorTickMarksAngle = properties.property("minorTickMarksAngle");
|
||||||
|
if (minorTickMarksAngle.isValid()) {
|
||||||
|
setMinorTickMarksAngle(minorTickMarksAngle.toVariant().toFloat());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue majorTickMarksLength = properties.property("majorTickMarksLength");
|
||||||
|
if (majorTickMarksLength.isValid()) {
|
||||||
|
setMajorTickMarksLength(majorTickMarksLength.toVariant().toFloat());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue minorTickMarksLength = properties.property("minorTickMarksLength");
|
||||||
|
if (minorTickMarksLength.isValid()) {
|
||||||
|
setMinorTickMarksLength(minorTickMarksLength.toVariant().toFloat());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue majorTickMarksColor = properties.property("majorTickMarksColor");
|
||||||
|
if (majorTickMarksColor.isValid()) {
|
||||||
|
QScriptValue red = majorTickMarksColor.property("red");
|
||||||
|
QScriptValue green = majorTickMarksColor.property("green");
|
||||||
|
QScriptValue blue = majorTickMarksColor.property("blue");
|
||||||
|
if (red.isValid() && green.isValid() && blue.isValid()) {
|
||||||
|
_majorTickMarksColor.red = red.toVariant().toInt();
|
||||||
|
_majorTickMarksColor.green = green.toVariant().toInt();
|
||||||
|
_majorTickMarksColor.blue = blue.toVariant().toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue minorTickMarksColor = properties.property("minorTickMarksColor");
|
||||||
|
if (minorTickMarksColor.isValid()) {
|
||||||
|
QScriptValue red = minorTickMarksColor.property("red");
|
||||||
|
QScriptValue green = minorTickMarksColor.property("green");
|
||||||
|
QScriptValue blue = minorTickMarksColor.property("blue");
|
||||||
|
if (red.isValid() && green.isValid() && blue.isValid()) {
|
||||||
|
_minorTickMarksColor.red = red.toVariant().toInt();
|
||||||
|
_minorTickMarksColor.green = green.toVariant().toInt();
|
||||||
|
_minorTickMarksColor.blue = blue.toVariant().toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,17 +26,38 @@ public:
|
||||||
float getEndAt() const { return _endAt; }
|
float getEndAt() const { return _endAt; }
|
||||||
float getOuterRadius() const { return _outerRadius; }
|
float getOuterRadius() const { return _outerRadius; }
|
||||||
float getInnerRadius() const { return _innerRadius; }
|
float getInnerRadius() const { return _innerRadius; }
|
||||||
|
bool getHasTickMarks() const { return _hasTickMarks; }
|
||||||
|
float getMajorTickMarksAngle() const { return _majorTickMarksAngle; }
|
||||||
|
float getMinorTickMarksAngle() const { return _minorTickMarksAngle; }
|
||||||
|
float getMajorTickMarksLength() const { return _majorTickMarksLength; }
|
||||||
|
float getMinorTickMarksLength() const { return _minorTickMarksLength; }
|
||||||
|
xColor getMajorTickMarksColor() const { return _majorTickMarksColor; }
|
||||||
|
xColor getMinorTickMarksColor() const { return _minorTickMarksColor; }
|
||||||
|
|
||||||
void setStartAt(float value) { _startAt = value; }
|
void setStartAt(float value) { _startAt = value; }
|
||||||
void setEndAt(float value) { _endAt = value; }
|
void setEndAt(float value) { _endAt = value; }
|
||||||
void setOuterRadius(float value) { _outerRadius = value; }
|
void setOuterRadius(float value) { _outerRadius = value; }
|
||||||
void setInnerRadius(float value) { _innerRadius = value; }
|
void setInnerRadius(float value) { _innerRadius = value; }
|
||||||
|
void setHasTickMarks(bool value) { _hasTickMarks = value; }
|
||||||
|
void setMajorTickMarksAngle(float value) { _majorTickMarksAngle = value; }
|
||||||
|
void setMinorTickMarksAngle(float value) { _minorTickMarksAngle = value; }
|
||||||
|
void setMajorTickMarksLength(float value) { _majorTickMarksLength = value; }
|
||||||
|
void setMinorTickMarksLength(float value) { _minorTickMarksLength = value; }
|
||||||
|
void setMajorTickMarksColor(const xColor& value) { _majorTickMarksColor = value; }
|
||||||
|
void setMinorTickMarksColor(const xColor& value) { _minorTickMarksColor = value; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float _startAt;
|
float _startAt;
|
||||||
float _endAt;
|
float _endAt;
|
||||||
float _outerRadius;
|
float _outerRadius;
|
||||||
float _innerRadius;
|
float _innerRadius;
|
||||||
|
bool _hasTickMarks;
|
||||||
|
float _majorTickMarksAngle;
|
||||||
|
float _minorTickMarksAngle;
|
||||||
|
float _majorTickMarksLength;
|
||||||
|
float _minorTickMarksLength;
|
||||||
|
xColor _majorTickMarksColor;
|
||||||
|
xColor _minorTickMarksColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue