Lasers and teleport scale with avatar

This commit is contained in:
luiscuenca 2017-11-07 16:57:55 -07:00
parent d5eb670819
commit 332cb48a41
18 changed files with 59 additions and 18 deletions

View file

@ -7,7 +7,7 @@
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
////
#include "LaserPointer.h"
#include "Application.h"
@ -15,7 +15,7 @@
#include "RayPickScriptingInterface.h"
LaserPointer::LaserPointer(const QVariant& rayProps, const RenderStateMap& renderStates, const DefaultRenderStateMap& defaultRenderStates,
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool enabled) :
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool scaleWithAvatar, const bool enabled) :
_renderingEnabled(enabled),
_renderStates(renderStates),
_defaultRenderStates(defaultRenderStates),
@ -23,6 +23,7 @@ LaserPointer::LaserPointer(const QVariant& rayProps, const RenderStateMap& rende
_centerEndY(centerEndY),
_lockEnd(lockEnd),
_distanceScaleEnd(distanceScaleEnd),
_scaleWithAvatar(scaleWithAvatar),
_rayPickUID(DependencyManager::get<RayPickScriptingInterface>()->createRayPick(rayProps))
{
@ -151,6 +152,9 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter
}
}
}
float avatarScale = DependencyManager::get<AvatarManager>()->getMyAvatar()->getAvatarScale();
QVariant end = vec3toVariant(endVec);
if (!renderState.getPathID().isNull()) {
QVariantMap pathProps;
@ -158,6 +162,11 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter
pathProps.insert("end", end);
pathProps.insert("visible", true);
pathProps.insert("ignoreRayIntersection", renderState.doesPathIgnoreRays());
if (_scaleWithAvatar) {
auto glowScaleProp = qApp->getOverlays().getProperty(renderState.getPathID(), "glowScale").value;
float glowScale = glowScaleProp.isValid() ? avatarScale * glowScaleProp.toFloat() : avatarScale;
pathProps.insert("glowScale", glowScale);
}
qApp->getOverlays().editOverlay(renderState.getPathID(), pathProps);
}
if (!renderState.getEndID().isNull()) {
@ -165,7 +174,7 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter
glm::quat faceAvatarRotation = DependencyManager::get<AvatarManager>()->getMyAvatar()->getOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, 180.0f, 0.0f)));
glm::vec3 dim = vec3FromVariant(qApp->getOverlays().getProperty(renderState.getEndID(), "dimensions").value);
if (_distanceScaleEnd) {
dim = renderState.getEndDim() * glm::distance(pickRay.origin, endVec) * DependencyManager::get<AvatarManager>()->getMyAvatar()->getSensorToWorldScale();
dim = renderState.getEndDim() * glm::distance(pickRay.origin, endVec);
endProps.insert("dimensions", vec3toVariant(dim));
}
if (_centerEndY) {
@ -211,6 +220,7 @@ void LaserPointer::update() {
if (_renderingEnabled && !_currentRenderState.empty() && _renderStates.find(_currentRenderState) != _renderStates.end() &&
(prevRayPickResult.type != IntersectionType::NONE || _laserLength > 0.0f || !_objectLockEnd.first.isNull())) {
float distance = _laserLength > 0.0f ? _laserLength : prevRayPickResult.distance;
qDebug() << &_currentRenderState;
updateRenderState(_renderStates[_currentRenderState], prevRayPickResult.type, distance, prevRayPickResult.objectID, prevRayPickResult.searchRay, false);
disableRenderState(_defaultRenderStates[_currentRenderState].second);
} else if (_renderingEnabled && !_currentRenderState.empty() && _defaultRenderStates.find(_currentRenderState) != _defaultRenderStates.end()) {

View file

@ -60,7 +60,7 @@ public:
typedef std::unordered_map<std::string, std::pair<float, RenderState>> DefaultRenderStateMap;
LaserPointer(const QVariant& rayProps, const RenderStateMap& renderStates, const DefaultRenderStateMap& defaultRenderStates,
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool enabled);
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool scaleWithAvatar, const bool enabled);
~LaserPointer();
QUuid getRayUID() { return _rayPickUID; }
@ -91,6 +91,7 @@ private:
bool _centerEndY;
bool _lockEnd;
bool _distanceScaleEnd;
bool _scaleWithAvatar;
std::pair<QUuid, bool> _objectLockEnd { std::pair<QUuid, bool>(QUuid(), false)};
const QUuid _rayPickUID;

View file

@ -11,9 +11,9 @@
#include "LaserPointerManager.h"
QUuid LaserPointerManager::createLaserPointer(const QVariant& rayProps, const LaserPointer::RenderStateMap& renderStates, const LaserPointer::DefaultRenderStateMap& defaultRenderStates,
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool enabled) {
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool scaleWithAvatar, const bool enabled) {
QUuid result;
std::shared_ptr<LaserPointer> laserPointer = std::make_shared<LaserPointer>(rayProps, renderStates, defaultRenderStates, faceAvatar, centerEndY, lockEnd, distanceScaleEnd, enabled);
std::shared_ptr<LaserPointer> laserPointer = std::make_shared<LaserPointer>(rayProps, renderStates, defaultRenderStates, faceAvatar, centerEndY, lockEnd, distanceScaleEnd, scaleWithAvatar, enabled);
if (!laserPointer->getRayUID().isNull()) {
result = QUuid::createUuid();
withWriteLock([&] { _laserPointers[result] = laserPointer; });

View file

@ -25,7 +25,7 @@ class LaserPointerManager : protected ReadWriteLockable {
public:
QUuid createLaserPointer(const QVariant& rayProps, const LaserPointer::RenderStateMap& renderStates, const LaserPointer::DefaultRenderStateMap& defaultRenderStates,
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool enabled);
const bool faceAvatar, const bool centerEndY, const bool lockEnd, const bool distanceScaleEnd, const bool scaleWithAvatar, const bool enabled);
void removeLaserPointer(const QUuid& uid);
void enableLaserPointer(const QUuid& uid) const;

View file

@ -7,7 +7,7 @@
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
////
#include "LaserPointerScriptingInterface.h"
@ -51,6 +51,11 @@ QUuid LaserPointerScriptingInterface::createLaserPointer(const QVariant& propert
enabled = propertyMap["enabled"].toBool();
}
bool scaleWithAvatar = false;
if (propertyMap["scaleWithAvatar"].isValid()) {
scaleWithAvatar = propertyMap["scaleWithAvatar"].toBool();
}
LaserPointer::RenderStateMap renderStates;
if (propertyMap["renderStates"].isValid()) {
QList<QVariant> renderStateVariants = propertyMap["renderStates"].toList();
@ -80,7 +85,7 @@ QUuid LaserPointerScriptingInterface::createLaserPointer(const QVariant& propert
}
}
return qApp->getLaserPointerManager().createLaserPointer(properties, renderStates, defaultRenderStates, faceAvatar, centerEndY, lockEnd, distanceScaleEnd, enabled);
return qApp->getLaserPointerManager().createLaserPointer(properties, renderStates, defaultRenderStates, faceAvatar, centerEndY, lockEnd, distanceScaleEnd, scaleWithAvatar, enabled);
}
void LaserPointerScriptingInterface::editRenderState(const QUuid& uid, const QString& renderState, const QVariant& properties) const {

View file

@ -12,6 +12,7 @@
#include <GeometryCache.h>
#include <RegisteredMetaTypes.h>
#include <Application.h>
#include "AbstractViewStateInterface.h"
@ -35,6 +36,7 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
_endParentJointIndex = line3DOverlay->getEndJointIndex();
_glow = line3DOverlay->getGlow();
_glowWidth = line3DOverlay->getGlowWidth();
_glowScale = line3DOverlay->getGlowScale();
}
Line3DOverlay::~Line3DOverlay() {
@ -145,7 +147,7 @@ void Line3DOverlay::render(RenderArgs* args) {
geometryCache->renderDashedLine(*batch, start, end, colorv4, _geometryCacheID);
} else {
// renderGlowLine handles both glow = 0 and glow > 0 cases
geometryCache->renderGlowLine(*batch, start, end, colorv4, _glow, _glowWidth, _geometryCacheID);
geometryCache->renderGlowLine(*batch, start, end, colorv4, _glow, _glowWidth, _glowScale, _geometryCacheID);
}
}
}
@ -244,6 +246,12 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) {
setGlowWidth(glowWidth.toFloat());
}
auto glowScale = properties["glowScale"];
if (glowScale.isValid()) {
float gscale = glowScale.toFloat();
setGlowScale(gscale);
}
}
QVariant Line3DOverlay::getProperty(const QString& property) {

View file

@ -33,6 +33,7 @@ public:
glm::vec3 getEnd() const;
const float& getGlow() const { return _glow; }
const float& getGlowWidth() const { return _glowWidth; }
const float& getGlowScale() const { return _glowScale; }
// setters
void setStart(const glm::vec3& start);
@ -43,6 +44,7 @@ public:
void setGlow(const float& glow) { _glow = glow; }
void setGlowWidth(const float& glowWidth) { _glowWidth = glowWidth; }
void setGlowScale(const float& glowScale) { _glowScale = glowScale; }
void setProperties(const QVariantMap& properties) override;
QVariant getProperty(const QString& property) override;
@ -72,6 +74,7 @@ private:
float _glow { 0.0 };
float _glowWidth { 0.0 };
float _glowScale{ 1.0 };
int _geometryCacheID;
};

