()->handleLookupString(homeLocation);
}
diff --git a/interface/src/ui/AvatarInputs.h b/interface/src/ui/AvatarInputs.h
index a9d1509770..e67d35e59f 100644
--- a/interface/src/ui/AvatarInputs.h
+++ b/interface/src/ui/AvatarInputs.h
@@ -26,6 +26,10 @@ class AvatarInputs : public QObject {
/**jsdoc
* API to help manage your Avatar's input
* @namespace AvatarInputs
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {boolean} cameraEnabled Read-only.
* @property {boolean} cameraMuted Read-only.
* @property {boolean} isHMD Read-only.
diff --git a/interface/src/ui/overlays/ContextOverlayInterface.h b/interface/src/ui/overlays/ContextOverlayInterface.h
index b80a3a70fb..808c3a4ee3 100644
--- a/interface/src/ui/overlays/ContextOverlayInterface.h
+++ b/interface/src/ui/overlays/ContextOverlayInterface.h
@@ -31,9 +31,6 @@
#include "EntityTree.h"
#include "ContextOverlayLogging.h"
-/**jsdoc
-* @namespace ContextOverlay
-*/
class ContextOverlayInterface : public QObject, public Dependency {
Q_OBJECT
diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h
index c2f6e3e693..cf1151b46a 100644
--- a/interface/src/ui/overlays/Overlays.h
+++ b/interface/src/ui/overlays/Overlays.h
@@ -76,6 +76,10 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R
* The Overlays API provides facilities to create and interact with overlays. Overlays are 2D and 3D objects visible only to
* yourself and that aren't persisted to the domain. They are used for UI.
* @namespace Overlays
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {Uuid} keyboardFocusOverlay - Get or set the {@link Overlays.OverlayType|web3d} overlay that has keyboard focus.
* If no overlay has keyboard focus, get returns null
; set to null
or {@link Uuid|Uuid.NULL} to
* clear keyboard focus.
diff --git a/libraries/animation/src/AnimationCache.h b/libraries/animation/src/AnimationCache.h
index 103b620254..d8f8a13cde 100644
--- a/libraries/animation/src/AnimationCache.h
+++ b/libraries/animation/src/AnimationCache.h
@@ -37,6 +37,10 @@ public:
* API to manage animation cache resources.
* @namespace AnimationCache
*
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-assignment-client
+ *
* @property {number} numTotal - Total number of total resources. Read-only.
* @property {number} numCached - Total number of cached resource. Read-only.
* @property {number} sizeTotal - Size in bytes of all resources. Read-only.
diff --git a/libraries/audio-client/src/AudioIOStats.h b/libraries/audio-client/src/AudioIOStats.h
index 89db4942ec..45fcf365da 100644
--- a/libraries/audio-client/src/AudioIOStats.h
+++ b/libraries/audio-client/src/AudioIOStats.h
@@ -41,6 +41,10 @@ class AudioStreamStatsInterface : public QObject {
/**jsdoc
* @class AudioStats.AudioStreamStats
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {number} lossRate Read-only.
* @property {number} lossCount Read-only.
* @property {number} lossRateWindow Read-only.
@@ -185,6 +189,10 @@ class AudioStatsInterface : public QObject {
/**jsdoc
* Audio stats from the client.
* @namespace AudioStats
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {number} pingMs Read-only.
* @property {number} inputReadMsMax Read-only.
* @property {number} inputUnplayedMsMax Read-only.
diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp
index 172ec9411a..d60c5ba4ab 100644
--- a/libraries/audio/src/InboundAudioStream.cpp
+++ b/libraries/audio/src/InboundAudioStream.cpp
@@ -150,6 +150,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) {
// fall through to OnTime case
}
+ // FALLTHRU
case SequenceNumberStats::OnTime: {
// Packet is on time; parse its data to the ringbuffer
if (message.getType() == PacketType::SilentAudioFrame
diff --git a/libraries/audio/src/SoundCache.h b/libraries/audio/src/SoundCache.h
index 039e815ff3..347f324353 100644
--- a/libraries/audio/src/SoundCache.h
+++ b/libraries/audio/src/SoundCache.h
@@ -29,6 +29,11 @@ public:
* API to manage sound cache resources.
* @namespace SoundCache
*
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property {number} numTotal - Total number of total resources. Read-only.
* @property {number} numCached - Total number of cached resource. Read-only.
* @property {number} sizeTotal - Size in bytes of all resources. Read-only.
diff --git a/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h b/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
index 3c3858e2ba..5bc7357dd7 100644
--- a/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
+++ b/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
@@ -54,6 +54,9 @@ class UserInputMapper;
*
*
* @class MappingObject
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
/**jsdoc
diff --git a/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h b/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
index d33f3e3383..804709ebfa 100644
--- a/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
+++ b/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
@@ -36,6 +36,9 @@ class ScriptingInterface;
* types.
*
* @class RouteObject
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
// TODO migrate functionality to a RouteBuilder class and make the proxy defer to that
diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
index f33af1b580..59cd637ca0 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
@@ -147,20 +147,21 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() {
batch.setViewportTransform(ivec4(uvec2(0), getRecommendedRenderSize()));
batch.draw(gpu::TRIANGLE_STRIP, 4);
});
-
- // render stick head
- auto jumpTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getJumpButtonPosition(),
- _virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize);
- render([&](gpu::Batch& batch) {
- batch.enableStereo(false);
- batch.setProjectionTransform(mat4());
- batch.setPipeline(_cursorPipeline);
- batch.setResourceTexture(0, _virtualPadJumpBtnTexture);
- batch.resetViewTransform();
- batch.setModelTransform(jumpTransform);
- batch.setViewportTransform(ivec4(uvec2(0), getRecommendedRenderSize()));
- batch.draw(gpu::TRIANGLE_STRIP, 4);
- });
+ if (!virtualPadManager.getLeftVirtualPad()->isBeingTouched()) {
+ // render stick head
+ auto jumpTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getJumpButtonPosition(),
+ _virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize);
+ render([&](gpu::Batch& batch) {
+ batch.enableStereo(false);
+ batch.setProjectionTransform(mat4());
+ batch.setPipeline(_cursorPipeline);
+ batch.setResourceTexture(0, _virtualPadJumpBtnTexture);
+ batch.resetViewTransform();
+ batch.setModelTransform(jumpTransform);
+ batch.setViewportTransform(ivec4(uvec2(0), getRecommendedRenderSize()));
+ batch.draw(gpu::TRIANGLE_STRIP, 4);
+ });
+ }
}
#endif
Parent::compositeExtra();
diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
index bc6ed63363..fb712c26fa 100644
--- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h
+++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
@@ -174,6 +174,10 @@ private:
/**jsdoc
* @namespace Reticle
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {boolean} allowMouseCapture
* @property {number} depth
* @property {Vec2} maximumPosition
diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h
index 5e76d18515..8adb5138f2 100644
--- a/libraries/entities/src/EntityScriptingInterface.h
+++ b/libraries/entities/src/EntityScriptingInterface.h
@@ -94,6 +94,12 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra
* Interface has displayed and so knows about.
*
* @namespace Entities
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property {Uuid} keyboardFocusEntity - Get or set the {@link Entities.EntityType|Web} entity that has keyboard focus.
* If no entity has keyboard focus, get returns null
; set to null
or {@link Uuid|Uuid.NULL} to
* clear keyboard focus.
diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp
index b56f367e0a..3149527216 100644
--- a/libraries/entities/src/EntityTree.cpp
+++ b/libraries/entities/src/EntityTree.cpp
@@ -1402,6 +1402,7 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c
case PacketType::EntityAdd:
isAdd = true; // fall through to next case
+ // FALLTHRU
case PacketType::EntityPhysics:
case PacketType::EntityEdit: {
quint64 startDecode = 0, endDecode = 0;
diff --git a/libraries/fbx/src/FBX.h b/libraries/fbx/src/FBX.h
index a609d85fc8..ce3fc52c3a 100644
--- a/libraries/fbx/src/FBX.h
+++ b/libraries/fbx/src/FBX.h
@@ -298,6 +298,7 @@ public:
bool hasSkeletonJoints;
QVector meshes;
+ QVector scripts;
QHash materials;
diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp
index e8365e38b7..801edddb06 100644
--- a/libraries/fbx/src/FBXReader_Mesh.cpp
+++ b/libraries/fbx/src/FBXReader_Mesh.cpp
@@ -249,7 +249,7 @@ ExtractedMesh FBXReader::extractMesh(const FBXNode& object, unsigned int& meshIn
indexToDirect = true;
}
}
- if (indexToDirect && data.normalIndices.isEmpty()) {
+ if (indexToDirect && data.colorIndices.isEmpty()) {
// hack to work around wacky Makehuman exports
data.colorsByVertex = true;
}
diff --git a/libraries/fbx/src/FBXWriter.cpp b/libraries/fbx/src/FBXWriter.cpp
index 511f253193..e6adff0df9 100644
--- a/libraries/fbx/src/FBXWriter.cpp
+++ b/libraries/fbx/src/FBXWriter.cpp
@@ -142,7 +142,6 @@ void FBXWriter::encodeFBXProperty(QDataStream& out, const QVariant& prop) {
out << prop.toInt();
break;
- encodeNode(out, FBXNode());
case QMetaType::Float:
out.device()->write("F", 1);
out << prop.toFloat();
diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/fbx/src/FSTReader.cpp
index cc4a919445..d63a5b3cc4 100644
--- a/libraries/fbx/src/FSTReader.cpp
+++ b/libraries/fbx/src/FSTReader.cpp
@@ -84,7 +84,7 @@ void FSTReader::writeVariant(QBuffer& buffer, QVariantHash::const_iterator& it)
QByteArray FSTReader::writeMapping(const QVariantHash& mapping) {
static const QStringList PREFERED_ORDER = QStringList() << NAME_FIELD << TYPE_FIELD << SCALE_FIELD << FILENAME_FIELD
- << TEXDIR_FIELD << JOINT_FIELD << FREE_JOINT_FIELD
+ << TEXDIR_FIELD << SCRIPT_FIELD << JOINT_FIELD << FREE_JOINT_FIELD
<< BLENDSHAPE_FIELD << JOINT_INDEX_FIELD;
QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
@@ -92,7 +92,7 @@ QByteArray FSTReader::writeMapping(const QVariantHash& mapping) {
for (auto key : PREFERED_ORDER) {
auto it = mapping.find(key);
if (it != mapping.constEnd()) {
- if (key == FREE_JOINT_FIELD) { // writeVariant does not handle strings added using insertMulti.
+ if (key == FREE_JOINT_FIELD || key == SCRIPT_FIELD) { // writeVariant does not handle strings added using insertMulti.
for (auto multi : mapping.values(key)) {
buffer.write(key.toUtf8());
buffer.write(" = ");
@@ -187,6 +187,26 @@ FSTReader::ModelType FSTReader::predictModelType(const QVariantHash& mapping) {
return ENTITY_MODEL;
}
+QVector FSTReader::getScripts(const QUrl& url, const QVariantHash& mapping) {
+
+ auto fstMapping = mapping.isEmpty() ? downloadMapping(url.toString()) : mapping;
+ QVector scriptPaths;
+ if (!fstMapping.value(SCRIPT_FIELD).isNull()) {
+ auto scripts = fstMapping.values(SCRIPT_FIELD).toVector();
+ for (auto &script : scripts) {
+ QString scriptPath = script.toString();
+ if (QUrl(scriptPath).isRelative()) {
+ if (scriptPath.at(0) == '/') {
+ scriptPath = scriptPath.right(scriptPath.length() - 1);
+ }
+ scriptPath = url.resolved(QUrl(scriptPath)).toString();
+ }
+ scriptPaths.push_back(scriptPath);
+ }
+ }
+ return scriptPaths;
+}
+
QVariantHash FSTReader::downloadMapping(const QString& url) {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest networkRequest = QNetworkRequest(url);
diff --git a/libraries/fbx/src/FSTReader.h b/libraries/fbx/src/FSTReader.h
index 981bae4feb..4a8574f0cf 100644
--- a/libraries/fbx/src/FSTReader.h
+++ b/libraries/fbx/src/FSTReader.h
@@ -28,6 +28,7 @@ static const QString TRANSLATION_Z_FIELD = "tz";
static const QString JOINT_FIELD = "joint";
static const QString FREE_JOINT_FIELD = "freeJoint";
static const QString BLENDSHAPE_FIELD = "bs";
+static const QString SCRIPT_FIELD = "script";
class FSTReader {
public:
@@ -49,6 +50,8 @@ public:
/// Predicts the type of model by examining the mapping
static ModelType predictModelType(const QVariantHash& mapping);
+ static QVector getScripts(const QUrl& fstUrl, const QVariantHash& mapping = QVariantHash());
+
static QString getNameFromType(ModelType modelType);
static FSTReader::ModelType getTypeFromName(const QString& name);
static QVariantHash downloadMapping(const QString& url);
diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackendOutput.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackendOutput.cpp
index 2285b0e486..d1ab34da90 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackendOutput.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackendOutput.cpp
@@ -46,10 +46,10 @@ void GLBackend::do_setFramebuffer(const Batch& batch, size_t paramOffset) {
}
void GLBackend::do_setFramebufferSwapChain(const Batch& batch, size_t paramOffset) {
- auto swapChain = batch._swapChains.get(batch._params[paramOffset]._uint);
+ auto swapChain = std::static_pointer_cast(batch._swapChains.get(batch._params[paramOffset]._uint));
if (swapChain) {
auto index = batch._params[paramOffset + 1]._uint;
- FramebufferPointer framebuffer = static_cast(swapChain.get())->get(index);
+ const auto& framebuffer = swapChain->get(index);
setFramebuffer(framebuffer);
}
}
diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackendPipeline.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackendPipeline.cpp
index 58fcc51605..91f1d8bb8c 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackendPipeline.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackendPipeline.cpp
@@ -268,7 +268,7 @@ void GLBackend::do_setResourceFramebufferSwapChainTexture(const Batch& batch, si
return;
}
- SwapChainPointer swapChain = batch._swapChains.get(batch._params[paramOffset + 0]._uint);
+ auto swapChain = std::static_pointer_cast(batch._swapChains.get(batch._params[paramOffset + 0]._uint));
if (!swapChain) {
releaseResourceTexture(slot);
@@ -276,9 +276,8 @@ void GLBackend::do_setResourceFramebufferSwapChainTexture(const Batch& batch, si
}
auto index = batch._params[paramOffset + 2]._uint;
auto renderBufferSlot = batch._params[paramOffset + 3]._uint;
- FramebufferPointer resourceFramebuffer = static_cast(swapChain.get())->get(index);
- TexturePointer resourceTexture = resourceFramebuffer->getRenderBuffer(renderBufferSlot);
-
+ auto resourceFramebuffer = swapChain->get(index);
+ auto resourceTexture = resourceFramebuffer->getRenderBuffer(renderBufferSlot);
setResourceTexture(slot, resourceTexture);
}
diff --git a/libraries/gpu/src/gpu/ResourceSwapChain.h b/libraries/gpu/src/gpu/ResourceSwapChain.h
index 7b46b35521..28c5ff2ed3 100644
--- a/libraries/gpu/src/gpu/ResourceSwapChain.h
+++ b/libraries/gpu/src/gpu/ResourceSwapChain.h
@@ -15,18 +15,18 @@ namespace gpu {
class SwapChain {
public:
- SwapChain(unsigned int size = 2U) : _size{ size } {}
+ SwapChain(uint8_t size = 2U) : _size{ size } {}
virtual ~SwapChain() {}
void advance() {
_frontIndex = (_frontIndex + 1) % _size;
}
- unsigned int getSize() const { return _size; }
+ uint8_t getSize() const { return _size; }
protected:
- unsigned int _size;
- unsigned int _frontIndex{ 0U };
+ const uint8_t _size;
+ uint8_t _frontIndex{ 0U };
};
typedef std::shared_ptr SwapChainPointer;
@@ -41,16 +41,13 @@ namespace gpu {
using Type = R;
using TypePointer = std::shared_ptr;
+ using TypeConstPointer = std::shared_ptr;
- ResourceSwapChain(unsigned int size = 2U) : SwapChain{ size } {}
-
- void reset() {
- for (auto& ptr : _resources) {
- ptr.reset();
+ ResourceSwapChain(const std::vector& v) : SwapChain{ std::min((uint8_t)v.size(), MAX_SIZE) } {
+ for (size_t i = 0; i < _size; ++i) {
+ _resources[i] = v[i];
}
}
-
- TypePointer& edit(unsigned int index) { return _resources[(index + _frontIndex) % _size]; }
const TypePointer& get(unsigned int index) const { return _resources[(index + _frontIndex) % _size]; }
private:
diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
index e0bb39c855..b88c6345cf 100644
--- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
+++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
@@ -24,6 +24,9 @@
/**jsdoc
* The experimental Graphics API (experimental) lets you query and manage certain graphics-related structures (like underlying meshes and textures) from scripting.
* @namespace Graphics
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
class GraphicsScriptingInterface : public QObject, public QScriptable, public Dependency {
diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp
index 957104bd30..7ee2135325 100644
--- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp
+++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp
@@ -43,6 +43,18 @@ void TouchscreenVirtualPadDevice::init() {
_fixedPosition = true; // This should be config
_viewTouchUpdateCount = 0;
+ resize();
+
+ auto& virtualPadManager = VirtualPad::Manager::instance();
+
+ if (_fixedPosition) {
+ virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled
+ }
+
+ KeyboardMouseDevice::enableTouch(false); // Touch for view controls is managed by this plugin
+}
+
+void TouchscreenVirtualPadDevice::resize() {
QScreen* eventScreen = qApp->primaryScreen();
if (_screenDPIProvided != eventScreen->physicalDotsPerInch()) {
_screenWidthCenter = eventScreen->size().width() / 2;
@@ -59,12 +71,6 @@ void TouchscreenVirtualPadDevice::init() {
auto& virtualPadManager = VirtualPad::Manager::instance();
setupControlsPositions(virtualPadManager, true);
-
- if (_fixedPosition) {
- virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled
- }
-
- KeyboardMouseDevice::enableTouch(false); // Touch for view controls is managed by this plugin
}
void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force) {
@@ -80,9 +86,10 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi
virtualPadManager.getLeftVirtualPad()->setFirstTouch(_moveRefTouchPoint);
// Jump button
- float leftMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_LEFT_MARGIN_PIXELS / VirtualPad::Manager::DPI;
+ float jumpBtnPixelSize = _screenDPI * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI;
+ float rightMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS / VirtualPad::Manager::DPI;
float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI;
- _jumpButtonPosition = glm::vec2( _jumpButtonRadius + leftMargin, eventScreen->size().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin);
+ _jumpButtonPosition = glm::vec2( eventScreen->size().width() - rightMargin - jumpBtnPixelSize, eventScreen->size().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin);
virtualPadManager.setJumpButtonPosition(_jumpButtonPosition);
}
diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h
index 212b7633ec..e7e540b503 100644
--- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h
+++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h
@@ -26,6 +26,7 @@ public:
// Plugin functions
virtual void init() override;
+ virtual void resize();
virtual bool isSupported() const override;
virtual const QString getName() const override { return NAME; }
diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp
index f17cdbb7e8..416920d43f 100644
--- a/libraries/model-networking/src/model-networking/ModelCache.cpp
+++ b/libraries/model-networking/src/model-networking/ModelCache.cpp
@@ -66,6 +66,7 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
auto mapping = FSTReader::readMapping(data);
QString filename = mapping.value("filename").toString();
+
if (filename.isNull()) {
qCDebug(modelnetworking) << "Mapping file" << _url << "has no \"filename\" field";
finishedLoading(false);
@@ -82,6 +83,14 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
_textureBaseUrl = url.resolved(QUrl("."));
}
+ auto scripts = FSTReader::getScripts(_url, mapping);
+ if (scripts.size() > 0) {
+ mapping.remove(SCRIPT_FIELD);
+ for (auto &scriptPath : scripts) {
+ mapping.insertMulti(SCRIPT_FIELD, scriptPath);
+ }
+ }
+
auto animGraphVariant = mapping.value("animGraphUrl");
if (animGraphVariant.isValid()) {
QUrl fstUrl(animGraphVariant.toString());
@@ -209,6 +218,14 @@ void GeometryReader::run() {
throw QString("unsupported format");
}
+ // Add scripts to fbxgeometry
+ if (!_mapping.value(SCRIPT_FIELD).isNull()) {
+ QVariantList scripts = _mapping.values(SCRIPT_FIELD);
+ for (auto &script : scripts) {
+ fbxGeometry->scripts.push_back(script.toString());
+ }
+ }
+
// Ensure the resource has not been deleted
auto resource = _resource.toStrongRef();
if (!resource) {
diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h
index 438c5e0d65..5f35f058ed 100644
--- a/libraries/model-networking/src/model-networking/ModelCache.h
+++ b/libraries/model-networking/src/model-networking/ModelCache.h
@@ -144,6 +144,9 @@ public:
* API to manage model cache resources.
* @namespace ModelCache
*
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {number} numTotal - Total number of total resources. Read-only.
* @property {number} numCached - Total number of cached resource. Read-only.
* @property {number} sizeTotal - Size in bytes of all resources. Read-only.
diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h
index 0c0dbeefa4..4ea8a98976 100644
--- a/libraries/model-networking/src/model-networking/TextureCache.h
+++ b/libraries/model-networking/src/model-networking/TextureCache.h
@@ -148,14 +148,17 @@ public:
// Properties are copied over from ResourceCache (see ResourceCache.h for reason).
/**jsdoc
- * API to manage texture cache resources.
- * @namespace TextureCache
- *
- * @property {number} numTotal - Total number of total resources. Read-only.
- * @property {number} numCached - Total number of cached resource. Read-only.
- * @property {number} sizeTotal - Size in bytes of all resources. Read-only.
- * @property {number} sizeCached - Size in bytes of all cached resources. Read-only.
- */
+ * API to manage texture cache resources.
+ * @namespace TextureCache
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
+ * @property {number} numTotal - Total number of total resources. Read-only.
+ * @property {number} numCached - Total number of cached resource. Read-only.
+ * @property {number} sizeTotal - Size in bytes of all resources. Read-only.
+ * @property {number} sizeCached - Size in bytes of all cached resources. Read-only.
+ */
// Functions are copied over from ResourceCache (see ResourceCache.h for reason).
diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp
index f6264a19c4..049129b2ba 100644
--- a/libraries/networking/src/AccountManager.cpp
+++ b/libraries/networking/src/AccountManager.cpp
@@ -106,7 +106,11 @@ void AccountManager::logout() {
}
QString accountFileDir() {
+#if defined(Q_OS_ANDROID)
+ return QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/../files";
+#else
return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
+#endif
}
QString accountFilePath() {
diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp
index 055d94c3b3..edb2992128 100644
--- a/libraries/networking/src/AddressManager.cpp
+++ b/libraries/networking/src/AddressManager.cpp
@@ -114,8 +114,6 @@ QUrl AddressManager::currentFacingPublicAddress() const {
void AddressManager::loadSettings(const QString& lookupString) {
#if defined(USE_GLES) && defined(Q_OS_WIN)
handleUrl(QUrl("hifi://127.0.0.0"), LookupTrigger::StartupFromSettings);
-#elif defined(Q_OS_ANDROID)
- handleUrl(QUrl("hifi://pikachu/167.11,0.745735,181.529/0,0.887027,0,-0.461717"), LookupTrigger::StartupFromSettings);
#else
if (lookupString.isEmpty()) {
handleUrl(currentAddressHandle.get(), LookupTrigger::StartupFromSettings);
diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h
index 94eff46bda..94fb25812f 100644
--- a/libraries/networking/src/AddressManager.h
+++ b/libraries/networking/src/AddressManager.h
@@ -33,6 +33,11 @@ const QString GET_PLACE = "/api/v1/places/%1";
* The location API provides facilities related to your current location in the metaverse.
*
* @namespace location
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-assignment-client
+ *
* @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid|Uuid.NULL} if you're not
* connected to the domain or are in a serverless domain.
* Read-only.
diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp
index 31500be682..0660f02fd6 100644
--- a/libraries/networking/src/LimitedNodeList.cpp
+++ b/libraries/networking/src/LimitedNodeList.cpp
@@ -302,6 +302,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
}
} else {
NLPacket::LocalID sourceLocalID = Node::NULL_LOCAL_ID;
+
// check if we were passed a sourceNode hint or if we need to look it up
if (!sourceNode) {
// figure out which node this is from
@@ -314,6 +315,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
QUuid sourceID = sourceNode ? sourceNode->getUUID() : QUuid();
if (!sourceNode &&
+ !isDomainServer() &&
sourceLocalID == getDomainLocalID() &&
packet.getSenderSockAddr() == getDomainSockAddr() &&
PacketTypeEnum::getDomainSourcedPackets().contains(headerType)) {
@@ -608,6 +610,7 @@ bool LimitedNodeList::killNodeWithUUID(const QUuid& nodeUUID, ConnectionID newCo
{
QWriteLocker writeLocker(&_nodeMutex);
+ _localIDMap.unsafe_erase(matchingNode->getLocalID());
_nodeHash.unsafe_erase(it);
}
diff --git a/libraries/networking/src/MessagesClient.h b/libraries/networking/src/MessagesClient.h
index 6ef3777d8c..f2ccfe33f4 100644
--- a/libraries/networking/src/MessagesClient.h
+++ b/libraries/networking/src/MessagesClient.h
@@ -37,6 +37,11 @@
*
*
* @namespace Messages
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
*/
class MessagesClient : public QObject, public Dependency {
Q_OBJECT
diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp
index 7ba7cca96d..d3583687e8 100644
--- a/libraries/networking/src/ResourceCache.cpp
+++ b/libraries/networking/src/ResourceCache.cpp
@@ -750,6 +750,7 @@ bool Resource::handleFailedRequest(ResourceRequest::Result result) {
qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal;
// Fall through to other cases
}
+ // FALLTHRU
case ResourceRequest::Result::ServerUnavailable: {
_attempts++;
_attemptsRemaining--;
@@ -768,6 +769,7 @@ bool Resource::handleFailedRequest(ResourceRequest::Result result) {
}
// fall through to final failure
}
+ // FALLTHRU
default: {
_attemptsRemaining = 0;
qCDebug(networking) << "Error loading " << _url << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining;
diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h
index 8a77beefd4..e2df582aa3 100644
--- a/libraries/networking/src/ResourceCache.h
+++ b/libraries/networking/src/ResourceCache.h
@@ -89,6 +89,12 @@ class ScriptableResource : public QObject {
/**jsdoc
* @constructor Resource
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property {string} url - URL of this resource.
* @property {Resource.State} state - Current loading state.
*/
diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp
index c2bacd4949..68f21eea87 100644
--- a/libraries/physics/src/EntityMotionState.cpp
+++ b/libraries/physics/src/EntityMotionState.cpp
@@ -447,7 +447,12 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationStep) {
// this case is prevented by setting _ownershipState to UNOWNABLE in EntityMotionState::ctor
assert(!(_entity->getClientOnly() && _entity->getOwningAvatarID() != Physics::getSessionUUID()));
- if (_entity->dynamicDataNeedsTransmit() || _entity->queryAACubeNeedsUpdate()) {
+ // shouldSendUpdate() sould NOT be triggering updates to maintain the queryAACube of dynamic entities.
+ // The server is supposed to predict the transform of such moving things. The client performs a "double prediction"
+ // where it predicts what the the server is doing, and only sends updates whent the entity's true transform
+ // differs significantly. That is what the remoteSimulationOutOfSync() logic is all about.
+ if (_entity->dynamicDataNeedsTransmit() ||
+ (!_entity->getDynamic() && _entity->queryAACubeNeedsUpdate())) {
return true;
}
diff --git a/libraries/physics/src/PhysicsDebugDraw.cpp b/libraries/physics/src/PhysicsDebugDraw.cpp
new file mode 100644
index 0000000000..b2911219d5
--- /dev/null
+++ b/libraries/physics/src/PhysicsDebugDraw.cpp
@@ -0,0 +1,54 @@
+//
+// PhysicsDebugDraw.cpp
+// libraries/physics/src
+//
+// Created by Anthony Thibault 2018-4-18
+// Copyright 2018 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 "PhysicsDebugDraw.h"
+#include "BulletUtil.h"
+#include "PhysicsLogging.h"
+
+#include
+#include
+
+void PhysicsDebugDraw::drawLine(const btVector3& from, const btVector3& to, const btVector3& color) {
+ DebugDraw::getInstance().drawRay(bulletToGLM(from), bulletToGLM(to), glm::vec4(color.getX(), color.getY(), color.getZ(), 1.0f));
+}
+
+void PhysicsDebugDraw::drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance,
+ int lifeTime, const btVector3& color) {
+
+ glm::vec3 normal, tangent, biNormal;
+ generateBasisVectors(bulletToGLM(normalOnB), Vectors::UNIT_X, normal, tangent, biNormal);
+ btVector3 u = glmToBullet(normal);
+ btVector3 v = glmToBullet(tangent);
+ btVector3 w = glmToBullet(biNormal);
+
+ // x marks the spot, green is along the normal.
+ const float CONTACT_POINT_RADIUS = 0.1f;
+ const btVector3 GREEN(0.0f, 1.0f, 0.0f);
+ const btVector3 WHITE(1.0f, 1.0f, 1.0f);
+ drawLine(PointOnB - u * CONTACT_POINT_RADIUS, PointOnB + u * CONTACT_POINT_RADIUS, GREEN);
+ drawLine(PointOnB - v * CONTACT_POINT_RADIUS, PointOnB + v * CONTACT_POINT_RADIUS, WHITE);
+ drawLine(PointOnB - w * CONTACT_POINT_RADIUS, PointOnB + w * CONTACT_POINT_RADIUS, WHITE);
+}
+
+void PhysicsDebugDraw::reportErrorWarning(const char* warningString) {
+ qCWarning(physics) << "BULLET:" << warningString;
+}
+
+void PhysicsDebugDraw::draw3dText(const btVector3& location, const char* textString) {
+}
+
+void PhysicsDebugDraw::setDebugMode(int debugMode) {
+ _debugDrawMode = debugMode;
+}
+
+int PhysicsDebugDraw::getDebugMode() const {
+ return _debugDrawMode;
+}
diff --git a/libraries/physics/src/PhysicsDebugDraw.h b/libraries/physics/src/PhysicsDebugDraw.h
new file mode 100644
index 0000000000..f653136474
--- /dev/null
+++ b/libraries/physics/src/PhysicsDebugDraw.h
@@ -0,0 +1,34 @@
+//
+// PhysicsDebugDraw.h
+// libraries/physics/src
+//
+// Created by Anthony Thibault 2018-4-18
+// Copyright 2018 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
+//
+// http://bulletphysics.org/Bullet/BulletFull/classbtIDebugDraw.html
+
+#ifndef hifi_PhysicsDebugDraw_h
+#define hifi_PhysicsDebugDraw_h
+
+#include
+#include
+
+class PhysicsDebugDraw : public btIDebugDraw {
+public:
+ using btIDebugDraw::drawLine;
+ virtual void drawLine(const btVector3& from, const btVector3& to, const btVector3& color) override;
+ virtual void drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance,
+ int lifeTime, const btVector3& color) override;
+ virtual void reportErrorWarning(const char* warningString) override;
+ virtual void draw3dText(const btVector3& location, const char* textString) override;
+ virtual void setDebugMode(int debugMode) override;
+ virtual int getDebugMode() const override;
+
+protected:
+ uint32_t _debugDrawMode;
+};
+
+#endif // hifi_PhysicsDebugDraw_h
diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp
index 7c2ad55405..50d516c256 100644
--- a/libraries/physics/src/PhysicsEngine.cpp
+++ b/libraries/physics/src/PhysicsEngine.cpp
@@ -22,6 +22,7 @@
#include "ObjectMotionState.h"
#include "PhysicsEngine.h"
#include "PhysicsHelpers.h"
+#include "PhysicsDebugDraw.h"
#include "ThreadSafeDynamicsWorld.h"
#include "PhysicsLogging.h"
@@ -49,6 +50,10 @@ void PhysicsEngine::init() {
_broadphaseFilter = new btDbvtBroadphase();
_constraintSolver = new btSequentialImpulseConstraintSolver;
_dynamicsWorld = new ThreadSafeDynamicsWorld(_collisionDispatcher, _broadphaseFilter, _constraintSolver, _collisionConfig);
+ _physicsDebugDraw.reset(new PhysicsDebugDraw());
+
+ // hook up debug draw renderer
+ _dynamicsWorld->setDebugDrawer(_physicsDebugDraw.get());
_ghostPairCallback = new btGhostPairCallback();
_dynamicsWorld->getPairCache()->setInternalGhostPairCallback(_ghostPairCallback);
@@ -333,6 +338,10 @@ void PhysicsEngine::stepSimulation() {
_hasOutgoingChanges = true;
}
+
+ if (_physicsDebugDraw->getDebugMode()) {
+ _dynamicsWorld->debugDrawWorld();
+ }
}
class CProfileOperator {
@@ -785,3 +794,49 @@ void PhysicsEngine::forEachDynamic(std::function act
}
}
}
+
+void PhysicsEngine::setShowBulletWireframe(bool value) {
+ int mode = _physicsDebugDraw->getDebugMode();
+ if (value) {
+ _physicsDebugDraw->setDebugMode(mode | btIDebugDraw::DBG_DrawWireframe);
+ } else {
+ _physicsDebugDraw->setDebugMode(mode & ~btIDebugDraw::DBG_DrawWireframe);
+ }
+}
+
+void PhysicsEngine::setShowBulletAABBs(bool value) {
+ int mode = _physicsDebugDraw->getDebugMode();
+ if (value) {
+ _physicsDebugDraw->setDebugMode(mode | btIDebugDraw::DBG_DrawAabb);
+ } else {
+ _physicsDebugDraw->setDebugMode(mode & ~btIDebugDraw::DBG_DrawAabb);
+ }
+}
+
+void PhysicsEngine::setShowBulletContactPoints(bool value) {
+ int mode = _physicsDebugDraw->getDebugMode();
+ if (value) {
+ _physicsDebugDraw->setDebugMode(mode | btIDebugDraw::DBG_DrawContactPoints);
+ } else {
+ _physicsDebugDraw->setDebugMode(mode & ~btIDebugDraw::DBG_DrawContactPoints);
+ }
+}
+
+void PhysicsEngine::setShowBulletConstraints(bool value) {
+ int mode = _physicsDebugDraw->getDebugMode();
+ if (value) {
+ _physicsDebugDraw->setDebugMode(mode | btIDebugDraw::DBG_DrawConstraints);
+ } else {
+ _physicsDebugDraw->setDebugMode(mode & ~btIDebugDraw::DBG_DrawConstraints);
+ }
+}
+
+void PhysicsEngine::setShowBulletConstraintLimits(bool value) {
+ int mode = _physicsDebugDraw->getDebugMode();
+ if (value) {
+ _physicsDebugDraw->setDebugMode(mode | btIDebugDraw::DBG_DrawConstraintLimits);
+ } else {
+ _physicsDebugDraw->setDebugMode(mode & ~btIDebugDraw::DBG_DrawConstraintLimits);
+ }
+}
+
diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h
index 92d2e6885a..0dfe3a7a7c 100644
--- a/libraries/physics/src/PhysicsEngine.h
+++ b/libraries/physics/src/PhysicsEngine.h
@@ -30,6 +30,7 @@
const float HALF_SIMULATION_EXTENT = 512.0f; // meters
class CharacterController;
+class PhysicsDebugDraw;
// simple class for keeping track of contacts
class ContactKey {
@@ -96,6 +97,12 @@ public:
void removeDynamic(const QUuid dynamicID);
void forEachDynamic(std::function actor);
+ void setShowBulletWireframe(bool value);
+ void setShowBulletAABBs(bool value);
+ void setShowBulletContactPoints(bool value);
+ void setShowBulletConstraints(bool value);
+ void setShowBulletConstraintLimits(bool value);
+
private:
QList removeDynamicsForBody(btRigidBody* body);
void addObjectToDynamicsWorld(ObjectMotionState* motionState);
@@ -114,6 +121,7 @@ private:
btSequentialImpulseConstraintSolver* _constraintSolver = NULL;
ThreadSafeDynamicsWorld* _dynamicsWorld = NULL;
btGhostPairCallback* _ghostPairCallback = NULL;
+ std::unique_ptr _physicsDebugDraw;
ContactMap _contactMap;
CollisionEvents _collisionEvents;
diff --git a/libraries/render-utils/src/AnimDebugDraw.cpp b/libraries/render-utils/src/AnimDebugDraw.cpp
index 7086b65f4c..eca500f36c 100644
--- a/libraries/render-utils/src/AnimDebugDraw.cpp
+++ b/libraries/render-utils/src/AnimDebugDraw.cpp
@@ -52,9 +52,9 @@ public:
batch.setInputFormat(_vertexFormat);
batch.setInputBuffer(0, _vertexBuffer, 0, sizeof(Vertex));
- batch.setIndexBuffer(gpu::UINT16, _indexBuffer, 0);
+ batch.setIndexBuffer(gpu::UINT32, _indexBuffer, 0);
- auto numIndices = _indexBuffer->getSize() / sizeof(uint16_t);
+ auto numIndices = _indexBuffer->getSize() / sizeof(uint32_t);
batch.drawIndexed(gpu::LINES, (int)numIndices);
}
@@ -135,9 +135,9 @@ AnimDebugDraw::AnimDebugDraw() :
AnimDebugDrawData::Vertex { glm::vec3(1.0, 1.0f, 1.0f), toRGBA(0, 0, 255, 255) },
AnimDebugDrawData::Vertex { glm::vec3(1.0, 1.0f, 2.0f), toRGBA(0, 0, 255, 255) },
});
- static std::vector indices({ 0, 1, 2, 3, 4, 5 });
+ static std::vector indices({ 0, 1, 2, 3, 4, 5 });
_animDebugDrawData->_vertexBuffer->setSubData(0, vertices);
- _animDebugDrawData->_indexBuffer->setSubData(0, indices);
+ _animDebugDrawData->_indexBuffer->setSubData(0, indices);
}
AnimDebugDraw::~AnimDebugDraw() {
@@ -425,9 +425,9 @@ void AnimDebugDraw::update() {
data._isVisible = (numVerts > 0);
- data._indexBuffer->resize(sizeof(uint16_t) * numVerts);
+ data._indexBuffer->resize(sizeof(uint32_t) * numVerts);
for (int i = 0; i < numVerts; i++) {
- data._indexBuffer->setSubData(i, (uint16_t)i);;
+ data._indexBuffer->setSubData(i, (uint32_t)i);;
}
});
scene->enqueueTransaction(transaction);
diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp
index dd4bda2e37..c9aa1b8f71 100644
--- a/libraries/render-utils/src/AntialiasingEffect.cpp
+++ b/libraries/render-utils/src/AntialiasingEffect.cpp
@@ -189,7 +189,6 @@ const int AntialiasingPass_NextMapSlot = 4;
Antialiasing::Antialiasing(bool isSharpenEnabled) :
_isSharpenEnabled{ isSharpenEnabled } {
- _antialiasingBuffers = std::make_shared(2U);
}
Antialiasing::~Antialiasing() {
@@ -325,25 +324,25 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const
int width = sourceBuffer->getWidth();
int height = sourceBuffer->getHeight();
- if (_antialiasingBuffers->get(0)) {
- if (_antialiasingBuffers->get(0)->getSize() != uvec2(width, height)) {// || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) {
- _antialiasingBuffers->edit(0).reset();
- _antialiasingBuffers->edit(1).reset();
- _antialiasingTextures[0].reset();
- _antialiasingTextures[1].reset();
- }
+ if (_antialiasingBuffers && _antialiasingBuffers->get(0) && _antialiasingBuffers->get(0)->getSize() != uvec2(width, height)) {
+ _antialiasingBuffers.reset();
+ _antialiasingTextures[0].reset();
+ _antialiasingTextures[1].reset();
}
- if (!_antialiasingBuffers->get(0)) {
+
+ if (!_antialiasingBuffers) {
+ std::vector antiAliasingBuffers;
// Link the antialiasing FBO to texture
auto format = sourceBuffer->getRenderBuffer(0)->getTexelFormat();
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR, gpu::Sampler::WRAP_CLAMP);
for (int i = 0; i < 2; i++) {
- auto& antiAliasingBuffer = _antialiasingBuffers->edit(i);
- antiAliasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing"));
+ antiAliasingBuffers.emplace_back(gpu::Framebuffer::create("antialiasing"));
+ const auto& antiAliasingBuffer = antiAliasingBuffers.back();
_antialiasingTextures[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler);
antiAliasingBuffer->setRenderBuffer(0, _antialiasingTextures[i]);
}
+ _antialiasingBuffers = std::make_shared(antiAliasingBuffers);
}
gpu::doInBatch("Antialiasing::run", args->_context, [&](gpu::Batch& batch) {
diff --git a/libraries/script-engine/src/AssetScriptingInterface.h b/libraries/script-engine/src/AssetScriptingInterface.h
index 5cb1136b74..eb9a628ae3 100644
--- a/libraries/script-engine/src/AssetScriptingInterface.h
+++ b/libraries/script-engine/src/AssetScriptingInterface.h
@@ -27,6 +27,11 @@
/**jsdoc
* The Assets API allows you to communicate with the Asset Browser.
* @namespace Assets
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
*/
class AssetScriptingInterface : public BaseAssetScriptingInterface, QScriptable {
Q_OBJECT
diff --git a/libraries/script-engine/src/Quat.h b/libraries/script-engine/src/Quat.h
index e6e395d9bf..254757dece 100644
--- a/libraries/script-engine/src/Quat.h
+++ b/libraries/script-engine/src/Quat.h
@@ -35,6 +35,12 @@
* of gimbal lock.
* @namespace Quat
* @variation 0
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property IDENTITY {Quat} { x: 0, y: 0, z: 0, w: 1 }
: The identity rotation, i.e., no rotation.
* Read-only.
* @example Print the IDENTITY
value.
diff --git a/libraries/script-engine/src/RecordingScriptingInterface.h b/libraries/script-engine/src/RecordingScriptingInterface.h
index 0e4f90b928..29d9b31049 100644
--- a/libraries/script-engine/src/RecordingScriptingInterface.h
+++ b/libraries/script-engine/src/RecordingScriptingInterface.h
@@ -25,6 +25,10 @@ class QScriptValue;
/**jsdoc
* @namespace Recording
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-assignment-client
*/
class RecordingScriptingInterface : public QObject, public Dependency {
Q_OBJECT
diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h
index c69cd7090d..fdfbc6f6c0 100644
--- a/libraries/script-engine/src/SceneScriptingInterface.h
+++ b/libraries/script-engine/src/SceneScriptingInterface.h
@@ -112,6 +112,10 @@ namespace SceneScripting {
/**jsdoc
* @class Scene.Stage
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {string} backgroundMode
* @property {Scene.Stage.KeyLight} keyLight
* @property {Scene.Stage.Location} location
@@ -171,6 +175,10 @@ namespace SceneScripting {
/**jsdoc
* @namespace Scene
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {boolean} shouldRenderAvatars
* @property {boolean} shouldRenderEntities
* @property {Scene.Stage} stage
diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp
index f0a13cc62b..4915a2dc8b 100644
--- a/libraries/script-engine/src/ScriptEngine.cpp
+++ b/libraries/script-engine/src/ScriptEngine.cpp
@@ -180,6 +180,21 @@ ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const
// don't delete `ScriptEngines` until all `ScriptEngine`s are gone
_scriptEngines(DependencyManager::get())
{
+ switch (_context) {
+ case Context::CLIENT_SCRIPT:
+ _type = Type::CLIENT;
+ break;
+ case Context::ENTITY_CLIENT_SCRIPT:
+ _type = Type::ENTITY_CLIENT;
+ break;
+ case Context::ENTITY_SERVER_SCRIPT:
+ _type = Type::ENTITY_SERVER;
+ break;
+ case Context::AGENT_SCRIPT:
+ _type = Type::AGENT;
+ break;
+ }
+
connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) {
if (hasUncaughtException()) {
// the engine's uncaughtException() seems to produce much better stack traces here
diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h
index 63a4ba4f90..7a9af2278c 100644
--- a/libraries/script-engine/src/ScriptEngine.h
+++ b/libraries/script-engine/src/ScriptEngine.h
@@ -89,6 +89,12 @@ public:
/**jsdoc
* @namespace Script
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property {string} context
*/
class ScriptEngine : public BaseScriptEngine, public EntitiesScriptEngineProvider {
@@ -103,6 +109,14 @@ public:
AGENT_SCRIPT
};
+ enum Type {
+ CLIENT,
+ ENTITY_CLIENT,
+ ENTITY_SERVER,
+ AGENT,
+ AVATAR
+ };
+
static int processLevelMaxRetries;
ScriptEngine(Context context, const QString& scriptContents = NO_SCRIPT, const QString& fileNameString = QString("about:ScriptEngine"));
~ScriptEngine();
@@ -493,6 +507,9 @@ public:
*/
Q_INVOKABLE QUuid generateUUID() { return QUuid::createUuid(); }
+ void setType(Type type) { _type = type; };
+ Type getType() { return _type; };
+
bool isFinished() const { return _isFinished; } // used by Application and ScriptWidget
bool isRunning() const { return _isRunning; } // used by ScriptWidget
@@ -724,6 +741,7 @@ protected:
void callWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, QScriptValue function, QScriptValue thisObject, QScriptValueList args);
Context _context;
+ Type _type;
QString _scriptContents;
QString _parentURL;
std::atomic _isFinished { false };
diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp
index a788cd9f0e..f2ed296b63 100644
--- a/libraries/script-engine/src/ScriptEngines.cpp
+++ b/libraries/script-engine/src/ScriptEngines.cpp
@@ -427,11 +427,13 @@ bool ScriptEngines::stopScript(const QString& rawScriptURL, bool restart) {
if (_scriptEnginesHash.contains(scriptURL)) {
ScriptEnginePointer scriptEngine = _scriptEnginesHash[scriptURL];
if (restart) {
+ bool isUserLoaded = scriptEngine->isUserLoaded();
+ ScriptEngine::Type type = scriptEngine->getType();
auto scriptCache = DependencyManager::get();
scriptCache->deleteScript(scriptURL);
connect(scriptEngine.data(), &ScriptEngine::finished,
- this, [this](QString scriptName, ScriptEnginePointer engine) {
- reloadScript(scriptName);
+ this, [this, isUserLoaded, type](QString scriptName, ScriptEnginePointer engine) {
+ reloadScript(scriptName, isUserLoaded)->setType(type);
});
}
scriptEngine->stop();
diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h
index 1200168420..376bae4827 100644
--- a/libraries/script-engine/src/ScriptEngines.h
+++ b/libraries/script-engine/src/ScriptEngines.h
@@ -29,6 +29,10 @@ class ScriptEngine;
/**jsdoc
* @namespace ScriptDiscoveryService
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {string} debugScriptUrl
* @property {string} defaultScriptsPath
* @property {ScriptsModel} scriptsModel
@@ -259,7 +263,7 @@ protected slots:
protected:
friend class ScriptEngine;
- void reloadScript(const QString& scriptName) { loadScript(scriptName, true, false, false, true); }
+ ScriptEnginePointer reloadScript(const QString& scriptName, bool isUserLoaded = true) { return loadScript(scriptName, isUserLoaded, false, false, true); }
void removeScriptEngine(ScriptEnginePointer);
void onScriptEngineLoaded(const QString& scriptFilename);
void onScriptEngineError(const QString& scriptFilename);
diff --git a/libraries/script-engine/src/ScriptUUID.h b/libraries/script-engine/src/ScriptUUID.h
index 303a871d1d..9b61f451c5 100644
--- a/libraries/script-engine/src/ScriptUUID.h
+++ b/libraries/script-engine/src/ScriptUUID.h
@@ -23,6 +23,12 @@
* hexadecimal digits.
*
* @namespace Uuid
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property NULL {Uuid} The null UUID, {00000000-0000-0000-0000-000000000000}
.
*/
diff --git a/libraries/script-engine/src/ScriptsModel.h b/libraries/script-engine/src/ScriptsModel.h
index a4ffc192f9..2466347baa 100644
--- a/libraries/script-engine/src/ScriptsModel.h
+++ b/libraries/script-engine/src/ScriptsModel.h
@@ -68,6 +68,9 @@ public:
* Has properties and functions below in addition to those of
* http://doc.qt.io/qt-5/qabstractitemmodel.html.
* @class ScriptsModel
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
class ScriptsModel : public QAbstractItemModel {
Q_OBJECT
diff --git a/libraries/script-engine/src/ScriptsModelFilter.h b/libraries/script-engine/src/ScriptsModelFilter.h
index 26efde02e8..05a76334bb 100644
--- a/libraries/script-engine/src/ScriptsModelFilter.h
+++ b/libraries/script-engine/src/ScriptsModelFilter.h
@@ -20,6 +20,9 @@
* Has properties and functions per
* http://doc.qt.io/qt-5/qsortfilterproxymodel.html.
* @class ScriptsModelFilter
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
class ScriptsModelFilter : public QSortFilterProxyModel {
Q_OBJECT
diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h
index 6728c471f6..f214c3f11c 100644
--- a/libraries/script-engine/src/UsersScriptingInterface.h
+++ b/libraries/script-engine/src/UsersScriptingInterface.h
@@ -18,7 +18,12 @@
/**jsdoc
* @namespace Users
- * @property {boolean} canKick - true
if the domain server allows the node or avatar to kick (ban) avatars,
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-assignment-client
+ *
+ * @property {boolean} canKick - true
if the domain server allows the node or avatar to kick (ban) avatars,
* otherwise false
. Read-only.
* @property {boolean} requestsDomainListData - true
if the avatar requests extra data from the mixers (such as
* positional data of an avatar you've ignored). Read-only.
diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h
index 635f2a530c..eb9438c5c2 100644
--- a/libraries/script-engine/src/Vec3.h
+++ b/libraries/script-engine/src/Vec3.h
@@ -47,6 +47,12 @@
*
* @namespace Vec3
* @variation 0
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @property {Vec3} UNIT_X - { x: 1, y: 0, z: 0 }
: Unit vector in the x-axis direction. Read-only.
* @property {Vec3} UNIT_Y - { x: 0, y: 1, z: 0 }
: Unit vector in the y-axis direction. Read-only.
* @property {Vec3} UNIT_Z - { x: 0, y: 0, z: 1 }
: Unit vector in the z-axis direction. Read-only.
diff --git a/libraries/shared/src/DebugDraw.h b/libraries/shared/src/DebugDraw.h
index 64327585fb..7dd19415c9 100644
--- a/libraries/shared/src/DebugDraw.h
+++ b/libraries/shared/src/DebugDraw.h
@@ -25,6 +25,11 @@
* Helper functions to render ephemeral debug markers and lines.
* DebugDraw markers and lines are only visible locally, they are not visible by other users.
* @namespace DebugDraw
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
*/
class DebugDraw : public QObject {
Q_OBJECT
diff --git a/libraries/shared/src/Gzip.cpp b/libraries/shared/src/Gzip.cpp
index a77f459fc9..25e214fffb 100644
--- a/libraries/shared/src/Gzip.cpp
+++ b/libraries/shared/src/Gzip.cpp
@@ -60,6 +60,7 @@ bool gunzip(QByteArray source, QByteArray &destination) {
switch (status) {
case Z_NEED_DICT:
status = Z_DATA_ERROR;
+ // FALLTHRU
case Z_DATA_ERROR:
case Z_MEM_ERROR:
case Z_STREAM_ERROR:
diff --git a/libraries/shared/src/PathUtils.h b/libraries/shared/src/PathUtils.h
index d879ac968d..fc933b6b8c 100644
--- a/libraries/shared/src/PathUtils.h
+++ b/libraries/shared/src/PathUtils.h
@@ -22,6 +22,10 @@
* The Paths API provides absolute paths to the scripts and resources directories.
*
* @namespace Paths
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @deprecated The Paths API is deprecated. Use {@link Script.resolvePath} and {@link Script.resourcesPath} instead.
* @readonly
* @property {string} defaultScripts - The path to the scripts directory. Read-only.
diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h
index 689d1a3f42..467d6374a5 100644
--- a/libraries/shared/src/RegisteredMetaTypes.h
+++ b/libraries/shared/src/RegisteredMetaTypes.h
@@ -361,6 +361,12 @@ using MeshPointer = std::shared_ptr;
/**jsdoc
* A handle for a mesh in an entity, such as returned by {@link Entities.getMeshes}.
* @class MeshProxy
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ * @hifi-server-entity
+ * @hifi-assignment-client
+ *
* @deprecated Use the {@link Graphics} API instead.
*/
class MeshProxy : public QObject {
diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h
index ea2e9cddab..32e753d0f9 100644
--- a/libraries/shared/src/shared/Camera.h
+++ b/libraries/shared/src/shared/Camera.h
@@ -40,6 +40,10 @@ class Camera : public QObject {
* The Camera API provides access to the "camera" that defines your view in desktop and HMD display modes.
*
* @namespace Camera
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property position {Vec3} The position of the camera. You can set this value only when the camera is in independent mode.
* @property orientation {Quat} The orientation of the camera. You can set this value only when the camera is in independent
* mode.
diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp
index c786110bdf..dae19b52c2 100644
--- a/libraries/ui/src/VirtualPadManager.cpp
+++ b/libraries/ui/src/VirtualPadManager.cpp
@@ -39,9 +39,9 @@ namespace VirtualPad {
const float Manager::BASE_MARGIN_PIXELS = 59.0f;
const float Manager::STICK_RADIUS_PIXELS = 105.0f;
const float Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS = 67.0f;
- const float Manager::JUMP_BTN_FULL_PIXELS = 134.0f;
- const float Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS = 67.0f;
- const float Manager::JUMP_BTN_LEFT_MARGIN_PIXELS = 547.0f;
+ const float Manager::JUMP_BTN_FULL_PIXELS = 164.0f;
+ const float Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS = 80.0f;
+ const float Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS = 13.0f;
Manager::Manager() {
diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h
index 68b3d4f10f..6f7fbcc921 100644
--- a/libraries/ui/src/VirtualPadManager.h
+++ b/libraries/ui/src/VirtualPadManager.h
@@ -54,7 +54,7 @@ namespace VirtualPad {
static const float JUMP_BTN_TRIMMED_RADIUS_PIXELS;
static const float JUMP_BTN_FULL_PIXELS;
static const float JUMP_BTN_BOTTOM_MARGIN_PIXELS;
- static const float JUMP_BTN_LEFT_MARGIN_PIXELS;
+ static const float JUMP_BTN_RIGHT_MARGIN_PIXELS;
private:
Instance _leftVPadInstance;
diff --git a/libraries/ui/src/ui/TabletScriptingInterface.h b/libraries/ui/src/ui/TabletScriptingInterface.h
index bab15fc7b6..e74b846f02 100644
--- a/libraries/ui/src/ui/TabletScriptingInterface.h
+++ b/libraries/ui/src/ui/TabletScriptingInterface.h
@@ -40,6 +40,9 @@ class OffscreenQmlSurface;
/**jsdoc
* @namespace Tablet
+ *
+ * @hifi-interface
+ * @hifi-client-entity
*/
class TabletScriptingInterface : public QObject, public Dependency {
Q_OBJECT
@@ -176,6 +179,10 @@ Q_DECLARE_METATYPE(TabletButtonsProxyModel*);
/**jsdoc
* @class TabletProxy
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {string} name - Name of this tablet. Read-only.
* @property {boolean} toolbarMode - Used to transition this tablet into and out of toolbar mode.
* When tablet is in toolbar mode, all its buttons will appear in a floating toolbar.
@@ -410,6 +417,10 @@ Q_DECLARE_METATYPE(TabletProxy*);
/**jsdoc
* @class TabletButtonProxy
+ *
+ * @hifi-interface
+ * @hifi-client-entity
+ *
* @property {Uuid} uuid - Uniquely identifies this button. Read-only.
* @property {TabletButtonProxy.ButtonProperties} properties
*/
diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js
index 11aee6a9d2..98fbb4b1a7 100644
--- a/scripts/+android/defaultScripts.js
+++ b/scripts/+android/defaultScripts.js
@@ -14,7 +14,7 @@
var DEFAULT_SCRIPTS_COMBINED = [
"system/progress.js",
"system/+android/touchscreenvirtualpad.js",
- "system/+android/bottombar.js",
+ "system/+android/actionbar.js",
"system/+android/audio.js" ,
"system/+android/modes.js",
"system/+android/stats.js"/*,
diff --git a/scripts/system/+android/actionbar.js b/scripts/system/+android/actionbar.js
new file mode 100644
index 0000000000..1f0872d5ee
--- /dev/null
+++ b/scripts/system/+android/actionbar.js
@@ -0,0 +1,53 @@
+"use strict";
+//
+// backbutton.js
+// scripts/system/+android
+//
+// Created by Gabriel Calero & Cristian Duarte on Apr 06, 2018
+// Copyright 2018 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
+//
+(function() { // BEGIN LOCAL_SCOPE
+
+var actionbar;
+var backButton;
+
+var logEnabled = true;
+
+function printd(str) {
+ if (logEnabled)
+ print("[actionbar.js] " + str);
+}
+
+function init() {
+ actionbar = new QmlFragment({
+ qml: "hifi/ActionBar.qml"
+ });
+ backButton = actionbar.addButton({
+ icon: "icons/+android/backward.svg",
+ activeIcon: "icons/+android/backward.svg",
+ text: "",
+ bgOpacity: 0.0,
+ hoverBgOpacity: 0.0,
+ activeBgOpacity: 0.0
+ });
+
+ backButton.clicked.connect(onBackPressed);
+}
+
+function onBackPressed() {
+ App.openAndroidActivity("Home");
+}
+
+
+Script.scriptEnding.connect(function() {
+ if(backButton) {
+ backButton.clicked.disconnect(onBackPressed);
+ }
+});
+
+init();
+
+}()); // END LOCAL_SCOPE
diff --git a/scripts/system/+android/audio.js b/scripts/system/+android/audio.js
index 955f74d63a..4d6d8db008 100644
--- a/scripts/system/+android/audio.js
+++ b/scripts/system/+android/audio.js
@@ -32,8 +32,9 @@ function init() {
activeIcon: "icons/mic-mute-a.svg",
text: "",
bgOpacity: 0.0,
- activeBgOpacity: 0.0,
- bgColor: "#FFFFFF"
+ hoverBgOpacity: 0.0,
+ activeHoverBgOpacity: 0.0,
+ activeBgOpacity: 0.0
});
onMuteToggled();
diff --git a/scripts/system/+android/avatarSelection.js b/scripts/system/+android/avatarSelection.js
deleted file mode 100644
index 2946e541b5..0000000000
--- a/scripts/system/+android/avatarSelection.js
+++ /dev/null
@@ -1,164 +0,0 @@
-"use strict";
-//
-// avatarSelection.js
-// scripts/system/
-//
-// Created by Gabriel Calero & Cristian Duarte on 21 Sep 2017
-// Copyright 2017 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
-//
-
-var window;
-
-var logEnabled = true;
-var isVisible = false;
-
-function printd(str) {
- if (logEnabled)
- print("[avatarSelection.js] " + str);
-}
-
-function fromQml(message) { // messages are {method, params}, like json-rpc. See also sendToQml.
- var data;
- printd("fromQml " + JSON.stringify(message));
- switch (message.method) {
- case 'selectAvatar':
- // use this message.params.avatarUrl
- printd("Selected Avatar: [" + message.params.avatarUrl + "]");
- App.askBeforeSetAvatarUrl(message.params.avatarUrl);
- break;
- case 'openAvatarMarket':
- // good
- App.openUrl("https://metaverse.highfidelity.com/marketplace?category=avatars");
- break;
- case 'hide':
- Controller.setVPadHidden(false);
- module.exports.hide();
- module.exports.onHidden();
- break;
- default:
- print('[avatarSelection.js] Unrecognized message from avatarSelection.qml:', JSON.stringify(message));
- }
-}
-
-function sendToQml(message) {
- if (!window) {
- print("[avatarSelection.js] There is no window object");
- return;
- }
- window.sendToQml(message);
-}
-
-function refreshSelected(currentAvatarURL) {
- sendToQml({
- type: "refreshSelected",
- selectedAvatarUrl: currentAvatarURL
- });
-
- sendToQml({
- type: "showAvatars"
- });
-}
-
-function init() {
- if (!window) {
- print("[avatarSelection.js] There is no window object for init()");
- return;
- }
- var DEFAULT_AVATAR_URL = "http://mpassets.highfidelity.com/7fe80a1e-f445-4800-9e89-40e677b03bee-v3/mannequin.fst";
- sendToQml({
- type: "addAvatar",
- name: "Wooden Mannequin",
- thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/7fe80a1e-f445-4800-9e89-40e677b03bee/thumbnail/hifi-mp-7fe80a1e-f445-4800-9e89-40e677b03bee.jpg",
- avatarUrl: DEFAULT_AVATAR_URL
- });
- sendToQml({
- type: "addAvatar",
- name: "Cody",
- thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53/thumbnail/hifi-mp-8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53.jpg",
- avatarUrl: "http://mpassets.highfidelity.com/8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53-v1/cody.fst"
- });
- sendToQml({
- type: "addAvatar",
- name: "Mixamo Will",
- thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73/thumbnail/hifi-mp-d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73.jpg",
- avatarUrl: "http://mpassets.highfidelity.com/d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73-v1/4618d52e711fbb34df442b414da767bb.fst"
- });
- sendToQml({
- type: "addAvatar",
- name: "Albert",
- thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/1e57c395-612e-4acd-9561-e79dbda0bc49/thumbnail/hifi-mp-1e57c395-612e-4acd-9561-e79dbda0bc49.jpg",
- avatarUrl: "http://mpassets.highfidelity.com/1e57c395-612e-4acd-9561-e79dbda0bc49-v1/albert.fst"
- });
- /* We need to implement the wallet, so let's skip this for the moment
- sendToQml({
- type: "addExtraOption",
- showName: "More choices",
- thumbnailUrl: "../../../images/moreAvatars.png",
- methodNameWhenClicked: "openAvatarMarket",
- actionText: "MARKETPLACE"
- });
- */
- var currentAvatarURL = Settings.getValue('Avatar/fullAvatarURL', DEFAULT_AVATAR_URL);
- printd("Default Avatar: [" + DEFAULT_AVATAR_URL + "]");
- printd("Current Avatar: [" + currentAvatarURL + "]");
- if (!currentAvatarURL || 0 === currentAvatarURL.length) {
- currentAvatarURL = DEFAULT_AVATAR_URL;
- }
- refreshSelected(currentAvatarURL);
-}
-
-module.exports = {
- init: function() {
- window = new QmlFragment({
- qml: "hifi/avatarSelection.qml",
- visible: false
- });
- if (window) {
- window.fromQml.connect(fromQml);
- }
- init();
- },
- show: function() {
- Controller.setVPadHidden(true);
- if (window) {
- window.setVisible(true);
- isVisible = true;
- }
- },
- hide: function() {
- Controller.setVPadHidden(false);
- if (window) {
- window.setVisible(false);
- }
- isVisible = false;
- },
- destroy: function() {
- Controller.setVPadHidden(false);
- if (window) {
- window.fromQml.disconnect(fromQml);
- window.close();
- window = null;
- }
- },
- isVisible: function() {
- return isVisible;
- },
- width: function() {
- return window ? window.size.x : 0;
- },
- height: function() {
- return window ? window.size.y : 0;
- },
- position: function() {
- return window && isVisible ? window.position : null;
- },
- refreshSelectedAvatar: function(currentAvatarURL) {
- refreshSelected(currentAvatarURL);
- },
- onHidden: function() {
- Controller.setVPadHidden(false);
- }
-};
diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js
deleted file mode 100644
index 3435edb548..0000000000
--- a/scripts/system/+android/bottombar.js
+++ /dev/null
@@ -1,267 +0,0 @@
-"use strict";
-//
-// bottombar.js
-// scripts/system/
-//
-// Created by Gabriel Calero & Cristian Duarte on Jan 18, 2018
-// Copyright 2018 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
-//
-(function() { // BEGIN LOCAL_SCOPE
-
-var bottombar;
-var bottomHudOptionsBar;
-var gotoBtn;
-var avatarBtn;
-var bubbleBtn;
-var loginBtn;
-
-var gotoScript = Script.require('./goto.js');
-var avatarSelection = Script.require('./avatarSelection.js');
-
-var logEnabled = false;
-
-function printd(str) {
- if (logEnabled) {
- print("[bottombar.js] " + str);
- }
-}
-
-function init() {
- gotoScript.init();
- gotoScript.setOnShownChange(function (shown) {
- if (shown) {
- showAddressBar();
- } else {
- hideAddressBar();
- }
- });
- avatarSelection.init();
- App.fullAvatarURLChanged.connect(processedNewAvatar);
-
- setupBottomBar();
- setupBottomHudOptionsBar();
-
- raiseBottomBar();
-
- GlobalServices.connected.connect(handleLogin);
- GlobalServices.disconnected.connect(handleLogout);
-}
-
-function shutdown() {
- App.fullAvatarURLChanged.disconnect(processedNewAvatar);
-}
-
-function setupBottomBar() {
- bottombar = new QmlFragment({
- qml: "hifi/bottombar.qml"
- });
-
- bottombar.fromQml.connect(function(message) {
- switch (message.method) {
- case 'hide':
- lowerBottomBar();
- break;
- default:
- print('[bottombar.js] Unrecognized message from bottomHud.qml:', JSON.stringify(message));
- }
- });
-
- avatarBtn = bottombar.addButton({
- icon: "icons/avatar-i.svg",
- activeIcon: "icons/avatar-a.svg",
- bgOpacity: 0,
- height: 240,
- width: 294,
- hoverBgOpacity: 0,
- activeBgOpacity: 0,
- activeHoverBgOpacity: 0,
- iconSize: 108,
- textSize: 45,
- text: "AVATAR"
- });
- avatarBtn.clicked.connect(function() {
- printd("Avatar button clicked");
- if (!avatarSelection.isVisible()) {
- showAvatarSelection();
- } else {
- hideAvatarSelection();
- }
- });
- avatarSelection.onHidden = function() {
- if (avatarBtn) {
- avatarBtn.isActive = false;
- }
- };
-
- gotoBtn = bottombar.addButton({
- icon: "icons/goto-i.svg",
- activeIcon: "icons/goto-a.svg",
- bgOpacity: 0,
- hoverBgOpacity: 0,
- activeBgOpacity: 0,
- activeHoverBgOpacity: 0,
- height: 240,
- width: 294,
- iconSize: 108,
- textSize: 45,
- text: "GO TO"
- });
-
- gotoBtn.clicked.connect(function() {
- if (!gotoScript.isVisible()) {
- showAddressBar();
- } else {
- hideAddressBar();
- }
- });
-
- bubbleBtn = bottombar.addButton({
- icon: "icons/bubble-i.svg",
- activeIcon: "icons/bubble-a.svg",
- bgOpacity: 0,
- hoverBgOpacity: 0,
- activeBgOpacity: 0,
- activeHoverBgOpacity: 0,
- height: 240,
- width: 294,
- iconSize: 108,
- textSize: 45,
- text: "BUBBLE"
- });
-
- bubbleBtn.editProperties({isActive: Users.getIgnoreRadiusEnabled()});
-
- bubbleBtn.clicked.connect(function() {
- Users.toggleIgnoreRadius();
- bubbleBtn.editProperties({isActive: Users.getIgnoreRadiusEnabled()});
- });
-
- loginBtn = bottombar.addButton({
- icon: "icons/login-i.svg",
- activeIcon: "icons/login-a.svg",
- height: 240,
- width: 294,
- iconSize: 108,
- textSize: 45,
- text: Account.isLoggedIn() ? "LOG OUT" : "LOG IN"
- });
- loginBtn.clicked.connect(function() {
- if (!Account.isLoggedIn()) {
- Account.checkAndSignalForAccessToken();
- } else {
- Menu.triggerOption("Login / Sign Up");
- }
- });
-
- // TODO: setup all the buttons or provide a dynamic interface
-
- raiseBottomBar();
-
-
-}
-
-var setupBottomHudOptionsBar = function() {
- var bottomHud = new QmlFragment({
- qml: "hifi/bottomHudOptions.qml"
- });
-
- bottomHudOptionsBar = {
- show: function() {
- bottomHud.setVisible(true);
- },
- hide: function() {
- bottomHud.setVisible(false);
- },
- qmlFragment: bottomHud
- };
- bottomHud.fromQml.connect(
- function(message) {
- switch (message.method) {
- case 'showUpBar':
- printd('[bottombar.js] showUpBar message from bottomHudOptions.qml: ', JSON.stringify(message));
- raiseBottomBar();
- break;
- default:
- print('[bottombar.js] Unrecognized message from bottomHudOptions.qml:', JSON.stringify(message));
- }
- }
- );
-}
-
-function lowerBottomBar() {
- if (bottombar) {
- bottombar.setVisible(false);
- }
- if (bottomHudOptionsBar) {
- bottomHudOptionsBar.show();
- }
- Controller.setVPadExtraBottomMargin(0);
-}
-
-function raiseBottomBar() {
- print('[bottombar.js] raiseBottomBar begin');
- if (bottombar) {
- bottombar.setVisible(true);
- }
- if (bottomHudOptionsBar) {
- bottomHudOptionsBar.hide();
- }
- Controller.setVPadExtraBottomMargin(255); // Height in bottombar.qml
- print('[bottombar.js] raiseBottomBar end');
-}
-
-function showAddressBar() {
- gotoScript.show();
- gotoBtn.isActive = true;
-}
-
-function hideAddressBar() {
- gotoScript.hide();
- gotoBtn.isActive = false;
-}
-
-function showAvatarSelection() {
- avatarSelection.show();
- avatarBtn.isActive = true;
-}
-
-function hideAvatarSelection() {
- avatarSelection.hide();
- avatarBtn.isActive = false;
-}
-
-// TODO: Move to avatarSelection.js and make it possible to hide the window from there AND switch the button state here too
-function processedNewAvatar(url, modelName) {
- avatarSelection.refreshSelectedAvatar(url);
- hideAvatarSelection();
-}
-
-function handleLogin() {
- Script.setTimeout(function() {
- if (Account.isLoggedIn()) {
- MyAvatar.displayName=Account.getUsername();
- }
- }, 2000);
- if (loginBtn) {
- loginBtn.editProperties({text: "LOG OUT"});
- }
-}
-function handleLogout() {
- MyAvatar.displayName="";
- if (loginBtn) {
- loginBtn.editProperties({text: "LOG IN"});
- }
-}
-
-Script.scriptEnding.connect(function () {
- shutdown();
- GlobalServices.connected.disconnect(handleLogin);
- GlobalServices.disconnected.disconnect(handleLogout);
-});
-
-init();
-
-}()); // END LOCAL_SCOPE
diff --git a/scripts/system/+android/goto.js b/scripts/system/+android/goto.js
deleted file mode 100644
index 2019af9077..0000000000
--- a/scripts/system/+android/goto.js
+++ /dev/null
@@ -1,96 +0,0 @@
-"use strict";
-//
-// goto-android.js
-// scripts/system/
-//
-// Created by Gabriel Calero & Cristian Duarte on 12 Sep 2017
-// Copyright 2017 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
-//
-
-var window;
-
-
-var logEnabled = false;
-function printd(str) {
- if (logEnabled)
- print("[goto-android.js] " + str);
-}
-
-function init() {
-}
-
-function fromQml(message) { // messages are {method, params}, like json-rpc. See also sendToQml.
- switch (message.method) {
- case 'shownChanged':
- if (notifyShownChange) {
- notifyShownChange(message.params.shown);
- } ;
- break;
- case 'hide':
- module.exports.hide();
- module.exports.onHidden();
- break;
- default:
- print('[goto-android.js] Unrecognized message from AddressBarDialog.qml:', JSON.stringify(message));
- }
-}
-
-function sendToQml(message) {
- window.sendToQml(message);
-}
-
-var isVisible = false;
-var notifyShownChange;
-module.exports = {
- init: function() {
- window = new QmlFragment({
- qml: "AddressBarDialog.qml",
- visible: false
- });
- },
- show: function() {
- Controller.setVPadHidden(true);
- if (window) {
- window.fromQml.connect(fromQml);
- window.setVisible(true);
- isVisible = true;
- }
- },
- hide: function() {
- Controller.setVPadHidden(false);
- if (window) {
- window.fromQml.disconnect(fromQml);
- window.setVisible(false);
- }
- isVisible = false;
- },
- destroy: function() {
- if (window) {
- window.close();
- window = null;
- }
- },
- isVisible: function() {
- return isVisible;
- },
- width: function() {
- return window ? window.size.x : 0;
- },
- height: function() {
- return window ? window.size.y : 0;
- },
- position: function() {
- return window && isVisible ? window.position : null;
- },
- setOnShownChange: function(f) {
- notifyShownChange = f;
- },
- onHidden: function() { }
-
-
-};
-
-init();
diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js
index c41ae1f327..f5b3609c26 100644
--- a/scripts/system/+android/modes.js
+++ b/scripts/system/+android/modes.js
@@ -11,15 +11,21 @@
//
(function() { // BEGIN LOCAL_SCOPE
-var modesbar;
-var modesButtons;
-var currentSelectedBtn;
+var modeButton;
+var currentMode;
+var barQml;
var SETTING_CURRENT_MODE_KEY = 'Android/Mode';
var MODE_VR = "VR", MODE_RADAR = "RADAR", MODE_MY_VIEW = "MY VIEW";
var DEFAULT_MODE = MODE_MY_VIEW;
-var logEnabled = true;
+var nextMode = {};
+nextMode[MODE_RADAR]=MODE_MY_VIEW;
+nextMode[MODE_MY_VIEW]=MODE_RADAR;
+var modeLabel = {};
+modeLabel[MODE_RADAR]="TOP VIEW";
+modeLabel[MODE_MY_VIEW]="MY VIEW";
+var logEnabled = false;
var radar = Script.require('./radar.js');
var uniqueColor = Script.require('./uniqueColor.js');
@@ -32,89 +38,35 @@ function printd(str) {
function init() {
radar.setUniqueColor(uniqueColor);
radar.init();
- setupModesBar();
+
+ barQml = new QmlFragment({
+ qml: "hifi/modesbar.qml"
+ });
+ modeButton = barQml.addButton({
+ icon: "icons/myview-a.svg",
+ activeBgOpacity: 0.0,
+ hoverBgOpacity: 0.0,
+ activeHoverBgOpacity: 0.0,
+ text: "MODE",
+ height:240,
+ bottomMargin: 16,
+ textSize: 38,
+ fontFamily: "Raleway",
+ fontBold: true
+
+ });
+
+ switchToMode(getCurrentModeSetting());
+
+ modeButton.clicked.connect(function() {
+ switchToMode(nextMode[currentMode]);
+ });
}
function shutdown() {
}
-function setupModesBar() {
-
- var bar = new QmlFragment({
- qml: "hifi/modesbar.qml"
- });
- var buttonRadarMode = bar.addButton({
- icon: "icons/radar-i.svg",
- activeIcon: "icons/radar-a.svg",
- hoverIcon: "icons/radar-a.svg",
- activeBgOpacity: 0.0,
- hoverBgOpacity: 0.0,
- activeHoverBgOpacity: 0.0,
- text: "RADAR",
- height:240,
- bottomMargin: 6,
- textSize: 45
- });
- var buttonMyViewMode = bar.addButton({
- icon: "icons/myview-i.svg",
- activeIcon: "icons/myview-a.svg",
- hoverIcon: "icons/myview-a.svg",
- activeBgOpacity: 0.0,
- hoverBgOpacity: 0.0,
- activeHoverBgOpacity: 0.0,
- text: "MY VIEW",
- height: 240,
- bottomMargin: 6,
- textSize: 45
- });
-
- modesButtons = [buttonRadarMode, buttonMyViewMode];
-
- var mode = getCurrentModeSetting();
-
- var buttonsRevealed = false;
- bar.sendToQml({type: "inactiveButtonsHidden"});
-
- modesbar = {
- restoreMyViewButton: function() {
- switchModeButtons(buttonMyViewMode);
- saveCurrentModeSetting(MODE_MY_VIEW);
- },
- sendToQml: function(o) { bar.sendToQml(o); },
- qmlFragment: bar
- };
-
- buttonRadarMode.clicked.connect(function() {
- //if (connections.isVisible()) return;
- saveCurrentModeSetting(MODE_RADAR);
- printd("Radar clicked");
- onButtonClicked(buttonRadarMode, function() {
- radar.startRadarMode();
- });
- });
- buttonMyViewMode.clicked.connect(function() {
- //if (connections.isVisible()) return;
- saveCurrentModeSetting(MODE_MY_VIEW);
- printd("My View clicked");
- onButtonClicked(buttonMyViewMode, function() {
- if (currentSelectedBtn == buttonRadarMode) {
- radar.endRadarMode();
- }
- });
- });
-
- var savedButton;
- if (mode == MODE_MY_VIEW) {
- savedButton = buttonMyViewMode;
- } else {
- savedButton = buttonRadarMode;
- }
- printd("[MODE] previous mode " + mode);
-
- savedButton.clicked();
-}
-
function saveCurrentModeSetting(mode) {
Settings.setValue(SETTING_CURRENT_MODE_KEY, mode);
}
@@ -123,62 +75,29 @@ function getCurrentModeSetting(mode) {
return Settings.getValue(SETTING_CURRENT_MODE_KEY, DEFAULT_MODE);
}
-function showAllButtons() {
- for (var i=0; i