mirror of
https://github.com/overte-org/overte.git
synced 2025-04-27 06:16:20 +02:00
147 lines
4.7 KiB
C++
147 lines
4.7 KiB
C++
//
|
|
// Base3DOverlay.cpp
|
|
// interface/src/ui/overlays
|
|
//
|
|
// Copyright 2014 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
// include this before QGLWidget, which includes an earlier version of OpenGL
|
|
#include "InterfaceConfig.h"
|
|
|
|
#include <QGLWidget>
|
|
#include <SharedUtil.h>
|
|
|
|
#include "Base3DOverlay.h"
|
|
|
|
const glm::vec3 DEFAULT_POSITION = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
const float DEFAULT_LINE_WIDTH = 1.0f;
|
|
const bool DEFAULT_IS_SOLID = false;
|
|
const bool DEFAULT_IS_DASHED_LINE = false;
|
|
|
|
Base3DOverlay::Base3DOverlay() :
|
|
_position(DEFAULT_POSITION),
|
|
_lineWidth(DEFAULT_LINE_WIDTH),
|
|
_isSolid(DEFAULT_IS_SOLID),
|
|
_isDashedLine(DEFAULT_IS_DASHED_LINE),
|
|
_rotation()
|
|
{
|
|
}
|
|
|
|
Base3DOverlay::~Base3DOverlay() {
|
|
}
|
|
|
|
void Base3DOverlay::setProperties(const QScriptValue& properties) {
|
|
Overlay::setProperties(properties);
|
|
|
|
QScriptValue position = properties.property("position");
|
|
|
|
// if "position" property was not there, check to see if they included aliases: start, point, p1
|
|
if (!position.isValid()) {
|
|
position = properties.property("start");
|
|
if (!position.isValid()) {
|
|
position = properties.property("p1");
|
|
if (!position.isValid()) {
|
|
position = properties.property("point");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (position.isValid()) {
|
|
QScriptValue x = position.property("x");
|
|
QScriptValue y = position.property("y");
|
|
QScriptValue z = position.property("z");
|
|
if (x.isValid() && y.isValid() && z.isValid()) {
|
|
glm::vec3 newPosition;
|
|
newPosition.x = x.toVariant().toFloat();
|
|
newPosition.y = y.toVariant().toFloat();
|
|
newPosition.z = z.toVariant().toFloat();
|
|
setPosition(newPosition);
|
|
}
|
|
}
|
|
|
|
if (properties.property("lineWidth").isValid()) {
|
|
setLineWidth(properties.property("lineWidth").toVariant().toFloat());
|
|
}
|
|
|
|
QScriptValue rotation = properties.property("rotation");
|
|
|
|
if (rotation.isValid()) {
|
|
glm::quat newRotation;
|
|
|
|
// size, scale, dimensions is special, it might just be a single scalar, or it might be a vector, check that here
|
|
QScriptValue x = rotation.property("x");
|
|
QScriptValue y = rotation.property("y");
|
|
QScriptValue z = rotation.property("z");
|
|
QScriptValue w = rotation.property("w");
|
|
|
|
|
|
if (x.isValid() && y.isValid() && z.isValid() && w.isValid()) {
|
|
newRotation.x = x.toVariant().toFloat();
|
|
newRotation.y = y.toVariant().toFloat();
|
|
newRotation.z = z.toVariant().toFloat();
|
|
newRotation.w = w.toVariant().toFloat();
|
|
setRotation(newRotation);
|
|
}
|
|
}
|
|
|
|
if (properties.property("isSolid").isValid()) {
|
|
setIsSolid(properties.property("isSolid").toVariant().toBool());
|
|
}
|
|
if (properties.property("isFilled").isValid()) {
|
|
setIsSolid(properties.property("isSolid").toVariant().toBool());
|
|
}
|
|
if (properties.property("isWire").isValid()) {
|
|
setIsSolid(!properties.property("isWire").toVariant().toBool());
|
|
}
|
|
if (properties.property("solid").isValid()) {
|
|
setIsSolid(properties.property("solid").toVariant().toBool());
|
|
}
|
|
if (properties.property("filled").isValid()) {
|
|
setIsSolid(properties.property("filled").toVariant().toBool());
|
|
}
|
|
if (properties.property("wire").isValid()) {
|
|
setIsSolid(!properties.property("wire").toVariant().toBool());
|
|
}
|
|
|
|
if (properties.property("isDashedLine").isValid()) {
|
|
setIsDashedLine(properties.property("isDashedLine").toVariant().toBool());
|
|
}
|
|
if (properties.property("dashed").isValid()) {
|
|
setIsDashedLine(properties.property("dashed").toVariant().toBool());
|
|
}
|
|
}
|
|
|
|
void Base3DOverlay::drawDashedLine(const glm::vec3& start, const glm::vec3& end) {
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
// draw each line segment with appropriate gaps
|
|
const float dashLength = 0.05f;
|
|
const float gapLength = 0.025f;
|
|
const float segmentLength = dashLength + gapLength;
|
|
float length = glm::distance(start, end);
|
|
float segmentCount = length / segmentLength;
|
|
int segmentCountFloor = (int)glm::floor(segmentCount);
|
|
|
|
glm::vec3 segmentVector = (end - start) / segmentCount;
|
|
glm::vec3 dashVector = segmentVector / segmentLength * dashLength;
|
|
glm::vec3 gapVector = segmentVector / segmentLength * gapLength;
|
|
|
|
glm::vec3 point = start;
|
|
glVertex3f(point.x, point.y, point.z);
|
|
for (int i = 0; i < segmentCountFloor; i++) {
|
|
point += dashVector;
|
|
glVertex3f(point.x, point.y, point.z);
|
|
|
|
point += gapVector;
|
|
glVertex3f(point.x, point.y, point.z);
|
|
}
|
|
glVertex3f(end.x, end.y, end.z);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|