View file

@ -1868,7 +1868,7 @@ void GeometryCache::renderLine(gpu::Batch& batch, const glm::vec2& p1, const glm
void GeometryCache::renderGlowLine(gpu::Batch& batch, const glm::vec3& p1, const glm::vec3& p2,
const glm::vec4& color, float glowIntensity, float glowWidth, int id) {
const glm::vec4& color, float glowIntensity, float glowWidth, float glowScale, int id) {
// Disable glow lines on OSX
#ifndef Q_OS_WIN
@ -1931,9 +1931,10 @@ void GeometryCache::renderGlowLine(gpu::Batch& batch, const glm::vec3& p1, const
vec4 p1;
vec4 p2;
vec4 color;
float scale;
};
LineData lineData { vec4(p1, 1.0f), vec4(p2, 1.0f), color };
LineData lineData { vec4(p1, 1.0f), vec4(p2, 1.0f), color, glowScale };
details.uniformBuffer->resize(sizeof(LineData));
details.uniformBuffer->setSubData(0, lineData);
}

View file

@ -248,7 +248,7 @@ public:
renderWireCubeInstance(args, batch, glm::vec4(color, 1.0f), pipeline);
}
// Dynamic geometry
// //Dynamic geometry
void renderShape(gpu::Batch& batch, Shape shape);
void renderWireShape(gpu::Batch& batch, Shape shape);
size_t getShapeTriangleCount(Shape shape);
@ -314,10 +314,10 @@ public:
const glm::vec4& color1, const glm::vec4& color2, int id);
void renderGlowLine(gpu::Batch& batch, const glm::vec3& p1, const glm::vec3& p2,
const glm::vec4& color, float glowIntensity, float glowWidth, int id);
const glm::vec4& color, float glowIntensity, float glowWidth, float glowScale, int id);
void renderGlowLine(gpu::Batch& batch, const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color, int id)
{ renderGlowLine(batch, p1, p2, color, 1.0f, 0.05f, id); }
{ renderGlowLine(batch, p1, p2, color, 1.0f, 0.05f, 1.0f, id); }
void renderDashedLine(gpu::Batch& batch, const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id)
{ renderDashedLine(batch, start, end, color, 0.05f, 0.025f, id); }

View file

@ -10,8 +10,9 @@
//
in vec4 _color;
in float distanceFromCenter;
in float _scale;
in float distanceFromCenter;
out vec4 _fragColor;
void main(void) {
@ -21,7 +22,7 @@ void main(void) {
float alpha = 1.0 - abs(distanceFromCenter);
// Convert from a linear alpha curve to a sharp peaked one
alpha = _color.a * pow(alpha, 10.0);
alpha = _color.a * pow(alpha, 10.0/_scale);
// Drop everything where the curve falls off to nearly nothing
if (alpha <= 0.05) {

View file

@ -16,14 +16,17 @@ layout(std140) uniform lineData {
vec4 p1;
vec4 p2;
vec4 color;
float scale;
};
out vec4 _color;
out float _scale;
// the distance from the center in 'quad space'
out float distanceFromCenter;
void main(void) {
_color = color;
_scale = scale;
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();

View file

@ -584,6 +584,7 @@ Script.include("/~/system/libraries/controllers.js");
renderStates: renderStates,
faceAvatar: true,
distanceScaleEnd: true,
scaleWithAvatar: true,
defaultRenderStates: defaultRenderStates
});
}

View file

@ -190,6 +190,7 @@ Script.include("/~/system/libraries/controllers.js");
renderStates: renderStates,
faceAvatar: true,
distanceScaleEnd: true,
scaleWithAvatar: true,
defaultRenderStates: defaultRenderStates
});

View file

@ -237,6 +237,7 @@ Script.include("/~/system/libraries/utils.js");
posOffset: getGrabPointSphereOffset(this.handToController(), true),
renderStates: renderStates,
faceAvatar: true,
scaleWithAvatar: true,
defaultRenderStates: defaultRenderStates
});

View file

@ -371,6 +371,7 @@ Script.include("/~/system/libraries/controllers.js");
posOffset: getGrabPointSphereOffset(this.handToController(), true),
renderStates: renderStates,
faceAvatar: true,
scaleWithAvatar: true,
defaultRenderStates: defaultRenderStates
});

View file

@ -153,6 +153,7 @@ Script.include("/~/system/libraries/controllers.js");
joint: (_this.hand === RIGHT_HAND) ? "RightHand" : "LeftHand",
filter: RayPick.PICK_ENTITIES,
faceAvatar: true,
scaleWithAvatar: true,
centerEndY: false,
renderStates: teleportRenderStates,
defaultRenderStates: teleportDefaultRenderStates
@ -161,6 +162,7 @@ Script.include("/~/system/libraries/controllers.js");
joint: (_this.hand === RIGHT_HAND) ? "RightHand" : "LeftHand",
filter: RayPick.PICK_ENTITIES | RayPick.PICK_INCLUDE_INVISIBLE,
faceAvatar: true,
scaleWithAvatar: true,
centerEndY: false,
renderStates: teleportRenderStates
});
@ -168,6 +170,7 @@ Script.include("/~/system/libraries/controllers.js");
joint: "Avatar",
filter: RayPick.PICK_ENTITIES,
faceAvatar: true,
scaleWithAvatar: true,
centerEndY: false,
renderStates: teleportRenderStates,
defaultRenderStates: teleportDefaultRenderStates
@ -176,6 +179,7 @@ Script.include("/~/system/libraries/controllers.js");
joint: "Avatar",
filter: RayPick.PICK_ENTITIES | RayPick.PICK_INCLUDE_INVISIBLE,
faceAvatar: true,
scaleWithAvatar: true,
centerEndY: false,
renderStates: teleportRenderStates
});

View file

@ -88,7 +88,6 @@ Script.include("/~/system/libraries/controllers.js");
{name: "hold", distance: DEFAULT_SEARCH_SPHERE_DISTANCE, path: holdPath}
];
// triggered when stylus presses a web overlay/entity
var HAPTIC_STYLUS_STRENGTH = 1.0;
var HAPTIC_STYLUS_DURATION = 20.0;
@ -452,6 +451,7 @@ Script.include("/~/system/libraries/controllers.js");
posOffset: getGrabPointSphereOffset(this.handToController(), true),
renderStates: renderStates,
faceAvatar: true,
scaleWithAvatar: true,
defaultRenderStates: defaultRenderStates
});
}

View file

@ -150,6 +150,7 @@ Laser = function (side) {
}
function update(hand) {
return;
var handPosition,
handOrientation,
deltaOrigin,