From 5bbd5b9e52881abcee6a80b8eb36fc9c7d71f833 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 10 Jul 2018 13:54:34 -0700 Subject: [PATCH 001/434] vec2 conversion --- .../src/RenderableMaterialEntityItem.cpp | 4 +- .../entities/src/EntityItemProperties.cpp | 12 +- libraries/entities/src/EntityItemProperties.h | 4 +- .../entities/src/EntityItemPropertiesMacros.h | 22 +--- libraries/entities/src/MaterialEntityItem.cpp | 18 +-- libraries/entities/src/MaterialEntityItem.h | 10 +- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- libraries/octree/src/OctreePacketData.cpp | 2 +- libraries/octree/src/OctreePacketData.h | 4 +- libraries/script-engine/src/ScriptEngine.cpp | 6 +- libraries/script-engine/src/TouchEvent.cpp | 5 +- libraries/script-engine/src/TouchEvent.h | 4 +- libraries/script-engine/src/Vec3.h | 18 --- libraries/shared/src/PointerEvent.cpp | 3 +- libraries/shared/src/RegisteredMetaTypes.cpp | 43 ++++++- libraries/shared/src/RegisteredMetaTypes.h | 105 +++++++++++++----- libraries/shared/src/shared/JSONHelpers.cpp | 30 +++++ libraries/shared/src/shared/JSONHelpers.h | 1 + 19 files changed, 197 insertions(+), 99 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp index eabcb68e4f..9173355cc2 100644 --- a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp @@ -31,8 +31,8 @@ void MaterialEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& withWriteLock([&] { _drawMaterial = entity->getMaterial(); _parentID = entity->getParentID(); - _materialMappingPos = entity->getMaterialMappingPos(); - _materialMappingScale = entity->getMaterialMappingScale(); + _materialMappingPos = entity->getMaterialMappingPosGlm(); + _materialMappingScale = entity->getMaterialMappingScaleGlm(); _materialMappingRot = entity->getMaterialMappingRot(); _renderTransform = getModelTransform(); const float MATERIAL_ENTITY_SCALE = 0.5f; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index efd2376677..defee4b664 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1578,8 +1578,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(materialMappingMode, MaterialMappingMode); COPY_PROPERTY_FROM_QSCRIPTVALUE(priority, quint16, setPriority); COPY_PROPERTY_FROM_QSCRIPTVALUE(parentMaterialName, QString, setParentMaterialName); - COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, vec2, setMaterialMappingPos); - COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, vec2, setMaterialMappingScale); + COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, ScriptVec2Float, setMaterialMappingPos); + COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, ScriptVec2Float, setMaterialMappingScale); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialData, QString, setMaterialData); COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera); @@ -1957,8 +1957,8 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16); ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, vec2); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, vec2); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2Float); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2Float); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString); @@ -2734,8 +2734,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, setMaterialMappingMode); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_PRIORITY, quint16, setPriority); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_MATERIAL_NAME, QString, setParentMaterialName); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, vec2, setMaterialMappingPos); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, vec2, setMaterialMappingScale); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, ScriptVec2Float, setMaterialMappingPos); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, ScriptVec2Float, setMaterialMappingScale); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_DATA, QString, setMaterialData); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 93b8c991d5..04b6e2d78d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -228,8 +228,8 @@ public: DEFINE_PROPERTY_REF_ENUM(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode, UV); DEFINE_PROPERTY_REF(PROP_MATERIAL_PRIORITY, Priority, priority, quint16, 0); DEFINE_PROPERTY_REF(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString, "0"); - DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, vec2, glm::vec2(0, 0)); - DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, vec2, glm::vec2(1, 1)); + DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2Float, ScriptVec2Float(0.0f)); + DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2Float, ScriptVec2Float(1.0f)); DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float, 0); DEFINE_PROPERTY_REF(PROP_MATERIAL_DATA, MaterialData, materialData, QString, ""); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 213460ec50..0d52861e55 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -101,7 +101,7 @@ changedProperties += P; \ } -inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec2& v) { return vec2toScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec2Float& v) { return vec2toScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3toScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, float v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, int v) { return QScriptValue(v); } @@ -221,21 +221,11 @@ inline QByteArray QByteArray_convertFromScriptValue(const QScriptValue& v, bool& return QByteArray::fromBase64(b64.toUtf8()); } -inline glm::vec2 vec2_convertFromScriptValue(const QScriptValue& v, bool& isValid) { - isValid = false; /// assume it can't be converted - QScriptValue x = v.property("x"); - QScriptValue y = v.property("y"); - if (x.isValid() && y.isValid()) { - glm::vec4 newValue(0); - newValue.x = x.toVariant().toFloat(); - newValue.y = y.toVariant().toFloat(); - isValid = !glm::isnan(newValue.x) && - !glm::isnan(newValue.y); - if (isValid) { - return newValue; - } - } - return glm::vec2(0); +inline ScriptVec2Float ScriptVec2Float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = true; + ScriptVec2Float vec2; + vec2FromScriptValue(v, vec2); + return vec2; } inline glm::vec3 vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { diff --git a/libraries/entities/src/MaterialEntityItem.cpp b/libraries/entities/src/MaterialEntityItem.cpp index 489ba5772c..88da5dd4b5 100644 --- a/libraries/entities/src/MaterialEntityItem.cpp +++ b/libraries/entities/src/MaterialEntityItem.cpp @@ -81,8 +81,8 @@ int MaterialEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, setMaterialMappingMode); READ_ENTITY_PROPERTY(PROP_MATERIAL_PRIORITY, quint16, setPriority); READ_ENTITY_PROPERTY(PROP_PARENT_MATERIAL_NAME, QString, setParentMaterialName); - READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, glm::vec2, setMaterialMappingPos); - READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, glm::vec2, setMaterialMappingScale); + READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, ScriptVec2Float, setMaterialMappingPos); + READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, ScriptVec2Float, setMaterialMappingScale); READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY(PROP_MATERIAL_DATA, QString, setMaterialData); @@ -208,18 +208,18 @@ void MaterialEntityItem::setMaterialData(const QString& materialData) { } } -void MaterialEntityItem::setMaterialMappingPos(const glm::vec2& materialMappingPos) { +void MaterialEntityItem::setMaterialMappingPos(const ScriptVec2Float& materialMappingPos) { if (_materialMappingPos != materialMappingPos) { removeMaterial(); - _materialMappingPos = materialMappingPos; + _materialMappingPos = glm::vec2(materialMappingPos.x, materialMappingPos.y); applyMaterial(); } } -void MaterialEntityItem::setMaterialMappingScale(const glm::vec2& materialMappingScale) { +void MaterialEntityItem::setMaterialMappingScale(const ScriptVec2Float& materialMappingScale) { if (_materialMappingScale != materialMappingScale) { removeMaterial(); - _materialMappingScale = materialMappingScale; + _materialMappingScale = glm::vec2(materialMappingScale.x, materialMappingScale.y); applyMaterial(); } } @@ -290,9 +290,9 @@ void MaterialEntityItem::applyMaterial() { return; } Transform textureTransform; - textureTransform.setTranslation(glm::vec3(_materialMappingPos, 0)); - textureTransform.setRotation(glm::vec3(0, 0, glm::radians(_materialMappingRot))); - textureTransform.setScale(glm::vec3(_materialMappingScale, 1)); + textureTransform.setTranslation(glm::vec3(_materialMappingPos, 0.0f)); + textureTransform.setRotation(glm::vec3(0.0f, 0.0f, glm::radians(_materialMappingRot))); + textureTransform.setScale(glm::vec3(_materialMappingScale, 1.0f)); material->setTextureTransforms(textureTransform); graphics::MaterialLayer materialLayer = graphics::MaterialLayer(material, getPriority()); diff --git a/libraries/entities/src/MaterialEntityItem.h b/libraries/entities/src/MaterialEntityItem.h index 30743850dd..791989b95e 100644 --- a/libraries/entities/src/MaterialEntityItem.h +++ b/libraries/entities/src/MaterialEntityItem.h @@ -66,10 +66,12 @@ public: QString getParentMaterialName() const { return _parentMaterialName; } void setParentMaterialName(const QString& parentMaterialName); - glm::vec2 getMaterialMappingPos() const { return _materialMappingPos; } - void setMaterialMappingPos(const glm::vec2& materialMappingPos); - glm::vec2 getMaterialMappingScale() const { return _materialMappingScale; } - void setMaterialMappingScale(const glm::vec2& materialMappingScale); + ScriptVec2Float getMaterialMappingPos() const { return _materialMappingPos; } + glm::vec2 getMaterialMappingPosGlm() const { return _materialMappingPos; } + void setMaterialMappingPos(const ScriptVec2Float& materialMappingPos); + ScriptVec2Float getMaterialMappingScale() const { return _materialMappingScale; } + glm::vec2 getMaterialMappingScaleGlm() const { return _materialMappingScale; } + void setMaterialMappingScale(const ScriptVec2Float& materialMappingScale); float getMaterialMappingRot() const { return _materialMappingRot; } void setMaterialMappingRot(const float& materialMappingRot); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 13ffcb5120..d7d71f20ca 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -33,7 +33,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::ParticleEntityFix); + return static_cast(EntityVersion::ScriptGlmVectors); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::ConicalFrustums); case PacketType::AvatarIdentity: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 6e1aca83e5..8a054241a1 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -238,7 +238,8 @@ enum class EntityVersion : PacketVersion { CloneableData, CollisionMask16Bytes, YieldSimulationOwnership, - ParticleEntityFix + ParticleEntityFix, + ScriptGlmVectors }; enum class EntityScriptCallMethodVersion : PacketVersion { diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index b938850684..d7b926916b 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -382,7 +382,7 @@ bool OctreePacketData::appendValue(float value) { return success; } -bool OctreePacketData::appendValue(const glm::vec2& value) { +bool OctreePacketData::appendValue(const ScriptVec2Float& value) { const unsigned char* data = (const unsigned char*)&value; int length = sizeof(value); bool success = append(data, length); diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 8d8f599fea..ed550a53ee 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -165,7 +165,7 @@ public: bool appendValue(float value); /// appends a vec2 to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const glm::vec2& value); + bool appendValue(const ScriptVec2Float& value); /// appends a non-position vector to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const glm::vec3& value); @@ -253,7 +253,7 @@ public: static quint64 getTotalBytesOfColor() { return _totalBytesOfColor; } /// total bytes of color static int unpackDataFromBytes(const unsigned char* dataBytes, float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, glm::vec2& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, glm::vec3& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, bool& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, quint64& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 99c02ba1f6..3ef7f12ade 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -666,9 +666,9 @@ void ScriptEngine::init() { qScriptRegisterSequenceMetaType>(this); qScriptRegisterSequenceMetaType>(this); - qScriptRegisterSequenceMetaType >(this); - qScriptRegisterSequenceMetaType >(this); - qScriptRegisterSequenceMetaType >(this); + qScriptRegisterSequenceMetaType>(this); + qScriptRegisterSequenceMetaType>(this); + qScriptRegisterSequenceMetaType>(this); QScriptValue xmlHttpRequestConstructorValue = newFunction(XMLHttpRequestClass::constructor); globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); diff --git a/libraries/script-engine/src/TouchEvent.cpp b/libraries/script-engine/src/TouchEvent.cpp index 6ff591decf..4c08c6ba46 100644 --- a/libraries/script-engine/src/TouchEvent.cpp +++ b/libraries/script-engine/src/TouchEvent.cpp @@ -14,7 +14,6 @@ #include #include -#include #include TouchEvent::TouchEvent() : @@ -80,7 +79,7 @@ void TouchEvent::initWithQTouchEvent(const QTouchEvent& event) { touchAvgY += (float)tPoints[i].pos().y(); // add it to our points vector - glm::vec2 thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); + ScriptVec2Float thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); points << thisPoint; } touchAvgX /= (float)(touchPoints); @@ -219,7 +218,7 @@ QScriptValue TouchEvent::toScriptValue(QScriptEngine* engine, const TouchEvent& QScriptValue pointsObj = engine->newArray(); int index = 0; - foreach (glm::vec2 point, event.points) { + foreach (ScriptVec2Float point, event.points) { QScriptValue thisPoint = vec2toScriptValue(engine, point); pointsObj.setProperty(index, thisPoint); index++; diff --git a/libraries/script-engine/src/TouchEvent.h b/libraries/script-engine/src/TouchEvent.h index 62cb1b1801..1898eef024 100644 --- a/libraries/script-engine/src/TouchEvent.h +++ b/libraries/script-engine/src/TouchEvent.h @@ -17,6 +17,8 @@ #include #include +#include + class QScriptValue; class QScriptEngine; @@ -40,7 +42,7 @@ public: bool isMeta; bool isAlt; int touchPoints; - QVector points; + QVector points; float radius; bool isPinching; bool isPinchOpening; diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 696981d1b4..fe903c07e2 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -21,24 +21,6 @@ #include "GLMHelpers.h" -/**jsdoc - * A 3-dimensional vector. See also the {@link Vec3(0)|Vec3} object. - * - * @typedef {object} Vec3 - * @property {number} x - X-coordinate of the vector. - * @property {number} y - Y-coordinate of the vector. - * @property {number} z - Z-coordinate of the vector. - */ - -/**jsdoc - * A color vector. See also the {@link Vec3(0)|Vec3} object. - * - * @typedef {object} Vec3Color - * @property {number} x - Red component value. Integer in the range 0 - 255. - * @property {number} y - Green component value. Integer in the range 0 - 255. - * @property {number} z - Blue component value. Integer in the range 0 - 255. - */ - /**jsdoc * The Vec3 API facilities for generating and manipulating 3-dimensional vectors. High Fidelity uses a right-handed * Cartesian coordinate system where the y-axis is the "up" and the negative z-axis is the "front" direction. diff --git a/libraries/shared/src/PointerEvent.cpp b/libraries/shared/src/PointerEvent.cpp index fb855922c2..c74d74c771 100644 --- a/libraries/shared/src/PointerEvent.cpp +++ b/libraries/shared/src/PointerEvent.cpp @@ -229,8 +229,7 @@ void PointerEvent::fromScriptValue(const QScriptValue& object, PointerEvent& eve QScriptValue id = object.property("id"); event._id = id.isNumber() ? (uint32_t)id.toNumber() : 0; - glm::vec2 pos2D; - vec2FromScriptValue(object.property("pos2D"), event._pos2D); + glm::vec2 pos2D = vec2FromVariant(object.property("pos2D").toVariant()); glm::vec3 pos3D; vec3FromScriptValue(object.property("pos3D"), event._pos3D); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index a9dbe83b06..96f177656b 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -30,7 +30,8 @@ int vec3MetaTypeId = qRegisterMetaType(); int qVectorVec3MetaTypeId = qRegisterMetaType>(); int qVectorQuatMetaTypeId = qRegisterMetaType>(); int qVectorBoolMetaTypeId = qRegisterMetaType>(); -int vec2MetaTypeId = qRegisterMetaType(); +int glmVec2MetaTypeId = qRegisterMetaType(); +int vec2FloatMetaTypeId = qRegisterMetaType(); int quatMetaTypeId = qRegisterMetaType(); int xColorMetaTypeId = qRegisterMetaType(); int pickRayMetaTypeId = qRegisterMetaType(); @@ -49,6 +50,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, qVectorBoolToScriptValue, qVectorBoolFromScriptValue); qScriptRegisterMetaType(engine, qVectorFloatToScriptValue, qVectorFloatFromScriptValue); qScriptRegisterMetaType(engine, qVectorIntToScriptValue, qVectorIntFromScriptValue); + qScriptRegisterMetaType(engine, glmVec2toScriptValue, glmVec2FromScriptValue); qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, qRectToScriptValue, qRectFromScriptValue); @@ -495,14 +497,49 @@ void qVectorBoolFromScriptValue(const QScriptValue& array, QVector& vector } } -QScriptValue vec2toScriptValue(QScriptEngine* engine, const glm::vec2 &vec2) { +QScriptValue vec2toScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2) { + return engine->newQObject(new ScriptVec2Float(vec2), QScriptEngine::ScriptOwnership); +} + +void vec2FromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) { + if (object.isQObject()) { + auto qObject = object.toQObject(); + if (qObject) { + vec2 = *qobject_cast(qObject); + return; + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("u"); + } + if (!x.isValid()) { + x = object.property("width"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("v"); + } + if (!y.isValid()) { + y = object.property("height"); + } + + vec2.x = x.toVariant().toFloat(); + vec2.y = y.toVariant().toFloat(); + return; + } + vec2 = ScriptVec2Float(); +} + +QScriptValue glmVec2toScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { QScriptValue obj = engine->newObject(); obj.setProperty("x", vec2.x); obj.setProperty("y", vec2.y); return obj; } -void vec2FromScriptValue(const QScriptValue &object, glm::vec2 &vec2) { +void glmVec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { vec2.x = object.property("x").toVariant().toFloat(); vec2.y = object.property("y").toVariant().toFloat(); } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 467d6374a5..293fefec21 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -23,12 +23,15 @@ #include "SharedUtil.h" #include "shared/Bilateral.h" +#include +#include +#include "shared/JSONHelpers.h" + class QColor; class QUrl; Q_DECLARE_METATYPE(glm::vec4) Q_DECLARE_METATYPE(glm::vec3) -Q_DECLARE_METATYPE(glm::vec2) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(glm::mat4) Q_DECLARE_METATYPE(xColor) @@ -44,6 +47,82 @@ void registerMetaTypes(QScriptEngine* engine); QScriptValue mat4toScriptValue(QScriptEngine* engine, const glm::mat4& mat4); void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); +/**jsdoc +* A 2-dimensional vector. +* +* @typedef {object} Vec2 +* @property {number} x - X-coordinate of the vector. +* @property {number} y - Y-coordinate of the vector. +*/ +class ScriptVec2Float : public QObject { + Q_OBJECT + Q_PROPERTY(float x MEMBER x) + Q_PROPERTY(float y MEMBER y) + Q_PROPERTY(float u MEMBER x) + Q_PROPERTY(float v MEMBER y) + Q_PROPERTY(float width MEMBER x) + Q_PROPERTY(float height MEMBER y) +public: + ScriptVec2Float() {} + ScriptVec2Float(float xy) : x(xy), y(xy) {} + ScriptVec2Float(float x, float y) : x(x), y(y) {} + ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} + ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} + void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } + inline bool operator==(const ScriptVec2Float& other) { return (x == other.x && y == other.y); } + inline bool operator!=(const ScriptVec2Float& other) { return !(*this == other); } + inline bool operator==(const glm::vec2& other) { return (x == other.x && y == other.y); } + inline bool operator!=(const glm::vec2& other) { return !(*this == other); } + + Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y" }).toObject().toVariantMap(); } + + float x { 0.0f }; + float y { 0.0f }; +private: + friend QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2); + friend bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2); + friend bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2); +}; +inline QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2) { + debug << "(" << vec2.x << "," << vec2.y << ")"; + return debug; +} +inline bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return (glmVec2.x == vec2.x && glmVec2.y == vec2.y); } +inline bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return !(glmVec2 == vec2); } +Q_DECLARE_METATYPE(ScriptVec2Float) +QScriptValue vec2toScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2); +void vec2FromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2); + +QVariant vec2toVariant(const glm::vec2& vec2); +glm::vec2 vec2FromVariant(const QVariant& object, bool& valid); +glm::vec2 vec2FromVariant(const QVariant& object); + +Q_DECLARE_METATYPE(glm::vec2) +QScriptValue glmVec2toScriptValue(QScriptEngine* engine, const glm::vec2& vec2); +void glmVec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); + +/**jsdoc +* A 3-dimensional vector. See also the {@link Vec3(0)|Vec3} object. +* +* @typedef {object} Vec3 +* @property {number} x - X-coordinate of the vector. +* @property {number} y - Y-coordinate of the vector. +* @property {number} z - Z-coordinate of the vector. +*/ +/**jsdoc +* A color vector. See also the {@link Vec3(0)|Vec3} object. +* +* @typedef {object} Vec3Color +* @property {number} x - Red component value. Integer in the range 0 - 255. +* @property {number} y - Green component value. Integer in the range 0 - 255. +* @property {number} z - Blue component value. Integer in the range 0 - 255. +*/ +QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); +void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3); +QVariant vec3toVariant(const glm::vec3& vec3); +glm::vec3 vec3FromVariant(const QVariant &object, bool& valid); +glm::vec3 vec3FromVariant(const QVariant &object); + /**jsdoc * A 4-dimensional vector. * @@ -53,36 +132,12 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * @property {number} z - Z-coordinate of the vector. * @property {number} w - W-coordinate of the vector. */ -// Vec4 QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4); void vec4FromScriptValue(const QScriptValue& object, glm::vec4& vec4); QVariant vec4toVariant(const glm::vec4& vec4); glm::vec4 vec4FromVariant(const QVariant &object, bool& valid); glm::vec4 vec4FromVariant(const QVariant &object); -// Vec3 -QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); -void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3); - -QVariant vec3toVariant(const glm::vec3& vec3); -glm::vec3 vec3FromVariant(const QVariant &object, bool& valid); -glm::vec3 vec3FromVariant(const QVariant &object); - -/**jsdoc - * A 2-dimensional vector. - * - * @typedef {object} Vec2 - * @property {number} x - X-coordinate of the vector. - * @property {number} y - Y-coordinate of the vector. - */ -// Vec2 -QScriptValue vec2toScriptValue(QScriptEngine* engine, const glm::vec2 &vec2); -void vec2FromScriptValue(const QScriptValue &object, glm::vec2 &vec2); - -QVariant vec2toVariant(const glm::vec2 &vec2); -glm::vec2 vec2FromVariant(const QVariant &object, bool& valid); -glm::vec2 vec2FromVariant(const QVariant &object); - // Quaternions QScriptValue quatToScriptValue(QScriptEngine* engine, const glm::quat& quat); void quatFromScriptValue(const QScriptValue &object, glm::quat& quat); diff --git a/libraries/shared/src/shared/JSONHelpers.cpp b/libraries/shared/src/shared/JSONHelpers.cpp index c7cbf0e724..eb2df5108d 100644 --- a/libraries/shared/src/shared/JSONHelpers.cpp +++ b/libraries/shared/src/shared/JSONHelpers.cpp @@ -106,6 +106,36 @@ QJsonValue toJsonValue(const QObject& o) { return json; } +QJsonValue toJsonValue(const QObject& o, const std::vector& props) { + QJsonObject json {}; + + const auto& meta = o.metaObject(); + // Only add the properties in props + for (auto& prop : props) { + int i = meta->indexOfProperty(prop.toStdString().c_str()); + QString name = QString::fromLatin1(meta->property(i).name()); + auto type = meta->property(i).userType(); + QVariant variant { meta->property(i).read(&o) }; + QJsonValue value; + + // User-registered types need explicit conversion + if (type == qMetaTypeId()) { + value = toJsonValue(variant.value()); + } else if (type == qMetaTypeId()) { + value = toJsonValue(variant.value()); + } else if (type == qMetaTypeId()) { + value = toJsonValue(variant.value()); + } else { + // Qt types are converted automatically + value = QJsonValue::fromVariant(variant); + } + + json.insert(name, value); + } + + return json; +} + void qObjectFromJsonValue(const QJsonValue& j, QObject& o) { const QJsonObject object = j.toObject(); for (auto it = object.begin(); it != object.end(); it++) { diff --git a/libraries/shared/src/shared/JSONHelpers.h b/libraries/shared/src/shared/JSONHelpers.h index 735d33b5a5..8548c24717 100644 --- a/libraries/shared/src/shared/JSONHelpers.h +++ b/libraries/shared/src/shared/JSONHelpers.h @@ -16,6 +16,7 @@ QJsonValue toJsonValue(const quat& q); QJsonValue toJsonValue(const vec3& v); QJsonValue toJsonValue(const vec4& v); QJsonValue toJsonValue(const QObject& o); +QJsonValue toJsonValue(const QObject& o, const std::vector& props); quat quatFromJsonValue(const QJsonValue& q); vec3 vec3FromJsonValue(const QJsonValue& v); From 9929529f309946535ab74878e8d28f3cf360224c Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 11 Jul 2018 14:18:22 -0700 Subject: [PATCH 002/434] vec3 conversion --- interface/src/Application.cpp | 10 +- interface/src/raypick/LaserPointer.cpp | 20 +- interface/src/raypick/RayPick.cpp | 4 +- interface/src/raypick/RayPick.h | 4 +- interface/src/raypick/StylusPick.h | 4 +- interface/src/raypick/StylusPointer.cpp | 4 +- interface/src/ui/overlays/Base3DOverlay.cpp | 8 +- .../ui/overlays/ContextOverlayInterface.cpp | 15 +- interface/src/ui/overlays/Image3DOverlay.cpp | 2 +- interface/src/ui/overlays/Line3DOverlay.cpp | 8 +- interface/src/ui/overlays/ModelOverlay.cpp | 8 +- interface/src/ui/overlays/Overlays.cpp | 2 +- interface/src/ui/overlays/PanelAttachable.cpp | 4 +- interface/src/ui/overlays/Planar3DOverlay.cpp | 2 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 12 +- interface/src/ui/overlays/Volume3DOverlay.cpp | 2 +- interface/src/ui/overlays/Web3DOverlay.cpp | 4 +- libraries/animation/src/AnimVariant.cpp | 2 +- libraries/audio/src/AudioInjectorOptions.cpp | 2 +- .../src/avatars-renderer/Avatar.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 2 +- .../controllers/src/controllers/Pose.cpp | 6 +- .../src/display-plugins/CompositorHelper.cpp | 2 +- .../src/RenderableLineEntityItem.h | 2 +- .../src/RenderableModelEntityItem.cpp | 4 +- .../src/RenderableModelEntityItem.h | 2 +- .../src/RenderablePolyLineEntityItem.cpp | 22 +- .../src/RenderablePolyLineEntityItem.h | 12 +- .../src/RenderablePolyVoxEntityItem.cpp | 26 +- .../src/RenderablePolyVoxEntityItem.h | 2 +- .../src/RenderableWebEntityItem.cpp | 2 +- .../src/RenderableZoneEntityItem.cpp | 2 +- libraries/entities/src/EntityEditFilters.cpp | 8 +- libraries/entities/src/EntityItem.cpp | 52 +- libraries/entities/src/EntityItem.h | 16 +- .../entities/src/EntityItemProperties.cpp | 110 ++-- libraries/entities/src/EntityItemProperties.h | 64 +-- .../src/EntityItemPropertiesDefaults.h | 2 +- .../entities/src/EntityItemPropertiesMacros.h | 50 +- .../entities/src/EntityScriptingInterface.cpp | 22 +- .../entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/EntityTree.cpp | 10 +- .../entities/src/KeyLightPropertyGroup.cpp | 8 +- .../entities/src/KeyLightPropertyGroup.h | 2 +- libraries/entities/src/LineEntityItem.cpp | 12 +- libraries/entities/src/LineEntityItem.h | 8 +- libraries/entities/src/ModelEntityItem.cpp | 8 +- libraries/entities/src/ModelEntityItem.h | 4 +- .../entities/src/ParticleEffectEntityItem.cpp | 20 +- .../entities/src/ParticleEffectEntityItem.h | 30 +- libraries/entities/src/PolyLineEntityItem.cpp | 30 +- libraries/entities/src/PolyLineEntityItem.h | 20 +- libraries/entities/src/PolyVoxEntityItem.cpp | 14 +- libraries/entities/src/PolyVoxEntityItem.h | 6 +- .../GraphicsScriptingInterface.cpp | 4 +- libraries/octree/src/OctreePacketData.cpp | 18 +- libraries/octree/src/OctreePacketData.h | 8 +- libraries/render-utils/src/GeometryCache.cpp | 10 +- libraries/render-utils/src/GeometryCache.h | 6 +- libraries/render-utils/src/Model.cpp | 20 +- .../src/ModelScriptingInterface.cpp | 2 +- libraries/script-engine/src/SpatialEvent.cpp | 4 +- libraries/script-engine/src/TouchEvent.cpp | 2 +- libraries/shared/src/JointData.h | 4 +- libraries/shared/src/PointerEvent.cpp | 3 +- libraries/shared/src/RegisteredMetaTypes.cpp | 533 ++++++++++-------- libraries/shared/src/RegisteredMetaTypes.h | 138 ++++- libraries/shared/src/SpatiallyNestable.cpp | 24 + libraries/shared/src/SpatiallyNestable.h | 4 + libraries/shared/src/shared/JSONHelpers.cpp | 50 +- libraries/shared/src/shared/JSONHelpers.h | 1 + 71 files changed, 870 insertions(+), 662 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7e683c7cc8..8e3ddbc687 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4748,7 +4748,7 @@ bool Application::exportEntities(const QString& filename, properties.setParentID(AVATAR_SELF_ID); } else { if (parentID.isInvalidID()) { - properties.setPosition(properties.getPosition() - root); + properties.setPosition(properties.getPosition().toGlm() - root); } else if (!entities.contains(parentID)) { entityDatum->globalizeProperties(properties, "Parent %3 of %2 %1 is not selected for export.", -root); } // else valid parent -- don't offset @@ -5396,9 +5396,9 @@ void Application::updateSecondaryCameraViewFrustum() { if (camera->mirrorProjection && !camera->attachedEntityId.isNull()) { auto entityScriptingInterface = DependencyManager::get(); auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId); - glm::vec3 mirrorPropertiesPosition = entityProperties.getPosition(); + glm::vec3 mirrorPropertiesPosition = entityProperties.getPosition().toGlm(); glm::quat mirrorPropertiesRotation = entityProperties.getRotation(); - glm::vec3 mirrorPropertiesDimensions = entityProperties.getDimensions(); + glm::vec3 mirrorPropertiesDimensions = entityProperties.getDimensions().toGlm(); glm::vec3 halfMirrorPropertiesDimensions = 0.5f * mirrorPropertiesDimensions; // setup mirror from world as inverse of world from mirror transformation using inverted x and z for mirrored image @@ -5430,7 +5430,7 @@ void Application::updateSecondaryCameraViewFrustum() { if (!camera->attachedEntityId.isNull()) { auto entityScriptingInterface = DependencyManager::get(); auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId); - secondaryViewFrustum.setPosition(entityProperties.getPosition()); + secondaryViewFrustum.setPosition(entityProperties.getPosition().toGlm()); secondaryViewFrustum.setOrientation(entityProperties.getRotation()); } else { secondaryViewFrustum.setPosition(camera->position); @@ -7270,7 +7270,7 @@ void Application::addAssetToWorldCheckModelSize() { auto entityScriptingInterface = DependencyManager::get(); auto properties = entityScriptingInterface->getEntityProperties(entityID, propertyFlags); auto name = properties.getName(); - auto dimensions = properties.getDimensions(); + auto dimensions = properties.getDimensions().toGlm(); const QString GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":true}}"; bool doResize = false; diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index bd71e47cf0..8e5776b84d 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -101,12 +101,12 @@ PickResultPointer LaserPointer::getVisualPickResult(const PickResultPointer& pic registrationPoint = glm::vec3(0.5f); } else { EntityItemProperties props = DependencyManager::get()->getEntityProperties(_lockEndObject.id); - glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition()); + glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition().toGlm()); glm::mat4 finalPosAndRotMat = entityMat * _lockEndObject.offsetMat; pos = extractTranslation(finalPosAndRotMat); rot = glmExtractRotation(finalPosAndRotMat); - dim = props.getDimensions(); - registrationPoint = props.getRegistrationPoint(); + dim = props.getDimensions().toGlm(); + registrationPoint = props.getRegistrationPoint().toGlm(); } const glm::vec3 DEFAULT_REGISTRATION_POINT = glm::vec3(0.5f); endVec = pos + rot * (dim * (DEFAULT_REGISTRATION_POINT - registrationPoint)); @@ -119,7 +119,7 @@ PickResultPointer LaserPointer::getVisualPickResult(const PickResultPointer& pic rayPickResult->intersection = endVec; rayPickResult->distance = distance; rayPickResult->surfaceNormal = -normalizedDirection; - rayPickResult->pickVariant["direction"] = vec3toVariant(normalizedDirection); + rayPickResult->pickVariant["direction"] = vec3ToVariant(normalizedDirection); } else if (type != IntersectionType::NONE && _lockEnd) { if (type == IntersectionType::ENTITY) { endVec = DependencyManager::get()->getEntityTransform(rayPickResult->objectID)[3]; @@ -134,7 +134,7 @@ PickResultPointer LaserPointer::getVisualPickResult(const PickResultPointer& pic rayPickResult->intersection = endVec; rayPickResult->distance = distance; rayPickResult->surfaceNormal = -normalizedDirection; - rayPickResult->pickVariant["direction"] = vec3toVariant(normalizedDirection); + rayPickResult->pickVariant["direction"] = vec3ToVariant(normalizedDirection); } } return visualPickResult; @@ -151,17 +151,17 @@ void LaserPointer::updateRenderStateOverlay(const OverlayID& id, const QVariant& void LaserPointer::updateRenderState(const RenderState& renderState, const IntersectionType type, float distance, const QUuid& objectID, const PickRay& pickRay) { if (!renderState.getStartID().isNull()) { QVariantMap startProps; - startProps.insert("position", vec3toVariant(pickRay.origin)); + startProps.insert("position", vec3ToVariant(pickRay.origin)); startProps.insert("visible", true); startProps.insert("ignoreRayIntersection", renderState.doesStartIgnoreRays()); qApp->getOverlays().editOverlay(renderState.getStartID(), startProps); } glm::vec3 endVec = pickRay.origin + pickRay.direction * distance; - QVariant end = vec3toVariant(endVec); + QVariant end = vec3ToVariant(endVec); if (!renderState.getPathID().isNull()) { QVariantMap pathProps; - pathProps.insert("start", vec3toVariant(pickRay.origin)); + pathProps.insert("start", vec3ToVariant(pickRay.origin)); pathProps.insert("end", end); pathProps.insert("visible", true); pathProps.insert("ignoreRayIntersection", renderState.doesPathIgnoreRays()); @@ -176,13 +176,13 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter glm::vec3 dim = vec3FromVariant(qApp->getOverlays().getProperty(renderState.getEndID(), "dimensions").value); if (_distanceScaleEnd) { dim = renderState.getEndDim() * glm::distance(pickRay.origin, endVec); - endProps.insert("dimensions", vec3toVariant(dim)); + endProps.insert("dimensions", vec3ToVariant(dim)); } if (_centerEndY) { endProps.insert("position", end); } else { glm::vec3 currentUpVector = faceAvatarRotation * Vectors::UP; - endProps.insert("position", vec3toVariant(endVec + glm::vec3(currentUpVector.x * 0.5f * dim.y, currentUpVector.y * 0.5f * dim.y, currentUpVector.z * 0.5f * dim.y))); + endProps.insert("position", vec3ToVariant(endVec + glm::vec3(currentUpVector.x * 0.5f * dim.y, currentUpVector.y * 0.5f * dim.y, currentUpVector.z * 0.5f * dim.y))); } if (_faceAvatar) { endProps.insert("rotation", quatToVariant(faceAvatarRotation)); diff --git a/interface/src/raypick/RayPick.cpp b/interface/src/raypick/RayPick.cpp index 75b5e77fd8..ba7eb4b3f6 100644 --- a/interface/src/raypick/RayPick.cpp +++ b/interface/src/raypick/RayPick.cpp @@ -65,7 +65,7 @@ glm::vec3 RayPick::intersectRayWithOverlayXYPlane(const QUuid& overlayID, const glm::vec3 RayPick::intersectRayWithEntityXYPlane(const QUuid& entityID, const glm::vec3& origin, const glm::vec3& direction) { auto props = DependencyManager::get()->getEntityProperties(entityID); - return intersectRayWithXYPlane(origin, direction, props.getPosition(), props.getRotation(), props.getRegistrationPoint()); + return intersectRayWithXYPlane(origin, direction, props.getPosition().toGlm(), props.getRotation(), props.getRegistrationPoint().toGlm()); } glm::vec2 RayPick::projectOntoXYPlane(const glm::vec3& worldPos, const glm::vec3& position, const glm::quat& rotation, const glm::vec3& dimensions, const glm::vec3& registrationPoint, bool unNormalized) { @@ -91,5 +91,5 @@ glm::vec2 RayPick::projectOntoOverlayXYPlane(const QUuid& overlayID, const glm:: glm::vec2 RayPick::projectOntoEntityXYPlane(const QUuid& entityID, const glm::vec3& worldPos, bool unNormalized) { auto props = DependencyManager::get()->getEntityProperties(entityID); - return projectOntoXYPlane(worldPos, props.getPosition(), props.getRotation(), props.getDimensions(), props.getRegistrationPoint(), unNormalized); + return projectOntoXYPlane(worldPos, props.getPosition().toGlm(), props.getRotation(), props.getDimensions().toGlm(), props.getRegistrationPoint().toGlm(), unNormalized); } \ No newline at end of file diff --git a/interface/src/raypick/RayPick.h b/interface/src/raypick/RayPick.h index 6bdc2cb5b0..da0988fc0d 100644 --- a/interface/src/raypick/RayPick.h +++ b/interface/src/raypick/RayPick.h @@ -46,8 +46,8 @@ public: toReturn["intersects"] = intersects; toReturn["objectID"] = objectID; toReturn["distance"] = distance; - toReturn["intersection"] = vec3toVariant(intersection); - toReturn["surfaceNormal"] = vec3toVariant(surfaceNormal); + toReturn["intersection"] = vec3ToVariant(intersection); + toReturn["surfaceNormal"] = vec3ToVariant(surfaceNormal); toReturn["searchRay"] = PickResult::toVariantMap(); toReturn["extraInfo"] = extraInfo; return toReturn; diff --git a/interface/src/raypick/StylusPick.h b/interface/src/raypick/StylusPick.h index f19e343f8d..bea40f147e 100644 --- a/interface/src/raypick/StylusPick.h +++ b/interface/src/raypick/StylusPick.h @@ -44,8 +44,8 @@ public: toReturn["intersects"] = intersects; toReturn["objectID"] = objectID; toReturn["distance"] = distance; - toReturn["intersection"] = vec3toVariant(intersection); - toReturn["surfaceNormal"] = vec3toVariant(surfaceNormal); + toReturn["intersection"] = vec3ToVariant(intersection); + toReturn["surfaceNormal"] = vec3ToVariant(surfaceNormal); toReturn["stylusTip"] = PickResult::toVariantMap(); return toReturn; } diff --git a/interface/src/raypick/StylusPointer.cpp b/interface/src/raypick/StylusPointer.cpp index 8c0fb59106..4ad4c55b84 100644 --- a/interface/src/raypick/StylusPointer.cpp +++ b/interface/src/raypick/StylusPointer.cpp @@ -74,9 +74,9 @@ void StylusPointer::show(const StylusTip& tip) { auto modelOrientation = tip.orientation * X_ROT_NEG_90; auto sensorToWorldScale = DependencyManager::get()->getMyAvatar()->getSensorToWorldScale(); auto modelPositionOffset = modelOrientation * (vec3(0.0f, 0.0f, -WEB_STYLUS_LENGTH / 2.0f) * sensorToWorldScale); - props["position"] = vec3toVariant(tip.position + modelPositionOffset); + props["position"] = vec3ToVariant(tip.position + modelPositionOffset); props["rotation"] = quatToVariant(modelOrientation); - props["dimensions"] = vec3toVariant(sensorToWorldScale * vec3(0.01f, 0.01f, WEB_STYLUS_LENGTH)); + props["dimensions"] = vec3ToVariant(sensorToWorldScale * vec3(0.01f, 0.01f, WEB_STYLUS_LENGTH)); props["visible"] = true; qApp->getOverlays().editOverlay(_stylusOverlay, props); } diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 551b352952..4d3a831948 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -59,7 +59,7 @@ QVariantMap convertOverlayLocationFromScriptSemantics(const QVariantMap& propert glm::vec3 localPosition = SpatiallyNestable::worldToLocal(vec3FromVariant(result["position"]), parentID, parentJointIndex, scalesWithParent, success); if (success) { - result["position"] = vec3toVariant(localPosition); + result["position"] = vec3ToVariant(localPosition); } } @@ -112,7 +112,7 @@ void Base3DOverlay::setProperties(const QVariantMap& originalProperties) { properties["parentJointIndex"] = getParentJointIndex(); } if (!properties["position"].isValid() && !properties["localPosition"].isValid()) { - properties["position"] = vec3toVariant(getWorldPosition()); + properties["position"] = vec3ToVariant(getWorldPosition()); } if (!properties["orientation"].isValid() && !properties["localOrientation"].isValid()) { properties["orientation"] = quatToVariant(getWorldOrientation()); @@ -240,10 +240,10 @@ QVariant Base3DOverlay::getProperty(const QString& property) { return _name; } if (property == "position" || property == "start" || property == "p1" || property == "point") { - return vec3toVariant(getWorldPosition()); + return vec3ToVariant(getWorldPosition()); } if (property == "localPosition") { - return vec3toVariant(getLocalPosition()); + return vec3ToVariant(getLocalPosition()); } if (property == "rotation" || property == "orientation") { return quatToVariant(getWorldOrientation()); diff --git a/interface/src/ui/overlays/ContextOverlayInterface.cpp b/interface/src/ui/overlays/ContextOverlayInterface.cpp index aca186a589..139d76a966 100644 --- a/interface/src/ui/overlays/ContextOverlayInterface.cpp +++ b/interface/src/ui/overlays/ContextOverlayInterface.cpp @@ -62,7 +62,7 @@ ContextOverlayInterface::ContextOverlayInterface() { glm::quat cameraOrientation = qApp->getCamera().getOrientation(); QVariantMap props; float sensorToWorldScale = myAvatar->getSensorToWorldScale(); - props.insert("position", vec3toVariant(myAvatar->getEyePosition() + glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_OFFSET, 0.0f))) * ((CONTEXT_OVERLAY_TABLET_DISTANCE * sensorToWorldScale) * (cameraOrientation * Vectors::FRONT)))); + props.insert("position", vec3ToVariant(myAvatar->getEyePosition() + glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_OFFSET, 0.0f))) * ((CONTEXT_OVERLAY_TABLET_DISTANCE * sensorToWorldScale) * (cameraOrientation * Vectors::FRONT)))); props.insert("orientation", quatToVariant(cameraOrientation * glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_ORIENTATION, 0.0f))))); qApp->getOverlays().editOverlay(tabletFrameID, props); _contextOverlayJustClicked = false; @@ -136,16 +136,17 @@ bool ContextOverlayInterface::createOrDestroyContextOverlay(const EntityItemID& // Add all necessary variables to the stack EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(entityItemID, _entityPropertyFlags); glm::vec3 cameraPosition = qApp->getCamera().getPosition(); - glm::vec3 entityDimensions = entityProperties.getDimensions(); - glm::vec3 entityPosition = entityProperties.getPosition(); - glm::vec3 contextOverlayPosition = entityProperties.getPosition(); + glm::vec3 entityDimensions = entityProperties.getDimensions().toGlm(); + glm::vec3 entityPosition = entityProperties.getPosition().toGlm(); + glm::vec3 registrationPoint = entityProperties.getRegistrationPoint().toGlm(); + glm::vec3 contextOverlayPosition = entityProperties.getPosition().toGlm(); glm::vec2 contextOverlayDimensions; // Update the position of the overlay if the registration point of the entity // isn't default - if (entityProperties.getRegistrationPoint() != glm::vec3(0.5f)) { - glm::vec3 adjustPos = entityProperties.getRegistrationPoint() - glm::vec3(0.5f); - entityPosition = entityPosition - (entityProperties.getRotation() * (adjustPos * entityProperties.getDimensions())); + if (registrationPoint != glm::vec3(0.5f)) { + glm::vec3 adjustPos = registrationPoint - glm::vec3(0.5f); + entityPosition = entityPosition - (entityProperties.getRotation() * (adjustPos * entityDimensions)); } enableEntityHighlight(entityItemID); diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index a4ce7f9e0d..d901f20c20 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -243,7 +243,7 @@ QVariant Image3DOverlay::getProperty(const QString& property) { return _fromImage; } if (property == "offsetPosition") { - return vec3toVariant(getOffsetPosition()); + return vec3ToVariant(getOffsetPosition()); } if (property == "emissive") { return _emissive; diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index c2e5ad1fb4..627b6d6577 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -314,10 +314,10 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { */ QVariant Line3DOverlay::getProperty(const QString& property) { if (property == "start" || property == "startPoint" || property == "p1") { - return vec3toVariant(getStart()); + return vec3ToVariant(getStart()); } if (property == "end" || property == "endPoint" || property == "p2") { - return vec3toVariant(getEnd()); + return vec3ToVariant(getEnd()); } if (property == "length") { return QVariant(getLength()); @@ -329,10 +329,10 @@ QVariant Line3DOverlay::getProperty(const QString& property) { return _endParentJointIndex; } if (property == "localStart") { - return vec3toVariant(getLocalStart()); + return vec3ToVariant(getLocalStart()); } if (property == "localEnd") { - return vec3toVariant(getLocalEnd()); + return vec3ToVariant(getLocalEnd()); } if (property == "glow") { return getGlow(); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index f4289b1bf5..2ffef6a233 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -416,10 +416,10 @@ QVariant ModelOverlay::getProperty(const QString& property) { return _url.toString(); } if (property == "dimensions" || property == "size") { - return vec3toVariant(getDimensions()); + return vec3ToVariant(getDimensions()); } if (property == "scale") { - return vec3toVariant(getSNScale()); + return vec3ToVariant(getSNScale()); } if (property == "textures") { if (_modelTextures.size() > 0) { @@ -463,7 +463,7 @@ QVariant ModelOverlay::getProperty(const QString& property) { [this](int jointIndex) -> QVariant { glm::vec3 translation; _model->getJointTranslation(jointIndex, translation); - return vec3toVariant(translation); + return vec3ToVariant(translation); }); } @@ -483,7 +483,7 @@ QVariant ModelOverlay::getProperty(const QString& property) { [this](int jointIndex) -> QVariant { glm::vec3 position; _model->getJointPositionInWorldFrame(jointIndex, position); - return vec3toVariant(position); + return vec3ToVariant(position); }); } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 4f2a8e6fa4..c52f470b47 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -606,7 +606,7 @@ QScriptValue RayToOverlayIntersectionResultToScriptValue(QScriptEngine* engine, break; } obj.setProperty("face", faceName); - auto intersection = vec3toScriptValue(engine, value.intersection); + auto intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; diff --git a/interface/src/ui/overlays/PanelAttachable.cpp b/interface/src/ui/overlays/PanelAttachable.cpp index b53474390c..7daa199181 100644 --- a/interface/src/ui/overlays/PanelAttachable.cpp +++ b/interface/src/ui/overlays/PanelAttachable.cpp @@ -21,13 +21,13 @@ bool PanelAttachable::getParentVisible() const { // No JSDoc because these properties are not actually used. QVariant PanelAttachable::getProperty(const QString& property) { if (property == "offsetPosition") { - return vec3toVariant(getOffsetPosition()); + return vec3ToVariant(getOffsetPosition()); } if (property == "offsetRotation") { return quatToVariant(getOffsetRotation()); } if (property == "offsetScale") { - return vec3toVariant(getOffsetScale()); + return vec3ToVariant(getOffsetScale()); } return QVariant(); } diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index 9a436c7564..2d25d90bd1 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -64,7 +64,7 @@ void Planar3DOverlay::setProperties(const QVariantMap& properties) { */ QVariant Planar3DOverlay::getProperty(const QString& property) { if (property == "dimensions" || property == "scale" || property == "size") { - return vec2toVariant(getDimensions()); + return vec2ToVariant(getDimensions()); } return Base3DOverlay::getProperty(property); diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index e765f3fc18..54d29df516 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -83,12 +83,12 @@ void Rectangle3DOverlay::render(RenderArgs* args) { geometryCache->renderDashedLine(*batch, point4, point1, rectangleColor, _rectGeometryIds[3]); } else { if (halfDimensions != _previousHalfDimensions) { - QVector border; - border << glm::vec3(-halfDimensions.x, -halfDimensions.y, 0.0f); - border << glm::vec3(halfDimensions.x, -halfDimensions.y, 0.0f); - border << glm::vec3(halfDimensions.x, halfDimensions.y, 0.0f); - border << glm::vec3(-halfDimensions.x, halfDimensions.y, 0.0f); - border << glm::vec3(-halfDimensions.x, -halfDimensions.y, 0.0f); + QVector border; + border << ScriptVec3Float(-halfDimensions.x, -halfDimensions.y, 0.0f); + border << ScriptVec3Float(halfDimensions.x, -halfDimensions.y, 0.0f); + border << ScriptVec3Float(halfDimensions.x, halfDimensions.y, 0.0f); + border << ScriptVec3Float(-halfDimensions.x, halfDimensions.y, 0.0f); + border << ScriptVec3Float(-halfDimensions.x, -halfDimensions.y, 0.0f); geometryCache->updateVertices(_geometryCacheID, border, rectangleColor); _previousHalfDimensions = halfDimensions; diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index cf1f7f7fcb..9879bea18c 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -69,7 +69,7 @@ void Volume3DOverlay::setProperties(const QVariantMap& properties) { */ QVariant Volume3DOverlay::getProperty(const QString& property) { if (property == "dimensions" || property == "scale" || property == "size") { - return vec3toVariant(getDimensions()); + return vec3ToVariant(getDimensions()); } return Base3DOverlay::getProperty(property); diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index a8a82c74b7..148fe2d49d 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -186,7 +186,7 @@ void Web3DOverlay::buildWebSurface() { _cachedWebSurface = false; setupQmlSurface(); } - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getWorldPosition())); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(getWorldPosition())); onResizeWebSurface(); _webSurface->resume(); }); @@ -198,7 +198,7 @@ void Web3DOverlay::buildWebSurface() { void Web3DOverlay::update(float deltatime) { if (_webSurface) { // update globalPosition - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getWorldPosition())); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(getWorldPosition())); } Parent::update(deltatime); } diff --git a/libraries/animation/src/AnimVariant.cpp b/libraries/animation/src/AnimVariant.cpp index 483a7999c9..a9294aa00f 100644 --- a/libraries/animation/src/AnimVariant.cpp +++ b/libraries/animation/src/AnimVariant.cpp @@ -40,7 +40,7 @@ QScriptValue AnimVariantMap::animVariantMapToScriptValue(QScriptEngine* engine, target.setProperty(name, value.getString()); break; case AnimVariant::Type::Vec3: - target.setProperty(name, vec3toScriptValue(engine, value.getVec3())); + target.setProperty(name, vec3ToScriptValue(engine, value.getVec3())); break; case AnimVariant::Type::Quat: target.setProperty(name, quatToScriptValue(engine, value.getQuat())); diff --git a/libraries/audio/src/AudioInjectorOptions.cpp b/libraries/audio/src/AudioInjectorOptions.cpp index 2f82cae137..217202f82f 100644 --- a/libraries/audio/src/AudioInjectorOptions.cpp +++ b/libraries/audio/src/AudioInjectorOptions.cpp @@ -34,7 +34,7 @@ AudioInjectorOptions::AudioInjectorOptions() : QScriptValue injectorOptionsToScriptValue(QScriptEngine* engine, const AudioInjectorOptions& injectorOptions) { QScriptValue obj = engine->newObject(); - obj.setProperty("position", vec3toScriptValue(engine, injectorOptions.position)); + obj.setProperty("position", vec3ToScriptValue(engine, injectorOptions.position)); obj.setProperty("volume", injectorOptions.volume); obj.setProperty("loop", injectorOptions.loop); obj.setProperty("orientation", quatToScriptValue(engine, injectorOptions.orientation)); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index dd2828eb25..e4a9f51d92 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1486,7 +1486,7 @@ void Avatar::renderJointConnectingCone(gpu::Batch& batch, glm::vec3 position1, g perpSin = glm::cross(perpCos, axis); float angleb = 0.0f; - QVector points; + QVector points; for (int i = 0; i < NUM_BODY_CONE_SIDES; i ++) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index fc72f34304..5921c2913b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2562,7 +2562,7 @@ QScriptValue RayToAvatarIntersectionResultToScriptValue(QScriptEngine* engine, c QScriptValue avatarIDValue = quuidToScriptValue(engine, value.avatarID); obj.setProperty("avatarID", avatarIDValue); obj.setProperty("distance", value.distance); - QScriptValue intersection = vec3toScriptValue(engine, value.intersection); + QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; diff --git a/libraries/controllers/src/controllers/Pose.cpp b/libraries/controllers/src/controllers/Pose.cpp index 967838ef84..6df4b4af81 100644 --- a/libraries/controllers/src/controllers/Pose.cpp +++ b/libraries/controllers/src/controllers/Pose.cpp @@ -41,10 +41,10 @@ namespace controller { */ QScriptValue Pose::toScriptValue(QScriptEngine* engine, const Pose& pose) { QScriptValue obj = engine->newObject(); - obj.setProperty("translation", vec3toScriptValue(engine, pose.translation)); + obj.setProperty("translation", vec3ToScriptValue(engine, pose.translation)); obj.setProperty("rotation", quatToScriptValue(engine, pose.rotation)); - obj.setProperty("velocity", vec3toScriptValue(engine, pose.velocity)); - obj.setProperty("angularVelocity", vec3toScriptValue(engine, pose.angularVelocity)); + obj.setProperty("velocity", vec3ToScriptValue(engine, pose.velocity)); + obj.setProperty("angularVelocity", vec3ToScriptValue(engine, pose.angularVelocity)); obj.setProperty("valid", pose.valid); return obj; } diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index b78f00fa0e..f70d979613 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -475,7 +475,7 @@ glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point, float si QVariant ReticleInterface::getPosition() const { - return vec2toVariant(_compositor->getReticlePosition()); + return vec2ToVariant(_compositor->getReticlePosition()); } void ReticleInterface::setPosition(QVariant position) { diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h index 799ba5b78c..fa26259dec 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -34,7 +34,7 @@ protected: private: int _lineVerticesID { GeometryCache::UNKNOWN_ID }; - QVector _linePoints; + QVector _linePoints; }; } } // namespace diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index d8ac3dc63e..dbcdb2328c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -913,7 +913,7 @@ void RenderableModelEntityItem::setJointRotationsSet(const QVector& rotati _needsJointSimulation = true; } -void RenderableModelEntityItem::setJointTranslations(const QVector& translations) { +void RenderableModelEntityItem::setJointTranslations(const QVector& translations) { ModelEntityItem::setJointTranslations(translations); _needsJointSimulation = true; } @@ -1029,7 +1029,7 @@ void RenderableModelEntityItem::copyAnimationJointDataToModel() { changed = true; } if (jointData.translationDirty) { - model->setJointTranslation(index, true, jointData.joint.translation, 1.0f); + model->setJointTranslation(index, true, jointData.joint.translation.toGlm(), 1.0f); jointData.translationDirty = false; changed = true; } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 91e5496b97..69aec1bea6 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -103,7 +103,7 @@ public: virtual void setJointRotations(const QVector& rotations) override; virtual void setJointRotationsSet(const QVector& rotationsSet) override; - virtual void setJointTranslations(const QVector& translations) override; + virtual void setJointTranslations(const QVector& translations) override; virtual void setJointTranslationsSet(const QVector& translationsSet) override; virtual void locationChanged(bool tellPhysics = true) override; diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 7cab57123d..ae98ccb07a 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -175,7 +175,7 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo } if (strokeColorsChanged) { _lastStrokeColors = entity->getStrokeColors(); - _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getXColor()) }); + _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getXColor()) }); } if (pointsChanged || strokeWidthsChanged || normalsChanged || strokeColorsChanged) { _empty = std::min(_lastPoints.size(), std::min(_lastNormals.size(), _lastStrokeWidths.size())) < 2; @@ -194,10 +194,10 @@ void PolyLineEntityRenderer::updateGeometry(const std::vector& vertices) _verticesBuffer->setSubData(0, vertices); } -std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, - const QVector& normals, +std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, + const QVector& normals, const QVector& strokeWidths, - const QVector& strokeColors, + const QVector& strokeColors, const bool isUVModeStretch, const float textureAspectRatio) { // Calculate the minimum vector size out of normals, points, and stroke widths @@ -230,14 +230,14 @@ std::vector PolyLineEntityRenderer::updateVertic for (int i = 0; i <= finalIndex; i++) { const float& width = strokeWidths.at(i); - const auto& point = points.at(i); - const auto& normal = normals.at(i); - const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i) : strokeColors.at(0); + const auto& point = points.at(i).toGlm(); + const auto& normal = normals.at(i).toGlm(); + const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i).toGlm() : strokeColors.at(0).toGlm(); int vertexIndex = i * 2; if (!isUVModeStretch && i >= 1) { - distanceToLastPoint = glm::distance(points.at(i), points.at(i - 1)); + distanceToLastPoint = glm::distance(points.at(i).toGlm(), points.at(i - 1).toGlm()); accumulatedDistance += distanceToLastPoint; strokeWidth = 2 * strokeWidths[i]; @@ -263,7 +263,7 @@ std::vector PolyLineEntityRenderer::updateVertic // For last point we can assume binormals are the same since it represents the last two vertices of quad if (i < finalIndex) { - const auto tangent = points.at(i + 1) - point; + const auto tangent = points.at(i + 1).toGlm() - point; binormal = glm::normalize(glm::cross(tangent, normal)) * width; // Check to make sure binormal is not a NAN. If it is, don't add to vertices vector @@ -272,8 +272,8 @@ std::vector PolyLineEntityRenderer::updateVertic } } - const auto v1 = points.at(i) + binormal; - const auto v2 = points.at(i) - binormal; + const auto v1 = points.at(i).toGlm() + binormal; + const auto v2 = points.at(i).toGlm() - binormal; vertices.emplace_back(v1, normal, vec2(uCoord, 0.0f), color); vertices.emplace_back(v2, normal, vec2(uCoord, 1.0f), color); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index f460baac59..370355a978 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -52,17 +52,17 @@ protected: }; void updateGeometry(const std::vector& vertices); - static std::vector updateVertices(const QVector& points, - const QVector& normals, + static std::vector updateVertices(const QVector& points, + const QVector& normals, const QVector& strokeWidths, - const QVector& strokeColors, + const QVector& strokeColors, const bool isUVModeStretch, const float textureAspectRatio); Transform _polylineTransform; - QVector _lastPoints; - QVector _lastNormals; - QVector _lastStrokeColors; + QVector _lastPoints; + QVector _lastNormals; + QVector _lastStrokeColors; QVector _lastStrokeWidths; gpu::BufferPointer _verticesBuffer; gpu::BufferView _uniformBuffer; diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 0211daff1e..563d3a1b68 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -215,7 +215,7 @@ void RenderablePolyVoxEntityItem::setVoxelSurfaceStyle(PolyVoxSurfaceStyle voxel glm::vec3 RenderablePolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::vec3 result; withReadLock([&] { - glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize; // meters / voxel-units + glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize.toGlm(); // meters / voxel-units if (isEdged(_voxelSurfaceStyle)) { result = scale / -2.0f; } @@ -227,7 +227,7 @@ glm::vec3 RenderablePolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::mat4 RenderablePolyVoxEntityItem::voxelToLocalMatrix() const { glm::vec3 voxelVolumeSize; withReadLock([&] { - voxelVolumeSize = _voxelVolumeSize; + voxelVolumeSize = _voxelVolumeSize.toGlm(); }); glm::vec3 dimensions = getScaledDimensions(); @@ -313,7 +313,7 @@ bool RenderablePolyVoxEntityItem::setAll(uint8_t toValue) { } withWriteLock([&] { - loop3(ivec3(0), ivec3(_voxelVolumeSize), [&](const ivec3& v) { + loop3(ivec3(0), ivec3(_voxelVolumeSize.toGlm()), [&](const ivec3& v) { result |= setVoxelInternal(v, toValue); }); }); @@ -332,7 +332,7 @@ bool RenderablePolyVoxEntityItem::setCuboid(const glm::vec3& lowPosition, const ivec3 iLowPosition = ivec3{ glm::round(lowPosition) }; ivec3 iCuboidSize = ivec3{ glm::round(cuboidSize) }; - ivec3 iVoxelVolumeSize = ivec3{ glm::round(_voxelVolumeSize) }; + ivec3 iVoxelVolumeSize = ivec3{ glm::round(_voxelVolumeSize.toGlm()) }; ivec3 low = glm::max(glm::min(iLowPosition, iVoxelVolumeSize - 1), ivec3(0)); ivec3 high = glm::max(glm::min(low + iCuboidSize, iVoxelVolumeSize), low); @@ -368,7 +368,7 @@ bool RenderablePolyVoxEntityItem::setSphereInVolume(const vec3& center, float ra float radiusSquared = radius * radius; // This three-level for loop iterates over every voxel in the volume withWriteLock([&] { - loop3(ivec3(0), ivec3(_voxelVolumeSize), [&](const ivec3& v) { + loop3(ivec3(0), ivec3(_voxelVolumeSize.toGlm()), [&](const ivec3& v) { // Store our current position as a vector... glm::vec3 pos = vec3(v) + 0.5f; // consider voxels cenetered on their coordinates // And compute how far the current position is from the center of the volume @@ -396,7 +396,7 @@ bool RenderablePolyVoxEntityItem::setSphere(const vec3& centerWorldCoords, float glm::mat4 wtvMatrix = glm::inverse(vtwMatrix); glm::vec3 dimensions = getScaledDimensions(); - glm::vec3 voxelSize = dimensions / _voxelVolumeSize; + glm::vec3 voxelSize = dimensions / _voxelVolumeSize.toGlm(); float smallestDimensionSize = voxelSize.x; smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.y); smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.z); @@ -410,8 +410,8 @@ bool RenderablePolyVoxEntityItem::setSphere(const vec3& centerWorldCoords, float glm::vec3 low = glm::floor(centerInVoxelCoords - maxRadiusInVoxelCoords); glm::vec3 high = glm::ceil(centerInVoxelCoords + maxRadiusInVoxelCoords); - glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize); - glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize); + glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); + glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); glm::vec3 radials(radiusWorldCoords / voxelSize.x, radiusWorldCoords / voxelSize.y, @@ -457,7 +457,7 @@ bool RenderablePolyVoxEntityItem::setCapsule(const vec3& startWorldCoords, const glm::mat4 wtvMatrix = glm::inverse(vtwMatrix); glm::vec3 dimensions = getScaledDimensions(); - glm::vec3 voxelSize = dimensions / _voxelVolumeSize; + glm::vec3 voxelSize = dimensions / _voxelVolumeSize.toGlm(); float smallestDimensionSize = voxelSize.x; smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.y); smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.z); @@ -472,8 +472,8 @@ bool RenderablePolyVoxEntityItem::setCapsule(const vec3& startWorldCoords, const glm::vec3 high = glm::max(glm::ceil(startInVoxelCoords + maxRadiusInVoxelCoords), glm::ceil(endInVoxelCoords + maxRadiusInVoxelCoords)); - glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize); - glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize); + glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); + glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); // This three-level for loop iterates over every voxel in the volume that might be in the capsule withWriteLock([&] { @@ -703,7 +703,7 @@ bool RenderablePolyVoxEntityItem::updateDependents() { return !volDataDirty; } -void RenderablePolyVoxEntityItem::setVoxelVolumeSize(const glm::vec3& voxelVolumeSize) { +void RenderablePolyVoxEntityItem::setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) { // This controls how many individual voxels are in the entity. This is unrelated to // the dimentions of the entity -- it defines the sizes of the arrays that hold voxel values. // In addition to setting the number of voxels, this is used in a few places for its @@ -1170,7 +1170,7 @@ void RenderablePolyVoxEntityItem::computeShapeInfoWorker() { withReadLock([&] { voxelSurfaceStyle = _voxelSurfaceStyle; - voxelVolumeSize = _voxelVolumeSize; + voxelVolumeSize = _voxelVolumeSize.toGlm(); mesh = _mesh; }); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 7077ae799b..fb22d2ad8e 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -58,7 +58,7 @@ public: QVariantMap& extraInfo, bool precisionPicking) const override; virtual void setVoxelData(const QByteArray& voxelData) override; - virtual void setVoxelVolumeSize(const glm::vec3& voxelVolumeSize) override; + virtual void setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) override; virtual void setVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle) override; glm::vec3 getSurfacePositionAdjustment() const; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 17d6d58781..257f486c11 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -198,7 +198,7 @@ void WebEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene if (_contextPosition != entity->getWorldPosition()) { // update globalPosition _contextPosition = entity->getWorldPosition(); - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(_contextPosition)); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(_contextPosition)); } _lastDPI = entity->getDPI(); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index c5035431f6..7cd7849ef9 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -333,7 +333,7 @@ void ZoneEntityRenderer::updateKeySunFromEntity(const TypedEntityPointer& entity // Set the keylight sunLight->setColor(ColorUtils::toVec3(_keyLightProperties.getColor())); sunLight->setIntensity(_keyLightProperties.getIntensity()); - sunLight->setDirection(entity->getTransform().getRotation() * _keyLightProperties.getDirection()); + sunLight->setDirection(entity->getTransform().getRotation() * _keyLightProperties.getDirection().toGlm()); sunLight->setCastShadows(_keyLightProperties.getCastShadows()); } diff --git a/libraries/entities/src/EntityEditFilters.cpp b/libraries/entities/src/EntityEditFilters.cpp index 94df7eb465..6f7e012bc4 100644 --- a/libraries/entities/src/EntityEditFilters.cpp +++ b/libraries/entities/src/EntityEditFilters.cpp @@ -104,10 +104,10 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper AABox aaBox = zoneEntity->getAABox(success); if (success) { QScriptValue boundingBox = filterData.engine->newObject(); - QScriptValue bottomRightNear = vec3toScriptValue(filterData.engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3toScriptValue(filterData.engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3toScriptValue(filterData.engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3toScriptValue(filterData.engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3ToScriptValue(filterData.engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3ToScriptValue(filterData.engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3ToScriptValue(filterData.engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3ToScriptValue(filterData.engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 31ec189cf9..e46133ac11 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -238,15 +238,15 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_CUSTOM_PROPERTIES_INCLUDED, APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, _simulationOwner.toByteArray()); - APPEND_ENTITY_PROPERTY(PROP_POSITION, getLocalPosition()); + APPEND_ENTITY_PROPERTY(PROP_POSITION, getScriptLocalPosition()); APPEND_ENTITY_PROPERTY(PROP_ROTATION, getLocalOrientation()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getLocalVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getLocalAngularVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getScriptLocalVelocity()); + APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getScriptLocalAngularVelocity()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getScriptAcceleration()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getScriptUnscaledDimensions()); APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getGravity()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getScriptGravity()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, getDamping()); APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, getRestitution()); APPEND_ENTITY_PROPERTY(PROP_FRICTION, getFriction()); @@ -254,7 +254,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp()); APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts()); - APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); + APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getScriptRegistrationPoint()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping()); APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible()); APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow()); @@ -766,11 +766,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // Note: duplicate packets are expected and not wrong. They may be sent for any number of // reasons and the contract is that the client handles them in an idempotent manner. - auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ + auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) { setPosition(value); _lastUpdatedPositionTimestamp = lastEdited; - _lastUpdatedPositionValue = value; + _lastUpdatedPositionValue = value.toGlm(); } }; @@ -782,40 +782,40 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } }; - auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ + auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) { setVelocity(value); _lastUpdatedVelocityTimestamp = lastEdited; - _lastUpdatedVelocityValue = value; + _lastUpdatedVelocityValue = value.toGlm(); } }; - auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ + auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ if (shouldUpdate(_lastUpdatedAngularVelocityTimestamp, value != _lastUpdatedAngularVelocityValue)) { setAngularVelocity(value); _lastUpdatedAngularVelocityTimestamp = lastEdited; - _lastUpdatedAngularVelocityValue = value; + _lastUpdatedAngularVelocityValue = value.toGlm(); } }; - auto customSetAcceleration = [this, shouldUpdate, lastEdited](glm::vec3 value){ + auto customSetAcceleration = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ if (shouldUpdate(_lastUpdatedAccelerationTimestamp, value != _lastUpdatedAccelerationValue)) { setAcceleration(value); _lastUpdatedAccelerationTimestamp = lastEdited; - _lastUpdatedAccelerationValue = value; + _lastUpdatedAccelerationValue = value.toGlm(); } }; - READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork); + READ_ENTITY_PROPERTY(PROP_POSITION, ScriptVec3Float, customUpdatePositionFromNetwork); READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork); - READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork); - READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork); - READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, customSetAcceleration); + READ_ENTITY_PROPERTY(PROP_VELOCITY, ScriptVec3Float, customUpdateVelocityFromNetwork); + READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, ScriptVec3Float, customUpdateAngularVelocityFromNetwork); + READ_ENTITY_PROPERTY(PROP_ACCELERATION, ScriptVec3Float, customSetAcceleration); } - READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions); + READ_ENTITY_PROPERTY(PROP_DIMENSIONS, ScriptVec3Float, setUnscaledDimensions); READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity); + READ_ENTITY_PROPERTY(PROP_GRAVITY, ScriptVec3Float, setGravity); READ_ENTITY_PROPERTY(PROP_DAMPING, float, setDamping); READ_ENTITY_PROPERTY(PROP_RESTITUTION, float, setRestitution); @@ -836,7 +836,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts); } - READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); + READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); @@ -1783,6 +1783,14 @@ void EntityItem::setUnscaledDimensions(const glm::vec3& value) { } } +glm::vec3 EntityItem::getUnscaledDimensions() const { + glm::vec3 result; + withReadLock([&] { + result = _unscaledDimensions; + }); + return result; +} + void EntityItem::setRotation(glm::quat rotation) { if (getLocalOrientation() != rotation) { setLocalOrientation(rotation); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 3a11fd821a..03d34e307b 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -187,8 +187,10 @@ public: virtual void setScaledDimensions(const glm::vec3& value); virtual glm::vec3 getRaycastDimensions() const { return getScaledDimensions(); } - inline const glm::vec3 getUnscaledDimensions() const { return _unscaledDimensions; } + glm::vec3 getUnscaledDimensions() const; + ScriptVec3Float getScriptUnscaledDimensions() const { return getUnscaledDimensions(); } virtual void setUnscaledDimensions(const glm::vec3& value); + void setUnscaledDimensions(const ScriptVec3Float& value) { setUnscaledDimensions(value.toGlm()); } float getLocalRenderAlpha() const; void setLocalRenderAlpha(float localRenderAlpha); @@ -203,11 +205,15 @@ public: bool hasLocalVelocity() const { return getLocalVelocity() != ENTITY_ITEM_ZERO_VEC3; } glm::vec3 getGravity() const; /// get gravity in meters + ScriptVec3Float getScriptGravity() const { return getGravity(); } void setGravity(const glm::vec3& value); /// gravity in meters + void setGravity(const ScriptVec3Float& value) { setGravity(value.toGlm()); } bool hasGravity() const { return getGravity() != ENTITY_ITEM_ZERO_VEC3; } glm::vec3 getAcceleration() const; /// get acceleration in meters/second/second + ScriptVec3Float getScriptAcceleration() const { return getAcceleration(); } void setAcceleration(const glm::vec3& value); /// acceleration in meters/second/second + void setAcceleration(const ScriptVec3Float& value) { setAcceleration(value.toGlm()); } bool hasAcceleration() const { return getAcceleration() != ENTITY_ITEM_ZERO_VEC3; } float getDamping() const; @@ -259,14 +265,16 @@ public: void setCollisionSoundURL(const QString& value); glm::vec3 getRegistrationPoint() const; /// registration point as ratio of entity - + ScriptVec3Float getScriptRegistrationPoint() const { return getRegistrationPoint(); } /// registration point as ratio of entity - virtual void setRegistrationPoint(const glm::vec3& value); // FIXME: this is suspicious! + virtual void setRegistrationPoint(const glm::vec3& value); // FIXME: this is suspicious! + void setRegistrationPoint(const ScriptVec3Float& value) { setRegistrationPoint(value.toGlm()); } bool hasAngularVelocity() const { return getWorldAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; } bool hasLocalAngularVelocity() const { return getLocalAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; } virtual void setAngularVelocity(const glm::vec3& angularVelocity); + void setAngularVelocity(const ScriptVec3Float& angularVelocity) { setAngularVelocity(angularVelocity.toGlm()); } float getAngularDamping() const; void setAngularDamping(float value); @@ -381,11 +389,13 @@ public: virtual void setCollisionShape(const btCollisionShape* shape) {} void setPosition(const glm::vec3& value); + void setPosition(const ScriptVec3Float& value) { setPosition(value.toGlm()); } virtual void setParentID(const QUuid& parentID) override; virtual void setShapeType(ShapeType type) { /* do nothing */ } void setRotation(glm::quat orientation); void setVelocity(const glm::vec3& velocity); + void setVelocity(const ScriptVec3Float& velocity) { setVelocity(velocity.toGlm()); } uint32_t getDirtyFlags() const; void markDirtyFlags(uint32_t mask); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index defee4b664..716e33b0c8 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -850,9 +850,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {number} emitSpeed=5 - The speed, in m/s, that each particle is emitted at. * @property {number} speedSpread=1 - The spread in speeds at which particles are emitted at. If emitSpeed == 5 * and speedSpread == 1, particles will be emitted with speeds in the range 4m/s – 6m/s. - * @property {vec3} emitAcceleration=0,-9.8,0 - The acceleration that is applied to each particle during its lifetime. The + * @property {Vec3} emitAcceleration=0,-9.8,0 - The acceleration that is applied to each particle during its lifetime. The * default is Earth's gravity value. - * @property {vec3} accelerationSpread=0,0,0 - The spread in accelerations that each particle is given. If + * @property {Vec3} accelerationSpread=0,0,0 - The spread in accelerations that each particle is given. If * emitAccelerations == {x: 0, y: -9.8, z: 0} and accelerationSpread == * {x: 0, y: 1, z: 0}, each particle will have an acceleration in the range {x: 0, y: -10.8, z: 0} * – {x: 0, y: -8.8, z: 0}. @@ -865,7 +865,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * default, particles emit along the entity's local z-axis, and azimuthStart and azimuthFinish * are relative to the entity's local x-axis. The default value is a rotation of -90 degrees about the local x-axis, i.e., * the particles emit vertically. - * @property {vec3} emitDimensions=0,0,0 - The dimensions of the ellipsoid from which particles are emitted. + * @property {Vec3} emitDimensions=0,0,0 - The dimensions of the ellipsoid from which particles are emitted. * @property {number} emitRadiusStart=1 - The starting radius within the ellipsoid at which particles start being emitted; * range 0.01.0 for the ellipsoid center to the ellipsoid surface, respectively. * Particles are emitted from the portion of the ellipsoid that lies between emitRadiusStart and the @@ -1424,10 +1424,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (!skipDefaults && !strictSemantics) { AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); - QScriptValue bottomRightNear = vec3toScriptValue(engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3toScriptValue(engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3toScriptValue(engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3toScriptValue(engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3ToScriptValue(engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3ToScriptValue(engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3ToScriptValue(engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3ToScriptValue(engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); @@ -1504,13 +1504,13 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool } COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy); - COPY_PROPERTY_FROM_QSCRIPTVALUE(position, vec3, setPosition); - COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, vec3, setDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(position, ScriptVec3Float, setPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, ScriptVec3Float, setDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, quat, setRotation); COPY_PROPERTY_FROM_QSCRIPTVALUE(density, float, setDensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, vec3, setVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, vec3, setGravity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, vec3, setAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, ScriptVec3Float, setVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, ScriptVec3Float, setGravity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, ScriptVec3Float, setAcceleration); COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(restitution, float, setRestitution); COPY_PROPERTY_FROM_QSCRIPTVALUE(friction, float, setFriction); @@ -1518,15 +1518,15 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp); COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts); - COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint); - COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, ScriptVec3Float, setRegistrationPoint); + COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, ScriptVec3Float, setAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); COPY_PROPERTY_FROM_QSCRIPTVALUE(color, xColor, setColor); COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, xColor, setColorSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3, setColorStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3, setColorFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, ScriptVec3Float, setColorStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, ScriptVec3Float, setColorFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart); @@ -1561,14 +1561,14 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(emitSpeed, float, setEmitSpeed); COPY_PROPERTY_FROM_QSCRIPTVALUE(speedSpread, float, setSpeedSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitOrientation, quat, setEmitOrientation); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, vec3, setEmitDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, ScriptVec3Float, setEmitDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRadiusStart, float, setEmitRadiusStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarStart, float, setPolarStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarFinish, float, setPolarFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthStart, float, setAzimuthStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthFinish, float, setAzimuthFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); - COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, ScriptVec3Float, setEmitAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, ScriptVec3Float, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); @@ -1606,7 +1606,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode); COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl); - COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize); + COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, ScriptVec3Float, setVoxelVolumeSize); COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData); COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineWidth, float, setLineWidth); @@ -1653,11 +1653,11 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex); COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, ScriptVec3Float, setLocalPosition); COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, ScriptVec3Float, setLocalVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, ScriptVec3Float, setLocalAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, ScriptVec3Float, setLocalDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet); COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations); @@ -2453,7 +2453,7 @@ QByteArray EntityItemProperties::getPackedNormals() const { return packNormals(getNormals()); } -QByteArray EntityItemProperties::packNormals(const QVector& normals) const { +QByteArray EntityItemProperties::packNormals(const QVector& normals) const { int normalsSize = normals.size(); QByteArray packedNormals = QByteArray(normalsSize * 6 + 1, '0'); // add size of the array @@ -2461,7 +2461,7 @@ QByteArray EntityItemProperties::packNormals(const QVector& normals) int index = 1; for (int i = 0; i < normalsSize; i++) { - int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, normals[i], 15); + int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, glm::vec3(normals[i].x, normals[i].y, normals[i].z), 15); index += numBytes; } return packedNormals; @@ -2470,7 +2470,7 @@ QByteArray EntityItemProperties::packNormals(const QVector& normals) QByteArray EntityItemProperties::getPackedStrokeColors() const { return packStrokeColors(getStrokeColors()); } -QByteArray EntityItemProperties::packStrokeColors(const QVector& strokeColors) const { +QByteArray EntityItemProperties::packStrokeColors(const QVector& strokeColors) const { int strokeColorsSize = strokeColors.size(); QByteArray packedStrokeColors = QByteArray(strokeColorsSize * 3 + 1, '0'); @@ -2480,9 +2480,9 @@ QByteArray EntityItemProperties::packStrokeColors(const QVector& stro for (int i = 0; i < strokeColorsSize; i++) { // add the color to the QByteArray - packedStrokeColors[i * 3 + 1] = strokeColors[i].r * 255; - packedStrokeColors[i * 3 + 2] = strokeColors[i].g * 255; - packedStrokeColors[i * 3 + 3] = strokeColors[i].b * 255; + packedStrokeColors[i * 3 + 1] = strokeColors[i].x * 255; + packedStrokeColors[i * 3 + 2] = strokeColors[i].y * 255; + packedStrokeColors[i * 3 + 3] = strokeColors[i].z * 255; } return packedStrokeColors; } @@ -2571,13 +2571,13 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int processedBytes += propertyFlags.getEncodedLength(); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, glm::vec3, setPosition); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, glm::vec3, setDimensions); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, ScriptVec3Float, setPosition); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, ScriptVec3Float, setDimensions); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, glm::quat, setRotation); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, glm::vec3, setVelocity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, glm::vec3, setGravity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, glm::vec3, setAcceleration); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, ScriptVec3Float, setVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, ScriptVec3Float, setGravity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, ScriptVec3Float, setAcceleration); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction); @@ -2586,8 +2586,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, xColor, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, glm::vec3, setAngularVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, ScriptVec3Float, setAngularVelocity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); @@ -2626,7 +2626,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints); } @@ -2648,21 +2648,21 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_SPEED, float, setEmitSpeed); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SPEED_SPREAD, float, setSpeedSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ORIENTATION, glm::quat, setEmitOrientation); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_DIMENSIONS, glm::vec3, setEmitDimensions); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_DIMENSIONS, ScriptVec3Float, setEmitDimensions); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RADIUS_START, float, setEmitRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POLAR_START, float, setPolarStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POLAR_FINISH, float, setPolarFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_AZIMUTH_START, float, setAzimuthStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_AZIMUTH_FINISH, float, setAzimuthFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ACCELERATION, glm::vec3, setEmitAcceleration); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION_SPREAD, glm::vec3, setAccelerationSpread); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ACCELERATION, ScriptVec3Float, setEmitAcceleration); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION_SPREAD, ScriptVec3Float, setAccelerationSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_RADIUS, float, setParticleRadius); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_SPREAD, float, setRadiusSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, xColor, setColorSpread); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3, setColorStart); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3, setColorFinish); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, ScriptVec3Float, setColorStart); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_START, float, setAlphaStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_FINISH, float, setAlphaFinish); @@ -2690,7 +2690,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::PolyVox) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_VOLUME_SIZE, glm::vec3, setVoxelVolumeSize); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_VOLUME_SIZE, ScriptVec3Float, setVoxelVolumeSize); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_X_TEXTURE_URL, QString, setXTextureURL); @@ -2706,13 +2706,13 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Line) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } if (properties.getType() == EntityTypes::PolyLine) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); @@ -2771,9 +2771,9 @@ void EntityItemProperties::setPackedNormals(const QByteArray& value) { setNormals(unpackNormals(value)); } -QVector EntityItemProperties::unpackNormals(const QByteArray& normals) { +QVector EntityItemProperties::unpackNormals(const QByteArray& normals) { // the size of the vector is packed first - QVector unpackedNormals = QVector((int)normals[0]); + QVector unpackedNormals = QVector((int)normals[0]); if ((int)normals[0] == normals.size() / 6) { int j = 0; @@ -2794,9 +2794,9 @@ void EntityItemProperties::setPackedStrokeColors(const QByteArray& value) { setStrokeColors(unpackStrokeColors(value)); } -QVector EntityItemProperties::unpackStrokeColors(const QByteArray& strokeColors) { +QVector EntityItemProperties::unpackStrokeColors(const QByteArray& strokeColors) { // the size of the vector is packed first - QVector unpackedStrokeColors = QVector((int)strokeColors[0]); + QVector unpackedStrokeColors = QVector((int)strokeColors[0]); if ((int)strokeColors[0] == strokeColors.size() / 3) { int j = 0; @@ -3061,15 +3061,17 @@ void EntityItemProperties::markAllChanged() { AABox EntityItemProperties::getAABox() const { // _position represents the position of the registration point. - glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; + glm::vec3 registrationPoint = glm::vec3(_registrationPoint.x, _registrationPoint.y, _registrationPoint.z); + glm::vec3 registrationRemainder = glm::vec3(1.0f) - registrationPoint; - glm::vec3 unrotatedMinRelativeToEntity = - (_dimensions * _registrationPoint); - glm::vec3 unrotatedMaxRelativeToEntity = _dimensions * registrationRemainder; + glm::vec3 dimensions = glm::vec3(_dimensions.x, _dimensions.y, _dimensions.z); + glm::vec3 unrotatedMinRelativeToEntity = - (dimensions * registrationPoint); + glm::vec3 unrotatedMaxRelativeToEntity = dimensions * registrationRemainder; Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(_rotation); // shift the extents to be relative to the position/registration point - rotatedExtentsRelativeToRegistrationPoint.shiftBy(_position); + rotatedExtentsRelativeToRegistrationPoint.shiftBy(glm::vec3(_position.x, _position.y, _position.z)); return AABox(rotatedExtentsRelativeToRegistrationPoint); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 04b6e2d78d..b03dcae841 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -119,13 +119,13 @@ public: DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE); DEFINE_PROPERTY(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool, ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW); - DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, glm::vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3, ENTITY_ITEM_DEFAULT_DIMENSIONS); + DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, ScriptVec3Float, ENTITY_ITEM_DEFAULT_DIMENSIONS); DEFINE_PROPERTY_REF(PROP_ROTATION, Rotation, rotation, glm::quat, ENTITY_ITEM_DEFAULT_ROTATION); DEFINE_PROPERTY(PROP_DENSITY, Density, density, float, ENTITY_ITEM_DEFAULT_DENSITY); - DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, glm::vec3, ENTITY_ITEM_DEFAULT_VELOCITY); - DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, glm::vec3, ENTITY_ITEM_DEFAULT_GRAVITY); - DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3, ENTITY_ITEM_DEFAULT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_VELOCITY); + DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_GRAVITY); + DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, ScriptVec3Float, ENTITY_ITEM_DEFAULT_ACCELERATION); DEFINE_PROPERTY(PROP_DAMPING, Damping, damping, float, ENTITY_ITEM_DEFAULT_DAMPING); DEFINE_PROPERTY(PROP_RESTITUTION, Restitution, restitution, float, ENTITY_ITEM_DEFAULT_RESTITUTION); DEFINE_PROPERTY(PROP_FRICTION, Friction, friction, float, ENTITY_ITEM_DEFAULT_FRICTION); @@ -136,16 +136,16 @@ public: DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL); DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, xColor, ParticleEffectEntityItem::DEFAULT_XCOLOR); DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, xColor, ParticleEffectEntityItem::DEFAULT_XCOLOR_SPREAD); - DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, vec3, particle::DEFAULT_COLOR_UNINITIALIZED); - DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3, particle::DEFAULT_COLOR_UNINITIALIZED); + DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); + DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, particle::DEFAULT_ALPHA_SPREAD); DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, particle::DEFAULT_ALPHA_START); DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, particle::DEFAULT_ALPHA_FINISH); DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString, ""); DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, ""); - DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT); - DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY); + DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, ScriptVec3Float, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT); + DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY); DEFINE_PROPERTY(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING); DEFINE_PROPERTY(PROP_COLLISIONLESS, Collisionless, collisionless, bool, ENTITY_ITEM_DEFAULT_COLLISIONLESS); DEFINE_PROPERTY(PROP_COLLISION_MASK, CollisionMask, collisionMask, uint16_t, ENTITY_COLLISION_MASK_DEFAULT); @@ -171,14 +171,14 @@ public: DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float, particle::DEFAULT_EMIT_SPEED); DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float, particle::DEFAULT_SPEED_SPREAD); DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, particle::DEFAULT_EMIT_ORIENTATION); - DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, particle::DEFAULT_EMIT_DIMENSIONS); + DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, ScriptVec3Float, particle::DEFAULT_EMIT_DIMENSIONS); DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, particle::DEFAULT_EMIT_RADIUS_START); DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, particle::DEFAULT_POLAR_START); DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, particle::DEFAULT_POLAR_FINISH); DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, particle::DEFAULT_AZIMUTH_START); DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, particle::DEFAULT_AZIMUTH_FINISH); - DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION); - DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD); + DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, ScriptVec3Float, particle::DEFAULT_EMIT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, ScriptVec3Float, particle::DEFAULT_ACCELERATION_SPREAD); DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, particle::DEFAULT_PARTICLE_RADIUS); DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD); DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START); @@ -186,7 +186,7 @@ public: DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL); DEFINE_PROPERTY_GROUP(KeyLight, keyLight, KeyLightPropertyGroup); DEFINE_PROPERTY_GROUP(AmbientLight, ambientLight, AmbientLightPropertyGroup); - DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); + DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, ScriptVec3Float, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray, PolyVoxEntityItem::DEFAULT_VOXEL_DATA); DEFINE_PROPERTY_REF(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t, PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME); @@ -201,13 +201,13 @@ public: DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString, ""); DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float, LineEntityItem::DEFAULT_LINE_WIDTH); - DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector, QVector()); + DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY_REF(PROP_HREF, Href, href, QString, ""); DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString, ""); DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool, TextEntityItem::DEFAULT_FACE_CAMERA); DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray, QByteArray()); - DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); - DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector, QVector()); DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString, ""); @@ -249,16 +249,16 @@ public: DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION); // these are used when bouncing location data into and out of scripts - DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION); - DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector, QVector()); - DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector, QVector()); + DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool, ZoneEntityItem::DEFAULT_FLYING_ALLOWED); DEFINE_PROPERTY(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool, ZoneEntityItem::DEFAULT_GHOSTING_ALLOWED); @@ -287,7 +287,7 @@ public: std::array::const_iterator findComponent(const QString& mode); public: - float getMaxDimension() const { return glm::compMax(_dimensions); } + float getMaxDimension() const { return glm::compMax(glm::vec3(_dimensions.x, _dimensions.y, _dimensions.z)); } float getAge() const { return (float)(usecTimestampNow() - _created) / (float)USECS_PER_SECOND; } bool hasCreatedTime() const { return (_created != UNKNOWN_CREATED_TIME); } @@ -314,10 +314,10 @@ public: void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; } void markAllChanged(); - const glm::vec3& getNaturalDimensions() const { return _naturalDimensions; } + const glm::vec3& getNaturalDimensions() const { return glm::vec3(_naturalDimensions.x, _naturalDimensions.y, _naturalDimensions.z); } void setNaturalDimensions(const glm::vec3& value) { _naturalDimensions = value; } - const glm::vec3& getNaturalPosition() const { return _naturalPosition; } + const glm::vec3& getNaturalPosition() const { return glm::vec3(_naturalPosition.x, _naturalPosition.y, _naturalPosition.z); } void calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max); const QVariantMap& getTextureNames() const { return _textureNames; } @@ -364,16 +364,16 @@ public: void setRenderInfoHasTransparent(bool value) { _renderInfoHasTransparent = value; } void setPackedNormals(const QByteArray& value); - QVector unpackNormals(const QByteArray& normals); + QVector unpackNormals(const QByteArray& normals); void setPackedStrokeColors(const QByteArray& value); - QVector unpackStrokeColors(const QByteArray& strokeColors); + QVector unpackStrokeColors(const QByteArray& strokeColors); QByteArray getPackedNormals() const; - QByteArray packNormals(const QVector& normals) const; + QByteArray packNormals(const QVector& normals) const; QByteArray getPackedStrokeColors() const; - QByteArray packStrokeColors(const QVector& strokeColors) const; + QByteArray packStrokeColors(const QVector& strokeColors) const; QByteArray getStaticCertificateJSON() const; QByteArray getStaticCertificateHash() const; @@ -401,8 +401,8 @@ private: // NOTE: The following are pseudo client only properties. They are only used in clients which can access // properties of model geometry. But these properties are not serialized like other properties. QVariantMap _textureNames; - glm::vec3 _naturalDimensions; - glm::vec3 _naturalPosition; + ScriptVec3Float _naturalDimensions; + ScriptVec3Float _naturalPosition; size_t _renderInfoVertexCount { 0 }; int _renderInfoTextureCount { 0 }; @@ -425,8 +425,8 @@ void EntityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityProper // define these inline here so the macros work -inline void EntityItemProperties::setPosition(const glm::vec3& value) - { _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } +inline void EntityItemProperties::setPosition(const ScriptVec3Float& value) + { _position = glm::clamp(glm::vec3(value.x, value.y, value.z), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { debug << "EntityItemProperties[" << "\n"; diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 6c39e90c91..78e718d593 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -24,7 +24,7 @@ const glm::vec3 ENTITY_ITEM_ZERO_VEC3 = glm::vec3(0.0f); const glm::vec3 ENTITY_ITEM_ONE_VEC3 = glm::vec3(1.0f); const glm::vec3 ENTITY_ITEM_HALF_VEC3 = glm::vec3(0.5f); -const QVector ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC = QVector(); +const QVector ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC = QVector(); const bool ENTITY_ITEM_DEFAULT_LOCKED = false; const QString ENTITY_ITEM_DEFAULT_USER_DATA = QString(""); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 0d52861e55..07dfcc4d23 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -101,8 +101,9 @@ changedProperties += P; \ } -inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec2Float& v) { return vec2toScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3toScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec2Float& v) { return vec2FloatToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3Float& v) { return vec3FloatToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3UInt& v) { return vec3UIntToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, float v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, int v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, bool v) { return QScriptValue(v); } @@ -114,7 +115,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QString& v) { ret inline QScriptValue convertScriptValue(QScriptEngine* e, const xColor& v) { return xColorToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::quat& v) { return quatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) { return v; } -inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorQuatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorBoolToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) { return qVectorFloatToScriptValue(e, v); } @@ -185,7 +186,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { retu properties.setProperty(#P, V); \ } -typedef QVector qVectorVec3; +typedef QVector qVectorVec3; typedef QVector qVectorQuat; typedef QVector qVectorBool; typedef QVector qVectorFloat; @@ -224,37 +225,22 @@ inline QByteArray QByteArray_convertFromScriptValue(const QScriptValue& v, bool& inline ScriptVec2Float ScriptVec2Float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; ScriptVec2Float vec2; - vec2FromScriptValue(v, vec2); + vec2FloatFromScriptValue(v, vec2); return vec2; } -inline glm::vec3 vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { - isValid = false; /// assume it can't be converted - QScriptValue x = v.property("x"); - QScriptValue y = v.property("y"); - QScriptValue z = v.property("z"); - if (!x.isValid()) { - x = v.property("red"); - } - if (!y.isValid()) { - y = v.property("green"); - } - if (!z.isValid()) { - z = v.property("blue"); - } - if (x.isValid() && y.isValid() && z.isValid()) { - glm::vec3 newValue(0); - newValue.x = x.toVariant().toFloat(); - newValue.y = y.toVariant().toFloat(); - newValue.z = z.toVariant().toFloat(); - isValid = !glm::isnan(newValue.x) && - !glm::isnan(newValue.y) && - !glm::isnan(newValue.z); - if (isValid) { - return newValue; - } - } - return glm::vec3(0); +inline ScriptVec3Float ScriptVec3Float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = true; + ScriptVec3Float vec3; + vec3FloatFromScriptValue(v, vec3); + return vec3; +} + +inline ScriptVec3UInt ScriptVec3UInt_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = true; + ScriptVec3UInt vec3; + vec3UIntFromScriptValue(v, vec3); + return vec3; } inline AACube AACube_convertFromScriptValue(const QScriptValue& v, bool& isValid) { diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 09d9823728..410e28b3b2 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -135,7 +135,7 @@ EntityItemProperties convertPropertiesToScriptSemantics(const EntityItemProperti scriptSideProperties.setLocalDimensions(entitySideProperties.getDimensions()); bool success; - glm::vec3 worldPosition = SpatiallyNestable::localToWorld(entitySideProperties.getPosition(), + glm::vec3 worldPosition = SpatiallyNestable::localToWorld(entitySideProperties.getPosition().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, @@ -145,17 +145,17 @@ EntityItemProperties convertPropertiesToScriptSemantics(const EntityItemProperti entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldVelocity = SpatiallyNestable::localToWorldVelocity(entitySideProperties.getVelocity(), + glm::vec3 worldVelocity = SpatiallyNestable::localToWorldVelocity(entitySideProperties.getVelocity().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldAngularVelocity = SpatiallyNestable::localToWorldAngularVelocity(entitySideProperties.getAngularVelocity(), + glm::vec3 worldAngularVelocity = SpatiallyNestable::localToWorldAngularVelocity(entitySideProperties.getAngularVelocity().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldDimensions = SpatiallyNestable::localToWorldDimensions(entitySideProperties.getDimensions(), + glm::vec3 worldDimensions = SpatiallyNestable::localToWorldDimensions(entitySideProperties.getDimensions().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, @@ -184,7 +184,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localPositionChanged()) { entitySideProperties.setPosition(scriptSideProperties.getLocalPosition()); } else if (scriptSideProperties.positionChanged()) { - glm::vec3 localPosition = SpatiallyNestable::worldToLocal(entitySideProperties.getPosition(), + glm::vec3 localPosition = SpatiallyNestable::worldToLocal(entitySideProperties.getPosition().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -204,7 +204,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localVelocityChanged()) { entitySideProperties.setVelocity(scriptSideProperties.getLocalVelocity()); } else if (scriptSideProperties.velocityChanged()) { - glm::vec3 localVelocity = SpatiallyNestable::worldToLocalVelocity(entitySideProperties.getVelocity(), + glm::vec3 localVelocity = SpatiallyNestable::worldToLocalVelocity(entitySideProperties.getVelocity().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -215,7 +215,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper entitySideProperties.setAngularVelocity(scriptSideProperties.getLocalAngularVelocity()); } else if (scriptSideProperties.angularVelocityChanged()) { glm::vec3 localAngularVelocity = - SpatiallyNestable::worldToLocalAngularVelocity(entitySideProperties.getAngularVelocity(), + SpatiallyNestable::worldToLocalAngularVelocity(entitySideProperties.getAngularVelocity().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -225,7 +225,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localDimensionsChanged()) { entitySideProperties.setDimensions(scriptSideProperties.getLocalDimensions()); } else if (scriptSideProperties.dimensionsChanged()) { - glm::vec3 localDimensions = SpatiallyNestable::worldToLocalDimensions(entitySideProperties.getDimensions(), + glm::vec3 localDimensions = SpatiallyNestable::worldToLocalDimensions(entitySideProperties.getDimensions().toGlm(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -1091,10 +1091,10 @@ QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, c } obj.setProperty("face", faceName); - QScriptValue intersection = vec3toScriptValue(engine, value.intersection); + QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3toScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -1243,7 +1243,7 @@ bool EntityScriptingInterface::setVoxelsInCuboid(QUuid entityID, const glm::vec3 }); } -bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { +bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { PROFILE_RANGE(script_entities, __FUNCTION__); EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 50df825e5f..8cb4053d7b 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -832,7 +832,7 @@ public slots: * ]); * }, 2000); */ - Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); + Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); /**jsdoc * Append a point to a {@link Entities.EntityType|Line} entity. diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 0315ba7186..f2241904ff 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1010,7 +1010,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList= 0) { - glm::vec3 value = properties.getVelocity(); + glm::vec3 value = properties.getVelocity().toGlm(); changedProperties[index] = QString("velocity:") + QString::number((int)value.x) + "," + QString::number((int)value.y) + "," + @@ -1021,7 +1021,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList= 0) { - glm::vec3 value = properties.getGravity(); + glm::vec3 value = properties.getGravity().toGlm(); QString changeHint = "0"; if (value.x + value.y + value.z > 0) { changeHint = "+"; @@ -1139,7 +1139,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QListgetWorldPosition() : propertiesIn.getPosition(); auto entityID = existingEntity ? existingEntity->getEntityItemID() : EntityItemID(); - accepted = entityEditFilters->filter(position, propertiesIn, propertiesOut, wasChanged, filterType, entityID, existingEntity); + accepted = entityEditFilters->filter(position.toGlm(), propertiesIn, propertiesOut, wasChanged, filterType, entityID, existingEntity); } return accepted; @@ -2318,7 +2318,7 @@ bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void EntityItemID oldParentID = properties.getParentID(); if (oldParentID.isInvalidID()) { // no parent - properties.setPosition(properties.getPosition() + args->root); + properties.setPosition(properties.getPosition().toGlm() + args->root); } else { EntityItemPointer parentEntity = args->ourTree->findEntityByEntityItemID(oldParentID); if (parentEntity || oldParentID == AVATAR_SELF_ID) { // map the parent diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index 67e6f05921..7a149a396e 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -35,13 +35,13 @@ void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desired void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, xColor, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, intensity, float, setIntensity); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, vec3, setDirection); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, ScriptVec3Float, setDirection); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, castShadows, bool, setCastShadows); // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, xColor, setColor, getColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightIntensity, float, setIntensity, getIntensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, vec3, setDirection, getDirection); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, ScriptVec3Float, setDirection, getDirection); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightCastShadows, bool, setCastShadows, getCastShadows); } @@ -101,7 +101,7 @@ bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFl READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_COLOR, Color); @@ -189,7 +189,7 @@ int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); return bytesRead; diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index b966b78fc7..8ccd26c4d8 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -92,7 +92,7 @@ public: DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, xColor, DEFAULT_KEYLIGHT_COLOR); DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, Intensity, intensity, float, DEFAULT_KEYLIGHT_INTENSITY); - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, glm::vec3, DEFAULT_KEYLIGHT_DIRECTION); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, ScriptVec3Float, DEFAULT_KEYLIGHT_DIRECTION); DEFINE_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, CastShadows, castShadows, bool, DEFAULT_KEYLIGHT_CAST_SHADOWS); }; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 92a1c25970..2acf8670d9 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -75,7 +75,7 @@ bool LineEntityItem::setProperties(const EntityItemProperties& properties) { return somethingChanged; } -bool LineEntityItem::appendPoint(const glm::vec3& point) { +bool LineEntityItem::appendPoint(const ScriptVec3Float& point) { if (_points.size() > MAX_POINTS_PER_LINE - 1) { qCDebug(entities) << "MAX POINTS REACHED!"; return false; @@ -92,13 +92,13 @@ bool LineEntityItem::appendPoint(const glm::vec3& point) { return true; } -bool LineEntityItem::setLinePoints(const QVector& points) { +bool LineEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } glm::vec3 halfBox = getScaledDimensions() * 0.5f; for (int i = 0; i < points.size(); i++) { - glm::vec3 point = points.at(i); + ScriptVec3Float point = points.at(i); if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { qCDebug(entities) << "Point is outside entity's bounding box"; return false; @@ -122,7 +122,7 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); return bytesRead; } @@ -201,8 +201,8 @@ float LineEntityItem::getLineWidth() const { return result; } -QVector LineEntityItem::getLinePoints() const { - QVector result; +QVector LineEntityItem::getLinePoints() const { + QVector result; withReadLock([&] { result = _points; }); diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index 84f9acf5f5..01f0f39c01 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -50,10 +50,10 @@ class LineEntityItem : public EntityItem { void setLineWidth(float lineWidth); float getLineWidth() const; - bool setLinePoints(const QVector& points); - bool appendPoint(const glm::vec3& point); + bool setLinePoints(const QVector& points); + bool appendPoint(const ScriptVec3Float& point); - QVector getLinePoints() const; + QVector getLinePoints() const; virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } @@ -73,7 +73,7 @@ class LineEntityItem : public EntityItem { private: rgbColor _color; float _lineWidth { DEFAULT_LINE_WIDTH }; - QVector _points; + QVector _points; bool _pointsChanged { true }; }; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index cf89a73214..2024663ecb 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -140,7 +140,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); - READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); + READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); return bytesRead; } @@ -428,7 +428,7 @@ void ModelEntityItem::setJointRotationsSet(const QVector& rotationsSet) { }); } -void ModelEntityItem::setJointTranslations(const QVector& translations) { +void ModelEntityItem::setJointTranslations(const QVector& translations) { resizeJointArrays(translations.size()); _jointDataLock.withWriteLock([&] { _jointTranslationsExplicitlySet = translations.size() > 0; @@ -479,8 +479,8 @@ QVector ModelEntityItem::getJointRotationsSet() const { return result; } -QVector ModelEntityItem::getJointTranslations() const { - QVector result; +QVector ModelEntityItem::getJointTranslations() const { + QVector result; _jointDataLock.withReadLock([&] { if (_jointTranslationsExplicitlySet) { result.resize(_localJointData.size()); diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index ad6cdf4040..17c71c4b90 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -119,14 +119,14 @@ public: virtual void setJointRotations(const QVector& rotations); virtual void setJointRotationsSet(const QVector& rotationsSet); - virtual void setJointTranslations(const QVector& translations); + virtual void setJointTranslations(const QVector& translations); virtual void setJointTranslationsSet(const QVector& translationsSet); virtual void setAnimationJointsData(const QVector& jointsData); QVector getJointRotations() const; QVector getJointRotationsSet() const; - QVector getJointTranslations() const; + QVector getJointTranslations() const; QVector getJointTranslationsSet() const; private: diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 18cf7c9252..dff517c770 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -486,8 +486,8 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan); READ_ENTITY_PROPERTY(PROP_EMIT_RATE, float, setEmitRate); - READ_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, vec3, setEmitAcceleration); - READ_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, vec3, setAccelerationSpread); + READ_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, ScriptVec3Float, setEmitAcceleration); + READ_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, ScriptVec3Float, setAccelerationSpread); READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); @@ -496,8 +496,8 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish); READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, xColor, setColorSpread); - READ_ENTITY_PROPERTY(PROP_COLOR_START, vec3, setColorStart); - READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, vec3, setColorFinish); + READ_ENTITY_PROPERTY(PROP_COLOR_START, ScriptVec3Float, setColorStart); + READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); READ_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY(PROP_ALPHA_START, float, setAlphaStart); @@ -506,7 +506,7 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_EMIT_SPEED, float, setEmitSpeed); READ_ENTITY_PROPERTY(PROP_SPEED_SPREAD, float, setSpeedSpread); READ_ENTITY_PROPERTY(PROP_EMIT_ORIENTATION, quat, setEmitOrientation); - READ_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, vec3, setEmitDimensions); + READ_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, ScriptVec3Float, setEmitDimensions); READ_ENTITY_PROPERTY(PROP_EMIT_RADIUS_START, float, setEmitRadiusStart); READ_ENTITY_PROPERTY(PROP_POLAR_START, float, setPolarStart); READ_ENTITY_PROPERTY(PROP_POLAR_FINISH, float, setPolarFinish); @@ -570,16 +570,16 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate()); - APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, getEmitAcceleration()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, getAccelerationSpread()); + APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, getScriptEmitAcceleration()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, getScriptAccelerationSpread()); APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, getParticleRadius()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_SPREAD, getRadiusSpread()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, getRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, getRadiusFinish()); APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, getColorSpread()); - APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getColorStart()); - APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getColorFinish()); + APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getScriptColorStart()); + APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getScriptColorFinish()); APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, getAlphaSpread()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, getAlphaStart()); @@ -587,7 +587,7 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_EMIT_SPEED, getEmitSpeed()); APPEND_ENTITY_PROPERTY(PROP_SPEED_SPREAD, getSpeedSpread()); APPEND_ENTITY_PROPERTY(PROP_EMIT_ORIENTATION, getEmitOrientation()); - APPEND_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, getEmitDimensions()); + APPEND_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, getScriptEmitDimensions()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RADIUS_START, getEmitRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_POLAR_START, getPolarStart()); APPEND_ENTITY_PROPERTY(PROP_POLAR_FINISH, getPolarFinish()); diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 7e507ab46a..d02016b283 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -194,7 +194,7 @@ class ParticleEffectEntityItem : public EntityItem { public: ALLOW_INSTANTIATION // This class can be instantiated - static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); ParticleEffectEntityItem(const EntityItemID& entityItemID); @@ -205,17 +205,17 @@ public: virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const override; + EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const override; virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) override; + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) override; xColor getXColor() const; vec3 getColor() const { return _particleProperties.color.gradient.target; } @@ -224,10 +224,14 @@ public: void setColor(const xColor& value); void setColorStart(const vec3& colorStart); + void setColorStart(const ScriptVec3Float& colorStart) { setColorStart(colorStart.toGlm()); } vec3 getColorStart() const { return _particleProperties.color.range.start; } + ScriptVec3Float getScriptColorStart() const { return getColorStart(); } void setColorFinish(const vec3& colorFinish); + void setColorFinish(const ScriptVec3Float& colorFinish) { setColorFinish(colorFinish.toGlm()); } vec3 getColorFinish() const { return _particleProperties.color.range.finish; } + ScriptVec3Float getScriptColorFinish() const { return getColorFinish(); } void setColorSpread(const xColor& colorSpread); xColor getColorSpread() const; @@ -271,7 +275,9 @@ public: const glm::quat& getEmitOrientation() const { return _particleProperties.emission.orientation; } void setEmitDimensions(const glm::vec3& emitDimensions); + void setEmitDimensions(const ScriptVec3Float& emitDimensions) { setEmitDimensions(emitDimensions.toGlm()); } const glm::vec3& getEmitDimensions() const { return _particleProperties.emission.dimensions; } + ScriptVec3Float getScriptEmitDimensions() const { return getEmitDimensions(); } void setEmitRadiusStart(float emitRadiusStart); float getEmitRadiusStart() const { return _particleProperties.radiusStart; } @@ -289,10 +295,14 @@ public: float getAzimuthFinish() const { return _particleProperties.azimuth.finish; } void setEmitAcceleration(const glm::vec3& emitAcceleration); + void setEmitAcceleration(const ScriptVec3Float& emitAcceleration) { setEmitAcceleration(emitAcceleration.toGlm()); } const glm::vec3& getEmitAcceleration() const { return _particleProperties.emission.acceleration.target; } + ScriptVec3Float getScriptEmitAcceleration() const { return getEmitAcceleration(); } void setAccelerationSpread(const glm::vec3& accelerationSpread); + void setAccelerationSpread(const ScriptVec3Float& accelerationSpread) { setAccelerationSpread(accelerationSpread.toGlm()); } const glm::vec3& getAccelerationSpread() const { return _particleProperties.emission.acceleration.spread; } + ScriptVec3Float getScriptAccelerationSpread() const { return getAccelerationSpread(); } void setParticleRadius(float particleRadius); float getParticleRadius() const { return _particleProperties.radius.gradient.target; } diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 5b3167b9ba..c4e8f4a7bc 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -83,7 +83,7 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { } -bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { +bool PolyLineEntityItem::appendPoint(const ScriptVec3Float& point) { if (_points.size() > MAX_POINTS_PER_LINE - 1) { qCDebug(entities) << "MAX POINTS REACHED!"; return false; @@ -106,7 +106,7 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { return true; } -bool PolyLineEntityItem::setNormals(const QVector& normals) { +bool PolyLineEntityItem::setNormals(const QVector& normals) { withWriteLock([&] { _normals = normals; _normalsChanged = true; @@ -114,7 +114,7 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { return true; } -bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { +bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { withWriteLock([&] { _strokeColors = strokeColors; _strokeColorsChanged = true; @@ -123,7 +123,7 @@ bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) } -bool PolyLineEntityItem::setLinePoints(const QVector& points) { +bool PolyLineEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } @@ -165,10 +165,10 @@ void PolyLineEntityItem::calculateScaleAndRegistrationPoint() { withReadLock([&] { pointCount = _points.size(); if (pointCount > 0) { - firstPoint = _points.at(0); + firstPoint = _points.at(0).toGlm(); } for (int i = 0; i < pointCount; i++) { - const glm::vec3& point = _points.at(i); + const glm::vec3& point = _points.at(i).toGlm(); high = glm::max(point, high); low = glm::min(point, low); } @@ -206,9 +206,9 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); - READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); - READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); + READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); @@ -261,24 +261,24 @@ void PolyLineEntityItem::debugDump() const { -QVector PolyLineEntityItem::getLinePoints() const { - QVector result; +QVector PolyLineEntityItem::getLinePoints() const { + QVector result; withReadLock([&] { result = _points; }); return result; } -QVector PolyLineEntityItem::getNormals() const { - QVector result; +QVector PolyLineEntityItem::getNormals() const { + QVector result; withReadLock([&] { result = _normals; }); return result; } -QVector PolyLineEntityItem::getStrokeColors() const { - QVector result; +QVector PolyLineEntityItem::getStrokeColors() const { + QVector result; withReadLock([&] { result = _strokeColors; }); diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index c76419af02..a30b32e2fa 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -58,15 +58,15 @@ class PolyLineEntityItem : public EntityItem { void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } float getLineWidth() const{ return _lineWidth; } - bool setLinePoints(const QVector& points); - bool appendPoint(const glm::vec3& point); - QVector getLinePoints() const; + bool setLinePoints(const QVector& points); + bool appendPoint(const ScriptVec3Float& point); + QVector getLinePoints() const; - bool setNormals(const QVector& normals); - QVector getNormals() const; + bool setNormals(const QVector& normals); + QVector getNormals() const; - bool setStrokeColors(const QVector& strokeColors); - QVector getStrokeColors() const; + bool setStrokeColors(const QVector& strokeColors); + QVector getStrokeColors() const; bool setStrokeWidths(const QVector& strokeWidths); QVector getStrokeWidths() const; @@ -111,9 +111,9 @@ private: bool _normalsChanged { true }; bool _strokeColorsChanged { true }; bool _strokeWidthsChanged { true }; - QVector _points; - QVector _normals; - QVector _strokeColors; + QVector _points; + QVector _normals; + QVector _strokeColors; QVector _strokeWidths; QString _textures; bool _isUVModeStretch; diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index ed3372818a..de4aeb14e0 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -70,9 +70,9 @@ PolyVoxEntityItem::PolyVoxEntityItem(const EntityItemID& entityItemID) : EntityI _type = EntityTypes::PolyVox; } -void PolyVoxEntityItem::setVoxelVolumeSize(const vec3& voxelVolumeSize) { +void PolyVoxEntityItem::setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) { withWriteLock([&] { - assert(!glm::any(glm::isnan(voxelVolumeSize))); + assert(!glm::any(glm::isnan(voxelVolumeSize.toGlm()))); _voxelVolumeSize = glm::vec3(roundf(voxelVolumeSize.x), roundf(voxelVolumeSize.y), roundf(voxelVolumeSize.z)); if (_voxelVolumeSize.x < 1) { @@ -104,8 +104,8 @@ void PolyVoxEntityItem::setVoxelVolumeSize(const vec3& voxelVolumeSize) { }); } -glm::vec3 PolyVoxEntityItem::getVoxelVolumeSize() const { - glm::vec3 voxelVolumeSize; +ScriptVec3Float PolyVoxEntityItem::getVoxelVolumeSize() const { + ScriptVec3Float voxelVolumeSize; withReadLock([&] { voxelVolumeSize = _voxelVolumeSize; }); @@ -167,7 +167,7 @@ int PolyVoxEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* dat int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, glm::vec3, setVoxelVolumeSize); + READ_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, ScriptVec3Float, setVoxelVolumeSize); READ_ENTITY_PROPERTY(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); READ_ENTITY_PROPERTY(PROP_X_TEXTURE_URL, QString, setXTextureURL); @@ -375,7 +375,7 @@ EntityItemID PolyVoxEntityItem::getZPNeighborID() const { glm::vec3 PolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::vec3 result; withReadLock([&] { - glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize; // meters / voxel-units + glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize.toGlm(); // meters / voxel-units if (isEdged()) { result = scale / -2.0f; } @@ -387,7 +387,7 @@ glm::vec3 PolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::mat4 PolyVoxEntityItem::voxelToLocalMatrix() const { glm::vec3 voxelVolumeSize; withReadLock([&] { - voxelVolumeSize = _voxelVolumeSize; + voxelVolumeSize = _voxelVolumeSize.toGlm(); }); glm::vec3 dimensions = getScaledDimensions(); diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 4dfe7b9535..5dd1ddb89b 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -50,8 +50,8 @@ class PolyVoxEntityItem : public EntityItem { virtual void debugDump() const override; - virtual void setVoxelVolumeSize(const vec3& voxelVolumeSize); - virtual glm::vec3 getVoxelVolumeSize() const; + virtual void setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize); + virtual ScriptVec3Float getVoxelVolumeSize() const; virtual void setVoxelData(const QByteArray& voxelData); virtual QByteArray getVoxelData() const; @@ -172,7 +172,7 @@ class PolyVoxEntityItem : public EntityItem { protected: void setVoxelDataDirty(bool value) { withWriteLock([&] { _voxelDataDirty = value; }); } - glm::vec3 _voxelVolumeSize { DEFAULT_VOXEL_VOLUME_SIZE }; // this is always 3 bytes + ScriptVec3Float _voxelVolumeSize { DEFAULT_VOXEL_VOLUME_SIZE }; // this is always 3 bytes QByteArray _voxelData { DEFAULT_VOXEL_DATA }; bool _voxelDataDirty { true }; // _voxelData has changed, things that depend on it should be updated diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp index 6fd0017ae2..6f40e9fbb4 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp @@ -367,8 +367,8 @@ namespace scriptable { obj.setProperty("metallic", material.metallic); obj.setProperty("scattering", material.scattering); obj.setProperty("unlit", material.unlit); - obj.setProperty("emissive", vec3toScriptValue(engine, material.emissive)); - obj.setProperty("albedo", vec3toScriptValue(engine, material.albedo)); + obj.setProperty("emissive", vec3ToScriptValue(engine, material.emissive)); + obj.setProperty("albedo", vec3ToScriptValue(engine, material.albedo)); obj.setProperty("emissiveMap", material.emissiveMap); obj.setProperty("albedoMap", material.albedoMap); obj.setProperty("opacityMap", material.opacityMap); diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index d7b926916b..d259f8cf6b 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -393,7 +393,7 @@ bool OctreePacketData::appendValue(const ScriptVec2Float& value) { return success; } -bool OctreePacketData::appendValue(const glm::vec3& value) { +bool OctreePacketData::appendValue(const ScriptVec3Float& value) { const unsigned char* data = (const unsigned char*)&value; int length = sizeof(value); bool success = append(data, length); @@ -404,14 +404,14 @@ bool OctreePacketData::appendValue(const glm::vec3& value) { return success; } -bool OctreePacketData::appendValue(const QVector& value) { +bool OctreePacketData::appendValue(const QVector& value) { uint16_t qVecSize = value.size(); bool success = appendValue(qVecSize); if (success) { - success = append((const unsigned char*)value.constData(), qVecSize * sizeof(glm::vec3)); + success = append((const unsigned char*)value.constData(), qVecSize * sizeof(ScriptVec3Float)); if (success) { - _bytesOfValues += qVecSize * sizeof(glm::vec3); - _totalBytesOfValues += qVecSize * sizeof(glm::vec3); + _bytesOfValues += qVecSize * sizeof(ScriptVec3Float); + _totalBytesOfValues += qVecSize * sizeof(ScriptVec3Float); } } return success; @@ -703,19 +703,19 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, xColor } -int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(uint16_t)); dataBytes += sizeof(length); // FIXME - this size check is wrong if we allow larger packets - if (length * sizeof(glm::vec3) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { + if (length * sizeof(ScriptVec3Float) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { result.resize(0); return sizeof(uint16_t); } result.resize(length); - memcpy(result.data(), dataBytes, length * sizeof(glm::vec3)); - return sizeof(uint16_t) + length * sizeof(glm::vec3); + memcpy(result.data(), dataBytes, length * sizeof(ScriptVec3Float)); + return sizeof(uint16_t) + length * sizeof(ScriptVec3Float); } int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index ed550a53ee..2309b5e67b 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -168,10 +168,10 @@ public: bool appendValue(const ScriptVec2Float& value); /// appends a non-position vector to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const glm::vec3& value); + bool appendValue(const ScriptVec3Float& value); /// appends a QVector of vec3s to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const QVector& value); + bool appendValue(const QVector& value); /// appends a QVector of quats to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const QVector& value); @@ -254,7 +254,7 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, glm::vec3& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, bool& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, quint64& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, uint32_t& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } @@ -267,7 +267,7 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, QString& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QUuid& result); static int unpackDataFromBytes(const unsigned char* dataBytes, xColor& result); - static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index f8f49921a3..89f7aed37a 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1073,7 +1073,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con updateVertices(id, points, QVector({ color })); } -void GeometryCache::updateVertices(int id, const QVector& points, const QVector& colors) { +void GeometryCache::updateVertices(int id, const QVector& points, const QVector& colors) { BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { details.clear(); @@ -1121,7 +1121,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con auto pointCount = points.size(); auto colorCount = colors.size(); for (auto i = 0; i < pointCount; i++) { - const glm::vec3& point = points[i]; + const glm::vec3& point = points[i].toGlm(); if (i < colorCount) { const glm::vec4& color = colors[i]; compactColor = ((int(color.x * 255.0f) & 0xFF)) | @@ -1148,11 +1148,11 @@ void GeometryCache::updateVertices(int id, const QVector& points, con #endif } -void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { +void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { updateVertices(id, points, QVector({ color })); } -void GeometryCache::updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color) { +void GeometryCache::updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color) { BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -1207,7 +1207,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con const glm::vec3 NORMAL(0.0f, 0.0f, 1.0f); for (int i = 0; i < points.size(); i++) { - glm::vec3 point = points[i]; + glm::vec3 point = points[i].toGlm(); glm::vec2 texCoord = texCoords[i]; *(vertex++) = point.x; *(vertex++) = point.y; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index fcbf5ee128..9e1f4878bd 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -346,9 +346,9 @@ public: void updateVertices(int id, const QVector& points, const glm::vec4& color); void updateVertices(int id, const QVector& points, const QVector& colors); - void updateVertices(int id, const QVector& points, const glm::vec4& color); - void updateVertices(int id, const QVector& points, const QVector& colors); - void updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color); + void updateVertices(int id, const QVector& points, const glm::vec4& color); + void updateVertices(int id, const QVector& points, const QVector& colors); + void updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color); void renderVertices(gpu::Batch& batch, gpu::Primitive primitiveType, int id); /// Set a batch to the simple pipeline, returning the previous pipeline diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 41b95312f6..2ae6eabc9a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -420,8 +420,8 @@ bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const g face = triangleSetFace; bestModelTriangle = triangleSetTriangle; bestWorldTriangle = triangleSetTriangle * meshToWorldMatrix; - extraInfo["worldIntersectionPoint"] = vec3toVariant(worldIntersectionPoint); - extraInfo["meshIntersectionPoint"] = vec3toVariant(meshIntersectionPoint); + extraInfo["worldIntersectionPoint"] = vec3ToVariant(worldIntersectionPoint); + extraInfo["meshIntersectionPoint"] = vec3ToVariant(meshIntersectionPoint); extraInfo["partIndex"] = partIndex; extraInfo["shapeID"] = shapeID; bestSubMeshIndex = subMeshIndex; @@ -440,15 +440,15 @@ bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const g extraInfo["subMeshIndex"] = bestSubMeshIndex; extraInfo["subMeshName"] = geometry.getModelNameOfMesh(bestSubMeshIndex); extraInfo["subMeshTriangleWorld"] = QVariantMap{ - { "v0", vec3toVariant(bestWorldTriangle.v0) }, - { "v1", vec3toVariant(bestWorldTriangle.v1) }, - { "v2", vec3toVariant(bestWorldTriangle.v2) }, + { "v0", vec3ToVariant(bestWorldTriangle.v0) }, + { "v1", vec3ToVariant(bestWorldTriangle.v1) }, + { "v2", vec3ToVariant(bestWorldTriangle.v2) }, }; - extraInfo["subMeshNormal"] = vec3toVariant(bestModelTriangle.getNormal()); + extraInfo["subMeshNormal"] = vec3ToVariant(bestModelTriangle.getNormal()); extraInfo["subMeshTriangle"] = QVariantMap{ - { "v0", vec3toVariant(bestModelTriangle.v0) }, - { "v1", vec3toVariant(bestModelTriangle.v1) }, - { "v2", vec3toVariant(bestModelTriangle.v2) }, + { "v0", vec3ToVariant(bestModelTriangle.v0) }, + { "v1", vec3ToVariant(bestModelTriangle.v1) }, + { "v2", vec3ToVariant(bestModelTriangle.v2) }, }; } } @@ -899,7 +899,7 @@ void Model::renderDebugMeshBoxes(gpu::Batch& batch) { if (_debugMeshBoxesID == GeometryCache::UNKNOWN_ID) { _debugMeshBoxesID = DependencyManager::get()->allocateID(); } - QVector points; + QVector points; glm::vec3 brn = box.getCorner(); glm::vec3 bln = brn + glm::vec3(box.getDimensions().x, 0, 0); diff --git a/libraries/script-engine/src/ModelScriptingInterface.cpp b/libraries/script-engine/src/ModelScriptingInterface.cpp index c693083ebf..1716ea72ff 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.cpp +++ b/libraries/script-engine/src/ModelScriptingInterface.cpp @@ -192,7 +192,7 @@ QScriptValue ModelScriptingInterface::getVertex(MeshProxy* meshProxy, int vertex } glm::vec3 pos = vertexBufferView.get(vertexIndex); - return vec3toScriptValue(_modelScriptEngine, pos); + return vec3ToScriptValue(_modelScriptEngine, pos); } diff --git a/libraries/script-engine/src/SpatialEvent.cpp b/libraries/script-engine/src/SpatialEvent.cpp index d06cc556d3..8520c0c485 100644 --- a/libraries/script-engine/src/SpatialEvent.cpp +++ b/libraries/script-engine/src/SpatialEvent.cpp @@ -33,9 +33,9 @@ SpatialEvent::SpatialEvent(const SpatialEvent& event) { QScriptValue SpatialEvent::toScriptValue(QScriptEngine* engine, const SpatialEvent& event) { QScriptValue obj = engine->newObject(); - obj.setProperty("locTranslation", vec3toScriptValue(engine, event.locTranslation) ); + obj.setProperty("locTranslation", vec3ToScriptValue(engine, event.locTranslation) ); obj.setProperty("locRotation", quatToScriptValue(engine, event.locRotation) ); - obj.setProperty("absTranslation", vec3toScriptValue(engine, event.absTranslation) ); + obj.setProperty("absTranslation", vec3ToScriptValue(engine, event.absTranslation) ); obj.setProperty("absRotation", quatToScriptValue(engine, event.absRotation) ); return obj; diff --git a/libraries/script-engine/src/TouchEvent.cpp b/libraries/script-engine/src/TouchEvent.cpp index 4c08c6ba46..be2a9e2c44 100644 --- a/libraries/script-engine/src/TouchEvent.cpp +++ b/libraries/script-engine/src/TouchEvent.cpp @@ -219,7 +219,7 @@ QScriptValue TouchEvent::toScriptValue(QScriptEngine* engine, const TouchEvent& QScriptValue pointsObj = engine->newArray(); int index = 0; foreach (ScriptVec2Float point, event.points) { - QScriptValue thisPoint = vec2toScriptValue(engine, point); + QScriptValue thisPoint = vec2FloatToScriptValue(engine, point); pointsObj.setProperty(index, thisPoint); index++; } diff --git a/libraries/shared/src/JointData.h b/libraries/shared/src/JointData.h index f4c8b89e7a..7fa0e5e8da 100644 --- a/libraries/shared/src/JointData.h +++ b/libraries/shared/src/JointData.h @@ -5,10 +5,12 @@ #include #include +#include "RegisteredMetaTypes.h" + class EntityJointData { public: glm::quat rotation; - glm::vec3 translation; + ScriptVec3Float translation; bool rotationSet = false; bool translationSet = false; }; diff --git a/libraries/shared/src/PointerEvent.cpp b/libraries/shared/src/PointerEvent.cpp index c74d74c771..fb855922c2 100644 --- a/libraries/shared/src/PointerEvent.cpp +++ b/libraries/shared/src/PointerEvent.cpp @@ -229,7 +229,8 @@ void PointerEvent::fromScriptValue(const QScriptValue& object, PointerEvent& eve QScriptValue id = object.property("id"); event._id = id.isNumber() ? (uint32_t)id.toNumber() : 0; - glm::vec2 pos2D = vec2FromVariant(object.property("pos2D").toVariant()); + glm::vec2 pos2D; + vec2FromScriptValue(object.property("pos2D"), event._pos2D); glm::vec3 pos3D; vec3FromScriptValue(object.property("pos3D"), event._pos3D); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 96f177656b..f0754b2a48 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -25,13 +25,16 @@ #include #include -int vec4MetaTypeId = qRegisterMetaType(); -int vec3MetaTypeId = qRegisterMetaType(); -int qVectorVec3MetaTypeId = qRegisterMetaType>(); -int qVectorQuatMetaTypeId = qRegisterMetaType>(); -int qVectorBoolMetaTypeId = qRegisterMetaType>(); + int glmVec2MetaTypeId = qRegisterMetaType(); int vec2FloatMetaTypeId = qRegisterMetaType(); +int glmVec3MetaTypeId = qRegisterMetaType(); +int vec3FloatMetaTypeId = qRegisterMetaType(); +int vec3UintMetaTypeId = qRegisterMetaType(); +int vec4MetaTypeId = qRegisterMetaType(); +int qVectorVec3MetaTypeId = qRegisterMetaType>(); +int qVectorQuatMetaTypeId = qRegisterMetaType>(); +int qVectorBoolMetaTypeId = qRegisterMetaType>(); int quatMetaTypeId = qRegisterMetaType(); int xColorMetaTypeId = qRegisterMetaType(); int pickRayMetaTypeId = qRegisterMetaType(); @@ -42,85 +45,214 @@ int voidLambdaType = qRegisterMetaType>(); int variantLambdaType = qRegisterMetaType>(); void registerMetaTypes(QScriptEngine* engine) { - qScriptRegisterMetaType(engine, mat4toScriptValue, mat4FromScriptValue); + qScriptRegisterMetaType(engine, vec2ToScriptValue, vec2FromScriptValue); + qScriptRegisterMetaType(engine, vec2FloatToScriptValue, vec2FloatFromScriptValue); + qScriptRegisterMetaType(engine, vec3ToScriptValue, vec3FromScriptValue); + qScriptRegisterMetaType(engine, vec3FloatToScriptValue, vec3FloatFromScriptValue); + qScriptRegisterMetaType(engine, vec3UIntToScriptValue, vec3UIntFromScriptValue); qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); - qScriptRegisterMetaType(engine, vec3toScriptValue, vec3FromScriptValue); + qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); + qScriptRegisterMetaType(engine, mat4toScriptValue, mat4FromScriptValue); + qScriptRegisterMetaType(engine, qVectorVec3ToScriptValue, qVectorVec3FromScriptValue); qScriptRegisterMetaType(engine, qVectorQuatToScriptValue, qVectorQuatFromScriptValue); qScriptRegisterMetaType(engine, qVectorBoolToScriptValue, qVectorBoolFromScriptValue); qScriptRegisterMetaType(engine, qVectorFloatToScriptValue, qVectorFloatFromScriptValue); qScriptRegisterMetaType(engine, qVectorIntToScriptValue, qVectorIntFromScriptValue); - qScriptRegisterMetaType(engine, glmVec2toScriptValue, glmVec2FromScriptValue); - qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); - qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); + + qScriptRegisterMetaType(engine, qSizeFToScriptValue, qSizeFFromScriptValue); qScriptRegisterMetaType(engine, qRectToScriptValue, qRectFromScriptValue); - qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); - qScriptRegisterMetaType(engine, qColorToScriptValue, qColorFromScriptValue); qScriptRegisterMetaType(engine, qURLToScriptValue, qURLFromScriptValue); + qScriptRegisterMetaType(engine, qColorToScriptValue, qColorFromScriptValue); + + qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); qScriptRegisterMetaType(engine, pickRayToScriptValue, pickRayFromScriptValue); qScriptRegisterMetaType(engine, collisionToScriptValue, collisionFromScriptValue); qScriptRegisterMetaType(engine, quuidToScriptValue, quuidFromScriptValue); - qScriptRegisterMetaType(engine, qSizeFToScriptValue, qSizeFFromScriptValue); qScriptRegisterMetaType(engine, aaCubeToScriptValue, aaCubeFromScriptValue); } -QScriptValue mat4toScriptValue(QScriptEngine* engine, const glm::mat4& mat4) { +QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2) { + return engine->newQObject(new ScriptVec2Float(vec2), QScriptEngine::ScriptOwnership); +} + +void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) { + if (object.isQObject()) { + auto qObject = object.toQObject(); + if (qObject) { + vec2 = *qobject_cast(qObject); + return; + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("u"); + } + if (!x.isValid()) { + x = object.property("width"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("v"); + } + if (!y.isValid()) { + y = object.property("height"); + } + + vec2.x = x.toVariant().toFloat(); + vec2.y = y.toVariant().toFloat(); + return; + } + vec2 = ScriptVec2Float(); +} + +QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { QScriptValue obj = engine->newObject(); - obj.setProperty("r0c0", mat4[0][0]); - obj.setProperty("r1c0", mat4[0][1]); - obj.setProperty("r2c0", mat4[0][2]); - obj.setProperty("r3c0", mat4[0][3]); - obj.setProperty("r0c1", mat4[1][0]); - obj.setProperty("r1c1", mat4[1][1]); - obj.setProperty("r2c1", mat4[1][2]); - obj.setProperty("r3c1", mat4[1][3]); - obj.setProperty("r0c2", mat4[2][0]); - obj.setProperty("r1c2", mat4[2][1]); - obj.setProperty("r2c2", mat4[2][2]); - obj.setProperty("r3c2", mat4[2][3]); - obj.setProperty("r0c3", mat4[3][0]); - obj.setProperty("r1c3", mat4[3][1]); - obj.setProperty("r2c3", mat4[3][2]); - obj.setProperty("r3c3", mat4[3][3]); + obj.setProperty("x", vec2.x); + obj.setProperty("y", vec2.y); return obj; } -void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { - mat4[0][0] = object.property("r0c0").toVariant().toFloat(); - mat4[0][1] = object.property("r1c0").toVariant().toFloat(); - mat4[0][2] = object.property("r2c0").toVariant().toFloat(); - mat4[0][3] = object.property("r3c0").toVariant().toFloat(); - mat4[1][0] = object.property("r0c1").toVariant().toFloat(); - mat4[1][1] = object.property("r1c1").toVariant().toFloat(); - mat4[1][2] = object.property("r2c1").toVariant().toFloat(); - mat4[1][3] = object.property("r3c1").toVariant().toFloat(); - mat4[2][0] = object.property("r0c2").toVariant().toFloat(); - mat4[2][1] = object.property("r1c2").toVariant().toFloat(); - mat4[2][2] = object.property("r2c2").toVariant().toFloat(); - mat4[2][3] = object.property("r3c2").toVariant().toFloat(); - mat4[3][0] = object.property("r0c3").toVariant().toFloat(); - mat4[3][1] = object.property("r1c3").toVariant().toFloat(); - mat4[3][2] = object.property("r2c3").toVariant().toFloat(); - mat4[3][3] = object.property("r3c3").toVariant().toFloat(); +void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { + vec2.x = object.property("x").toVariant().toFloat(); + vec2.y = object.property("y").toVariant().toFloat(); } -QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4) { - QScriptValue obj = engine->newObject(); - obj.setProperty("x", vec4.x); - obj.setProperty("y", vec4.y); - obj.setProperty("z", vec4.z); - obj.setProperty("w", vec4.w); - return obj; +QVariant vec2ToVariant(const glm::vec2 &vec2) { + if (vec2.x != vec2.x || vec2.y != vec2.y) { + // if vec2 contains a NaN don't try to convert it + return QVariant(); + } + QVariantMap result; + result["x"] = vec2.x; + result["y"] = vec2.y; + return result; } -void vec4FromScriptValue(const QScriptValue& object, glm::vec4& vec4) { - vec4.x = object.property("x").toVariant().toFloat(); - vec4.y = object.property("y").toVariant().toFloat(); - vec4.z = object.property("z").toVariant().toFloat(); - vec4.w = object.property("w").toVariant().toFloat(); +glm::vec2 vec2FromVariant(const QVariant &object, bool& isValid) { + isValid = false; + glm::vec2 result; + if (object.canConvert()) { + result = glm::vec2(object.toFloat()); + } else if (object.canConvert()) { + auto qvec2 = qvariant_cast(object); + result.x = qvec2.x(); + result.y = qvec2.y(); + } else { + auto map = object.toMap(); + auto x = map["x"]; + if (!x.isValid()) { + x = map["width"]; + } + auto y = map["y"]; + if (!y.isValid()) { + y = map["height"]; + } + if (x.isValid() && y.isValid()) { + result.x = x.toFloat(&isValid); + if (isValid) { + result.y = y.toFloat(&isValid); + } + } + } + return result; } -QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { +glm::vec2 vec2FromVariant(const QVariant &object) { + bool valid; + return vec2FromVariant(object, valid); +} + +QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float& vec3) { + return engine->newQObject(new ScriptVec3Float(vec3), QScriptEngine::ScriptOwnership); +} + +void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) { + if (object.isQObject()) { + auto qObject = object.toQObject(); + if (qObject) { + vec3 = *qobject_cast(qObject); + return; + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("r"); + } + if (!x.isValid()) { + x = object.property("red"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("g"); + } + if (!y.isValid()) { + y = object.property("green"); + } + + QScriptValue z = object.property("z"); + if (!z.isValid()) { + z = object.property("b"); + } + if (!z.isValid()) { + z = object.property("blue"); + } + + vec3.x = x.toVariant().toFloat(); + vec3.y = y.toVariant().toFloat(); + vec3.z = z.toVariant().toFloat(); + return; + } + vec3 = ScriptVec3Float(); +} + +QScriptValue vec3UIntToScriptValue(QScriptEngine* engine, const ScriptVec3UInt& vec3) { + return engine->newQObject(new ScriptVec3UInt(vec3), QScriptEngine::ScriptOwnership); +} + +void vec3UIntFromScriptValue(const QScriptValue& object, ScriptVec3UInt& vec3) { + if (object.isQObject()) { + auto qObject = object.toQObject(); + if (qObject) { + vec3 = *qobject_cast(qObject); + return; + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("r"); + } + if (!x.isValid()) { + x = object.property("red"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("g"); + } + if (!y.isValid()) { + y = object.property("green"); + } + + QScriptValue z = object.property("z"); + if (!z.isValid()) { + z = object.property("b"); + } + if (!z.isValid()) { + z = object.property("blue"); + } + + vec3.x = x.toVariant().toUInt(); + vec3.y = y.toVariant().toUInt(); + vec3.z = z.toVariant().toUInt(); + return; + } + vec3 = ScriptVec3UInt(); +} + +QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { QScriptValue obj = engine->newObject(); if (vec3.x != vec3.x || vec3.y != vec3.y || vec3.z != vec3.z) { // if vec3 contains a NaN don't try to convert it @@ -129,31 +261,16 @@ QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { obj.setProperty("x", vec3.x); obj.setProperty("y", vec3.y); obj.setProperty("z", vec3.z); - obj.setProperty("red", vec3.x); - obj.setProperty("green", vec3.y); - obj.setProperty("blue", vec3.z); return obj; } void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { - auto x = object.property("x").toVariant(); - if (!x.isValid()) { - x = object.property("red").toVariant(); - } - auto y = object.property("y").toVariant(); - if (!y.isValid()) { - y = object.property("green").toVariant(); - } - auto z = object.property("z").toVariant(); - if (!z.isValid()) { - z = object.property("blue").toVariant(); - } - vec3.x = x.toFloat(); - vec3.y = y.toFloat(); - vec3.z = z.toFloat(); + vec3.x = object.property("x").toVariant().toFloat(); + vec3.y = object.property("y").toVariant().toFloat(); + vec3.z = object.property("z").toVariant().toFloat(); } -QVariant vec3toVariant(const glm::vec3& vec3) { +QVariant vec3ToVariant(const glm::vec3& vec3) { if (vec3.x != vec3.x || vec3.y != vec3.y || vec3.z != vec3.z) { // if vec3 contains a NaN don't try to convert it return QVariant(); @@ -165,28 +282,6 @@ QVariant vec3toVariant(const glm::vec3& vec3) { return result; } -QVariant vec4toVariant(const glm::vec4& vec4) { - if (isNaN(vec4.x) || isNaN(vec4.y) || isNaN(vec4.z) || isNaN(vec4.w)) { - // if vec4 contains a NaN don't try to convert it - return QVariant(); - } - QVariantMap result; - result["x"] = vec4.x; - result["y"] = vec4.y; - result["z"] = vec4.z; - result["w"] = vec4.w; - return result; -} - -QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector) { - QScriptValue array = engine->newArray(); - for (int i = 0; i < vector.size(); i++) { - array.setProperty(i, vec3toScriptValue(engine, vector.at(i))); - } - return array; -} - - glm::vec3 vec3FromVariant(const QVariant& object, bool& valid) { glm::vec3 v; valid = false; @@ -231,6 +326,35 @@ glm::vec3 vec3FromVariant(const QVariant& object) { return vec3FromVariant(object, valid); } +QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4) { + QScriptValue obj = engine->newObject(); + obj.setProperty("x", vec4.x); + obj.setProperty("y", vec4.y); + obj.setProperty("z", vec4.z); + obj.setProperty("w", vec4.w); + return obj; +} + +void vec4FromScriptValue(const QScriptValue& object, glm::vec4& vec4) { + vec4.x = object.property("x").toVariant().toFloat(); + vec4.y = object.property("y").toVariant().toFloat(); + vec4.z = object.property("z").toVariant().toFloat(); + vec4.w = object.property("w").toVariant().toFloat(); +} + +QVariant vec4toVariant(const glm::vec4& vec4) { + if (isNaN(vec4.x) || isNaN(vec4.y) || isNaN(vec4.z) || isNaN(vec4.w)) { + // if vec4 contains a NaN don't try to convert it + return QVariant(); + } + QVariantMap result; + result["x"] = vec4.x; + result["y"] = vec4.y; + result["z"] = vec4.z; + result["w"] = vec4.w; + return result; +} + glm::vec4 vec4FromVariant(const QVariant& object, bool& valid) { glm::vec4 v; valid = false; @@ -268,6 +392,76 @@ glm::vec4 vec4FromVariant(const QVariant& object) { return vec4FromVariant(object, valid); } +QScriptValue mat4toScriptValue(QScriptEngine* engine, const glm::mat4& mat4) { + QScriptValue obj = engine->newObject(); + obj.setProperty("r0c0", mat4[0][0]); + obj.setProperty("r1c0", mat4[0][1]); + obj.setProperty("r2c0", mat4[0][2]); + obj.setProperty("r3c0", mat4[0][3]); + obj.setProperty("r0c1", mat4[1][0]); + obj.setProperty("r1c1", mat4[1][1]); + obj.setProperty("r2c1", mat4[1][2]); + obj.setProperty("r3c1", mat4[1][3]); + obj.setProperty("r0c2", mat4[2][0]); + obj.setProperty("r1c2", mat4[2][1]); + obj.setProperty("r2c2", mat4[2][2]); + obj.setProperty("r3c2", mat4[2][3]); + obj.setProperty("r0c3", mat4[3][0]); + obj.setProperty("r1c3", mat4[3][1]); + obj.setProperty("r2c3", mat4[3][2]); + obj.setProperty("r3c3", mat4[3][3]); + return obj; +} + +void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { + mat4[0][0] = object.property("r0c0").toVariant().toFloat(); + mat4[0][1] = object.property("r1c0").toVariant().toFloat(); + mat4[0][2] = object.property("r2c0").toVariant().toFloat(); + mat4[0][3] = object.property("r3c0").toVariant().toFloat(); + mat4[1][0] = object.property("r0c1").toVariant().toFloat(); + mat4[1][1] = object.property("r1c1").toVariant().toFloat(); + mat4[1][2] = object.property("r2c1").toVariant().toFloat(); + mat4[1][3] = object.property("r3c1").toVariant().toFloat(); + mat4[2][0] = object.property("r0c2").toVariant().toFloat(); + mat4[2][1] = object.property("r1c2").toVariant().toFloat(); + mat4[2][2] = object.property("r2c2").toVariant().toFloat(); + mat4[2][3] = object.property("r3c2").toVariant().toFloat(); + mat4[3][0] = object.property("r0c3").toVariant().toFloat(); + mat4[3][1] = object.property("r1c3").toVariant().toFloat(); + mat4[3][2] = object.property("r2c3").toVariant().toFloat(); + mat4[3][3] = object.property("r3c3").toVariant().toFloat(); +} + +QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector) { + QScriptValue array = engine->newArray(); + for (int i = 0; i < vector.size(); i++) { + array.setProperty(i, vec3FloatToScriptValue(engine, vector.at(i))); + } + return array; +} + +QVector qVectorVec3FromScriptValue(const QScriptValue& array) { + QVector newVector; + int length = array.property("length").toInteger(); + + for (int i = 0; i < length; i++) { + ScriptVec3Float newVec3 = ScriptVec3Float(); + vec3FloatFromScriptValue(array.property(i), newVec3); + newVector << newVec3; + } + return newVector; +} + +void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector) { + int length = array.property("length").toInteger(); + + for (int i = 0; i < length; i++) { + ScriptVec3Float newVec3 = ScriptVec3Float(); + vec3FloatFromScriptValue(array.property(i), newVec3); + vector << newVec3; + } +} + QScriptValue quatToScriptValue(QScriptEngine* engine, const glm::quat& quat) { QScriptValue obj = engine->newObject(); if (quat.x != quat.x || quat.y != quat.y || quat.z != quat.z || quat.w != quat.w) { @@ -299,11 +493,11 @@ void quatFromScriptValue(const QScriptValue& object, glm::quat &quat) { glm::quat quatFromVariant(const QVariant &object, bool& isValid) { glm::quat q; if (object.canConvert()) { - auto qvec3 = qvariant_cast(object); - q.x = qvec3.x(); - q.y = qvec3.y(); - q.z = qvec3.z(); - q.w = qvec3.scalar(); + auto qquat = qvariant_cast(object); + q.x = qquat.x(); + q.y = qquat.y(); + q.z = qquat.z(); + q.w = qquat.scalar(); // enforce normalized quaternion float length = glm::length(q); @@ -342,7 +536,7 @@ glm::quat quatFromVariant(const QVariant& object) { QVariant quatToVariant(const glm::quat& quat) { if (quat.x != quat.x || quat.y != quat.y || quat.z != quat.z) { - // if vec3 contains a NaN don't try to convert it + // if quat contains a NaN don't try to convert it return QVariant(); } QVariantMap result; @@ -434,29 +628,6 @@ void qVectorIntFromScriptValue(const QScriptValue& array, QVector& vec } } -// -QVector qVectorVec3FromScriptValue(const QScriptValue& array){ - QVector newVector; - int length = array.property("length").toInteger(); - - for (int i = 0; i < length; i++) { - glm::vec3 newVec3 = glm::vec3(); - vec3FromScriptValue(array.property(i), newVec3); - newVector << newVec3; - } - return newVector; -} - -void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector ) { - int length = array.property("length").toInteger(); - - for (int i = 0; i < length; i++) { - glm::vec3 newVec3 = glm::vec3(); - vec3FromScriptValue(array.property(i), newVec3); - vector << newVec3; - } -} - QVector qVectorQuatFromScriptValue(const QScriptValue& array){ QVector newVector; int length = array.property("length").toInteger(); @@ -497,98 +668,6 @@ void qVectorBoolFromScriptValue(const QScriptValue& array, QVector& vector } } -QScriptValue vec2toScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2) { - return engine->newQObject(new ScriptVec2Float(vec2), QScriptEngine::ScriptOwnership); -} - -void vec2FromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) { - if (object.isQObject()) { - auto qObject = object.toQObject(); - if (qObject) { - vec2 = *qobject_cast(qObject); - return; - } - } else { - QScriptValue x = object.property("x"); - if (!x.isValid()) { - x = object.property("u"); - } - if (!x.isValid()) { - x = object.property("width"); - } - - QScriptValue y = object.property("y"); - if (!y.isValid()) { - y = object.property("v"); - } - if (!y.isValid()) { - y = object.property("height"); - } - - vec2.x = x.toVariant().toFloat(); - vec2.y = y.toVariant().toFloat(); - return; - } - vec2 = ScriptVec2Float(); -} - -QScriptValue glmVec2toScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { - QScriptValue obj = engine->newObject(); - obj.setProperty("x", vec2.x); - obj.setProperty("y", vec2.y); - return obj; -} - -void glmVec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { - vec2.x = object.property("x").toVariant().toFloat(); - vec2.y = object.property("y").toVariant().toFloat(); -} - -QVariant vec2toVariant(const glm::vec2 &vec2) { - if (vec2.x != vec2.x || vec2.y != vec2.y) { - // if vec2 contains a NaN don't try to convert it - return QVariant(); - } - QVariantMap result; - result["x"] = vec2.x; - result["y"] = vec2.y; - return result; -} - -glm::vec2 vec2FromVariant(const QVariant &object, bool& isValid) { - isValid = false; - glm::vec2 result; - if (object.canConvert()) { - result = glm::vec2(object.toFloat()); - } else if (object.canConvert()) { - auto qvec2 = qvariant_cast(object); - result.x = qvec2.x(); - result.y = qvec2.y(); - } else { - auto map = object.toMap(); - auto x = map["x"]; - if (!x.isValid()) { - x = map["width"]; - } - auto y = map["y"]; - if (!y.isValid()) { - y = map["height"]; - } - if (x.isValid() && y.isValid()) { - result.x = x.toFloat(&isValid); - if (isValid) { - result.y = y.toFloat(&isValid); - } - } - } - return result; -} - -glm::vec2 vec2FromVariant(const QVariant &object) { - bool valid; - return vec2FromVariant(object, valid); -} - QScriptValue qRectToScriptValue(QScriptEngine* engine, const QRect& rect) { QScriptValue obj = engine->newObject(); obj.setProperty("x", rect.x()); @@ -794,9 +873,9 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url) { QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) { QScriptValue obj = engine->newObject(); - QScriptValue origin = vec3toScriptValue(engine, pickRay.origin); + QScriptValue origin = vec3ToScriptValue(engine, pickRay.origin); obj.setProperty("origin", origin); - QScriptValue direction = vec3toScriptValue(engine, pickRay.direction); + QScriptValue direction = vec3ToScriptValue(engine, pickRay.direction); obj.setProperty("direction", direction); return obj; } @@ -840,9 +919,9 @@ QScriptValue collisionToScriptValue(QScriptEngine* engine, const Collision& coll obj.setProperty("type", collision.type); obj.setProperty("idA", quuidToScriptValue(engine, collision.idA)); obj.setProperty("idB", quuidToScriptValue(engine, collision.idB)); - obj.setProperty("penetration", vec3toScriptValue(engine, collision.penetration)); - obj.setProperty("contactPoint", vec3toScriptValue(engine, collision.contactPoint)); - obj.setProperty("velocityChange", vec3toScriptValue(engine, collision.velocityChange)); + obj.setProperty("penetration", vec3ToScriptValue(engine, collision.penetration)); + obj.setProperty("contactPoint", vec3ToScriptValue(engine, collision.contactPoint)); + obj.setProperty("velocityChange", vec3ToScriptValue(engine, collision.velocityChange)); return obj; } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 293fefec21..eca7552e23 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -31,11 +31,9 @@ class QColor; class QUrl; Q_DECLARE_METATYPE(glm::vec4) -Q_DECLARE_METATYPE(glm::vec3) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(glm::mat4) Q_DECLARE_METATYPE(xColor) -Q_DECLARE_METATYPE(QVector) Q_DECLARE_METATYPE(QVector) Q_DECLARE_METATYPE(AACube) Q_DECLARE_METATYPE(std::function); @@ -51,8 +49,8 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * A 2-dimensional vector. * * @typedef {object} Vec2 -* @property {number} x - X-coordinate of the vector. -* @property {number} y - Y-coordinate of the vector. +* @property {number} x - X-coordinate of the vector. Synonyms: u and width. +* @property {number} y - Y-coordinate of the vector. Synonyms: v and height. */ class ScriptVec2Float : public QObject { Q_OBJECT @@ -74,6 +72,7 @@ public: inline bool operator==(const glm::vec2& other) { return (x == other.x && y == other.y); } inline bool operator!=(const glm::vec2& other) { return !(*this == other); } + glm::vec2 toGlm() const { return glm::vec2(x, y); } Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y" }).toObject().toVariantMap(); } float x { 0.0f }; @@ -90,36 +89,120 @@ inline QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2) { inline bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return (glmVec2.x == vec2.x && glmVec2.y == vec2.y); } inline bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return !(glmVec2 == vec2); } Q_DECLARE_METATYPE(ScriptVec2Float) -QScriptValue vec2toScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2); -void vec2FromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2); - -QVariant vec2toVariant(const glm::vec2& vec2); -glm::vec2 vec2FromVariant(const QVariant& object, bool& valid); -glm::vec2 vec2FromVariant(const QVariant& object); +QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2); +void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2); Q_DECLARE_METATYPE(glm::vec2) -QScriptValue glmVec2toScriptValue(QScriptEngine* engine, const glm::vec2& vec2); -void glmVec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); +QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); +void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); + +QVariant vec2ToVariant(const glm::vec2& vec2); +glm::vec2 vec2FromVariant(const QVariant& object, bool& valid); +glm::vec2 vec2FromVariant(const QVariant& object); /**jsdoc * A 3-dimensional vector. See also the {@link Vec3(0)|Vec3} object. * * @typedef {object} Vec3 -* @property {number} x - X-coordinate of the vector. -* @property {number} y - Y-coordinate of the vector. -* @property {number} z - Z-coordinate of the vector. +* @property {number} x - X-coordinate of the vector. Synonyms: r and red. +* @property {number} y - Y-coordinate of the vector. Synonyms: g and green. +* @property {number} z - Z-coordinate of the vector. Synonyms: b and blue. */ +class ScriptVec3Float : public QObject { + Q_OBJECT + Q_PROPERTY(float x MEMBER x) + Q_PROPERTY(float y MEMBER y) + Q_PROPERTY(float z MEMBER z) + Q_PROPERTY(float r MEMBER x) + Q_PROPERTY(float g MEMBER y) + Q_PROPERTY(float b MEMBER z) + Q_PROPERTY(float red MEMBER x) + Q_PROPERTY(float green MEMBER y) + Q_PROPERTY(float blue MEMBER z) +public: + ScriptVec3Float() {} + ScriptVec3Float(float xyz) : x(xyz), y(xyz), z(xyz) {} + ScriptVec3Float(float x, float y, float z) : x(x), y(y), z(z) {} + ScriptVec3Float(const ScriptVec3Float& other) : x(other.x), y(other.y), z(other.z) {} + ScriptVec3Float(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} + void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } + inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } + inline bool operator!=(const ScriptVec3Float& other) const { return !(*this == other); } + inline bool operator==(const glm::vec3& other) { return (x == other.x && y == other.y && z == other.z); } + inline bool operator!=(const glm::vec3& other) { return !(*this == other); } + + glm::vec3 toGlm() const { return glm::vec3(x, y, z); } + Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } + + float x { 0.0f }; + float y { 0.0f }; + float z { 0.0f }; +private: + friend QDebug operator<<(QDebug debug, const ScriptVec3Float& vec3); + friend bool operator==(glm::vec3 glmVec3, const ScriptVec3Float& vec3); + friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3Float& vec3); +}; +inline QDebug operator<<(QDebug debug, const ScriptVec3Float& vec3) { + debug << "(" << vec3.x << "," << vec3.y << "," << vec3.z << ")"; + return debug; +} +inline bool operator==(glm::vec3 glmVec3, const ScriptVec3Float& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } +inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3Float& vec3) { return !(glmVec3 == vec3); } +Q_DECLARE_METATYPE(ScriptVec3Float) +QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float& vec3); +void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3); + /**jsdoc * A color vector. See also the {@link Vec3(0)|Vec3} object. * * @typedef {object} Vec3Color -* @property {number} x - Red component value. Integer in the range 0 - 255. -* @property {number} y - Green component value. Integer in the range 0 - 255. -* @property {number} z - Blue component value. Integer in the range 0 - 255. +* @property {number} x - Red component value. Integer in the range 0 - 255. Synonyms: r and red. +* @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g and green. +* @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b and blue. */ -QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); +class ScriptVec3UInt : public QObject { + Q_OBJECT + Q_PROPERTY(unsigned int x MEMBER x) + Q_PROPERTY(unsigned int y MEMBER y) + Q_PROPERTY(unsigned int z MEMBER z) + Q_PROPERTY(unsigned int r MEMBER x) + Q_PROPERTY(unsigned int g MEMBER y) + Q_PROPERTY(unsigned int b MEMBER z) + Q_PROPERTY(unsigned int red MEMBER x) + Q_PROPERTY(unsigned int green MEMBER y) + Q_PROPERTY(unsigned int blue MEMBER z) +public: + ScriptVec3UInt() {} + ScriptVec3UInt(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} + ScriptVec3UInt(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} + ScriptVec3UInt(const ScriptVec3UInt& other) : x(other.x), y(other.y), z(other.z) {} + void operator=(const ScriptVec3UInt& other) { x = other.x; y = other.y; z = other.z; } + inline bool operator==(const ScriptVec3UInt& other) { return (x == other.x && y == other.y && z == other.z); } + inline bool operator!=(const ScriptVec3UInt& other) { return !(*this == other); } + + Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } + + unsigned int x { 0 }; + unsigned int y { 0 }; + unsigned int z { 0 }; +private: + friend QDebug operator<<(QDebug debug, const ScriptVec3UInt& vec3); +}; +inline QDebug operator<<(QDebug debug, const ScriptVec3UInt& vec3) { + debug << "(" << vec3.x << "," << vec3.y << "," << vec3.z << ")"; + return debug; +} +inline bool operator==(glm::vec3 glmVec3, const ScriptVec3UInt& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } +inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3UInt& vec3) { return !(glmVec3 == vec3); } +Q_DECLARE_METATYPE(ScriptVec3UInt) +QScriptValue vec3UIntToScriptValue(QScriptEngine* engine, const ScriptVec3UInt& vec3); +void vec3UIntFromScriptValue(const QScriptValue& object, ScriptVec3UInt& vec3); + +Q_DECLARE_METATYPE(glm::vec3) +QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3); -QVariant vec3toVariant(const glm::vec3& vec3); + +QVariant vec3ToVariant(const glm::vec3& vec3); glm::vec3 vec3FromVariant(const QVariant &object, bool& valid); glm::vec3 vec3FromVariant(const QVariant &object); @@ -169,9 +252,10 @@ QScriptValue qURLToScriptValue(QScriptEngine* engine, const QUrl& url); void qURLFromScriptValue(const QScriptValue& object, QUrl& url); // vector -QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); -void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector); -QVector qVectorVec3FromScriptValue(const QScriptValue& array); +Q_DECLARE_METATYPE(QVector) +QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); +void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector); +QVector qVectorVec3FromScriptValue(const QScriptValue& array); // vector QScriptValue qVectorQuatToScriptValue(QScriptEngine* engine, const QVector& vector); @@ -229,8 +313,8 @@ public: } QVariantMap toVariantMap() const override { QVariantMap pickRay; - pickRay["origin"] = vec3toVariant(origin); - pickRay["direction"] = vec3toVariant(direction); + pickRay["origin"] = vec3ToVariant(origin); + pickRay["direction"] = vec3ToVariant(direction); return pickRay; } }; @@ -267,9 +351,9 @@ public: QVariantMap toVariantMap() const override { QVariantMap stylusTip; stylusTip["side"] = (int)side; - stylusTip["position"] = vec3toVariant(position); + stylusTip["position"] = vec3ToVariant(position); stylusTip["orientation"] = quatToVariant(orientation); - stylusTip["velocity"] = vec3toVariant(velocity); + stylusTip["velocity"] = vec3ToVariant(velocity); return stylusTip; } }; diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index ccb275ffc9..ffe0f2e6eb 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -886,6 +886,14 @@ glm::vec3 SpatiallyNestable::getLocalPosition() const { return result; } +ScriptVec3Float SpatiallyNestable::getScriptLocalPosition() const { + ScriptVec3Float result; + _transformLock.withReadLock([&] { + result = _transform.getTranslation(); + }); + return result; +} + void SpatiallyNestable::setLocalPosition(const glm::vec3& position, bool tellPhysics) { // guard against introducing NaN into the transform if (isNaN(position)) { @@ -940,6 +948,14 @@ glm::vec3 SpatiallyNestable::getLocalVelocity() const { return result; } +ScriptVec3Float SpatiallyNestable::getScriptLocalVelocity() const { + ScriptVec3Float result; + _velocityLock.withReadLock([&] { + result = _velocity; + }); + return result; +} + void SpatiallyNestable::setLocalVelocity(const glm::vec3& velocity) { _velocityLock.withWriteLock([&] { _velocity = velocity; @@ -954,6 +970,14 @@ glm::vec3 SpatiallyNestable::getLocalAngularVelocity() const { return result; } +ScriptVec3Float SpatiallyNestable::getScriptLocalAngularVelocity() const { + ScriptVec3Float result; + _angularVelocityLock.withReadLock([&] { + result = _angularVelocity; + }); + return result; +} + void SpatiallyNestable::setLocalAngularVelocity(const glm::vec3& angularVelocity) { _angularVelocityLock.withWriteLock([&] { _angularVelocity = angularVelocity; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 361f0aaf17..ada56177b3 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -19,6 +19,7 @@ #include "SpatialParentFinder.h" #include "shared/ReadWriteLockable.h" +#include "RegisteredMetaTypes.h" class SpatiallyNestable; using SpatiallyNestableWeakPointer = std::weak_ptr; @@ -136,15 +137,18 @@ public: virtual void setLocalTransform(const Transform& transform); virtual glm::vec3 getLocalPosition() const; + virtual ScriptVec3Float getScriptLocalPosition() const; virtual void setLocalPosition(const glm::vec3& position, bool tellPhysics = true); virtual glm::quat getLocalOrientation() const; virtual void setLocalOrientation(const glm::quat& orientation); virtual glm::vec3 getLocalVelocity() const; + virtual ScriptVec3Float getScriptLocalVelocity() const; virtual void setLocalVelocity(const glm::vec3& velocity); virtual glm::vec3 getLocalAngularVelocity() const; + virtual ScriptVec3Float getScriptLocalAngularVelocity() const; virtual void setLocalAngularVelocity(const glm::vec3& angularVelocity); virtual glm::vec3 getLocalSNScale() const; diff --git a/libraries/shared/src/shared/JSONHelpers.cpp b/libraries/shared/src/shared/JSONHelpers.cpp index eb2df5108d..9cda41ced0 100644 --- a/libraries/shared/src/shared/JSONHelpers.cpp +++ b/libraries/shared/src/shared/JSONHelpers.cpp @@ -68,6 +68,26 @@ vec4 vec4FromJsonValue(const QJsonValue& v) { return glmFromJson(v); } +QJsonValue toJsonValueHelper(const QVariant& variant, int type) { + // User-registered types need explicit conversion + if (type == qMetaTypeId()) { + return toJsonValue(variant.value()); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value()); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value()); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value(), {"x", "y"}); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value(), { "x", "y", "z" }); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value(), { "x", "y", "z" }); + } else { + // Qt types are converted automatically + return QJsonValue::fromVariant(variant); + } +} + QJsonValue toJsonValue(const QObject& o) { QJsonObject json{}; @@ -76,20 +96,8 @@ QJsonValue toJsonValue(const QObject& o) { for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { QString name = QString::fromLatin1(meta->property(i).name()); auto type = meta->property(i).userType(); - QVariant variant{ meta->property(i).read(&o) }; - QJsonValue value; - - // User-registered types need explicit conversion - if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else { - // Qt types are converted automatically - value = QJsonValue::fromVariant(variant); - } + QVariant variant { meta->property(i).read(&o) }; + QJsonValue value = toJsonValueHelper(variant, type); json.insert(name, value); } @@ -116,19 +124,7 @@ QJsonValue toJsonValue(const QObject& o, const std::vector& props) { QString name = QString::fromLatin1(meta->property(i).name()); auto type = meta->property(i).userType(); QVariant variant { meta->property(i).read(&o) }; - QJsonValue value; - - // User-registered types need explicit conversion - if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else if (type == qMetaTypeId()) { - value = toJsonValue(variant.value()); - } else { - // Qt types are converted automatically - value = QJsonValue::fromVariant(variant); - } + QJsonValue value = toJsonValueHelper(variant, type); json.insert(name, value); } diff --git a/libraries/shared/src/shared/JSONHelpers.h b/libraries/shared/src/shared/JSONHelpers.h index 8548c24717..a7e7077904 100644 --- a/libraries/shared/src/shared/JSONHelpers.h +++ b/libraries/shared/src/shared/JSONHelpers.h @@ -15,6 +15,7 @@ QJsonValue toJsonValue(const quat& q); QJsonValue toJsonValue(const vec3& v); QJsonValue toJsonValue(const vec4& v); +QJsonValue toJsonValueHelper(const QVariant& variant, int type); QJsonValue toJsonValue(const QObject& o); QJsonValue toJsonValue(const QObject& o, const std::vector& props); From 16ad9cb5d3c54b6d209ecf7a9c51061f8941da21 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 11 Jul 2018 18:06:06 -0700 Subject: [PATCH 003/434] xcolor/rgbcolor conversion --- .../scripting/SelectionScriptingInterface.cpp | 25 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 63 ++- interface/src/ui/overlays/Circle3DOverlay.h | 20 +- .../ui/overlays/ContextOverlayInterface.cpp | 2 +- interface/src/ui/overlays/Cube3DOverlay.cpp | 9 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 6 +- interface/src/ui/overlays/Image3DOverlay.cpp | 9 +- interface/src/ui/overlays/ImageOverlay.cpp | 2 +- interface/src/ui/overlays/Line3DOverlay.cpp | 7 +- interface/src/ui/overlays/ModelOverlay.cpp | 2 +- interface/src/ui/overlays/Overlay.cpp | 24 +- interface/src/ui/overlays/Overlay.h | 10 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 7 +- .../src/ui/overlays/RectangleOverlay.cpp | 4 +- interface/src/ui/overlays/Shape3DOverlay.cpp | 11 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 7 +- interface/src/ui/overlays/Text3DOverlay.cpp | 33 +- interface/src/ui/overlays/Text3DOverlay.h | 4 +- interface/src/ui/overlays/TextOverlay.cpp | 4 +- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- .../src/RenderableLightEntityItem.cpp | 2 +- .../src/RenderableLineEntityItem.cpp | 2 +- .../src/RenderablePolyLineEntityItem.cpp | 4 +- .../src/RenderableTextEntityItem.cpp | 8 +- .../src/RenderableZoneEntityItem.cpp | 10 +- .../entities/src/EntityItemProperties.cpp | 379 +++++++++--------- libraries/entities/src/EntityItemProperties.h | 16 +- .../entities/src/EntityItemPropertiesMacros.h | 38 +- libraries/entities/src/HazePropertyGroup.cpp | 12 +- libraries/entities/src/HazePropertyGroup.h | 12 +- .../entities/src/KeyLightPropertyGroup.cpp | 10 +- .../entities/src/KeyLightPropertyGroup.h | 6 +- libraries/entities/src/LightEntityItem.cpp | 26 +- libraries/entities/src/LightEntityItem.h | 12 +- libraries/entities/src/LineEntityItem.cpp | 39 +- libraries/entities/src/LineEntityItem.h | 9 +- libraries/entities/src/MaterialEntityItem.cpp | 4 +- libraries/entities/src/ModelEntityItem.cpp | 20 +- libraries/entities/src/ModelEntityItem.h | 10 +- .../entities/src/ParticleEffectEntityItem.cpp | 50 +-- .../entities/src/ParticleEffectEntityItem.h | 28 +- libraries/entities/src/PolyLineEntityItem.cpp | 22 +- libraries/entities/src/PolyLineEntityItem.h | 17 +- libraries/entities/src/ShapeEntityItem.cpp | 40 +- libraries/entities/src/ShapeEntityItem.h | 14 +- .../entities/src/SkyboxPropertyGroup.cpp | 8 +- libraries/entities/src/SkyboxPropertyGroup.h | 14 +- libraries/entities/src/TextEntityItem.cpp | 66 +-- libraries/entities/src/TextEntityItem.h | 24 +- libraries/octree/src/OctreePacketData.cpp | 21 +- libraries/octree/src/OctreePacketData.h | 12 +- libraries/shared/src/BufferParser.h | 12 +- libraries/shared/src/ColorUtils.h | 8 +- libraries/shared/src/GLMHelpers.cpp | 17 +- libraries/shared/src/GLMHelpers.h | 8 +- libraries/shared/src/QVariantGLM.cpp | 12 - libraries/shared/src/QVariantGLM.h | 2 - libraries/shared/src/RegisteredMetaTypes.cpp | 128 ++---- libraries/shared/src/RegisteredMetaTypes.h | 61 ++- libraries/shared/src/SharedUtil.cpp | 3 +- libraries/shared/src/SharedUtil.h | 37 -- libraries/shared/src/shared/JSONHelpers.cpp | 4 +- 62 files changed, 577 insertions(+), 901 deletions(-) diff --git a/interface/src/scripting/SelectionScriptingInterface.cpp b/interface/src/scripting/SelectionScriptingInterface.cpp index 9716b7e665..64e570dd42 100644 --- a/interface/src/scripting/SelectionScriptingInterface.cpp +++ b/interface/src/scripting/SelectionScriptingInterface.cpp @@ -421,7 +421,7 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { auto colorVariant = properties["outlineUnoccludedColor"]; if (colorVariant.isValid()) { bool isValid; - auto color = xColorFromVariant(colorVariant, isValid); + auto color = vec3FromVariant(colorVariant, isValid); if (isValid) { _style._outlineUnoccluded.color = toGlm(color); } @@ -429,7 +429,7 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { colorVariant = properties["outlineOccludedColor"]; if (colorVariant.isValid()) { bool isValid; - auto color = xColorFromVariant(colorVariant, isValid); + auto color = vec3FromVariant(colorVariant, isValid); if (isValid) { _style._outlineOccluded.color = toGlm(color); } @@ -437,7 +437,7 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { colorVariant = properties["fillUnoccludedColor"]; if (colorVariant.isValid()) { bool isValid; - auto color = xColorFromVariant(colorVariant, isValid); + auto color = vec3FromVariant(colorVariant, isValid); if (isValid) { _style._fillUnoccluded.color = toGlm(color); } @@ -445,7 +445,7 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { colorVariant = properties["fillOccludedColor"]; if (colorVariant.isValid()) { bool isValid; - auto color = xColorFromVariant(colorVariant, isValid); + auto color = vec3FromVariant(colorVariant, isValid); if (isValid) { _style._fillOccluded.color = toGlm(color); } @@ -482,10 +482,10 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { /**jsdoc * @typedef {object} Selection.HighlightStyle - * @property {Color} outlineUnoccludedColor - Color of the specified highlight region. - * @property {Color} outlineOccludedColor - "" - * @property {Color} fillUnoccludedColor- "" - * @property {Color} fillOccludedColor- "" + * @property {Vec3Color} outlineUnoccludedColor - Color of the specified highlight region. + * @property {Vec3Color} outlineOccludedColor - "" + * @property {Vec3Color} fillUnoccludedColor- "" + * @property {Vec3Color} fillOccludedColor- "" * @property {number} outlineUnoccludedAlpha - Alpha value ranging from 0.0 (not visible) to 1.0 * (fully opaque) for the specified highlight region. * @property {number} outlineOccludedAlpha - "" @@ -497,10 +497,11 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { QVariantMap SelectionHighlightStyle::toVariantMap() const { QVariantMap properties; - properties["outlineUnoccludedColor"] = xColorToVariant(xColorFromGlm(_style._outlineUnoccluded.color)); - properties["outlineOccludedColor"] = xColorToVariant(xColorFromGlm(_style._outlineOccluded.color)); - properties["fillUnoccludedColor"] = xColorToVariant(xColorFromGlm(_style._fillUnoccluded.color)); - properties["fillOccludedColor"] = xColorToVariant(xColorFromGlm(_style._fillOccluded.color)); + const float MAX_COLOR = 255.0f; + properties["outlineUnoccludedColor"] = vec3ToVariant(_style._outlineUnoccluded.color * MAX_COLOR); + properties["outlineOccludedColor"] = vec3ToVariant(_style._outlineOccluded.color * MAX_COLOR); + properties["fillUnoccludedColor"] = vec3ToVariant(_style._fillUnoccluded.color * MAX_COLOR); + properties["fillOccludedColor"] = vec3ToVariant(_style._fillOccluded.color * MAX_COLOR); properties["outlineUnoccludedAlpha"] = _style._outlineUnoccluded.alpha; properties["outlineOccludedAlpha"] = _style._outlineOccluded.alpha; diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 8b04f17269..f54f1427e8 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -237,20 +237,15 @@ void Circle3DOverlay::render(RenderArgs* args) { angle += tickMarkAngle; } } - - xColor majorColorX = getMajorTickMarksColor(); - glm::vec4 majorColor(majorColorX.red / MAX_COLOR, majorColorX.green / MAX_COLOR, majorColorX.blue / MAX_COLOR, alpha); - + + glm::vec4 majorColor(toGlm(getMajorTickMarksColor()), alpha); geometryCache->updateVertices(_majorTicksVerticesID, majorPoints, majorColor); - - xColor minorColorX = getMinorTickMarksColor(); - glm::vec4 minorColor(minorColorX.red / MAX_COLOR, minorColorX.green / MAX_COLOR, minorColorX.blue / MAX_COLOR, alpha); - + glm::vec4 minorColor(toGlm(getMinorTickMarksColor()), alpha); geometryCache->updateVertices(_minorTicksVerticesID, minorPoints, minorColor); } - + geometryCache->renderVertices(batch, gpu::LINES, _majorTicksVerticesID); - + geometryCache->renderVertices(batch, gpu::LINES, _minorTicksVerticesID); } } @@ -271,8 +266,8 @@ template T fromVariant(const QVariant& v, bool& valid) { return qvariant_cast(v); } -template<> xColor fromVariant(const QVariant& v, bool& valid) { - return xColorFromVariant(v, valid); +template<> ScriptVec3UChar fromVariant(const QVariant& v, bool& valid) { + return vec3FromVariant(v, valid); } template @@ -335,11 +330,11 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { _dirty |= updateIfValid(properties, "outerStartAlpha", _outerStartAlpha); _dirty |= updateIfValid(properties, "outerEndAlpha", _outerEndAlpha); - _dirty |= updateIfValid(properties, "color", { _innerStartColor, _innerEndColor, _outerStartColor, _outerEndColor }); - _dirty |= updateIfValid(properties, "startColor", { _innerStartColor, _outerStartColor } ); - _dirty |= updateIfValid(properties, "endColor", { _innerEndColor, _outerEndColor } ); - _dirty |= updateIfValid(properties, "innerColor", { _innerStartColor, _innerEndColor } ); - _dirty |= updateIfValid(properties, "outerColor", { _outerStartColor, _outerEndColor } ); + _dirty |= updateIfValid(properties, "color", { _innerStartColor, _innerEndColor, _outerStartColor, _outerEndColor }); + _dirty |= updateIfValid(properties, "startColor", { _innerStartColor, _outerStartColor } ); + _dirty |= updateIfValid(properties, "endColor", { _innerEndColor, _outerEndColor } ); + _dirty |= updateIfValid(properties, "innerColor", { _innerStartColor, _innerEndColor } ); + _dirty |= updateIfValid(properties, "outerColor", { _outerStartColor, _outerEndColor } ); _dirty |= updateIfValid(properties, "innerStartColor", _innerStartColor); _dirty |= updateIfValid(properties, "innerEndColor", _innerEndColor); _dirty |= updateIfValid(properties, "outerStartColor", _outerStartColor); @@ -413,20 +408,20 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { * @property {number} endAt=360 - The counter-clockwise angle from the overlay's x-axis that drawing ends at, in degrees. * @property {number} outerRadius=1 - The outer radius of the overlay, in meters. Synonym: radius. * @property {number} innerRadius=0 - The inner radius of the overlay, in meters. - * @property {Color} color=255,255,255 - The color of the overlay. Setting this value also sets the values of + * @property {Vec3Color} color=255,255,255 - The color of the overlay. Setting this value also sets the values of * innerStartColor, innerEndColor, outerStartColor, and outerEndColor. - * @property {Color} startColor - Sets the values of innerStartColor and outerStartColor. + * @property {Vec3Color} startColor - Sets the values of innerStartColor and outerStartColor. * Write-only. - * @property {Color} endColor - Sets the values of innerEndColor and outerEndColor. + * @property {Vec3Color} endColor - Sets the values of innerEndColor and outerEndColor. * Write-only. - * @property {Color} innerColor - Sets the values of innerStartColor and innerEndColor. + * @property {Vec3Color} innerColor - Sets the values of innerStartColor and innerEndColor. * Write-only. - * @property {Color} outerColor - Sets the values of outerStartColor and outerEndColor. + * @property {Vec3Color} outerColor - Sets the values of outerStartColor and outerEndColor. * Write-only. - * @property {Color} innerStartcolor - The color at the inner start point of the overlay. - * @property {Color} innerEndColor - The color at the inner end point of the overlay. - * @property {Color} outerStartColor - The color at the outer start point of the overlay. - * @property {Color} outerEndColor - The color at the outer end point of the overlay. + * @property {Vec3Color} innerStartcolor - The color at the inner start point of the overlay. + * @property {Vec3Color} innerEndColor - The color at the inner end point of the overlay. + * @property {Vec3Color} outerStartColor - The color at the outer start point of the overlay. + * @property {Vec3Color} outerEndColor - The color at the outer end point of the overlay. * @property {number} alpha=0.5 - The opacity of the overlay, 0.0 - 1.0. Setting this value also sets * the values of innerStartAlpha, innerEndAlpha, outerStartAlpha, and * outerEndAlpha. Synonym: Alpha; write-only. @@ -450,8 +445,8 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { * outwards from the inner radius; a negative value draws tick marks inwards from the outer radius. * @property {number} minorTickMarksLength=0 - The length of the minor tick marks, in meters. A positive value draws tick marks * outwards from the inner radius; a negative value draws tick marks inwards from the outer radius. - * @property {Color} majorTickMarksColor=0,0,0 - The color of the major tick marks. - * @property {Color} minorTickMarksColor=0,0,0 - The color of the minor tick marks. + * @property {Vec3Color} majorTickMarksColor=0,0,0 - The color of the major tick marks. + * @property {Vec3Color} minorTickMarksColor=0,0,0 - The color of the minor tick marks. */ QVariant Circle3DOverlay::getProperty(const QString& property) { if (property == "startAt") { @@ -470,16 +465,16 @@ QVariant Circle3DOverlay::getProperty(const QString& property) { return _innerRadius; } if (property == "innerStartColor") { - return xColorToVariant(_innerStartColor); + return vec3ToVariant(_innerStartColor.toGlm()); } if (property == "innerEndColor") { - return xColorToVariant(_innerEndColor); + return vec3ToVariant(_innerEndColor.toGlm()); } if (property == "outerStartColor") { - return xColorToVariant(_outerStartColor); + return vec3ToVariant(_outerStartColor.toGlm()); } if (property == "outerEndColor") { - return xColorToVariant(_outerEndColor); + return vec3ToVariant(_outerEndColor.toGlm()); } if (property == "innerStartAlpha") { return _innerStartAlpha; @@ -509,10 +504,10 @@ QVariant Circle3DOverlay::getProperty(const QString& property) { return _minorTickMarksLength; } if (property == "majorTickMarksColor") { - return xColorToVariant(_majorTickMarksColor); + return vec3ToVariant(_majorTickMarksColor.toGlm()); } if (property == "minorTickMarksColor") { - return xColorToVariant(_minorTickMarksColor); + return vec3ToVariant(_minorTickMarksColor.toGlm()); } return Planar3DOverlay::getProperty(property); diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index 0dc0f8b138..31f496f90a 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -39,8 +39,8 @@ public: float getMinorTickMarksAngle() const { return _minorTickMarksAngle; } float getMajorTickMarksLength() const { return _majorTickMarksLength; } float getMinorTickMarksLength() const { return _minorTickMarksLength; } - xColor getMajorTickMarksColor() const { return _majorTickMarksColor; } - xColor getMinorTickMarksColor() const { return _minorTickMarksColor; } + ScriptVec3UChar getMajorTickMarksColor() const { return _majorTickMarksColor; } + ScriptVec3UChar getMinorTickMarksColor() const { return _minorTickMarksColor; } void setStartAt(float value) { _startAt = value; } void setEndAt(float value) { _endAt = value; } @@ -51,8 +51,8 @@ public: void setMinorTickMarksAngle(float value) { _minorTickMarksAngle = value; } void setMajorTickMarksLength(float value) { _majorTickMarksLength = value; } void setMinorTickMarksLength(float value) { _minorTickMarksLength = value; } - void setMajorTickMarksColor(const xColor& value) { _majorTickMarksColor = value; } - void setMinorTickMarksColor(const xColor& value) { _minorTickMarksColor = value; } + void setMajorTickMarksColor(const ScriptVec3UChar& value) { _majorTickMarksColor = value; } + void setMinorTickMarksColor(const ScriptVec3UChar& value) { _minorTickMarksColor = value; } virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal, bool precisionPicking = false) override; @@ -65,10 +65,10 @@ protected: float _outerRadius { 1 }; float _innerRadius { 0 }; - xColor _innerStartColor { DEFAULT_OVERLAY_COLOR }; - xColor _innerEndColor { DEFAULT_OVERLAY_COLOR }; - xColor _outerStartColor { DEFAULT_OVERLAY_COLOR }; - xColor _outerEndColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _innerStartColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _innerEndColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _outerStartColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _outerEndColor { DEFAULT_OVERLAY_COLOR }; float _innerStartAlpha { DEFAULT_ALPHA }; float _innerEndAlpha { DEFAULT_ALPHA }; float _outerStartAlpha { DEFAULT_ALPHA }; @@ -79,8 +79,8 @@ protected: float _minorTickMarksAngle { 0 }; float _majorTickMarksLength { 0 }; float _minorTickMarksLength { 0 }; - xColor _majorTickMarksColor { DEFAULT_OVERLAY_COLOR }; - xColor _minorTickMarksColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _majorTickMarksColor { DEFAULT_OVERLAY_COLOR }; + ScriptVec3UChar _minorTickMarksColor { DEFAULT_OVERLAY_COLOR }; gpu::Primitive _solidPrimitive { gpu::TRIANGLE_FAN }; int _quadVerticesID { 0 }; int _lineVerticesID { 0 }; diff --git a/interface/src/ui/overlays/ContextOverlayInterface.cpp b/interface/src/ui/overlays/ContextOverlayInterface.cpp index 139d76a966..52aaa7f64c 100644 --- a/interface/src/ui/overlays/ContextOverlayInterface.cpp +++ b/interface/src/ui/overlays/ContextOverlayInterface.cpp @@ -83,7 +83,7 @@ ContextOverlayInterface::ContextOverlayInterface() { _challengeOwnershipTimeoutTimer.setSingleShot(true); } -static const xColor CONTEXT_OVERLAY_COLOR = { 255, 255, 255 }; +static const ScriptVec3UChar CONTEXT_OVERLAY_COLOR = { 255, 255, 255 }; static const float CONTEXT_OVERLAY_INSIDE_DISTANCE = 1.0f; // in meters static const float CONTEXT_OVERLAY_SIZE = 0.09f; // in meters, same x and y dims static const float CONTEXT_OVERLAY_OFFSET_DISTANCE = 0.1f; diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index c98d9330df..85f4360d49 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -49,11 +49,8 @@ void Cube3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - xColor color = getColor(); - const float MAX_COLOR = 255.0f; - glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); - - + ScriptVec3UChar color = getColor(); + glm::vec4 cubeColor(toGlm(color), alpha); auto batch = args->_batch; if (batch) { @@ -132,7 +129,7 @@ void Cube3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.CubeProperties * * @property {string} type=cube - Has the value "cube". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 621c19944b..ec3efe1155 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -60,8 +60,8 @@ void Grid3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; float alpha = getAlpha(); - xColor color = getColor(); - glm::vec4 gridColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + ScriptVec3UChar color = getColor(); + glm::vec4 gridColor(toGlm(color), alpha); auto batch = args->_batch; @@ -117,7 +117,7 @@ void Grid3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.GridProperties * * @property {string} type=grid - Has the value "grid". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index d901f20c20..f9a83ac21f 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -107,17 +107,16 @@ void Image3DOverlay::render(RenderArgs* args) { glm::vec2 texCoordBottomRight((fromImage.x() + fromImage.width() - 0.5f) / imageWidth, (fromImage.y() + fromImage.height() - 0.5f) / imageHeight); - const float MAX_COLOR = 255.0f; - xColor color = getColor(); float alpha = getAlpha(); + ScriptVec3UChar color = getColor(); + glm::vec4 imageColor(toGlm(color), alpha); batch->setModelTransform(getRenderTransform()); batch->setResourceTexture(0, _texture->getGPUTexture()); DependencyManager::get()->renderQuad( *batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, - glm::vec4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha), - _geometryId + imageColor, _geometryId ); batch->setResourceTexture(0, nullptr); // restore default white color after me @@ -188,7 +187,7 @@ void Image3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Image3DProperties * * @property {string} type=image3d - Has the value "image3d". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 19f32511f6..3c04de8568 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -35,7 +35,7 @@ QUrl const ImageOverlay::URL(QString("hifi/overlays/ImageOverlay.qml")); * Write-only. * @property {Vec2} subImage=0,0 - Integer coordinates of the top left pixel to start using image content from. * Write-only. - * @property {Color} color=0,0,0 - The color to apply over the top of the image to colorize it. Write-only. + * @property {Vec3Color} color=0,0,0 - The color to apply over the top of the image to colorize it. Write-only. * @property {number} alpha=0.0 - The opacity of the color applied over the top of the image, 0.0 - * 1.0. Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 627b6d6577..e12736b280 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -128,9 +128,8 @@ void Line3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - xColor color = getColor(); - const float MAX_COLOR = 255.0f; - glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + ScriptVec3UChar color = getColor(); + glm::vec4 colorv4(toGlm(color), alpha); auto batch = args->_batch; if (batch) { batch->setModelTransform(Transform()); @@ -260,7 +259,7 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { * @typedef {object} Overlays.Line3DProperties * * @property {string} type=line3d - Has the value "line3d". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 2ffef6a233..ca0ed7282b 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -345,7 +345,7 @@ vectorType ModelOverlay::mapJoints(mapFunction function) const { * @typedef {object} Overlays.ModelProperties * * @property {string} type=sphere - Has the value "model". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index faa15ee2b4..6f46fc7dde 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -15,7 +15,7 @@ #include "Application.h" -const xColor Overlay::DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; +const ScriptVec3UChar Overlay::DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; const float Overlay::DEFAULT_ALPHA = 0.7f; Overlay::Overlay() : @@ -57,7 +57,7 @@ Overlay::~Overlay() { void Overlay::setProperties(const QVariantMap& properties) { bool valid; - auto color = xColorFromVariant(properties["color"], valid); + auto color = vec3FromVariant(properties["color"], valid); if (valid) { _color = color; } @@ -95,7 +95,7 @@ void Overlay::setProperties(const QVariantMap& properties) { // JSDoc for copying to @typedefs of overlay types that inherit Overlay. /**jsdoc * @property {string} type=TODO - Has the value "TODO". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. @@ -116,7 +116,7 @@ QVariant Overlay::getProperty(const QString& property) { return QVariant(getType()); } if (property == "color") { - return xColorToVariant(_color); + return vec3ToVariant(_color.toGlm()); } if (property == "alpha") { return _alpha; @@ -143,21 +143,21 @@ QVariant Overlay::getProperty(const QString& property) { return QVariant(); } -xColor Overlay::getColor() { +ScriptVec3UChar Overlay::getColor() { if (_colorPulse == 0.0f) { return _color; } float pulseLevel = updatePulse(); - xColor result = _color; + ScriptVec3UChar result = _color; if (_colorPulse < 0.0f) { - result.red *= (1.0f - pulseLevel); - result.green *= (1.0f - pulseLevel); - result.blue *= (1.0f - pulseLevel); + result.x *= (1.0f - pulseLevel); + result.y *= (1.0f - pulseLevel); + result.z *= (1.0f - pulseLevel); } else { - result.red *= pulseLevel; - result.green *= pulseLevel; - result.blue *= pulseLevel; + result.x *= pulseLevel; + result.y *= pulseLevel; + result.z *= pulseLevel; } return result; } diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 45fc77a452..8b9118cecd 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -11,8 +11,6 @@ #ifndef hifi_Overlay_h #define hifi_Overlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include // for xColor #include class OverlayID : public QUuid { @@ -59,7 +57,7 @@ public: virtual bool isTransparent() { return getAlphaPulse() != 0.0f || getAlpha() != 1.0f; }; virtual bool getIsVisibleInSecondaryCamera() const { return false; } - xColor getColor(); + ScriptVec3UChar getColor(); float getAlpha(); float getPulseMax() const { return _pulseMax; } @@ -73,7 +71,7 @@ public: // setters virtual void setVisible(bool visible) { _visible = visible; } void setDrawHUDLayer(bool drawHUDLayer); - void setColor(const xColor& color) { _color = color; } + void setColor(const ScriptVec3UChar& color) { _color = color; } void setAlpha(float alpha) { _alpha = alpha; } void setPulseMax(float value) { _pulseMax = value; } @@ -115,12 +113,12 @@ protected: float _alphaPulse; // ratio of the pulse to the alpha float _colorPulse; // ratio of the pulse to the color - xColor _color; + ScriptVec3UChar _color; bool _visible; // should the overlay be drawn at all unsigned int _stackOrder { 0 }; - static const xColor DEFAULT_OVERLAY_COLOR; + static const ScriptVec3UChar DEFAULT_OVERLAY_COLOR; static const float DEFAULT_ALPHA; std::unordered_map _materials; diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 54d29df516..bce90c60c9 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -51,9 +51,8 @@ void Rectangle3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - xColor color = getColor(); - const float MAX_COLOR = 255.0f; - glm::vec4 rectangleColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + ScriptVec3UChar color = getColor(); + glm::vec4 rectangleColor(toGlm(color), alpha); auto batch = args->_batch; if (batch) { @@ -112,7 +111,7 @@ const render::ShapeKey Rectangle3DOverlay::getShapeKey() { * @typedef {object} Overlays.Rectangle3DProperties * * @property {string} type=rectangle3d - Has the value "rectangle3d". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/RectangleOverlay.cpp b/interface/src/ui/overlays/RectangleOverlay.cpp index af37a4ac02..356457a50f 100644 --- a/interface/src/ui/overlays/RectangleOverlay.cpp +++ b/interface/src/ui/overlays/RectangleOverlay.cpp @@ -22,12 +22,12 @@ QUrl const RectangleOverlay::URL(QString("hifi/overlays/RectangleOverlay.qml")); * @property {number} width - Integer width of the rectangle = bounds.width. Write-only. * @property {number} height - Integer height of the rectangle = bounds.height. Write-only. * - * @property {Color} color=0,0,0 - The color of the overlay. Write-only. + * @property {Vec3Color} color=0,0,0 - The color of the overlay. Write-only. * @property {number} alpha=1.0 - The opacity of the overlay, 0.0 - 1.0. Write-only. * @property {number} borderWidth=1 - Integer width of the border, in pixels. The border is drawn within the rectangle's bounds. * It is not drawn unless either borderColor or borderAlpha are specified. Write-only. * @property {number} radius=0 - Integer corner radius, in pixels. Write-only. - * @property {Color} borderColor=0,0,0 - The color of the border. Write-only. + * @property {Vec3Color} borderColor=0,0,0 - The color of the border. Write-only. * @property {number} borderAlpha=1.0 - The opacity of the border, 0.0 - 1.0. * Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index c27faf6f0f..9a955ad956 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -30,9 +30,8 @@ void Shape3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - xColor color = getColor(); - const float MAX_COLOR = 255.0f; - glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + ScriptVec3UChar color = getColor(); + glm::vec4 shapeColor(toGlm(color), alpha); auto batch = args->_batch; if (batch) { @@ -44,9 +43,9 @@ void Shape3DOverlay::render(RenderArgs* args) { batch->setModelTransform(getRenderTransform()); if (_isSolid) { - geometryCache->renderSolidShapeInstance(args, *batch, _shape, cubeColor, shapePipeline); + geometryCache->renderSolidShapeInstance(args, *batch, _shape, shapeColor, shapePipeline); } else { - geometryCache->renderWireShapeInstance(args, *batch, _shape, cubeColor, shapePipeline); + geometryCache->renderWireShapeInstance(args, *batch, _shape, shapeColor, shapePipeline); } } } @@ -132,7 +131,7 @@ void Shape3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.ShapeProperties * * @property {string} type=shape - Has the value "shape". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 4743e1ed3a..0e30fa7032 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -32,7 +32,7 @@ Sphere3DOverlay::Sphere3DOverlay(const Sphere3DOverlay* Sphere3DOverlay) : * @typedef {object} Overlays.SphereProperties * * @property {string} type=sphere - Has the value "sphere". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. @@ -78,9 +78,8 @@ void Sphere3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - xColor color = getColor(); - const float MAX_COLOR = 255.0f; - glm::vec4 sphereColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + ScriptVec3UChar color = getColor(); + glm::vec4 sphereColor(toGlm(color), alpha); auto batch = args->_batch; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index b128ce7df7..1c84affa56 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -64,21 +64,21 @@ void Text3DOverlay::setText(const QString& text) { _text = text; } -xColor Text3DOverlay::getBackgroundColor() { +ScriptVec3UChar Text3DOverlay::getBackgroundColor() { if (_colorPulse == 0.0f) { return _backgroundColor; } float pulseLevel = updatePulse(); - xColor result = _backgroundColor; + ScriptVec3UChar result = _backgroundColor; if (_colorPulse < 0.0f) { - result.red *= (1.0f - pulseLevel); - result.green *= (1.0f - pulseLevel); - result.blue *= (1.0f - pulseLevel); + result.x *= (1.0f - pulseLevel); + result.y *= (1.0f - pulseLevel); + result.z *= (1.0f - pulseLevel); } else { - result.red *= pulseLevel; - result.green *= pulseLevel; - result.blue *= pulseLevel; + result.x *= pulseLevel; + result.y *= pulseLevel; + result.z *= pulseLevel; } return result; } @@ -94,10 +94,8 @@ void Text3DOverlay::render(RenderArgs* args) { auto transform = getRenderTransform(); batch.setModelTransform(transform); - const float MAX_COLOR = 255.0f; - xColor backgroundColor = getBackgroundColor(); - glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, - backgroundColor.blue / MAX_COLOR, getBackgroundAlpha()); + ScriptVec3UChar backgroundColor = getBackgroundColor(); + glm::vec4 quadColor(toGlm(backgroundColor), getBackgroundAlpha()); glm::vec2 dimensions = getDimensions(); glm::vec2 halfDimensions = dimensions * 0.5f; @@ -123,8 +121,7 @@ void Text3DOverlay::render(RenderArgs* args) { transform.setScale(scaleFactor); batch.setModelTransform(transform); - glm::vec4 textColor = { _color.red / MAX_COLOR, _color.green / MAX_COLOR, - _color.blue / MAX_COLOR, getTextAlpha() }; + glm::vec4 textColor = { toGlm(_color), getTextAlpha() }; // FIXME: Factor out textRenderer so that Text3DOverlay overlay parts can be grouped by pipeline for a gpu performance increase. _textRenderer->draw(batch, 0, 0, getText(), textColor, glm::vec2(-1.0f), true); @@ -165,7 +162,7 @@ void Text3DOverlay::setProperties(const QVariantMap& properties) { bool valid; auto backgroundColor = properties["backgroundColor"]; if (backgroundColor.isValid()) { - auto color = xColorFromVariant(backgroundColor, valid); + auto color = vec3FromVariant(backgroundColor, valid); if (valid) { _backgroundColor = color; } @@ -201,7 +198,7 @@ void Text3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Text3DProperties * * @property {string} type=text3d - Has the value "text3d". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. @@ -245,7 +242,7 @@ void Text3DOverlay::setProperties(const QVariantMap& properties) { * * @property {string} text="" - The text to display. Text does not automatically wrap; use \n for a line break. * @property {number} textAlpha=1 - The text alpha value. - * @property {Color} backgroundColor=0,0,0 - The background color. + * @property {Vec3Color} backgroundColor=0,0,0 - The background color. * @property {number} backgroundAlpha=0.7 - The background alpha value. * @property {number} lineHeight=1 - The height of a line of text in meters. * @property {number} leftMargin=0.1 - The left margin, in meters. @@ -262,7 +259,7 @@ QVariant Text3DOverlay::getProperty(const QString& property) { return _textAlpha; } if (property == "backgroundColor") { - return xColorToVariant(_backgroundColor); + return vec3ToVariant(_backgroundColor.toGlm()); } if (property == "backgroundAlpha") { return Billboard3DOverlay::getProperty("alpha"); diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 21163101d0..5c3c8e7381 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -39,7 +39,7 @@ public: float getTopMargin() const { return _topMargin; } float getRightMargin() const { return _rightMargin; } float getBottomMargin() const { return _bottomMargin; } - xColor getBackgroundColor(); + ScriptVec3UChar getBackgroundColor(); float getTextAlpha() { return _textAlpha; } float getBackgroundAlpha() { return getAlpha(); } bool isTransparent() override { return Overlay::isTransparent() || _textAlpha < 1.0f; } @@ -65,7 +65,7 @@ private: QString _text; mutable QMutex _mutex; // used to make get/setText threadsafe, mutable so can be used in const functions - xColor _backgroundColor = xColor { 0, 0, 0 }; + ScriptVec3UChar _backgroundColor { 0, 0, 0 }; float _textAlpha { 1.0f }; float _lineHeight { 1.0f }; float _leftMargin { 0.1f }; diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index e7641ab2c2..5e7f648320 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -48,9 +48,9 @@ QUrl const TextOverlay::URL(QString("hifi/overlays/TextOverlay.qml")); * is clipped to the bounds. Write-only. * @property {number} font.size=18 - The size of the text, in pixels. Write-only. * @property {number} lineHeight=18 - The height of a line of text, in pixels. Write-only. - * @property {Color} color=255,255,255 - The color of the text. Synonym: textColor. Write-only. + * @property {Vec3Color} color=255,255,255 - The color of the text. Synonym: textColor. Write-only. * @property {number} alpha=1.0 - The opacity of the overlay, 0.0 - 1.0. Write-only. - * @property {Color} backgroundColor=0,0,0 - The color of the background rectangle. Write-only. + * @property {Vec3Color} backgroundColor=0,0,0 - The color of the background rectangle. Write-only. * @property {number} backgroundAlpha=0.7 - The opacity of the background rectangle. Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. * Write-only. diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 148fe2d49d..1f5dba177d 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -513,7 +513,7 @@ void Web3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Web3DProperties * * @property {string} type=web3d - Has the value "web3d". Read-only. - * @property {Color} color=255,255,255 - The color of the overlay. + * @property {Vec3Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 4ea293a3da..d746ec1ea9 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -41,7 +41,7 @@ void LightEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPoint float largestDiameter = glm::compMax(dimensions); light->setMaximumRadius(largestDiameter / 2.0f); - light->setColor(toGlm(entity->getXColor())); + light->setColor(toGlm(entity->getColor())); float intensity = entity->getIntensity();//* entity->getFadingRatio(); light->setIntensity(intensity); diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 9ac7e9921f..6a472cab1e 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -37,7 +37,7 @@ void LineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointe if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { _lineVerticesID = geometryCache->allocateID(); } - glm::vec4 lineColor(toGlm(entity->getXColor()), entity->getLocalRenderAlpha()); + glm::vec4 lineColor(toGlm(entity->getColor()), entity->getLocalRenderAlpha()); geometryCache->updateVertices(_lineVerticesID, _linePoints, lineColor); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index ae98ccb07a..f8ee27615e 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -149,7 +149,7 @@ void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { PolyLineUniforms uniforms; - uniforms.color = toGlm(entity->getXColor()); + uniforms.color = toGlm(entity->getColor()); memcpy(&_uniformBuffer.edit(), &uniforms, sizeof(PolyLineUniforms)); auto pointsChanged = entity->pointsChanged(); auto strokeWidthsChanged = entity->strokeWidthsChanged(); @@ -175,7 +175,7 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo } if (strokeColorsChanged) { _lastStrokeColors = entity->getStrokeColors(); - _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getXColor()) }); + _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getColor()) }); } if (pointsChanged || strokeWidthsChanged || normalsChanged || strokeColorsChanged) { _empty = std::min(_lastPoints.size(), std::min(_lastNormals.size(), _lastStrokeWidths.size())) < 2; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index ce4b6d9175..b7c94ed834 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -47,11 +47,11 @@ bool TextEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPoint return true; } - if (_textColor != toGlm(entity->getTextColorX())) { + if (_textColor != toGlm(entity->getTextColor())) { return true; } - if (_backgroundColor != toGlm(entity->getBackgroundColorX())) { + if (_backgroundColor != toGlm(entity->getBackgroundColor())) { return true; } @@ -77,8 +77,8 @@ void TextEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scen } void TextEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { - _textColor = toGlm(entity->getTextColorX()); - _backgroundColor = toGlm(entity->getBackgroundColorX()); + _textColor = toGlm(entity->getTextColor()); + _backgroundColor = toGlm(entity->getBackgroundColor()); _faceCamera = entity->getFaceCamera(); _lineHeight = entity->getLineHeight(); _text = entity->getText(); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 7cd7849ef9..137f256de2 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -368,10 +368,10 @@ void ZoneEntityRenderer::updateHazeFromEntity(const TypedEntityPointer& entity) haze->setAltitudeBased(_hazeProperties.getHazeAltitudeEffect()); haze->setHazeRangeFactor(graphics::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeRange())); - xColor hazeColor = _hazeProperties.getHazeColor(); - haze->setHazeColor(glm::vec3(hazeColor.red / 255.0, hazeColor.green / 255.0, hazeColor.blue / 255.0)); - xColor hazeGlareColor = _hazeProperties.getHazeGlareColor(); - haze->setHazeGlareColor(glm::vec3(hazeGlareColor.red / 255.0, hazeGlareColor.green / 255.0, hazeGlareColor.blue / 255.0)); + ScriptVec3UChar hazeColor = _hazeProperties.getHazeColor(); + haze->setHazeColor(toGlm(hazeColor)); + ScriptVec3UChar hazeGlareColor = _hazeProperties.getHazeGlareColor(); + haze->setHazeGlareColor(toGlm(hazeGlareColor)); haze->setHazeEnableGlare(_hazeProperties.getHazeEnableGlare()); haze->setHazeGlareBlend(graphics::Haze::convertGlareAngleToPower(_hazeProperties.getHazeGlareAngle())); @@ -392,7 +392,7 @@ void ZoneEntityRenderer::updateKeyBackgroundFromEntity(const TypedEntityPointer& setSkyboxMode((ComponentMode)entity->getSkyboxMode()); editBackground(); - setSkyboxColor(_skyboxProperties.getColorVec3()); + setSkyboxColor(toGlm(_skyboxProperties.getColor())); setProceduralUserData(entity->getUserData()); setSkyboxURL(_skyboxProperties.getURL()); } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 716e33b0c8..1f79afcd29 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -653,7 +653,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-Light * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Entity surface outside these dimensions are not lit * by the light. - * @property {Color} color=255,255,255 - The color of the light emitted. + * @property {Vec3Color} color=255,255,255 - The color of the light emitted. * @property {number} intensity=1 - The brightness of the light. * @property {number} falloffRadius=0.1 - The distance from the light's center at which intensity is reduced by 25%. * @property {boolean} isSpotlight=false - If true then the light is directional, emitting along the entity's @@ -686,7 +686,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * position. A maximum of 70 points can be specified. The property's value is set only if all the linePoints * lie within the entity's dimensions. * @property {number} lineWidth=2 - Currently not used. - * @property {Color} color=255,255,255 - The color of the line. + * @property {Vec3Color} color=255,255,255 - The color of the line. * @example Draw lines in a "V". * var entity = Entities.addEntity({ * type: "Line", @@ -767,7 +767,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. When adding an entity, if no dimensions * value is specified then the model is automatically sized to its * {@link Entities.EntityProperties|naturalDimensions}. - * @property {Color} color=255,255,255 - Currently not used. + * @property {Vec3Color} color=255,255,255 - Currently not used. * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx".
* Note: If the name ends with "default-image-model.fbx" then the entity is considered to be an "Image" * entity, in which case the textures property should be set per the example. @@ -892,12 +892,12 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * particleRadius value is used. * @property {number} radiusSpread=0 - The spread in radius that each particle is given. If particleRadius == 0.5 * and radiusSpread == 0.25, each particle will have a radius in the range 0.250.75. - * @property {Color} color=255,255,255 - The color of each particle at the middle of its life. - * @property {Color} colorStart=NAN,NAN,NAN - The color of each particle at the start of its life. If any of the values are NAN, the + * @property {Vec3Color} color=255,255,255 - The color of each particle at the middle of its life. + * @property {Vec3Color} colorStart=NAN,NAN,NAN - The color of each particle at the start of its life. If any of the values are NAN, the * color value is used. - * @property {Color} colorFinish=NAN,NAN,NAN - The color of each particle at the end of its life. If any of the values are NAN, the + * @property {Vec3Color} colorFinish=NAN,NAN,NAN - The color of each particle at the end of its life. If any of the values are NAN, the * color value is used. - * @property {Color} colorSpread=0,0,0 - The spread in color that each particle is given. If + * @property {Vec3Color} colorSpread=0,0,0 - The spread in color that each particle is given. If * color == {red: 100, green: 100, blue: 100} and colorSpread == * {red: 10, green: 25, blue: 50}, each particle will have an acceleration in the range {red: 90, green: 75, blue: 50} * – {red: 110, green: 125, blue: 150}. @@ -944,7 +944,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * order for the entity to render. * @property {number} lineWidth=2 - Currently not used. * @property {Vec3[]} strokeColors=[]] - Currently not used. - * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for + * @property {Vec3Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for * rendering. * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG * format. @@ -1033,7 +1033,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-Shape * @property {Entities.Shape} shape="Sphere" - The shape of the entity. * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. - * @property {Color} color=255,255,255 - The color of the entity. + * @property {Vec3Color} color=255,255,255 - The color of the entity. * @example Create a cylinder. * var shape = Entities.addEntity({ * type: "Shape", @@ -1061,8 +1061,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {string} text="" - The text to display on the face of the entity. Text wraps if necessary to fit. New lines can be * created using \n. Overflowing lines are not displayed. * @property {number} lineHeight=0.1 - The height of each line of text (thus determining the font size). - * @property {Color} textColor=255,255,255 - The color of the text. - * @property {Color} backgroundColor=0,0,0 - The color of the background rectangle. + * @property {Vec3Color} textColor=255,255,255 - The color of the text. + * @property {Vec3Color} backgroundColor=0,0,0 - The color of the background rectangle. * @property {boolean} faceCamera=false - If true, the entity is oriented to face each user's camera (i.e., it * differs for each user present). * @example Create a text entity. @@ -1523,8 +1523,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); - COPY_PROPERTY_FROM_QSCRIPTVALUE(color, xColor, setColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, xColor, setColorSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(color, ScriptVec3UChar, setColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, ScriptVec3UChar, setColorSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, ScriptVec3Float, setColorStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, ScriptVec3Float, setColorFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); @@ -1551,8 +1551,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData); COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); - COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, xColor, setTextColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, xColor, setBackgroundColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, ScriptVec3UChar, setTextColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, ScriptVec3UChar, setBackgroundColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, quint32, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); @@ -1882,198 +1882,198 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue static std::once_flag initMap; std::call_once(initMap, [](){ - ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); - ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); - ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, glm::quat); - ADD_PROPERTY_TO_MAP(PROP_DENSITY, Density, density, float); - ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_DAMPING, Damping, damping, float); - ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, Restitution, restitution, float); - ADD_PROPERTY_TO_MAP(PROP_FRICTION, Friction, friction, float); - ADD_PROPERTY_TO_MAP(PROP_LIFETIME, Lifetime, lifetime, float); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); - ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); - ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, xColor); - ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, xColor); - ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3); - ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3); - ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); - ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool); - ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); - ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); - ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, Collisionless, collisionless, bool); - ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, unused, ignoreForCollisions, unused); // legacy support - ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collisionMask, unused); - ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collidesWith, unused); - ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, collisionsWillMove, unused); // legacy support - ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, dynamic, unused); - ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool); - ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float); - ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float); - ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float); - ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float); - ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool); - ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString); - ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString); - ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); - ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); - ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); - ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, xColor); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, xColor); - ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); - ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); - ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float); - ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); - ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, EmitRate, emitRate, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat); - ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); - ADD_PROPERTY_TO_MAP(PROP_POLAR_START, EmitPolarStart, polarStart, float); - ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, EmitPolarFinish, polarFinish, float); - ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, EmitAzimuthStart, azimuthStart, float); - ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, EmitAzimuthFinish, azimuthFinish, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); + ADD_PROPERTY_TO_MAP(PROP_VISIBLE, visible); + ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, canCastShadow); + ADD_PROPERTY_TO_MAP(PROP_POSITION, position); + ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, dimensions); + ADD_PROPERTY_TO_MAP(PROP_ROTATION, rotation); + ADD_PROPERTY_TO_MAP(PROP_DENSITY, density); + ADD_PROPERTY_TO_MAP(PROP_VELOCITY, velocity); + ADD_PROPERTY_TO_MAP(PROP_GRAVITY, gravity); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, acceleration); + ADD_PROPERTY_TO_MAP(PROP_DAMPING, damping); + ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, restitution); + ADD_PROPERTY_TO_MAP(PROP_FRICTION, friction); + ADD_PROPERTY_TO_MAP(PROP_LIFETIME, lifetime); + ADD_PROPERTY_TO_MAP(PROP_SCRIPT, script); + ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); + ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, serverScripts); + ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, collisionSoundURL); + ADD_PROPERTY_TO_MAP(PROP_COLOR, color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, colorSpread); + ADD_PROPERTY_TO_MAP(PROP_COLOR_START, colorStart); + ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, colorFinish); + ADD_PROPERTY_TO_MAP(PROP_ALPHA, alpha); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, alphaSpread); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, alphaStart); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, alphaFinish); + ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail); + ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, modelURL); + ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, registrationPoint); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, angularVelocity); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, angularDamping); + ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, collisionless); + ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, ignoreForCollisions); // legacy support + ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, collisionMask); + ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, collidesWith); + ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, collisionsWillMove); // legacy support + ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, dynamic); + ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, isSpotlight); + ADD_PROPERTY_TO_MAP(PROP_INTENSITY, intensity); + ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, falloffRadius); + ADD_PROPERTY_TO_MAP(PROP_EXPONENT, exponent); + ADD_PROPERTY_TO_MAP(PROP_CUTOFF, cutoff); + ADD_PROPERTY_TO_MAP(PROP_LOCKED, locked); + ADD_PROPERTY_TO_MAP(PROP_TEXTURES, textures); + ADD_PROPERTY_TO_MAP(PROP_USER_DATA, userData); + ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, simulationOwner); + ADD_PROPERTY_TO_MAP(PROP_TEXT, text); + ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, lineHeight); + ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, textColor); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, backgroundColor); + ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, shapeType); + ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, maxParticles); + ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, lifespan); + ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, isEmitting); + ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, emitRate); + ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, emitSpeed); + ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, speedSpread); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, emitOrientation); + ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, emitDimensions); + ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, emitRadiusStart); + ADD_PROPERTY_TO_MAP(PROP_POLAR_START, polarStart); + ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, polarFinish); + ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, azimuthStart); + ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, azimuthFinish); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, emitAcceleration); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, accelerationSpread); + ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, particleRadius); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, radiusSpread); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, radiusStart); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, radiusFinish); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, MaterialURL, materialURL, QString); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16); - ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2Float); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2Float); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, materialURL); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, materialMappingMode); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, priority); + ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, parentMaterialName); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, materialMappingPos); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, materialMappingRot); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, materialData); - ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool); + ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); // Certifiable Properties - ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString); - ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); - ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); - ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); - ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32); - ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); - ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); + ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, itemName); + ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, itemDescription); + ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, itemCategories); + ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, itemArtist); + ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, itemLicense); + ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, limitedRun); + ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, marketplaceID); + ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, editionNumber); + ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); + ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, certificateID); + ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, keyLightColor); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, keyLightIntensity); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, keyLightDirection); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, keyLightCastShadows); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); - ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); - ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); - ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, LineWidth, lineWidth, float); - ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); - ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString); - ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString); - ADD_PROPERTY_TO_MAP(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); - ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); - ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector); - ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); - ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); - ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); - ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, voxelData); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle); + ADD_PROPERTY_TO_MAP(PROP_NAME, name); + ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, sourceUrl); + ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, lineWidth); + ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, linePoints); + ADD_PROPERTY_TO_MAP(PROP_HREF, href); + ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, description); + ADD_PROPERTY_TO_MAP(PROP_FACE_CAMERA, faceCamera); + ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, actionData); + ADD_PROPERTY_TO_MAP(PROP_NORMALS, normals); + ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, strokeColors); + ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, strokeWidths); + ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); + ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, xTextureURL); + ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, yTextureURL); + ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, zTextureURL); + ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, xNNeighborID); + ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, yNNeighborID); + ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, zNNeighborID); + ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, xPNeighborID); + ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); + ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); - ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid); - ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t); + ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, parentID); + ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, parentJointIndex); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, glm::quat); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, localPosition); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, localRotation); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, localVelocity); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, localDimensions); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); - ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, jointRotations); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, jointTranslations); + ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, relayParentJoints); - ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); + ADD_PROPERTY_TO_MAP(PROP_SHAPE, shape); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, animation, url); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, animation, fps); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, animation, currentFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, animation, running); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, animation, loop); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, animation, firstFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, animation, lastFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, animation, hold); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, animation, allowTranslation); - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url); + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, skybox, color); + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, skybox, url); - ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool); - ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool); - ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString); + ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, flyingAllowed); + ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, ghostingAllowed); + ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, filterURL); - ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, hazeMode); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, haze, hazeRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, haze, hazeColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, haze, hazeGlareColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, haze, hazeEnableGlare); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, haze, hazeGlareAngle); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, haze, hazeAltitudeEfect); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, haze, hazeCeiling); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, haze, hazeBaseRef); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, haze, hazeBackgroundBlend); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, haze, hazeAttenuateKeyLight); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, haze, hazeKeyLightRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, haze, hazeKeyLightAltitude); - ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, keyLightMode); + ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, ambientLightMode); + ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, skyboxMode); - ADD_PROPERTY_TO_MAP(PROP_DPI, DPI, dpi, uint16_t); + ADD_PROPERTY_TO_MAP(PROP_DPI, dpi); - ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float); - ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid); + ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, cloneable); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, cloneLifetime); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, cloneLimit); + ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, cloneDynamic); + ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); + ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, cloneOriginID); // FIXME - these are not yet handled - //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64); + //ADD_PROPERTY_TO_MAP(PROP_CREATED, created); }); @@ -2257,7 +2257,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy if (properties.getType() == EntityTypes::Light) { APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity()); APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius()); APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent()); @@ -2585,7 +2584,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, ScriptVec3Float, setAngularVelocity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); @@ -2610,8 +2609,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Text) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, xColor, setTextColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, xColor, setBackgroundColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, ScriptVec3UChar, setTextColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, ScriptVec3UChar, setBackgroundColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FACE_CAMERA, bool, setFaceCamera); } @@ -2632,7 +2631,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Light) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); @@ -2660,7 +2659,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_SPREAD, float, setRadiusSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, xColor, setColorSpread); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, ScriptVec3UChar, setColorSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, ScriptVec3Float, setColorStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index b03dcae841..ff08fb531d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -134,8 +134,8 @@ public: DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString, ENTITY_ITEM_DEFAULT_SCRIPT); DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP); DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL); - DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, xColor, ParticleEffectEntityItem::DEFAULT_XCOLOR); - DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, xColor, ParticleEffectEntityItem::DEFAULT_XCOLOR_SPREAD); + DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, ScriptVec3UChar, particle::DEFAULT_COLOR); + DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, ScriptVec3UChar, particle::DEFAULT_COLOR_SPREAD); DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); @@ -161,8 +161,8 @@ public: DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner()); DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString, TextEntityItem::DEFAULT_TEXT); DEFINE_PROPERTY(PROP_LINE_HEIGHT, LineHeight, lineHeight, float, TextEntityItem::DEFAULT_LINE_HEIGHT); - DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, xColor, TextEntityItem::DEFAULT_TEXT_COLOR); - DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, xColor, TextEntityItem::DEFAULT_BACKGROUND_COLOR); + DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, ScriptVec3UChar, TextEntityItem::DEFAULT_TEXT_COLOR); + DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, ScriptVec3UChar, TextEntityItem::DEFAULT_BACKGROUND_COLOR); DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES); DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN); @@ -287,7 +287,7 @@ public: std::array::const_iterator findComponent(const QString& mode); public: - float getMaxDimension() const { return glm::compMax(glm::vec3(_dimensions.x, _dimensions.y, _dimensions.z)); } + float getMaxDimension() const { return glm::compMax(_dimensions.toGlm()); } float getAge() const { return (float)(usecTimestampNow() - _created) / (float)USECS_PER_SECOND; } bool hasCreatedTime() const { return (_created != UNKNOWN_CREATED_TIME); } @@ -314,10 +314,10 @@ public: void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; } void markAllChanged(); - const glm::vec3& getNaturalDimensions() const { return glm::vec3(_naturalDimensions.x, _naturalDimensions.y, _naturalDimensions.z); } + const glm::vec3& getNaturalDimensions() const { return _naturalDimensions.toGlm(); } void setNaturalDimensions(const glm::vec3& value) { _naturalDimensions = value; } - const glm::vec3& getNaturalPosition() const { return glm::vec3(_naturalPosition.x, _naturalPosition.y, _naturalPosition.z); } + const glm::vec3& getNaturalPosition() const { return _naturalPosition.toGlm(); } void calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max); const QVariantMap& getTextureNames() const { return _textureNames; } @@ -426,7 +426,7 @@ void EntityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityProper // define these inline here so the macros work inline void EntityItemProperties::setPosition(const ScriptVec3Float& value) - { _position = glm::clamp(glm::vec3(value.x, value.y, value.z), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } + { _position = glm::clamp(value.toGlm(), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { debug << "EntityItemProperties[" << "\n"; diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 07dfcc4d23..09bee26040 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -103,7 +103,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec2Float& v) { return vec2FloatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3Float& v) { return vec3FloatToScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3UInt& v) { return vec3UIntToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3UChar& v) { return vec3UCharToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, float v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, int v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, bool v) { return QScriptValue(v); } @@ -112,7 +112,6 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, quint32 v) { return QSc inline QScriptValue convertScriptValue(QScriptEngine* e, quint64 v) { return QScriptValue((qsreal)v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QString& v) { return QScriptValue(v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const xColor& v) { return xColorToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::quat& v) { return quatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) { return v; } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } @@ -236,10 +235,10 @@ inline ScriptVec3Float ScriptVec3Float_convertFromScriptValue(const QScriptValue return vec3; } -inline ScriptVec3UInt ScriptVec3UInt_convertFromScriptValue(const QScriptValue& v, bool& isValid) { +inline ScriptVec3UChar ScriptVec3UChar_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - ScriptVec3UInt vec3; - vec3UIntFromScriptValue(v, vec3); + ScriptVec3UChar vec3; + vec3UCharFromScriptValue(v, vec3); return vec3; } @@ -293,31 +292,6 @@ inline glm::quat quat_convertFromScriptValue(const QScriptValue& v, bool& isVali return glm::quat(); } -inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid) { - xColor newValue { 255, 255, 255 }; - isValid = false; /// assume it can't be converted - QScriptValue r = v.property("red"); - QScriptValue g = v.property("green"); - QScriptValue b = v.property("blue"); - if (!r.isValid()) { - r = v.property("x"); - } - if (!g.isValid()) { - g = v.property("y"); - } - if (!b.isValid()) { - b = v.property("z"); - } - if (r.isValid() && g.isValid() && b.isValid()) { - newValue.red = r.toVariant().toInt(); - newValue.green = g.toVariant().toInt(); - newValue.blue = b.toVariant().toInt(); - isValid = true; - } - return newValue; -} - - #define COPY_PROPERTY_IF_CHANGED(P) \ { \ if (other._##P##Changed) { \ @@ -395,10 +369,10 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid T _##n; \ static T _static##N; -#define ADD_PROPERTY_TO_MAP(P, N, n, T) \ +#define ADD_PROPERTY_TO_MAP(P, n) \ _propertyStringsToEnums[#n] = P; -#define ADD_GROUP_PROPERTY_TO_MAP(P, G, g, N, n) \ +#define ADD_GROUP_PROPERTY_TO_MAP(P, g, n) \ _propertyStringsToEnums[#g "." #n] = P; #define DEFINE_CORE(N, n, T, V) \ diff --git a/libraries/entities/src/HazePropertyGroup.cpp b/libraries/entities/src/HazePropertyGroup.cpp index c15b28707c..e1b0e4e49a 100644 --- a/libraries/entities/src/HazePropertyGroup.cpp +++ b/libraries/entities/src/HazePropertyGroup.cpp @@ -36,8 +36,8 @@ void HazePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProp void HazePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeRange, float, setHazeRange); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, xColor, setHazeColor); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, xColor, setHazeGlareColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, ScriptVec3UChar, setHazeColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, ScriptVec3UChar, setHazeGlareColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeEnableGlare, bool, setHazeEnableGlare); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareAngle, float, setHazeGlareAngle); @@ -167,8 +167,8 @@ bool HazePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, xColor, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, xColor, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, ScriptVec3UChar, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, ScriptVec3UChar, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); @@ -343,8 +343,8 @@ int HazePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* dat const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, xColor, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, xColor, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, ScriptVec3UChar, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, ScriptVec3UChar, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index e992aefbf3..cb5cfec014 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -28,8 +28,8 @@ class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; static const float INITIAL_HAZE_RANGE{ 1000.0f }; -static const xColor initialHazeGlareColorXcolor{ 255, 229, 179 }; -static const xColor initialHazeColorXcolor{ 128, 154, 179 }; +static const ScriptVec3UChar initialHazeGlareColor { 255, 229, 179 }; +static const ScriptVec3UChar initialHazeColor { 128, 154, 179 }; static const float INITIAL_HAZE_GLARE_ANGLE{ 20.0f }; static const float INITIAL_HAZE_BASE_REFERENCE{ 0.0f }; @@ -48,10 +48,10 @@ static const float INITIAL_KEY_LIGHT_ALTITUDE{ 200.0f }; * * @property {number} hazeRange=1000 - The horizontal distance at which visibility is reduced to 95%; i.e., 95% of each pixel's * color is haze. - * @property {Color} hazeColor=128,154,179 - The color of the haze when looking away from the key light. + * @property {Vec3Color} hazeColor=128,154,179 - The color of the haze when looking away from the key light. * @property {boolean} hazeEnableGlare=false - If true then the haze is colored with glare from the key light; * hazeGlareColor and hazeGlareAngle are used. - * @property {Color} hazeGlareColor=255,299,179 - The color of the haze when looking towards the key light. + * @property {Vec3Color} hazeGlareColor=255,299,179 - The color of the haze when looking towards the key light. * @property {number} hazeGlareAngle=20 - The angle in degrees across the circle around the key light that the glare color and * haze color are blended 50/50. * @@ -118,8 +118,8 @@ public: // Range only parameters DEFINE_PROPERTY(PROP_HAZE_RANGE, HazeRange, hazeRange, float, INITIAL_HAZE_RANGE); - DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, xColor, initialHazeColorXcolor); - DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, xColor, initialHazeGlareColorXcolor); + DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, ScriptVec3UChar, initialHazeColor); + DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, ScriptVec3UChar, initialHazeGlareColor); DEFINE_PROPERTY(PROP_HAZE_ENABLE_GLARE, HazeEnableGlare, hazeEnableGlare, bool, false); DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_ANGLE, HazeGlareAngle, hazeGlareAngle, float, INITIAL_HAZE_GLARE_ANGLE); diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index 7a149a396e..0657d22073 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -17,7 +17,7 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -const xColor KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; +const ScriptVec3UChar KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_INTENSITY = 1.0f; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY = 0.5f; const glm::vec3 KeyLightPropertyGroup::DEFAULT_KEYLIGHT_DIRECTION = { 0.0f, -1.0f, 0.0f }; @@ -33,13 +33,13 @@ void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desired } void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, xColor, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, ScriptVec3UChar, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, intensity, float, setIntensity); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, ScriptVec3Float, setDirection); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, castShadows, bool, setCastShadows); // legacy property support - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, xColor, setColor, getColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, ScriptVec3UChar, setColor, getColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightIntensity, float, setIntensity, getIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, ScriptVec3Float, setDirection, getDirection); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightCastShadows, bool, setCastShadows, getCastShadows); @@ -99,7 +99,7 @@ bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFl bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); @@ -187,7 +187,7 @@ int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index 8ccd26c4d8..3972b71254 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -30,7 +30,7 @@ class ReadBitstreamToTreeParams; /**jsdoc * A key light is defined by the following properties. * @typedef {object} Entities.KeyLight - * @property {Color} color=255,255,255 - The color of the light. + * @property {Vec3Color} color=255,255,255 - The color of the light. * @property {number} intensity=1 - The intensity of the light. * @property {Vec3} direction=0,-1,0 - The direction the light is shining. * @property {boolean} castShadows=false - If true then shadows are cast. Shadows are cast by avatars, plus @@ -84,13 +84,13 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - static const xColor DEFAULT_KEYLIGHT_COLOR; + static const ScriptVec3UChar DEFAULT_KEYLIGHT_COLOR; static const float DEFAULT_KEYLIGHT_INTENSITY; static const float DEFAULT_KEYLIGHT_AMBIENT_INTENSITY; static const glm::vec3 DEFAULT_KEYLIGHT_DIRECTION; static const bool DEFAULT_KEYLIGHT_CAST_SHADOWS; - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, xColor, DEFAULT_KEYLIGHT_COLOR); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, ScriptVec3UChar, DEFAULT_KEYLIGHT_COLOR); DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, Intensity, intensity, float, DEFAULT_KEYLIGHT_INTENSITY); DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, ScriptVec3Float, DEFAULT_KEYLIGHT_DIRECTION); DEFINE_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, CastShadows, castShadows, bool, DEFAULT_KEYLIGHT_CAST_SHADOWS); diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index e95af7ebf9..ab793c4c30 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -38,7 +38,6 @@ EntityItemPointer LightEntityItem::factory(const EntityItemID& entityID, const E // our non-pure virtual subclass for now... LightEntityItem::LightEntityItem(const EntityItemID& entityItemID) : EntityItem(entityItemID) { _type = EntityTypes::Light; - _color[RED_INDEX] = _color[GREEN_INDEX] = _color[BLUE_INDEX] = 0; } void LightEntityItem::setUnscaledDimensions(const glm::vec3& value) { @@ -73,7 +72,7 @@ EntityItemProperties LightEntityItem::getProperties(EntityPropertyFlags desiredP EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class COPY_ENTITY_PROPERTY_TO_PROPERTIES(isSpotlight, getIsSpotlight); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(intensity, getIntensity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(exponent, getExponent); COPY_ENTITY_PROPERTY_TO_PROPERTIES(cutoff, getCutoff); @@ -176,7 +175,7 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_EXPONENT, float, setExponent); READ_ENTITY_PROPERTY(PROP_CUTOFF, float, setCutoff); @@ -214,26 +213,15 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, getFalloffRadius()); } -const rgbColor& LightEntityItem::getColor() const { - return _color; -} - -xColor LightEntityItem::getXColor() const { - xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; -} - -void LightEntityItem::setColor(const rgbColor& value) { - withWriteLock([&] { - memcpy(_color, value, sizeof(_color)); - _lightPropertiesChanged = true; +const ScriptVec3UChar& LightEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; }); } -void LightEntityItem::setColor(const xColor& value) { +void LightEntityItem::setColor(const ScriptVec3UChar& value) { withWriteLock([&] { - _color[RED_INDEX] = value.red; - _color[GREEN_INDEX] = value.green; - _color[BLUE_INDEX] = value.blue; + _color = value; _lightPropertiesChanged = true; }); } diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 4d0bde3718..0e57015c49 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -52,18 +52,12 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const rgbColor& getColor() const; - xColor getXColor() const; - - void setColor(const rgbColor& value); - void setColor(const xColor& value); + const ScriptVec3UChar& getColor() const; + void setColor(const ScriptVec3UChar& value); bool getIsSpotlight() const; void setIsSpotlight(bool value); - void setIgnoredColor(const rgbColor& value) { } - void setIgnoredAttenuation(float value) { } - float getIntensity() const; void setIntensity(float value); float getFalloffRadius() const; @@ -92,7 +86,7 @@ public: private: // properties of a light - rgbColor _color; + ScriptVec3UChar _color; bool _isSpotlight { DEFAULT_IS_SPOTLIGHT }; float _intensity { DEFAULT_INTENSITY }; float _falloffRadius { DEFAULT_FALLOFF_RADIUS }; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 2acf8670d9..21326ad0da 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -41,13 +41,8 @@ EntityItemProperties LineEntityItem::getProperties(EntityPropertyFlags desiredPr EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - - properties._color = getXColor(); - properties._colorChanged = false; - - + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); return properties; @@ -56,12 +51,11 @@ EntityItemProperties LineEntityItem::getProperties(EntityPropertyFlags desiredPr bool LineEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); - if (somethingChanged) { bool wantDebug = false; if (wantDebug) { @@ -120,7 +114,7 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); @@ -154,36 +148,21 @@ void LineEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits void LineEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qCDebug(entities) << " LINE EntityItem id:" << getEntityItemID() << "---------------------------------------------"; - qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2]; + qCDebug(entities) << " color:" << _color; qCDebug(entities) << " position:" << debugTreeVector(getWorldPosition()); qCDebug(entities) << " dimensions:" << debugTreeVector(getScaledDimensions()); qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); } - -const rgbColor& LineEntityItem::getColor() const { - return _color; -} - -xColor LineEntityItem::getXColor() const { - xColor result; - withReadLock([&] { - result = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; - }); - return result; -} - -void LineEntityItem::setColor(const rgbColor& value) { - withWriteLock([&] { - memcpy(_color, value, sizeof(_color)); +const ScriptVec3UChar& LineEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; }); } -void LineEntityItem::setColor(const xColor& value) { +void LineEntityItem::setColor(const ScriptVec3UChar& value) { withWriteLock([&] { - _color[RED_INDEX] = value.red; - _color[GREEN_INDEX] = value.green; - _color[BLUE_INDEX] = value.blue; + _color = value; }); } diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index 01f0f39c01..4965514e12 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -41,11 +41,8 @@ class LineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const rgbColor& getColor() const; - xColor getXColor() const; - - void setColor(const rgbColor& value); - void setColor(const xColor& value); + const ScriptVec3UChar& getColor() const; + void setColor(const ScriptVec3UChar& value); void setLineWidth(float lineWidth); float getLineWidth() const; @@ -71,7 +68,7 @@ class LineEntityItem : public EntityItem { static const int MAX_POINTS_PER_LINE; private: - rgbColor _color; + ScriptVec3UChar _color; float _lineWidth { DEFAULT_LINE_WIDTH }; QVector _points; bool _pointsChanged { true }; diff --git a/libraries/entities/src/MaterialEntityItem.cpp b/libraries/entities/src/MaterialEntityItem.cpp index 88da5dd4b5..a10937d537 100644 --- a/libraries/entities/src/MaterialEntityItem.cpp +++ b/libraries/entities/src/MaterialEntityItem.cpp @@ -211,7 +211,7 @@ void MaterialEntityItem::setMaterialData(const QString& materialData) { void MaterialEntityItem::setMaterialMappingPos(const ScriptVec2Float& materialMappingPos) { if (_materialMappingPos != materialMappingPos) { removeMaterial(); - _materialMappingPos = glm::vec2(materialMappingPos.x, materialMappingPos.y); + _materialMappingPos = materialMappingPos.toGlm(); applyMaterial(); } } @@ -219,7 +219,7 @@ void MaterialEntityItem::setMaterialMappingPos(const ScriptVec2Float& materialMa void MaterialEntityItem::setMaterialMappingScale(const ScriptVec2Float& materialMappingScale) { if (_materialMappingScale != materialMappingScale) { removeMaterial(); - _materialMappingScale = glm::vec2(materialMappingScale.x, materialMappingScale.y); + _materialMappingScale = materialMappingScale.toGlm(); applyMaterial(); } } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 2024663ecb..5a3bdc7849 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -39,7 +39,6 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID) : EntityItem( // set the last animated when interface (re)starts _type = EntityTypes::Model; _lastKnownCurrentFrame = -1; - _color[0] = _color[1] = _color[2] = 0; } const QString ModelEntityItem::getTextures() const { @@ -55,7 +54,7 @@ void ModelEntityItem::setTextures(const QString& textures) { EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); @@ -114,7 +113,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; bool animationPropertiesChanged = false; - READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); @@ -506,9 +505,6 @@ QVector ModelEntityItem::getJointTranslationsSet() const { } -xColor ModelEntityItem::getXColor() const { - xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; -} bool ModelEntityItem::hasModel() const { return resultWithReadLock([&] { return !_modelURL.isEmpty(); @@ -540,17 +536,15 @@ QString ModelEntityItem::getCompoundShapeURL() const { return _compoundShapeURL.get(); } -void ModelEntityItem::setColor(const rgbColor& value) { +void ModelEntityItem::setColor(const ScriptVec3UChar& value) { withWriteLock([&] { - memcpy(_color, value, sizeof(_color)); + _color = value; }); } -void ModelEntityItem::setColor(const xColor& value) { - withWriteLock([&] { - _color[RED_INDEX] = value.red; - _color[GREEN_INDEX] = value.green; - _color[BLUE_INDEX] = value.blue; +const ScriptVec3UChar& ModelEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; }); } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 17c71c4b90..8022e44521 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -55,12 +55,11 @@ public: void setShapeType(ShapeType type) override; virtual ShapeType getShapeType() const override; - // TODO: Move these to subclasses, or other appropriate abstraction // getters/setters applicable to models and particles + const ScriptVec3UChar& getColor() const; + void setColor(const ScriptVec3UChar& value); - const rgbColor& getColor() const { return _color; } - xColor getXColor() const; bool hasModel() const; virtual bool hasCompoundShapeURL() const; @@ -70,9 +69,6 @@ public: static const QString DEFAULT_COMPOUND_SHAPE_URL; QString getCompoundShapeURL() const; - void setColor(const rgbColor& value); - void setColor(const xColor& value); - // model related properties virtual void setModelURL(const QString& url); virtual void setCompoundShapeURL(const QString& url); @@ -157,7 +153,7 @@ protected: QVector _localJointData; int _lastKnownCurrentFrame{-1}; - rgbColor _color; + ScriptVec3UChar _color; QString _modelURL; bool _relayParentJoints; diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index dff517c770..8238edb08b 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -145,9 +145,6 @@ uint64_t Properties::emitIntervalUsecs() const { return 0; } -const xColor ParticleEffectEntityItem::DEFAULT_XCOLOR = xColor(static_cast(DEFAULT_COLOR.r), static_cast(DEFAULT_COLOR.g), static_cast(DEFAULT_COLOR.b)); -const xColor ParticleEffectEntityItem::DEFAULT_XCOLOR_SPREAD = xColor(static_cast(DEFAULT_COLOR_SPREAD.r), static_cast(DEFAULT_COLOR_SPREAD.g), static_cast(DEFAULT_COLOR_SPREAD.b)); - EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer entity(new ParticleEffectEntityItem(entityID), [](EntityItem* ptr) { ptr->deleteLater(); }); entity->setProperties(properties); @@ -159,7 +156,6 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte EntityItem(entityItemID) { _type = EntityTypes::ParticleEffect; - setColor(DEFAULT_COLOR); } void ParticleEffectEntityItem::setAlpha(float alpha) { @@ -368,7 +364,7 @@ void ParticleEffectEntityItem::computeAndUpdateDimensions() { EntityItemProperties ParticleEffectEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); // FIXME - this doesn't appear to get used COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles); @@ -449,28 +445,12 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert return somethingChanged; } -void ParticleEffectEntityItem::setColor(const vec3& value) { +void ParticleEffectEntityItem::setColor(const ScriptVec3UChar& value) { withWriteLock([&] { - _particleProperties.color.gradient.target = value; + _particleProperties.color.gradient.target = value.toGlm(); }); } -void ParticleEffectEntityItem::setColor(const xColor& value) { - withWriteLock([&] { - _particleProperties.color.gradient.target.r = value.red; - _particleProperties.color.gradient.target.g = value.green; - _particleProperties.color.gradient.target.b = value.blue; - }); -} - -xColor ParticleEffectEntityItem::getXColor() const { - xColor color; - color.red = _particleProperties.color.gradient.target.r; - color.green = _particleProperties.color.gradient.target.g; - color.blue = _particleProperties.color.gradient.target.b; - return color; -} - int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, @@ -479,7 +459,7 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, bool, setIsEmitting); READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles); @@ -495,7 +475,7 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, xColor, setColorSpread); + READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, ScriptVec3UChar, setColorSpread); READ_ENTITY_PROPERTY(PROP_COLOR_START, ScriptVec3Float, setColorStart); READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); @@ -564,7 +544,7 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, OctreeElement::AppendState& appendState) const { bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_COLOR, getXColor()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); @@ -643,22 +623,12 @@ void ParticleEffectEntityItem::setColorFinish(const vec3& colorFinish) { }); } -void ParticleEffectEntityItem::setColorSpread(const xColor& value) { +void ParticleEffectEntityItem::setColorSpread(const ScriptVec3UChar& value) { withWriteLock([&] { - _particleProperties.color.gradient.spread.r = value.red; - _particleProperties.color.gradient.spread.g = value.green; - _particleProperties.color.gradient.spread.b = value.blue; + _particleProperties.color.gradient.spread = value.toGlm(); }); } -xColor ParticleEffectEntityItem::getColorSpread() const { - xColor color; - color.red = _particleProperties.color.gradient.spread.r; - color.green = _particleProperties.color.gradient.spread.g; - color.blue = _particleProperties.color.gradient.spread.b; - return color; -} - void ParticleEffectEntityItem::setEmitterShouldTrail(bool emitterShouldTrail) { withWriteLock([&] { _particleProperties.emission.shouldTrail = emitterShouldTrail; @@ -672,10 +642,10 @@ particle::Properties ParticleEffectEntityItem::getParticleProperties() const { // Special case the properties that get treated differently if they're unintialized if (glm::any(glm::isnan(result.color.range.start))) { - result.color.range.start = getColor(); + result.color.range.start = getColor().toGlm(); } if (glm::any(glm::isnan(result.color.range.finish))) { - result.color.range.finish = getColor(); + result.color.range.finish = getColor().toGlm(); } if (glm::isnan(result.alpha.range.start)) { result.alpha.range.start = getAlpha(); diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index d02016b283..970315280d 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -20,9 +20,9 @@ namespace particle { static const float SCRIPT_MAXIMUM_PI = 3.1416f; // Round up so that reasonable property values work static const float UNINITIALIZED = NAN; - static const vec3 DEFAULT_COLOR = { 255, 255, 255 }; + static const ScriptVec3UChar DEFAULT_COLOR = { 255, 255, 255 }; static const vec3 DEFAULT_COLOR_UNINITIALIZED = { UNINITIALIZED, UNINITIALIZED, UNINITIALIZED }; - static const vec3 DEFAULT_COLOR_SPREAD = { 0, 0, 0 }; + static const ScriptVec3UChar DEFAULT_COLOR_SPREAD = { 0, 0, 0 }; static const float DEFAULT_ALPHA = 1.0f; static const float DEFAULT_ALPHA_SPREAD = 0.0f; static const float DEFAULT_ALPHA_START = UNINITIALIZED; @@ -147,7 +147,7 @@ namespace particle { }; struct Properties { - RangeGradient color { DEFAULT_COLOR, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_SPREAD }; + RangeGradient color { DEFAULT_COLOR.toGlm(), DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_SPREAD.toGlm() }; RangeGradient alpha { DEFAULT_ALPHA, DEFAULT_ALPHA_START, DEFAULT_ALPHA_FINISH, DEFAULT_ALPHA_SPREAD }; float radiusStart { DEFAULT_EMIT_RADIUS_START }; RangeGradient radius { DEFAULT_PARTICLE_RADIUS, DEFAULT_RADIUS_START, DEFAULT_RADIUS_FINISH, DEFAULT_RADIUS_SPREAD }; @@ -178,10 +178,10 @@ namespace particle { return *this; } - vec4 getColorStart() const { return vec4(ColorUtils::sRGBToLinearVec3(color.range.start / 255.0f), alpha.range.start); } - vec4 getColorMiddle() const { return vec4(ColorUtils::sRGBToLinearVec3(color.gradient.target / 255.0f), alpha.gradient.target); } - vec4 getColorFinish() const { return vec4(ColorUtils::sRGBToLinearVec3(color.range.finish / 255.0f), alpha.range.finish); } - vec4 getColorSpread() const { return vec4(ColorUtils::sRGBToLinearVec3(color.gradient.spread / 255.0f), alpha.gradient.spread); } + vec4 getColorStart() const { return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.range.start)), alpha.range.start); } + vec4 getColorMiddle() const { return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.gradient.target)), alpha.gradient.target); } + vec4 getColorFinish() const { return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.range.finish)), alpha.range.finish); } + vec4 getColorSpread() const { return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.gradient.spread)), alpha.gradient.spread); } }; } // namespace particles @@ -217,11 +217,8 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - xColor getXColor() const; - vec3 getColor() const { return _particleProperties.color.gradient.target; } - - void setColor(const vec3& value); - void setColor(const xColor& value); + void setColor(const ScriptVec3UChar& value); + ScriptVec3UChar getColor() const { return _particleProperties.color.gradient.target; } void setColorStart(const vec3& colorStart); void setColorStart(const ScriptVec3Float& colorStart) { setColorStart(colorStart.toGlm()); } @@ -233,8 +230,8 @@ public: vec3 getColorFinish() const { return _particleProperties.color.range.finish; } ScriptVec3Float getScriptColorFinish() const { return getColorFinish(); } - void setColorSpread(const xColor& colorSpread); - xColor getColorSpread() const; + void setColorSpread(const ScriptVec3UChar& colorSpread); + ScriptVec3UChar getColorSpread() const { return _particleProperties.color.gradient.spread; } void setAlpha(float alpha); float getAlpha() const { return _particleProperties.alpha.gradient.target; } @@ -328,9 +325,6 @@ public: particle::Properties getParticleProperties() const; - static const xColor DEFAULT_XCOLOR; - static const xColor DEFAULT_XCOLOR_SPREAD; - protected: particle::Properties _particleProperties; bool _isEmitting { true }; diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index c4e8f4a7bc..47438bdba0 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -39,12 +39,8 @@ PolyLineEntityItem::PolyLineEntityItem(const EntityItemID& entityItemID) : Entit EntityItemProperties PolyLineEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { QWriteLocker lock(&_quadReadWriteLock); EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - - - properties._color = getXColor(); - properties._colorChanged = false; - + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); @@ -204,7 +200,7 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); @@ -253,7 +249,7 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode void PolyLineEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qCDebug(entities) << " QUAD EntityItem id:" << getEntityItemID() << "---------------------------------------------"; - qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2]; + qCDebug(entities) << " color:" << _color; qCDebug(entities) << " position:" << debugTreeVector(getWorldPosition()); qCDebug(entities) << " dimensions:" << debugTreeVector(getScaledDimensions()); qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); @@ -309,3 +305,15 @@ void PolyLineEntityItem::setTextures(const QString& textures) { } }); } + +void PolyLineEntityItem::setColor(const ScriptVec3UChar& value) { + withWriteLock([&] { + _color = value; + }); +} + +const ScriptVec3UChar& PolyLineEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; + }); +} diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index a30b32e2fa..db381e4d01 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -41,19 +41,8 @@ class PolyLineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const rgbColor& getColor() const { return _color; } - xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } - - void setColor(const rgbColor& value) { - _strokeColorsChanged = true; - memcpy(_color, value, sizeof(_color)); - } - void setColor(const xColor& value) { - _strokeColorsChanged = true; - _color[RED_INDEX] = value.red; - _color[GREEN_INDEX] = value.green; - _color[BLUE_INDEX] = value.blue; - } + const ScriptVec3UChar& getColor() const; + void setColor(const ScriptVec3UChar& value); void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } float getLineWidth() const{ return _lineWidth; } @@ -105,7 +94,7 @@ private: void calculateScaleAndRegistrationPoint(); protected: - rgbColor _color; + ScriptVec3UChar _color; float _lineWidth { DEFAULT_LINE_WIDTH }; bool _pointsChanged { true }; bool _normalsChanged { true }; diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index 943ae2e462..bb56ad7cb9 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -73,7 +73,7 @@ namespace entity { return Shape::Sphere; } - ::QString stringFromShape(Shape shape) { + QString stringFromShape(Shape shape) { return shapeStrings[shape]; } } @@ -117,8 +117,10 @@ ShapeEntityItem::ShapeEntityItem(const EntityItemID& entityItemID) : EntityItem( EntityItemProperties ShapeEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class + properties.setShape(entity::stringFromShape(getShape())); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); + properties._shapeChanged = false; + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); return properties; @@ -182,7 +184,7 @@ int ShapeEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape); - READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); return bytesRead; @@ -210,27 +212,16 @@ void ShapeEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); } -void ShapeEntityItem::setColor(const rgbColor& value) { - memcpy(_color, value, sizeof(rgbColor)); - _material->setAlbedo(glm::vec3(_color[0], _color[1], _color[2]) / 255.0f); +void ShapeEntityItem::setColor(const ScriptVec3UChar& value) { + withWriteLock([&] { + _color = value; + }); } -xColor ShapeEntityItem::getXColor() const { - return xColor { _color[0], _color[1], _color[2] }; -} - -void ShapeEntityItem::setColor(const xColor& value) { - setColor(rgbColor { value.red, value.green, value.blue }); -} - -QColor ShapeEntityItem::getQColor() const { - auto& color = getColor(); - return QColor(color[0], color[1], color[2], (int)(getAlpha() * 255)); -} - -void ShapeEntityItem::setColor(const QColor& value) { - setColor(rgbColor { (uint8_t)value.red(), (uint8_t)value.green(), (uint8_t)value.blue() }); - setAlpha(value.alpha()); +const ScriptVec3UChar& ShapeEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; + }); } void ShapeEntityItem::setAlpha(float alpha) { @@ -288,7 +279,7 @@ void ShapeEntityItem::debugDump() const { qCDebug(entities) << " name:" << _name; qCDebug(entities) << " shape:" << stringFromShape(_shape) << " (EnumId: " << _shape << " )"; qCDebug(entities) << " collisionShapeType:" << ShapeInfo::getNameForShapeType(getShapeType()); - qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2]; + qCDebug(entities) << " color:" << _color; qCDebug(entities) << " position:" << debugTreeVector(getWorldPosition()); qCDebug(entities) << " dimensions:" << debugTreeVector(getScaledDimensions()); qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); @@ -394,5 +385,4 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { // This value specifies how the shape should be treated by physics calculations. ShapeType ShapeEntityItem::getShapeType() const { return _collisionShapeType; -} - +} \ No newline at end of file diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index adc33b764b..6796c2f621 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -31,7 +31,7 @@ namespace entity { }; Shape shapeFromString(const ::QString& shapeString); - ::QString stringFromShape(Shape shape); + QString stringFromShape(Shape shape); } class ShapeEntityItem : public EntityItem { @@ -77,17 +77,11 @@ public: float getAlpha() const { return _alpha; }; void setAlpha(float alpha); - const rgbColor& getColor() const { return _color; } - void setColor(const rgbColor& value); + const ScriptVec3UChar& getColor() const; + void setColor(const ScriptVec3UChar& value); void setUnscaledDimensions(const glm::vec3& value) override; - xColor getXColor() const; - void setColor(const xColor& value); - - QColor getQColor() const; - void setColor(const QColor& value); - bool shouldBePhysical() const override { return !isDead(); } bool supportsDetailedRayIntersection() const override; @@ -106,7 +100,7 @@ public: protected: float _alpha { 1.0f }; - rgbColor _color; + ScriptVec3UChar _color; entity::Shape _shape { entity::Shape::Sphere }; //! This is SHAPE_TYPE_ELLIPSOID rather than SHAPE_TYPE_NONE to maintain diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index ba40c3fa6f..2ed3253536 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -16,7 +16,7 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -const xColor SkyboxPropertyGroup::DEFAULT_COLOR = { 0, 0, 0 }; +const ScriptVec3UChar SkyboxPropertyGroup::DEFAULT_COLOR = { 0, 0, 0 }; void SkyboxPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); @@ -24,7 +24,7 @@ void SkyboxPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredPr } void SkyboxPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, xColor, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, ScriptVec3UChar, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, url, QString, setURL); } @@ -71,7 +71,7 @@ bool SkyboxPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlag bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_SKYBOX_COLOR, Color); @@ -143,7 +143,7 @@ int SkyboxPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* d int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, xColor, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); return bytesRead; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index a94365d24d..447d36f842 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -32,7 +32,7 @@ class ReadBitstreamToTreeParams; /**jsdoc * A skybox is defined by the following properties. * @typedef {object} Entities.Skybox - * @property {Color} color=0,0,0 - Sets the color of the sky if url is "", otherwise modifies the + * @property {Vec3Color} color=0,0,0 - Sets the color of the sky if url is "", otherwise modifies the * color of the cube map image. * @property {string} url="" - A cube map image that is used to render the sky. */ @@ -83,16 +83,8 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - glm::vec3 getColorVec3() const { - const quint8 MAX_COLOR = 255; - glm::vec3 color = { (float)_color.red / (float)MAX_COLOR, - (float)_color.green / (float)MAX_COLOR, - (float)_color.blue / (float)MAX_COLOR }; - return color; - } - - static const xColor DEFAULT_COLOR; - DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, xColor, DEFAULT_COLOR); + static const ScriptVec3UChar DEFAULT_COLOR; + DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, ScriptVec3UChar, DEFAULT_COLOR); DEFINE_PROPERTY_REF(PROP_SKYBOX_URL, URL, url, QString, ""); }; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 56e12e66d9..c5e0cf0bb1 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -25,8 +25,8 @@ const QString TextEntityItem::DEFAULT_TEXT(""); const float TextEntityItem::DEFAULT_LINE_HEIGHT = 0.1f; -const xColor TextEntityItem::DEFAULT_TEXT_COLOR = { 255, 255, 255 }; -const xColor TextEntityItem::DEFAULT_BACKGROUND_COLOR = { 0, 0, 0}; +const ScriptVec3UChar TextEntityItem::DEFAULT_TEXT_COLOR = { 255, 255, 255 }; +const ScriptVec3UChar TextEntityItem::DEFAULT_BACKGROUND_COLOR = { 0, 0, 0}; const bool TextEntityItem::DEFAULT_FACE_CAMERA = false; EntityItemPointer TextEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -51,8 +51,8 @@ EntityItemProperties TextEntityItem::getProperties(EntityPropertyFlags desiredPr COPY_ENTITY_PROPERTY_TO_PROPERTIES(text, getText); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineHeight, getLineHeight); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(textColor, getTextColorX); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(backgroundColor, getBackgroundColorX); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(textColor, getTextColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(backgroundColor, getBackgroundColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(faceCamera, getFaceCamera); return properties; } @@ -91,8 +91,8 @@ int TextEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY(PROP_TEXT_COLOR, rgbColor, setTextColor); - READ_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, rgbColor, setBackgroundColor); + READ_ENTITY_PROPERTY(PROP_TEXT_COLOR, ScriptVec3UChar, setTextColor); + READ_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, ScriptVec3UChar, setBackgroundColor); READ_ENTITY_PROPERTY(PROP_FACE_CAMERA, bool, setFaceCamera); return bytesRead; @@ -168,55 +168,27 @@ float TextEntityItem::getLineHeight() const { return result; } -const rgbColor& TextEntityItem::getTextColor() const { - return _textColor; -} - -const rgbColor& TextEntityItem::getBackgroundColor() const { - return _backgroundColor; -} - -xColor TextEntityItem::getTextColorX() const { - xColor result; - withReadLock([&] { - result = { _textColor[RED_INDEX], _textColor[GREEN_INDEX], _textColor[BLUE_INDEX] }; - }); - return result; -} - -void TextEntityItem::setTextColor(const rgbColor& value) { +void TextEntityItem::setTextColor(const ScriptVec3UChar& value) { withWriteLock([&] { - memcpy(_textColor, value, sizeof(_textColor)); + _textColor = value; }); } -void TextEntityItem::setTextColor(const xColor& value) { +const ScriptVec3UChar& TextEntityItem::getTextColor() const { + return resultWithReadLock([&] { + return _textColor; + }); +} + +void TextEntityItem::setBackgroundColor(const ScriptVec3UChar& value) { withWriteLock([&] { - _textColor[RED_INDEX] = value.red; - _textColor[GREEN_INDEX] = value.green; - _textColor[BLUE_INDEX] = value.blue; + _backgroundColor = value; }); } -xColor TextEntityItem::getBackgroundColorX() const { - xColor result; - withReadLock([&] { - result = { _backgroundColor[RED_INDEX], _backgroundColor[GREEN_INDEX], _backgroundColor[BLUE_INDEX] }; - }); - return result; -} - -void TextEntityItem::setBackgroundColor(const rgbColor& value) { - withWriteLock([&] { - memcpy(_backgroundColor, value, sizeof(_backgroundColor)); - }); -} - -void TextEntityItem::setBackgroundColor(const xColor& value) { - withWriteLock([&] { - _backgroundColor[RED_INDEX] = value.red; - _backgroundColor[GREEN_INDEX] = value.green; - _backgroundColor[BLUE_INDEX] = value.blue; +const ScriptVec3UChar& TextEntityItem::getBackgroundColor() const { + return resultWithReadLock([&] { + return _backgroundColor; }); } diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index efdc84bcd8..fa6cbdfcf4 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -59,21 +59,13 @@ public: void setLineHeight(float value); float getLineHeight() const; - static const xColor DEFAULT_TEXT_COLOR; - // FIXME should not return a reference because of thread safety, but can't return an array - const rgbColor& getTextColor() const; - xColor getTextColorX() const; + static const ScriptVec3UChar DEFAULT_TEXT_COLOR; + const ScriptVec3UChar& getTextColor() const; + void setTextColor(const ScriptVec3UChar& value); - void setTextColor(const rgbColor& value); - void setTextColor(const xColor& value); - - static const xColor DEFAULT_BACKGROUND_COLOR; - // FIXME should not return a reference because of thread safety, but can't return an array - const rgbColor& getBackgroundColor() const; - xColor getBackgroundColorX() const; - - void setBackgroundColor(const rgbColor& value); - void setBackgroundColor(const xColor& value); + static const ScriptVec3UChar DEFAULT_BACKGROUND_COLOR; + const ScriptVec3UChar& getBackgroundColor() const; + void setBackgroundColor(const ScriptVec3UChar& value); static const bool DEFAULT_FACE_CAMERA; bool getFaceCamera() const; @@ -82,8 +74,8 @@ public: private: QString _text; float _lineHeight; - rgbColor _textColor; - rgbColor _backgroundColor; + ScriptVec3UChar _textColor; + ScriptVec3UChar _backgroundColor; bool _faceCamera; }; diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index d259f8cf6b..0f3904c09e 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -297,14 +297,6 @@ bool OctreePacketData::appendValue(const nodeColor& color) { return appendColor(color[RED_INDEX], color[GREEN_INDEX], color[BLUE_INDEX]); } -bool OctreePacketData::appendValue(const xColor& color) { - return appendColor(color.red, color.green, color.blue); -} - -bool OctreePacketData::appendValue(const rgbColor& color) { - return appendColor(color[RED_INDEX], color[GREEN_INDEX], color[BLUE_INDEX]); -} - bool OctreePacketData::appendColor(colorPart red, colorPart green, colorPart blue) { // eventually we can make this use a dictionary... bool success = false; @@ -404,6 +396,11 @@ bool OctreePacketData::appendValue(const ScriptVec3Float& value) { return success; } + +bool OctreePacketData::appendValue(const ScriptVec3UChar& color) { + return appendColor(color.x, color.y, color.z); +} + bool OctreePacketData::appendValue(const QVector& value) { uint16_t qVecSize = value.size(); bool success = appendValue(qVecSize); @@ -695,14 +692,6 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QUuid& return sizeof(length) + length; } -int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, xColor& result) { - result.red = dataBytes[RED_INDEX]; - result.green = dataBytes[GREEN_INDEX]; - result.blue = dataBytes[BLUE_INDEX]; - return sizeof(rgbColor); -} - - int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(uint16_t)); diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 2309b5e67b..5ce0d5bea4 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -143,12 +143,6 @@ public: /// appends a color to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const nodeColor& color); - /// appends a color to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const xColor& color); - - /// appends a color to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const rgbColor& color); - /// appends a unsigned 8 bit int to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(uint8_t value); @@ -170,6 +164,9 @@ public: /// appends a non-position vector to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const ScriptVec3Float& value); + /// appends a color to the end of the stream, may fail if new data stream is too long to fit in packet + bool appendValue(const ScriptVec3UChar& value); + /// appends a QVector of vec3s to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const QVector& value); @@ -255,18 +252,17 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, bool& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, quint64& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, uint32_t& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, uint16_t& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, uint8_t& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, rgbColor& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, glm::quat& result) { int bytes = unpackOrientationQuatFromBytes(dataBytes, result); return bytes; } static int unpackDataFromBytes(const unsigned char* dataBytes, ShapeType& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, MaterialMappingMode& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, QString& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QUuid& result); - static int unpackDataFromBytes(const unsigned char* dataBytes, xColor& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); diff --git a/libraries/shared/src/BufferParser.h b/libraries/shared/src/BufferParser.h index 74b47cb72f..73bfa4bfdc 100644 --- a/libraries/shared/src/BufferParser.h +++ b/libraries/shared/src/BufferParser.h @@ -94,12 +94,12 @@ inline void BufferParser::readValue(QUuid& result) { readUuid(result); } -template<> -inline void BufferParser::readValue(xColor& result) { - readValue(result.red); - readValue(result.blue); - readValue(result.green); -} +//template<> +//inline void BufferParser::readValue(xColor& result) { +// readValue(result.red); +// readValue(result.blue); +// readValue(result.green); +//} template<> inline void BufferParser::readValue(QVector& result) { diff --git a/libraries/shared/src/ColorUtils.h b/libraries/shared/src/ColorUtils.h index e113449db3..d73fb478c8 100644 --- a/libraries/shared/src/ColorUtils.h +++ b/libraries/shared/src/ColorUtils.h @@ -18,11 +18,13 @@ #include "DependencyManager.h" +#include "RegisteredMetaTypes.h" + extern const float srgbToLinearLookupTable[256]; class ColorUtils { public: - inline static glm::vec3 toVec3(const xColor& color); + inline static glm::vec3 toVec3(const ScriptVec3UChar& color); // Convert to gamma 2.2 space from linear inline static glm::vec3 toGamma22Vec3(const glm::vec3& linear); @@ -40,9 +42,9 @@ public: inline static float tosRGBFloat(const float& linear); }; -inline glm::vec3 ColorUtils::toVec3(const xColor& color) { +inline glm::vec3 ColorUtils::toVec3(const ScriptVec3UChar& color) { const float ONE_OVER_255 = 1.0f / 255.0f; - return glm::vec3(color.red * ONE_OVER_255, color.green * ONE_OVER_255, color.blue * ONE_OVER_255); + return glm::vec3(color.x * ONE_OVER_255, color.y * ONE_OVER_255, color.z * ONE_OVER_255); } inline glm::vec3 ColorUtils::toGamma22Vec3(const glm::vec3& linear) { diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 4be8ad0e41..36719453ad 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -13,6 +13,8 @@ #include #include "NumericalConstants.h" +#include "RegisteredMetaTypes.h" + const vec3 Vectors::UNIT_X{ 1.0f, 0.0f, 0.0f }; const vec3 Vectors::UNIT_Y{ 0.0f, 1.0f, 0.0f }; const vec3 Vectors::UNIT_Z{ 0.0f, 0.0f, 1.0f }; @@ -436,12 +438,17 @@ glm::vec2 toGlm(const QPointF& pt) { return glm::vec2(pt.x(), pt.y()); } -glm::vec3 toGlm(const xColor& color) { +glm::vec3 toGlm(const ScriptVec3UChar& color) { static const float MAX_COLOR = 255.0f; - return glm::vec3(color.red, color.green, color.blue) / MAX_COLOR; + return color.toGlm() / MAX_COLOR; } -xColor xColorFromGlm(const glm::vec3 & color) { +vec4 toGlm(const ScriptVec3UChar& color, float alpha) { + static const float MAX_COLOR = 255.0f; + return vec4(color.toGlm() / MAX_COLOR, alpha); +} + +ScriptVec3UChar scriptVec3UCharFromGlm(const glm::vec3 & color) { static const float MAX_COLOR = 255.0f; return { (uint8_t)(color.x * MAX_COLOR), (uint8_t)(color.y * MAX_COLOR), (uint8_t)(color.z * MAX_COLOR) }; } @@ -463,10 +470,6 @@ QSize fromGlm(const glm::ivec2 & v) { return QSize(v.x, v.y); } -vec4 toGlm(const xColor& color, float alpha) { - return vec4((float)color.red / 255.0f, (float)color.green / 255.0f, (float)color.blue / 255.0f, alpha); -} - QRectF glmToRect(const glm::vec2 & pos, const glm::vec2 & size) { QRectF result(pos.x, pos.y, size.x, size.y); return result; diff --git a/libraries/shared/src/GLMHelpers.h b/libraries/shared/src/GLMHelpers.h index 7e6ef4cb28..b2b5226c7f 100644 --- a/libraries/shared/src/GLMHelpers.h +++ b/libraries/shared/src/GLMHelpers.h @@ -33,6 +33,8 @@ using glm::vec3; using glm::vec4; using glm::quat; +class ScriptVec3UChar; + #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" @@ -174,12 +176,12 @@ bool isSimilarPosition(const glm::vec3& positionA, const glm::vec3& positionB, f uvec2 toGlm(const QSize& size); ivec2 toGlm(const QPoint& pt); vec2 toGlm(const QPointF& pt); -vec3 toGlm(const xColor& color); +vec3 toGlm(const ScriptVec3UChar& color); vec4 toGlm(const QColor& color); ivec4 toGlm(const QRect& rect); -vec4 toGlm(const xColor& color, float alpha); +vec4 toGlm(const ScriptVec3UChar& color, float alpha); -xColor xColorFromGlm(const glm::vec3 & c); +ScriptVec3UChar scriptVec3UCharFromGlm(const glm::vec3 & c); QSize fromGlm(const glm::ivec2 & v); QMatrix4x4 fromGlm(const glm::mat4 & m); diff --git a/libraries/shared/src/QVariantGLM.cpp b/libraries/shared/src/QVariantGLM.cpp index f7fd7fbc8a..12c4628fbd 100644 --- a/libraries/shared/src/QVariantGLM.cpp +++ b/libraries/shared/src/QVariantGLM.cpp @@ -20,10 +20,6 @@ QVariantList quatToQList(const glm::quat& g) { return QVariantList() << g.x << g.y << g.z << g.w; } -QVariantList rgbColorToQList(const rgbColor& v) { - return QVariantList() << (int)(v[0]) << (int)(v[1]) << (int)(v[2]); -} - QVariantMap vec3ToQMap(const glm::vec3& glmVector) { QVariantMap vectorAsVariantMap; vectorAsVariantMap["x"] = glmVector.x; @@ -56,14 +52,6 @@ glm::quat qListToQuat(const QVariant& q) { return glm::quat(w, x, y, z); } -void qListToRgbColor(const QVariant& q, rgbColor& returnValue) { - QVariantList qList = q.toList(); - returnValue[RED_INDEX] = qList[RED_INDEX].toInt(); - returnValue[GREEN_INDEX] = qList[GREEN_INDEX].toInt(); - returnValue[BLUE_INDEX] = qList[BLUE_INDEX].toInt(); -} - - glm::vec3 qMapToVec3(const QVariant& q) { QVariantMap qMap = q.toMap(); if (qMap.contains("x") && qMap.contains("y") && qMap.contains("z")) { diff --git a/libraries/shared/src/QVariantGLM.h b/libraries/shared/src/QVariantGLM.h index a8f8b531c0..d61f64312a 100644 --- a/libraries/shared/src/QVariantGLM.h +++ b/libraries/shared/src/QVariantGLM.h @@ -19,14 +19,12 @@ QVariantList vec3ToQList(const glm::vec3& g); QVariantList quatToQList(const glm::quat& g); -QVariantList rgbColorToQList(const rgbColor& v); QVariantMap vec3ToQMap(const glm::vec3& glmVector); QVariantMap quatToQMap(const glm::quat& glmQuat); glm::vec3 qListToVec3(const QVariant& q); glm::quat qListToQuat(const QVariant& q); -void qListToRgbColor(const QVariant& q, rgbColor& returnValue); glm::vec3 qMapToVec3(const QVariant& q); glm::quat qMapToQuat(const QVariant& q); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index f0754b2a48..99f38c835e 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -30,13 +30,12 @@ int glmVec2MetaTypeId = qRegisterMetaType(); int vec2FloatMetaTypeId = qRegisterMetaType(); int glmVec3MetaTypeId = qRegisterMetaType(); int vec3FloatMetaTypeId = qRegisterMetaType(); -int vec3UintMetaTypeId = qRegisterMetaType(); +int vec3UintMetaTypeId = qRegisterMetaType(); int vec4MetaTypeId = qRegisterMetaType(); int qVectorVec3MetaTypeId = qRegisterMetaType>(); int qVectorQuatMetaTypeId = qRegisterMetaType>(); int qVectorBoolMetaTypeId = qRegisterMetaType>(); int quatMetaTypeId = qRegisterMetaType(); -int xColorMetaTypeId = qRegisterMetaType(); int pickRayMetaTypeId = qRegisterMetaType(); int collisionMetaTypeId = qRegisterMetaType(); int qMapURLStringMetaTypeId = qRegisterMetaType>(); @@ -49,7 +48,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec2FloatToScriptValue, vec2FloatFromScriptValue); qScriptRegisterMetaType(engine, vec3ToScriptValue, vec3FromScriptValue); qScriptRegisterMetaType(engine, vec3FloatToScriptValue, vec3FloatFromScriptValue); - qScriptRegisterMetaType(engine, vec3UIntToScriptValue, vec3UIntFromScriptValue); + qScriptRegisterMetaType(engine, vec3UCharToScriptValue, vec3UCharFromScriptValue); qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, mat4toScriptValue, mat4FromScriptValue); @@ -65,7 +64,6 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, qURLToScriptValue, qURLFromScriptValue); qScriptRegisterMetaType(engine, qColorToScriptValue, qColorFromScriptValue); - qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); qScriptRegisterMetaType(engine, pickRayToScriptValue, pickRayFromScriptValue); qScriptRegisterMetaType(engine, collisionToScriptValue, collisionFromScriptValue); qScriptRegisterMetaType(engine, quuidToScriptValue, quuidFromScriptValue); @@ -208,15 +206,23 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) vec3 = ScriptVec3Float(); } -QScriptValue vec3UIntToScriptValue(QScriptEngine* engine, const ScriptVec3UInt& vec3) { - return engine->newQObject(new ScriptVec3UInt(vec3), QScriptEngine::ScriptOwnership); +QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar& vec3) { + return engine->newQObject(new ScriptVec3UChar(vec3), QScriptEngine::ScriptOwnership); } -void vec3UIntFromScriptValue(const QScriptValue& object, ScriptVec3UInt& vec3) { +void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) { if (object.isQObject()) { auto qObject = object.toQObject(); if (qObject) { - vec3 = *qobject_cast(qObject); + vec3 = *qobject_cast(qObject); + return; + } + } else if (object.isString()) { + QColor qColor(object.toString()); + if (qColor.isValid()) { + vec3.x = (uint8_t)qColor.red(); + vec3.y = (uint8_t)qColor.blue(); + vec3.z = (uint8_t)qColor.green(); return; } } else { @@ -249,7 +255,7 @@ void vec3UIntFromScriptValue(const QScriptValue& object, ScriptVec3UInt& vec3) { vec3.z = z.toVariant().toUInt(); return; } - vec3 = ScriptVec3UInt(); + vec3 = ScriptVec3UChar(); } QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { @@ -296,6 +302,22 @@ glm::vec3 vec3FromVariant(const QVariant& object, bool& valid) { v.y = qvec3.y(); v.z = qvec3.z(); valid = true; + } else if (object.canConvert()) { + QColor qColor(object.toString()); + if (qColor.isValid()) { + v.x = (uint8_t)qColor.red(); + v.y = (uint8_t)qColor.blue(); + v.z = (uint8_t)qColor.green(); + valid = true; + } + } else if (object.canConvert()) { + QColor qColor = qvariant_cast(object); + if (qColor.isValid()) { + v.x = (uint8_t)qColor.red(); + v.y = (uint8_t)qColor.blue(); + v.z = (uint8_t)qColor.green(); + valid = true; + } } else { auto map = object.toMap(); auto x = map["x"]; @@ -684,14 +706,6 @@ void qRectFromScriptValue(const QScriptValue &object, QRect& rect) { rect.setHeight(object.property("height").toVariant().toInt()); } -QScriptValue xColorToScriptValue(QScriptEngine *engine, const xColor& color) { - QScriptValue obj = engine->newObject(); - obj.setProperty("red", color.red); - obj.setProperty("green", color.green); - obj.setProperty("blue", color.blue); - return obj; -} - /**jsdoc * Defines a rectangular portion of an image or screen. * @typedef {object} Rect @@ -731,86 +745,6 @@ QRect qRectFromVariant(const QVariant& object) { return qRectFromVariant(object, valid); } - -void xColorFromScriptValue(const QScriptValue &object, xColor& color) { - if (!object.isValid()) { - return; - } - if (object.isNumber()) { - color.red = color.green = color.blue = (uint8_t)object.toUInt32(); - } else if (object.isString()) { - QColor qcolor(object.toString()); - if (qcolor.isValid()) { - color.red = (uint8_t)qcolor.red(); - color.blue = (uint8_t)qcolor.blue(); - color.green = (uint8_t)qcolor.green(); - } - } else { - color.red = object.property("red").toVariant().toInt(); - color.green = object.property("green").toVariant().toInt(); - color.blue = object.property("blue").toVariant().toInt(); - } -} - -/**jsdoc - * An RGB color value. - * @typedef {object} Color - * @property {number} red - Red component value. Integer in the range 0 - 255. - * @property {number} green - Green component value. Integer in the range 0 - 255. - * @property {number} blue - Blue component value. Integer in the range 0 - 255. - */ -QVariant xColorToVariant(const xColor& color) { - QVariantMap obj; - obj["red"] = color.red; - obj["green"] = color.green; - obj["blue"] = color.blue; - return obj; -} - -xColor xColorFromVariant(const QVariant &object, bool& isValid) { - isValid = false; - xColor color { 0, 0, 0 }; - if (!object.isValid()) { - return color; - } - if (object.canConvert()) { - isValid = true; - color.red = color.green = color.blue = (uint8_t)object.toInt(); - } else if (object.canConvert()) { - QColor qcolor(object.toString()); - if (qcolor.isValid()) { - isValid = true; - color.red = (uint8_t)qcolor.red(); - color.blue = (uint8_t)qcolor.blue(); - color.green = (uint8_t)qcolor.green(); - } - } else if (object.canConvert()) { - QColor qcolor = qvariant_cast(object); - if (qcolor.isValid()) { - isValid = true; - color.red = (uint8_t)qcolor.red(); - color.blue = (uint8_t)qcolor.blue(); - color.green = (uint8_t)qcolor.green(); - } - } else { - QVariantMap map = object.toMap(); - color.red = map["red"].toInt(&isValid); - if (isValid) { - color.green = map["green"].toInt(&isValid); - } - if (isValid) { - color.blue = map["blue"].toInt(&isValid); - } - } - return color; -} - -xColor xColorFromVariant(const QVariant &object) { - bool valid; - return xColorFromVariant(object, valid); -} - - QScriptValue qColorToScriptValue(QScriptEngine* engine, const QColor& color) { QScriptValue object = engine->newObject(); object.setProperty("red", color.red()); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index eca7552e23..89118dc91b 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -33,7 +33,6 @@ class QUrl; Q_DECLARE_METATYPE(glm::vec4) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(glm::mat4) -Q_DECLARE_METATYPE(xColor) Q_DECLARE_METATYPE(QVector) Q_DECLARE_METATYPE(AACube) Q_DECLARE_METATYPE(std::function); @@ -67,10 +66,10 @@ public: ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } - inline bool operator==(const ScriptVec2Float& other) { return (x == other.x && y == other.y); } - inline bool operator!=(const ScriptVec2Float& other) { return !(*this == other); } - inline bool operator==(const glm::vec2& other) { return (x == other.x && y == other.y); } - inline bool operator!=(const glm::vec2& other) { return !(*this == other); } + inline bool operator==(const ScriptVec2Float& other) const { return (x == other.x && y == other.y); } + inline bool operator!=(const ScriptVec2Float& other) const { return !(*this == other); } + inline bool operator==(const glm::vec2& other) const { return (x == other.x && y == other.y); } + inline bool operator!=(const glm::vec2& other) const { return !(*this == other); } glm::vec2 toGlm() const { return glm::vec2(x, y); } Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y" }).toObject().toVariantMap(); } @@ -128,8 +127,8 @@ public: void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } inline bool operator!=(const ScriptVec3Float& other) const { return !(*this == other); } - inline bool operator==(const glm::vec3& other) { return (x == other.x && y == other.y && z == other.z); } - inline bool operator!=(const glm::vec3& other) { return !(*this == other); } + inline bool operator==(const glm::vec3& other) const { return (x == other.x && y == other.y && z == other.z); } + inline bool operator!=(const glm::vec3& other) const { return !(*this == other); } glm::vec3 toGlm() const { return glm::vec3(x, y, z); } Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } @@ -160,7 +159,7 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) * @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g and green. * @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b and blue. */ -class ScriptVec3UInt : public QObject { +class ScriptVec3UChar : public QObject { Q_OBJECT Q_PROPERTY(unsigned int x MEMBER x) Q_PROPERTY(unsigned int y MEMBER y) @@ -172,31 +171,35 @@ class ScriptVec3UInt : public QObject { Q_PROPERTY(unsigned int green MEMBER y) Q_PROPERTY(unsigned int blue MEMBER z) public: - ScriptVec3UInt() {} - ScriptVec3UInt(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} - ScriptVec3UInt(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} - ScriptVec3UInt(const ScriptVec3UInt& other) : x(other.x), y(other.y), z(other.z) {} - void operator=(const ScriptVec3UInt& other) { x = other.x; y = other.y; z = other.z; } - inline bool operator==(const ScriptVec3UInt& other) { return (x == other.x && y == other.y && z == other.z); } - inline bool operator!=(const ScriptVec3UInt& other) { return !(*this == other); } + ScriptVec3UChar() {} + ScriptVec3UChar(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} + ScriptVec3UChar(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} + ScriptVec3UChar(const ScriptVec3UChar& other) : x(other.x), y(other.y), z(other.z) {} + ScriptVec3UChar(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} + void operator=(const ScriptVec3UChar& other) { x = other.x; y = other.y; z = other.z; } + inline bool operator==(const ScriptVec3UChar& other) const { return (x == other.x && y == other.y && z == other.z); } + inline bool operator!=(const ScriptVec3UChar& other) const { return !(*this == other); } + glm::vec3 toGlm() const { return glm::vec3(x, y, z); } Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } - unsigned int x { 0 }; - unsigned int y { 0 }; - unsigned int z { 0 }; + unsigned char x { 0 }; + unsigned char y { 0 }; + unsigned char z { 0 }; private: - friend QDebug operator<<(QDebug debug, const ScriptVec3UInt& vec3); + friend QDebug operator<<(QDebug debug, const ScriptVec3UChar& vec3); + friend bool operator==(glm::vec3 glmVec3, const ScriptVec3UChar& vec3); + friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3UChar& vec3); }; -inline QDebug operator<<(QDebug debug, const ScriptVec3UInt& vec3) { +inline QDebug operator<<(QDebug debug, const ScriptVec3UChar& vec3) { debug << "(" << vec3.x << "," << vec3.y << "," << vec3.z << ")"; return debug; } -inline bool operator==(glm::vec3 glmVec3, const ScriptVec3UInt& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } -inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3UInt& vec3) { return !(glmVec3 == vec3); } -Q_DECLARE_METATYPE(ScriptVec3UInt) -QScriptValue vec3UIntToScriptValue(QScriptEngine* engine, const ScriptVec3UInt& vec3); -void vec3UIntFromScriptValue(const QScriptValue& object, ScriptVec3UInt& vec3); +inline bool operator==(glm::vec3 glmVec3, const ScriptVec3UChar& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } +inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3UChar& vec3) { return !(glmVec3 == vec3); } +Q_DECLARE_METATYPE(ScriptVec3UChar) +QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar& vec3); +void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3); Q_DECLARE_METATYPE(glm::vec3) QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); @@ -236,14 +239,6 @@ QRect qRectFromVariant(const QVariant& object, bool& isValid); QRect qRectFromVariant(const QVariant& object); QVariant qRectToVariant(const QRect& rect); - -// xColor -QScriptValue xColorToScriptValue(QScriptEngine* engine, const xColor& color); -void xColorFromScriptValue(const QScriptValue &object, xColor& color); - -QVariant xColorToVariant(const xColor& color); -xColor xColorFromVariant(const QVariant &object, bool& isValid); - // QColor QScriptValue qColorToScriptValue(QScriptEngine* engine, const QColor& color); void qColorFromScriptValue(const QScriptValue& object, QColor& color); diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index bb22a1e753..5c042d87e1 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -24,6 +24,7 @@ #include +#include "RegisteredMetaTypes.h" #ifdef Q_OS_WIN #include @@ -420,7 +421,7 @@ unsigned char* pointToVoxel(float x, float y, float z, float s, unsigned char r, } auto voxelSizeInBytes = bytesRequiredForCodeLength(voxelSizeInOctets); // (voxelSizeInBits/8)+1; - auto voxelBufferSize = voxelSizeInBytes + sizeof(rgbColor); // 3 for color + auto voxelBufferSize = voxelSizeInBytes + sizeof(ScriptVec3UChar); // 3 for color // allocate our resulting buffer unsigned char* voxelOut = new unsigned char[voxelBufferSize]; diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 3b24110f18..f36574bed6 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -80,43 +80,6 @@ const int BYTES_PER_COLOR = 3; const int BYTES_PER_FLAGS = 1; typedef unsigned char colorPart; typedef unsigned char nodeColor[BYTES_PER_COLOR + BYTES_PER_FLAGS]; -typedef unsigned char rgbColor[BYTES_PER_COLOR]; - -inline QDebug& operator<<(QDebug& dbg, const rgbColor& c) { - dbg.nospace() << "{type='rgbColor'" - ", red=" << c[0] << - ", green=" << c[1] << - ", blue=" << c[2] << - "}"; - return dbg; -} - -struct xColor { - xColor() {} - xColor(unsigned char r, unsigned char g, unsigned char b) : red(r), green(g), blue(b) {} - unsigned char red; - unsigned char green; - unsigned char blue; -}; - -inline QDebug& operator<<(QDebug& dbg, const xColor& c) { - dbg.nospace() << "{type='xColor'" - ", red=" << c.red << - ", green=" << c.green << - ", blue=" << c.blue << - "}"; - return dbg; -} - -inline bool operator==(const xColor& lhs, const xColor& rhs) -{ - return (lhs.red == rhs.red) && (lhs.green == rhs.green) && (lhs.blue == rhs.blue); -} - -inline bool operator!=(const xColor& lhs, const xColor& rhs) -{ - return (lhs.red != rhs.red) || (lhs.green != rhs.green) || (lhs.blue != rhs.blue); -} // Use a custom User-Agent to avoid ModSecurity filtering, e.g. by hosting providers. const QByteArray HIGH_FIDELITY_USER_AGENT = "Mozilla/5.0 (HighFidelityInterface)"; diff --git a/libraries/shared/src/shared/JSONHelpers.cpp b/libraries/shared/src/shared/JSONHelpers.cpp index 9cda41ced0..afbdfdbd41 100644 --- a/libraries/shared/src/shared/JSONHelpers.cpp +++ b/libraries/shared/src/shared/JSONHelpers.cpp @@ -80,8 +80,8 @@ QJsonValue toJsonValueHelper(const QVariant& variant, int type) { return toJsonValue(variant.value(), {"x", "y"}); } else if (type == qMetaTypeId()) { return toJsonValue(variant.value(), { "x", "y", "z" }); - } else if (type == qMetaTypeId()) { - return toJsonValue(variant.value(), { "x", "y", "z" }); + } else if (type == qMetaTypeId()) { + return toJsonValue(variant.value(), { "x", "y", "z" }); } else { // Qt types are converted automatically return QJsonValue::fromVariant(variant); From f9cdfbad7c5725f8012d1aec38c36196b9bc9b12 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 12 Jul 2018 12:03:08 -0700 Subject: [PATCH 004/434] cleanup --- interface/src/ui/overlays/Circle3DOverlay.cpp | 1 - interface/src/ui/overlays/Grid3DOverlay.cpp | 2 - .../src/RenderableMaterialEntityItem.cpp | 4 +- libraries/entities/src/EntityItem.cpp | 6 +- .../entities/src/EntityItemProperties.cpp | 373 +++++++++--------- libraries/entities/src/EntityItemProperties.h | 4 +- .../entities/src/EntityItemPropertiesMacros.h | 4 +- libraries/entities/src/EntityTree.cpp | 4 +- libraries/entities/src/LightEntityItem.cpp | 2 +- libraries/entities/src/LightEntityItem.h | 2 +- libraries/entities/src/LineEntityItem.cpp | 2 +- libraries/entities/src/LineEntityItem.h | 2 +- libraries/entities/src/MaterialEntityItem.h | 2 - libraries/entities/src/ModelEntityItem.cpp | 3 +- libraries/entities/src/ModelEntityItem.h | 2 +- .../entities/src/ParticleEffectEntityItem.h | 20 +- libraries/entities/src/PolyLineEntityItem.cpp | 2 +- libraries/entities/src/PolyLineEntityItem.h | 2 +- libraries/entities/src/ShapeEntityItem.cpp | 3 +- libraries/entities/src/ShapeEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 4 +- libraries/entities/src/TextEntityItem.h | 4 +- libraries/octree/src/OctreePacketData.cpp | 68 +++- libraries/octree/src/OctreePacketData.h | 6 +- libraries/shared/src/BufferParser.h | 7 - libraries/shared/src/RegisteredMetaTypes.cpp | 113 +++++- libraries/shared/src/RegisteredMetaTypes.h | 24 +- libraries/shared/src/SpatiallyNestable.cpp | 24 -- libraries/shared/src/SpatiallyNestable.h | 6 +- scripts/system/html/js/entityProperties.js | 84 ++-- 30 files changed, 453 insertions(+), 329 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index f54f1427e8..5287b83cc3 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -75,7 +75,6 @@ void Circle3DOverlay::render(RenderArgs* args) { const float FULL_CIRCLE = 360.0f; const float SLICES = 180.0f; // The amount of segment to create the circle const float SLICE_ANGLE = FULL_CIRCLE / SLICES; - const float MAX_COLOR = 255.0f; auto geometryCache = DependencyManager::get(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index ec3efe1155..5aaefd8a46 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -57,8 +57,6 @@ void Grid3DOverlay::render(RenderArgs* args) { return; // do nothing if we're not visible } - const float MAX_COLOR = 255.0f; - float alpha = getAlpha(); ScriptVec3UChar color = getColor(); glm::vec4 gridColor(toGlm(color), alpha); diff --git a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp index 9173355cc2..985b5c8b9d 100644 --- a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp @@ -31,8 +31,8 @@ void MaterialEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& withWriteLock([&] { _drawMaterial = entity->getMaterial(); _parentID = entity->getParentID(); - _materialMappingPos = entity->getMaterialMappingPosGlm(); - _materialMappingScale = entity->getMaterialMappingScaleGlm(); + _materialMappingPos = entity->getMaterialMappingPos().toGlm(); + _materialMappingScale = entity->getMaterialMappingScale().toGlm(); _materialMappingRot = entity->getMaterialMappingRot(); _renderTransform = getModelTransform(); const float MATERIAL_ENTITY_SCALE = 0.5f; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index e46133ac11..71bd400e53 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1784,11 +1784,9 @@ void EntityItem::setUnscaledDimensions(const glm::vec3& value) { } glm::vec3 EntityItem::getUnscaledDimensions() const { - glm::vec3 result; - withReadLock([&] { - result = _unscaledDimensions; + return resultWithReadLock([&] { + return _unscaledDimensions; }); - return result; } void EntityItem::setRotation(glm::quat rotation) { diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 1f79afcd29..a180e9a6e6 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1260,9 +1260,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL); - // Light, Line, Model, ParticleEffect, PolyLine, Shape - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); - // Particles only if (_type == EntityTypes::ParticleEffect) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMITTING_PARTICLES, isEmitting); @@ -1284,6 +1281,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_SPREAD, radiusSpread); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_START, radiusStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_FINISH, radiusFinish); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_SPREAD, colorSpread); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_START, colorStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_FINISH, colorFinish); @@ -1302,6 +1300,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS, jointTranslations); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RELAY_PARENT_JOINTS, relayParentJoints); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); } if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) { @@ -1318,6 +1317,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (_type == EntityTypes::Box || _type == EntityTypes::Sphere || _type == EntityTypes::Shape) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); } // FIXME - it seems like ParticleEffect should also support this @@ -1332,6 +1332,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Lights only if (_type == EntityTypes::Light) { + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_INTENSITY, intensity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FALLOFF_RADIUS, falloffRadius); @@ -1392,6 +1393,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Lines & PolyLines if (_type == EntityTypes::Line || _type == EntityTypes::PolyLine) { + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals); // Polyline only. @@ -1882,198 +1884,198 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue static std::once_flag initMap; std::call_once(initMap, [](){ - ADD_PROPERTY_TO_MAP(PROP_VISIBLE, visible); - ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, canCastShadow); - ADD_PROPERTY_TO_MAP(PROP_POSITION, position); - ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, dimensions); - ADD_PROPERTY_TO_MAP(PROP_ROTATION, rotation); - ADD_PROPERTY_TO_MAP(PROP_DENSITY, density); - ADD_PROPERTY_TO_MAP(PROP_VELOCITY, velocity); - ADD_PROPERTY_TO_MAP(PROP_GRAVITY, gravity); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, acceleration); - ADD_PROPERTY_TO_MAP(PROP_DAMPING, damping); - ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, restitution); - ADD_PROPERTY_TO_MAP(PROP_FRICTION, friction); - ADD_PROPERTY_TO_MAP(PROP_LIFETIME, lifetime); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT, script); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); - ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, serverScripts); - ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, collisionSoundURL); - ADD_PROPERTY_TO_MAP(PROP_COLOR, color); - ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, colorSpread); - ADD_PROPERTY_TO_MAP(PROP_COLOR_START, colorStart); - ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, colorFinish); - ADD_PROPERTY_TO_MAP(PROP_ALPHA, alpha); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, alphaSpread); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, alphaStart); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, alphaFinish); - ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail); - ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, modelURL); - ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); - ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, registrationPoint); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, angularVelocity); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, angularDamping); - ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, collisionless); - ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, ignoreForCollisions); // legacy support - ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, collisionMask); - ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, collidesWith); - ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, collisionsWillMove); // legacy support - ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, dynamic); - ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, isSpotlight); - ADD_PROPERTY_TO_MAP(PROP_INTENSITY, intensity); - ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, falloffRadius); - ADD_PROPERTY_TO_MAP(PROP_EXPONENT, exponent); - ADD_PROPERTY_TO_MAP(PROP_CUTOFF, cutoff); - ADD_PROPERTY_TO_MAP(PROP_LOCKED, locked); - ADD_PROPERTY_TO_MAP(PROP_TEXTURES, textures); - ADD_PROPERTY_TO_MAP(PROP_USER_DATA, userData); - ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, simulationOwner); - ADD_PROPERTY_TO_MAP(PROP_TEXT, text); - ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, lineHeight); - ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, textColor); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, backgroundColor); - ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, shapeType); - ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, maxParticles); - ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, lifespan); - ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, isEmitting); - ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, emitRate); - ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, emitSpeed); - ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, speedSpread); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, emitOrientation); - ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, emitDimensions); - ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, emitRadiusStart); - ADD_PROPERTY_TO_MAP(PROP_POLAR_START, polarStart); - ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, polarFinish); - ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, azimuthStart); - ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, azimuthFinish); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, emitAcceleration); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, accelerationSpread); - ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, particleRadius); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, radiusSpread); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, radiusStart); - ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, radiusFinish); + ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); + ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); + ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, glm::quat); + ADD_PROPERTY_TO_MAP(PROP_DENSITY, Density, density, float); + ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_DAMPING, Damping, damping, float); + ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, Restitution, restitution, float); + ADD_PROPERTY_TO_MAP(PROP_FRICTION, Friction, friction, float); + ADD_PROPERTY_TO_MAP(PROP_LIFETIME, Lifetime, lifetime, float); + ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString); + ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); + ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); + ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); + ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); + ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool); + ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString); + ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); + ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); + ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, Collisionless, collisionless, bool); + ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, unused, ignoreForCollisions, unused); // legacy support + ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collisionMask, unused); + ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collidesWith, unused); + ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, collisionsWillMove, unused); // legacy support + ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, dynamic, unused); + ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool); + ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float); + ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float); + ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float); + ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float); + ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool); + ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString); + ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString); + ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); + ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); + ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); + ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); + ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); + ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float); + ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); + ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, EmitRate, emitRate, float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat); + ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); + ADD_PROPERTY_TO_MAP(PROP_POLAR_START, EmitPolarStart, polarStart, float); + ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, EmitPolarFinish, polarFinish, float); + ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, EmitAzimuthStart, azimuthStart, float); + ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, EmitAzimuthFinish, azimuthFinish, float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); + ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, materialURL); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, materialMappingMode); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, priority); - ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, parentMaterialName); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, materialMappingPos); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, materialMappingScale); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, materialMappingRot); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, materialData); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, MaterialURL, materialURL, QString); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16); + ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2UChar); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2UChar); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString); - ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); + ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool); // Certifiable Properties - ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, itemName); - ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, itemDescription); - ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, itemCategories); - ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, itemArtist); - ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, itemLicense); - ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, limitedRun); - ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, marketplaceID); - ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, editionNumber); - ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); - ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, certificateID); - ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); + ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString); + ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); + ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); + ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); + ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, keyLightColor); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, keyLightIntensity); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, keyLightDirection); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, keyLightCastShadows); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, voxelData); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle); - ADD_PROPERTY_TO_MAP(PROP_NAME, name); - ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, sourceUrl); - ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, lineWidth); - ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, linePoints); - ADD_PROPERTY_TO_MAP(PROP_HREF, href); - ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, description); - ADD_PROPERTY_TO_MAP(PROP_FACE_CAMERA, faceCamera); - ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, actionData); - ADD_PROPERTY_TO_MAP(PROP_NORMALS, normals); - ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, strokeColors); - ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, strokeWidths); - ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); - ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, xTextureURL); - ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, yTextureURL); - ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, zTextureURL); - ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, xNNeighborID); - ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, yNNeighborID); - ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, zNNeighborID); - ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, xPNeighborID); - ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); - ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); + ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); + ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); + ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, LineWidth, lineWidth, float); + ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); + ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString); + ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString); + ADD_PROPERTY_TO_MAP(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); + ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); + ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); + ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); + ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, parentID); - ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, parentJointIndex); + ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid); + ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, localPosition); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, localRotation); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, localVelocity); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, localDimensions); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, glm::quat); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, jointRotations); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, jointTranslations); - ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, relayParentJoints); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); + ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool); - ADD_PROPERTY_TO_MAP(PROP_SHAPE, shape); + ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, animation, url); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, animation, fps); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, animation, currentFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, animation, running); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, animation, loop); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, animation, firstFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, animation, lastFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, animation, hold); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, animation, allowTranslation); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation); - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, skybox, color); - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, skybox, url); + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url); - ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, flyingAllowed); - ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, ghostingAllowed); - ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, filterURL); + ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool); + ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool); + ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString); - ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, hazeMode); + ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, haze, hazeRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, haze, hazeColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, haze, hazeGlareColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, haze, hazeEnableGlare); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, haze, hazeGlareAngle); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, haze, hazeAltitudeEfect); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, haze, hazeCeiling); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, haze, hazeBaseRef); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, haze, hazeBackgroundBlend); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, haze, hazeAttenuateKeyLight); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, haze, hazeKeyLightRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, haze, hazeKeyLightAltitude); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude); - ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, keyLightMode); - ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, ambientLightMode); - ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, skyboxMode); + ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_DPI, dpi); + ADD_PROPERTY_TO_MAP(PROP_DPI, DPI, dpi, uint16_t); - ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, cloneable); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, cloneLifetime); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, cloneLimit); - ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, cloneDynamic); - ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); - ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, cloneOriginID); + ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float); + ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid); // FIXME - these are not yet handled - //ADD_PROPERTY_TO_MAP(PROP_CREATED, created); + //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64); }); @@ -2209,7 +2211,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp()); APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts()); - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, properties.getRegistrationPoint()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping()); @@ -2244,6 +2245,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); _staticAnimation.setProperties(properties); _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -2256,6 +2258,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy } if (properties.getType() == EntityTypes::Light) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity()); APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius()); @@ -2284,6 +2287,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_RADIUS_SPREAD, properties.getRadiusSpread()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, properties.getRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, properties.getRadiusFinish()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, properties.getColorSpread()); APPEND_ENTITY_PROPERTY(PROP_COLOR_START, properties.getColorStart()); APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, properties.getColorFinish()); @@ -2335,11 +2339,13 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy } if (properties.getType() == EntityTypes::Line) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); } if (properties.getType() == EntityTypes::PolyLine) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getPackedNormals()); @@ -2354,6 +2360,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); } // Materials @@ -2460,7 +2467,7 @@ QByteArray EntityItemProperties::packNormals(const QVector& nor int index = 1; for (int i = 0; i < normalsSize; i++) { - int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, glm::vec3(normals[i].x, normals[i].y, normals[i].z), 15); + int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, normals[i].toGlm(), 15); index += numBytes; } return packedNormals; @@ -2584,7 +2591,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, ScriptVec3Float, setAngularVelocity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); @@ -2619,6 +2625,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); @@ -2659,6 +2666,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_SPREAD, float, setRadiusSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, ScriptVec3UChar, setColorSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, ScriptVec3Float, setColorStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); @@ -2704,12 +2712,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Line) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } if (properties.getType() == EntityTypes::PolyLine) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals); @@ -2725,6 +2735,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); } // Materials @@ -2804,7 +2815,7 @@ QVector EntityItemProperties::unpackStrokeColors(const QByteArr float r = (uint8_t)strokeColors[i++] / 255.0f; float g = (uint8_t)strokeColors[i++] / 255.0f; float b = (uint8_t)strokeColors[i++] / 255.0f; - unpackedStrokeColors[j++] = vec3(r, g, b); + unpackedStrokeColors[j++] = ScriptVec3Float(r, g, b); } } else { qCDebug(entities) << "WARNING - Expected received size for stroke colors does not match. Expected: " @@ -3060,17 +3071,15 @@ void EntityItemProperties::markAllChanged() { AABox EntityItemProperties::getAABox() const { // _position represents the position of the registration point. - glm::vec3 registrationPoint = glm::vec3(_registrationPoint.x, _registrationPoint.y, _registrationPoint.z); - glm::vec3 registrationRemainder = glm::vec3(1.0f) - registrationPoint; + glm::vec3 registrationRemainder = glm::vec3(1.0f) - _registrationPoint.toGlm(); - glm::vec3 dimensions = glm::vec3(_dimensions.x, _dimensions.y, _dimensions.z); - glm::vec3 unrotatedMinRelativeToEntity = - (dimensions * registrationPoint); - glm::vec3 unrotatedMaxRelativeToEntity = dimensions * registrationRemainder; + glm::vec3 unrotatedMinRelativeToEntity = - (_dimensions.toGlm() * _registrationPoint.toGlm()); + glm::vec3 unrotatedMaxRelativeToEntity = _dimensions.toGlm() * registrationRemainder; Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(_rotation); // shift the extents to be relative to the position/registration point - rotatedExtentsRelativeToRegistrationPoint.shiftBy(glm::vec3(_position.x, _position.y, _position.z)); + rotatedExtentsRelativeToRegistrationPoint.shiftBy(_position.toGlm()); return AABox(rotatedExtentsRelativeToRegistrationPoint); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index ff08fb531d..23c0707d06 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -314,10 +314,10 @@ public: void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; } void markAllChanged(); - const glm::vec3& getNaturalDimensions() const { return _naturalDimensions.toGlm(); } + glm::vec3 getNaturalDimensions() const { return _naturalDimensions.toGlm(); } void setNaturalDimensions(const glm::vec3& value) { _naturalDimensions = value; } - const glm::vec3& getNaturalPosition() const { return _naturalPosition.toGlm(); } + glm::vec3 getNaturalPosition() const { return _naturalPosition.toGlm(); } void calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max); const QVariantMap& getTextureNames() const { return _textureNames; } diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 09bee26040..fed06b43f5 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -369,10 +369,10 @@ inline glm::quat quat_convertFromScriptValue(const QScriptValue& v, bool& isVali T _##n; \ static T _static##N; -#define ADD_PROPERTY_TO_MAP(P, n) \ +#define ADD_PROPERTY_TO_MAP(P, N, n, T) \ _propertyStringsToEnums[#n] = P; -#define ADD_GROUP_PROPERTY_TO_MAP(P, g, n) \ +#define ADD_GROUP_PROPERTY_TO_MAP(P, G, g, N, n) \ _propertyStringsToEnums[#g "." #n] = P; #define DEFINE_CORE(N, n, T, V) \ diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index f2241904ff..f264136f5a 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1159,9 +1159,9 @@ bool EntityTree::filterProperties(EntityItemPointer& existingEntity, EntityItemP bool accepted = true; auto entityEditFilters = DependencyManager::get(); if (entityEditFilters) { - auto position = existingEntity ? existingEntity->getWorldPosition() : propertiesIn.getPosition(); + auto position = existingEntity ? existingEntity->getWorldPosition() : propertiesIn.getPosition().toGlm(); auto entityID = existingEntity ? existingEntity->getEntityItemID() : EntityItemID(); - accepted = entityEditFilters->filter(position.toGlm(), propertiesIn, propertiesOut, wasChanged, filterType, entityID, existingEntity); + accepted = entityEditFilters->filter(position, propertiesIn, propertiesOut, wasChanged, filterType, entityID, existingEntity); } return accepted; diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index ab793c4c30..32021551ac 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -213,7 +213,7 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, getFalloffRadius()); } -const ScriptVec3UChar& LightEntityItem::getColor() const { +ScriptVec3UChar LightEntityItem::getColor() const { return resultWithReadLock([&] { return _color; }); diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 0e57015c49..59ac4376c8 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -52,7 +52,7 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const ScriptVec3UChar& getColor() const; + ScriptVec3UChar getColor() const; void setColor(const ScriptVec3UChar& value); bool getIsSpotlight() const; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 21326ad0da..639e4a64e5 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -154,7 +154,7 @@ void LineEntityItem::debugDump() const { qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); } -const ScriptVec3UChar& LineEntityItem::getColor() const { +ScriptVec3UChar LineEntityItem::getColor() const { return resultWithReadLock([&] { return _color; }); diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index 4965514e12..d493af7fc3 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -41,7 +41,7 @@ class LineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const ScriptVec3UChar& getColor() const; + ScriptVec3UChar getColor() const; void setColor(const ScriptVec3UChar& value); void setLineWidth(float lineWidth); diff --git a/libraries/entities/src/MaterialEntityItem.h b/libraries/entities/src/MaterialEntityItem.h index 791989b95e..9920014991 100644 --- a/libraries/entities/src/MaterialEntityItem.h +++ b/libraries/entities/src/MaterialEntityItem.h @@ -67,10 +67,8 @@ public: void setParentMaterialName(const QString& parentMaterialName); ScriptVec2Float getMaterialMappingPos() const { return _materialMappingPos; } - glm::vec2 getMaterialMappingPosGlm() const { return _materialMappingPos; } void setMaterialMappingPos(const ScriptVec2Float& materialMappingPos); ScriptVec2Float getMaterialMappingScale() const { return _materialMappingScale; } - glm::vec2 getMaterialMappingScaleGlm() const { return _materialMappingScale; } void setMaterialMappingScale(const ScriptVec2Float& materialMappingScale); float getMaterialMappingRot() const { return _materialMappingRot; } void setMaterialMappingRot(const float& materialMappingRot); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 5a3bdc7849..cb167983ea 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -147,6 +147,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, EntityPropertyFlags ModelEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + requestedProperties += PROP_COLOR; requestedProperties += PROP_MODEL_URL; requestedProperties += PROP_COMPOUND_SHAPE_URL; requestedProperties += PROP_TEXTURES; @@ -542,7 +543,7 @@ void ModelEntityItem::setColor(const ScriptVec3UChar& value) { }); } -const ScriptVec3UChar& ModelEntityItem::getColor() const { +ScriptVec3UChar ModelEntityItem::getColor() const { return resultWithReadLock([&] { return _color; }); diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 8022e44521..0700fea476 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -57,7 +57,7 @@ public: // TODO: Move these to subclasses, or other appropriate abstraction // getters/setters applicable to models and particles - const ScriptVec3UChar& getColor() const; + ScriptVec3UChar getColor() const; void setColor(const ScriptVec3UChar& value); bool hasModel() const; diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 970315280d..952701d8d4 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -194,7 +194,7 @@ class ParticleEffectEntityItem : public EntityItem { public: ALLOW_INSTANTIATION // This class can be instantiated - static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); ParticleEffectEntityItem(const EntityItemID& entityItemID); @@ -205,17 +205,17 @@ public: virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const override; + EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const override; virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) override; + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) override; void setColor(const ScriptVec3UChar& value); ScriptVec3UChar getColor() const { return _particleProperties.color.gradient.target; } diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 47438bdba0..d5bd204c1f 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -312,7 +312,7 @@ void PolyLineEntityItem::setColor(const ScriptVec3UChar& value) { }); } -const ScriptVec3UChar& PolyLineEntityItem::getColor() const { +ScriptVec3UChar PolyLineEntityItem::getColor() const { return resultWithReadLock([&] { return _color; }); diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index db381e4d01..e68a3cfe1c 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -41,7 +41,7 @@ class PolyLineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - const ScriptVec3UChar& getColor() const; + ScriptVec3UChar getColor() const; void setColor(const ScriptVec3UChar& value); void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index bb56ad7cb9..9047ff67fa 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -215,10 +215,11 @@ void ShapeEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit void ShapeEntityItem::setColor(const ScriptVec3UChar& value) { withWriteLock([&] { _color = value; + _material->setAlbedo(toGlm(_color)); }); } -const ScriptVec3UChar& ShapeEntityItem::getColor() const { +ScriptVec3UChar ShapeEntityItem::getColor() const { return resultWithReadLock([&] { return _color; }); diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index 6796c2f621..5a34b68879 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -77,7 +77,7 @@ public: float getAlpha() const { return _alpha; }; void setAlpha(float alpha); - const ScriptVec3UChar& getColor() const; + ScriptVec3UChar getColor() const; void setColor(const ScriptVec3UChar& value); void setUnscaledDimensions(const glm::vec3& value) override; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index c5e0cf0bb1..2a43c17350 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -174,7 +174,7 @@ void TextEntityItem::setTextColor(const ScriptVec3UChar& value) { }); } -const ScriptVec3UChar& TextEntityItem::getTextColor() const { +ScriptVec3UChar TextEntityItem::getTextColor() const { return resultWithReadLock([&] { return _textColor; }); @@ -186,7 +186,7 @@ void TextEntityItem::setBackgroundColor(const ScriptVec3UChar& value) { }); } -const ScriptVec3UChar& TextEntityItem::getBackgroundColor() const { +ScriptVec3UChar TextEntityItem::getBackgroundColor() const { return resultWithReadLock([&] { return _backgroundColor; }); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index fa6cbdfcf4..94cfa6958b 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -60,11 +60,11 @@ public: float getLineHeight() const; static const ScriptVec3UChar DEFAULT_TEXT_COLOR; - const ScriptVec3UChar& getTextColor() const; + ScriptVec3UChar getTextColor() const; void setTextColor(const ScriptVec3UChar& value); static const ScriptVec3UChar DEFAULT_BACKGROUND_COLOR; - const ScriptVec3UChar& getBackgroundColor() const; + ScriptVec3UChar getBackgroundColor() const; void setBackgroundColor(const ScriptVec3UChar& value); static const bool DEFAULT_FACE_CAMERA; diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 0f3904c09e..5b59990874 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -25,6 +25,23 @@ AtomicUIntStat OctreePacketData::_totalBytesOfValues { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfPositions { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfRawData { 0 }; +struct vec2FloatData { + float x; + float y; +}; + +struct vec3FloatData { + float x; + float y; + float z; +}; + +struct vec3UCharData { + unsigned char x; + unsigned char y; + unsigned char z; +}; + struct aaCubeData { glm::vec3 corner; float scale; @@ -375,8 +392,9 @@ bool OctreePacketData::appendValue(float value) { } bool OctreePacketData::appendValue(const ScriptVec2Float& value) { - const unsigned char* data = (const unsigned char*)&value; - int length = sizeof(value); + vec2FloatData vec { value.x, value.y }; + const unsigned char* data = (const unsigned char*)&vec; + int length = sizeof(vec2FloatData); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -386,8 +404,9 @@ bool OctreePacketData::appendValue(const ScriptVec2Float& value) { } bool OctreePacketData::appendValue(const ScriptVec3Float& value) { - const unsigned char* data = (const unsigned char*)&value; - int length = sizeof(value); + vec3FloatData vec { value.x, value.y, value.z }; + const unsigned char* data = (const unsigned char*)&vec; + int length = sizeof(vec3FloatData); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -396,7 +415,6 @@ bool OctreePacketData::appendValue(const ScriptVec3Float& value) { return success; } - bool OctreePacketData::appendValue(const ScriptVec3UChar& color) { return appendColor(color.x, color.y, color.z); } @@ -405,10 +423,14 @@ bool OctreePacketData::appendValue(const QVector& value) { uint16_t qVecSize = value.size(); bool success = appendValue(qVecSize); if (success) { - success = append((const unsigned char*)value.constData(), qVecSize * sizeof(ScriptVec3Float)); + QVector rawVector(qVecSize); + for (int i = 0; i < qVecSize; i++) { + rawVector[i] = { value[i].x, value[i].y, value[i].z }; + } + success = append((const unsigned char*)rawVector.constData(), qVecSize * sizeof(vec3FloatData)); if (success) { - _bytesOfValues += qVecSize * sizeof(ScriptVec3Float); - _totalBytesOfValues += qVecSize * sizeof(ScriptVec3Float); + _bytesOfValues += qVecSize * sizeof(vec3FloatData); + _totalBytesOfValues += qVecSize * sizeof(vec3FloatData); } } return success; @@ -670,6 +692,27 @@ void OctreePacketData::debugBytes() { qCDebug(octree) << " _bytesReserved=" << _bytesReserved; } +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { + vec2FloatData vec; + memcpy(&vec, dataBytes, sizeof(vec2FloatData)); + result = ScriptVec2Float(vec.x, vec.y); + return sizeof(vec2FloatData); +} + +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { + vec3FloatData vec; + memcpy(&vec, dataBytes, sizeof(vec3FloatData)); + result = ScriptVec3Float(vec.x, vec.y, vec.z); + return sizeof(vec3FloatData); +} + +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result) { + vec3UCharData vec; + memcpy(&vec, dataBytes, sizeof(vec3UCharData)); + result = ScriptVec3UChar(vec.x, vec.y, vec.z); + return sizeof(vec3UCharData); +} + int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QString& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(length)); @@ -698,12 +741,17 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto dataBytes += sizeof(length); // FIXME - this size check is wrong if we allow larger packets - if (length * sizeof(ScriptVec3Float) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { + if (length * sizeof(vec3FloatData) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { result.resize(0); return sizeof(uint16_t); } result.resize(length); - memcpy(result.data(), dataBytes, length * sizeof(ScriptVec3Float)); + QVector rawVector(length); + memcpy(rawVector.data(), dataBytes, length * sizeof(vec3FloatData)); + for (int i = 0; i < length; i++) { + auto v = rawVector[i]; + result[i] = ScriptVec3Float(v.x, v.y, v.z); + } return sizeof(uint16_t) + length * sizeof(ScriptVec3Float); } diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 5ce0d5bea4..2b82712b01 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -250,9 +250,6 @@ public: static quint64 getTotalBytesOfColor() { return _totalBytesOfColor; } /// total bytes of color static int unpackDataFromBytes(const unsigned char* dataBytes, float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, bool& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, quint64& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, uint32_t& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } @@ -261,6 +258,9 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, glm::quat& result) { int bytes = unpackOrientationQuatFromBytes(dataBytes, result); return bytes; } static int unpackDataFromBytes(const unsigned char* dataBytes, ShapeType& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, MaterialMappingMode& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QString& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QUuid& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); diff --git a/libraries/shared/src/BufferParser.h b/libraries/shared/src/BufferParser.h index 73bfa4bfdc..c73356558e 100644 --- a/libraries/shared/src/BufferParser.h +++ b/libraries/shared/src/BufferParser.h @@ -94,13 +94,6 @@ inline void BufferParser::readValue(QUuid& result) { readUuid(result); } -//template<> -//inline void BufferParser::readValue(xColor& result) { -// readValue(result.red); -// readValue(result.blue); -// readValue(result.green); -//} - template<> inline void BufferParser::readValue(QVector& result) { uint16_t length; readValue(length); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 99f38c835e..998db8157c 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -113,8 +113,27 @@ QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { } void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { - vec2.x = object.property("x").toVariant().toFloat(); - vec2.y = object.property("y").toVariant().toFloat(); + auto x = object.property("x"); + if (!x.isValid()) { + x = object.property("u"); + } + if (!x.isValid()) { + x = object.property("width"); + } + auto y = object.property("y"); + if (!y.isValid()) { + y = object.property("v"); + } + if (!y.isValid()) { + y = object.property("height"); + } + if (x.isValid() && y.isValid()) { + vec2.x = x.toVariant().toFloat(); + vec2.y = y.toVariant().toFloat(); + return; + } + + vec2 = glm::vec2(); } QVariant vec2ToVariant(const glm::vec2 &vec2) { @@ -140,10 +159,16 @@ glm::vec2 vec2FromVariant(const QVariant &object, bool& isValid) { } else { auto map = object.toMap(); auto x = map["x"]; + if (!x.isValid()) { + x = map["u"]; + } if (!x.isValid()) { x = map["width"]; } auto y = map["y"]; + if (!y.isValid()) { + y = map["v"]; + } if (!y.isValid()) { y = map["height"]; } @@ -181,6 +206,9 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) if (!x.isValid()) { x = object.property("red"); } + if (!x.isValid()) { + x = object.property("width"); + } QScriptValue y = object.property("y"); if (!y.isValid()) { @@ -189,6 +217,9 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) if (!y.isValid()) { y = object.property("green"); } + if (!y.isValid()) { + y = object.property("height"); + } QScriptValue z = object.property("z"); if (!z.isValid()) { @@ -197,6 +228,9 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) if (!z.isValid()) { z = object.property("blue"); } + if (!z.isValid()) { + z = object.property("depth"); + } vec3.x = x.toVariant().toFloat(); vec3.y = y.toVariant().toFloat(); @@ -233,6 +267,9 @@ void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) if (!x.isValid()) { x = object.property("red"); } + if (!x.isValid()) { + x = object.property("width"); + } QScriptValue y = object.property("y"); if (!y.isValid()) { @@ -241,6 +278,9 @@ void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) if (!y.isValid()) { y = object.property("green"); } + if (!y.isValid()) { + y = object.property("height"); + } QScriptValue z = object.property("z"); if (!z.isValid()) { @@ -249,6 +289,9 @@ void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) if (!z.isValid()) { z = object.property("blue"); } + if (!z.isValid()) { + z = object.property("depth"); + } vec3.x = x.toVariant().toUInt(); vec3.y = y.toVariant().toUInt(); @@ -271,9 +314,45 @@ QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { } void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { - vec3.x = object.property("x").toVariant().toFloat(); - vec3.y = object.property("y").toVariant().toFloat(); - vec3.z = object.property("z").toVariant().toFloat(); + auto x = object.property("x"); + if (!x.isValid()) { + x = object.property("r"); + } + if (!x.isValid()) { + x = object.property("red"); + } + if (!x.isValid()) { + x = object.property("width"); + } + auto y = object.property("y"); + if (!y.isValid()) { + y = object.property("g"); + } + if (!y.isValid()) { + y = object.property("green"); + } + if (!y.isValid()) { + y = object.property("height"); + } + auto z = object.property("z"); + if (!z.isValid()) { + z = object.property("b"); + } + if (!z.isValid()) { + z = object.property("blue"); + } + if (!z.isValid()) { + z = object.property("depth"); + } + if (x.isValid() && y.isValid() && z.isValid()) { + vec3.x = x.toVariant().toFloat(); + vec3.y = y.toVariant().toFloat(); + vec3.z = z.toVariant().toFloat(); + return; + } + + vec3 = glm::vec3(); + return; } QVariant vec3ToVariant(const glm::vec3& vec3) { @@ -321,15 +400,33 @@ glm::vec3 vec3FromVariant(const QVariant& object, bool& valid) { } else { auto map = object.toMap(); auto x = map["x"]; - auto y = map["y"]; - auto z = map["z"]; + if (!x.isValid()) { + x = map["r"]; + } + if (!x.isValid()) { + x = map["red"]; + } if (!x.isValid()) { x = map["width"]; } + auto y = map["y"]; + if (!y.isValid()) { + y = map["g"]; + } + if (!y.isValid()) { + y = map["green"]; + } if (!y.isValid()) { y = map["height"]; } - if (!y.isValid()) { + auto z = map["z"]; + if (!z.isValid()) { + z = map["b"]; + } + if (!z.isValid()) { + z = map["blue"]; + } + if (!z.isValid()) { z = map["depth"]; } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 89118dc91b..712e63a26a 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -63,7 +63,7 @@ public: ScriptVec2Float() {} ScriptVec2Float(float xy) : x(xy), y(xy) {} ScriptVec2Float(float x, float y) : x(x), y(y) {} - ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} + ScriptVec2Float(const ScriptVec2Float& other) : QObject(), x(other.x), y(other.y) {} ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } inline bool operator==(const ScriptVec2Float& other) const { return (x == other.x && y == other.y); } @@ -103,9 +103,9 @@ glm::vec2 vec2FromVariant(const QVariant& object); * A 3-dimensional vector. See also the {@link Vec3(0)|Vec3} object. * * @typedef {object} Vec3 -* @property {number} x - X-coordinate of the vector. Synonyms: r and red. -* @property {number} y - Y-coordinate of the vector. Synonyms: g and green. -* @property {number} z - Z-coordinate of the vector. Synonyms: b and blue. +* @property {number} x - X-coordinate of the vector. Synonyms: r, red, and width. +* @property {number} y - Y-coordinate of the vector. Synonyms: g, green, and height. +* @property {number} z - Z-coordinate of the vector. Synonyms: b, blue, and depth. */ class ScriptVec3Float : public QObject { Q_OBJECT @@ -118,11 +118,14 @@ class ScriptVec3Float : public QObject { Q_PROPERTY(float red MEMBER x) Q_PROPERTY(float green MEMBER y) Q_PROPERTY(float blue MEMBER z) + Q_PROPERTY(float width MEMBER x) + Q_PROPERTY(float height MEMBER y) + Q_PROPERTY(float depth MEMBER z) public: ScriptVec3Float() {} ScriptVec3Float(float xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3Float(float x, float y, float z) : x(x), y(y), z(z) {} - ScriptVec3Float(const ScriptVec3Float& other) : x(other.x), y(other.y), z(other.z) {} + ScriptVec3Float(const ScriptVec3Float& other) : QObject(), x(other.x), y(other.y), z(other.z) {} ScriptVec3Float(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } @@ -155,9 +158,9 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) * A color vector. See also the {@link Vec3(0)|Vec3} object. * * @typedef {object} Vec3Color -* @property {number} x - Red component value. Integer in the range 0 - 255. Synonyms: r and red. -* @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g and green. -* @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b and blue. +* @property {number} x - Red component value. Integer in the range 0 - 255. Synonyms: r, red, and width. +* @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g, green, and height. +* @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b, blue, and depth. */ class ScriptVec3UChar : public QObject { Q_OBJECT @@ -170,11 +173,14 @@ class ScriptVec3UChar : public QObject { Q_PROPERTY(unsigned int red MEMBER x) Q_PROPERTY(unsigned int green MEMBER y) Q_PROPERTY(unsigned int blue MEMBER z) + Q_PROPERTY(unsigned int width MEMBER x) + Q_PROPERTY(unsigned int height MEMBER y) + Q_PROPERTY(unsigned int depth MEMBER z) public: ScriptVec3UChar() {} ScriptVec3UChar(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3UChar(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} - ScriptVec3UChar(const ScriptVec3UChar& other) : x(other.x), y(other.y), z(other.z) {} + ScriptVec3UChar(const ScriptVec3UChar& other) : QObject(), x(other.x), y(other.y), z(other.z) {} ScriptVec3UChar(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3UChar& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3UChar& other) const { return (x == other.x && y == other.y && z == other.z); } diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index ffe0f2e6eb..ccb275ffc9 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -886,14 +886,6 @@ glm::vec3 SpatiallyNestable::getLocalPosition() const { return result; } -ScriptVec3Float SpatiallyNestable::getScriptLocalPosition() const { - ScriptVec3Float result; - _transformLock.withReadLock([&] { - result = _transform.getTranslation(); - }); - return result; -} - void SpatiallyNestable::setLocalPosition(const glm::vec3& position, bool tellPhysics) { // guard against introducing NaN into the transform if (isNaN(position)) { @@ -948,14 +940,6 @@ glm::vec3 SpatiallyNestable::getLocalVelocity() const { return result; } -ScriptVec3Float SpatiallyNestable::getScriptLocalVelocity() const { - ScriptVec3Float result; - _velocityLock.withReadLock([&] { - result = _velocity; - }); - return result; -} - void SpatiallyNestable::setLocalVelocity(const glm::vec3& velocity) { _velocityLock.withWriteLock([&] { _velocity = velocity; @@ -970,14 +954,6 @@ glm::vec3 SpatiallyNestable::getLocalAngularVelocity() const { return result; } -ScriptVec3Float SpatiallyNestable::getScriptLocalAngularVelocity() const { - ScriptVec3Float result; - _angularVelocityLock.withReadLock([&] { - result = _angularVelocity; - }); - return result; -} - void SpatiallyNestable::setLocalAngularVelocity(const glm::vec3& angularVelocity) { _angularVelocityLock.withWriteLock([&] { _angularVelocity = angularVelocity; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index ada56177b3..494283be2b 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -137,18 +137,18 @@ public: virtual void setLocalTransform(const Transform& transform); virtual glm::vec3 getLocalPosition() const; - virtual ScriptVec3Float getScriptLocalPosition() const; + virtual ScriptVec3Float getScriptLocalPosition() const { return getLocalPosition(); } virtual void setLocalPosition(const glm::vec3& position, bool tellPhysics = true); virtual glm::quat getLocalOrientation() const; virtual void setLocalOrientation(const glm::quat& orientation); virtual glm::vec3 getLocalVelocity() const; - virtual ScriptVec3Float getScriptLocalVelocity() const; + virtual ScriptVec3Float getScriptLocalVelocity() const { return getLocalVelocity(); } virtual void setLocalVelocity(const glm::vec3& velocity); virtual glm::vec3 getLocalAngularVelocity() const; - virtual ScriptVec3Float getScriptLocalAngularVelocity() const; + virtual ScriptVec3Float getScriptLocalAngularVelocity() const { return getLocalAngularVelocity(); } virtual void setLocalAngularVelocity(const glm::vec3& angularVelocity); virtual glm::vec3 getLocalSNScale() const; diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index a6a781b35f..3950ad0524 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -1142,11 +1142,11 @@ function loaded() { if (properties.type === "Shape" || properties.type === "Box" || properties.type === "Sphere" || properties.type === "ParticleEffect") { - elColorRed.value = properties.color.red; - elColorGreen.value = properties.color.green; - elColorBlue.value = properties.color.blue; - elColorControlVariant2.style.backgroundColor = "rgb(" + properties.color.red + "," + - properties.color.green + "," + properties.color.blue + ")"; + elColorRed.value = properties.color.x; + elColorGreen.value = properties.color.y; + elColorBlue.value = properties.color.z; + elColorControlVariant2.style.backgroundColor = "rgb(" + properties.color.x + "," + + properties.color.y + "," + properties.color.z + ")"; } if (properties.type === "Model" || @@ -1183,22 +1183,22 @@ function loaded() { elTextText.value = properties.text; elTextLineHeight.value = properties.lineHeight.toFixed(4); elTextFaceCamera.checked = properties.faceCamera; - elTextTextColor.style.backgroundColor = "rgb(" + properties.textColor.red + "," + - properties.textColor.green + "," + properties.textColor.blue + ")"; - elTextTextColorRed.value = properties.textColor.red; - elTextTextColorGreen.value = properties.textColor.green; - elTextTextColorBlue.value = properties.textColor.blue; - elTextBackgroundColorRed.value = properties.backgroundColor.red; - elTextBackgroundColorGreen.value = properties.backgroundColor.green; - elTextBackgroundColorBlue.value = properties.backgroundColor.blue; + elTextTextColor.style.backgroundColor = "rgb(" + properties.textColor.x + "," + + properties.textColor.y + "," + properties.textColor.z + ")"; + elTextTextColorRed.value = properties.textColor.x; + elTextTextColorGreen.value = properties.textColor.y; + elTextTextColorBlue.value = properties.textColor.z; + elTextBackgroundColorRed.value = properties.backgroundColor.x; + elTextBackgroundColorGreen.value = properties.backgroundColor.y; + elTextBackgroundColorBlue.value = properties.backgroundColor.z; } else if (properties.type === "Light") { elLightSpotLight.checked = properties.isSpotlight; - elLightColor.style.backgroundColor = "rgb(" + properties.color.red + "," + - properties.color.green + "," + properties.color.blue + ")"; - elLightColorRed.value = properties.color.red; - elLightColorGreen.value = properties.color.green; - elLightColorBlue.value = properties.color.blue; + elLightColor.style.backgroundColor = "rgb(" + properties.color.x + "," + + properties.color.y + "," + properties.color.z + ")"; + elLightColorRed.value = properties.color.x; + elLightColorGreen.value = properties.color.y; + elLightColorBlue.value = properties.color.z; elLightIntensity.value = properties.intensity.toFixed(1); elLightFalloffRadius.value = properties.falloffRadius.toFixed(1); @@ -1210,11 +1210,11 @@ function loaded() { elZoneKeyLightModeDisabled.checked = (properties.keyLightMode === 'disabled'); elZoneKeyLightModeEnabled.checked = (properties.keyLightMode === 'enabled'); - elZoneKeyLightColor.style.backgroundColor = "rgb(" + properties.keyLight.color.red + "," + - properties.keyLight.color.green + "," + properties.keyLight.color.blue + ")"; - elZoneKeyLightColorRed.value = properties.keyLight.color.red; - elZoneKeyLightColorGreen.value = properties.keyLight.color.green; - elZoneKeyLightColorBlue.value = properties.keyLight.color.blue; + elZoneKeyLightColor.style.backgroundColor = "rgb(" + properties.keyLight.color.x + "," + + properties.keyLight.color.y + "," + properties.keyLight.color.z + ")"; + elZoneKeyLightColorRed.value = properties.keyLight.color.x; + elZoneKeyLightColorGreen.value = properties.keyLight.color.y; + elZoneKeyLightColorBlue.value = properties.keyLight.color.z; elZoneKeyLightIntensity.value = properties.keyLight.intensity.toFixed(2); elZoneKeyLightDirectionX.value = properties.keyLight.direction.x.toFixed(2); elZoneKeyLightDirectionY.value = properties.keyLight.direction.y.toFixed(2); @@ -1240,24 +1240,24 @@ function loaded() { elZoneHazeModeEnabled.checked = (properties.hazeMode === 'enabled'); elZoneHazeRange.value = properties.haze.hazeRange.toFixed(0); - elZoneHazeColor.style.backgroundColor = "rgb(" + - properties.haze.hazeColor.red + "," + - properties.haze.hazeColor.green + "," + - properties.haze.hazeColor.blue + ")"; + elZoneHazeColor.style.backgroundColor = "rgb(" + + properties.haze.hazeColor.x + "," + + properties.haze.hazeColor.y + "," + + properties.haze.hazeColor.z + ")"; - elZoneHazeColorRed.value = properties.haze.hazeColor.red; - elZoneHazeColorGreen.value = properties.haze.hazeColor.green; - elZoneHazeColorBlue.value = properties.haze.hazeColor.blue; + elZoneHazeColorRed.value = properties.haze.hazeColor.x; + elZoneHazeColorGreen.value = properties.haze.hazeColor.y; + elZoneHazeColorBlue.value = properties.haze.hazeColor.z; elZoneHazeBackgroundBlend.value = properties.haze.hazeBackgroundBlend.toFixed(2); - elZoneHazeGlareColor.style.backgroundColor = "rgb(" + - properties.haze.hazeGlareColor.red + "," + - properties.haze.hazeGlareColor.green + "," + - properties.haze.hazeGlareColor.blue + ")"; + elZoneHazeGlareColor.style.backgroundColor = "rgb(" + + properties.haze.hazeGlareColor.x + "," + + properties.haze.hazeGlareColor.y + "," + + properties.haze.hazeGlareColor.z + ")"; - elZoneHazeGlareColorRed.value = properties.haze.hazeGlareColor.red; - elZoneHazeGlareColorGreen.value = properties.haze.hazeGlareColor.green; - elZoneHazeGlareColorBlue.value = properties.haze.hazeGlareColor.blue; + elZoneHazeGlareColorRed.value = properties.haze.hazeGlareColor.x; + elZoneHazeGlareColorGreen.value = properties.haze.hazeGlareColor.y; + elZoneHazeGlareColorBlue.value = properties.haze.hazeGlareColor.z; elZoneHazeEnableGlare.checked = properties.haze.hazeEnableGlare; elZonehazeGlareAngle.value = properties.haze.hazeGlareAngle.toFixed(0); @@ -1270,11 +1270,11 @@ function loaded() { elShapeType.value = properties.shapeType; elCompoundShapeURL.value = properties.compoundShapeURL; - elZoneSkyboxColor.style.backgroundColor = "rgb(" + properties.skybox.color.red + "," + - properties.skybox.color.green + "," + properties.skybox.color.blue + ")"; - elZoneSkyboxColorRed.value = properties.skybox.color.red; - elZoneSkyboxColorGreen.value = properties.skybox.color.green; - elZoneSkyboxColorBlue.value = properties.skybox.color.blue; + elZoneSkyboxColor.style.backgroundColor = "rgb(" + properties.skybox.color.x + "," + + properties.skybox.color.y + "," + properties.skybox.color.z + ")"; + elZoneSkyboxColorRed.value = properties.skybox.color.x; + elZoneSkyboxColorGreen.value = properties.skybox.color.y; + elZoneSkyboxColorBlue.value = properties.skybox.color.z; elZoneSkyboxURL.value = properties.skybox.url; elZoneFlyingAllowed.checked = properties.flyingAllowed; From 19cf2b0a2975fc3bff15deadec1c6ef1630a1943 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 30 Jul 2018 11:28:59 -0700 Subject: [PATCH 005/434] mukul's changes, enable parabolic teleport --- .../system/assets/models/teleport-cancel.fbx | Bin 177324 -> 0 bytes .../controllers/controllerModules/teleport.js | 78 ++++++------------ 2 files changed, 25 insertions(+), 53 deletions(-) delete mode 100644 scripts/system/assets/models/teleport-cancel.fbx diff --git a/scripts/system/assets/models/teleport-cancel.fbx b/scripts/system/assets/models/teleport-cancel.fbx deleted file mode 100644 index 1c12e28159056cadaafb840f7e449e683489d311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177324 zcmdSC2UHZx6E8gEpn{kK3Zj_FBAF#45(U8sxWE7_o7`P;G@_yc=753`GiGuy5){G6 zRV1iLmYiYXJ3TYNAS`gb|MR`~=6F2A%+#-|s;jH3yQ_OmiM}pG22s*TZ=<9hiArSn zN=ia=ph|HFau9$9t|>-(8`r=@7not_!-Avkg7_c^nmq8@4rYLtCN(?| zUv)~YywK%381k{OrHT0k+&oYY{Mc_=y^D5 zfdN<^2>OM4!Mh12GE7PZAgBlTl+T<-Wx1OOLJ%azH7Eg(0nyil7lNQAxQD!JXr2s{ z$q)n)a8LQoNmNf3Y{Cse&<6Z-8`zmfbup2FAc%!~KEa$sCX<-x%a(qj`mZePOC<<` z1Q0=K3>#Spg7nBR)dglqE@iTaPGlIVArs4Gk}{HtvMQ@3mohz_B;~=MO0uhE71s$s z5MXEt1VKVJ&M*}=p}Nv+rb7^9Or|*z$>2|jYw!(FfGrbd7!X;+h1{qjCP5Iy3#wqq zTTSdOsOSM@yFd^$k*8k>2of}hSww)fozvGlaWDARlUQWf29Te{Jr=O>blMI(vyc}L za4-0EJz4HF2J-w3?zx~T?CVWqxG<47<@h(&uonqfBJ!pW_eMaUMxnq|w2&c}0nXqj zS}|yJn86~!Oci-D4{GLWz>chJCO{BmKy&s4D7Fl;4IneMVKGQlHyfZ5@C*PWAIiDX zXih|itgDmH6AVTZg%JUtFr5De379%C)0VBHqUPZqs-mY#KQ`HdAljmg+| zK=O%0dOM&sU}ZA$3NrEvk_wousmsgDa|@#2|FP!?0nG!uM9{v%24=BHR5#{otb`$+ zANU?7j%J9b+$V_Yd>N{9e&7x1x;`W(;uuL(7Scpbs4UnGM%}py=;)tfWT5Nhva%5# zBqO;|M&sVN_^klpMJ9Kgh@Az!!s1MIl5%Wl>2i z8)qUJHX=HM_yyFv3(eDs3?sJ|o)jmnx(!fEYanD|C^{$#u=4>%{yo~f2@nLjVa$U7 z^VFp{kzguIpGKxJFo#K|F|3XCY=AkVj{!3nMh0HmkxSu(AAjJTwoi}o5NI3%3wER0y>0J zj0CiC%tnzQm`6n`kqV{jbg+gQebN$3$5W%D_a%RF^B5`P%3r_^@l>tI}-;Zb3T2VCzXY`iK~+! z2n1O3K)~7mu^B6KBJdj!A`24W4&M3U;D

m6Oo!b@8BHY-pYgXV?;rK!F9*27^&V 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

pf4{QakR4SQ?k?U>@n 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%0A+wcw$vE7a;M|kN2C>zu;{TX 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

y*>ar`ls37 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 Date: Mon, 16 Jul 2018 09:22:50 -0700 Subject: [PATCH 006/434] trying to fix conversion --- libraries/octree/src/Octree.cpp | 2 + libraries/shared/src/RegisteredMetaTypes.cpp | 209 +++++++++++------- libraries/shared/src/RegisteredMetaTypes.h | 48 +--- .../particle_explorer/hifi-entity-ui.js | 29 ++- .../particle_explorer/particleExplorerTool.js | 6 +- 5 files changed, 153 insertions(+), 141 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 9bb0e25982..747d50c07f 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -939,7 +939,9 @@ bool Octree::toJSONDocument(QJsonDocument* doc, const OctreeElementPointer& elem return false; } + qDebug() << "boop3" << entityDescription; *doc = QJsonDocument::fromVariant(entityDescription); + qDebug() << "boop4" << *doc; return true; } diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 998db8157c..20ee2a52b8 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -25,7 +25,6 @@ #include #include - int glmVec2MetaTypeId = qRegisterMetaType(); int vec2FloatMetaTypeId = qRegisterMetaType(); int glmVec3MetaTypeId = qRegisterMetaType(); @@ -71,38 +70,46 @@ void registerMetaTypes(QScriptEngine* engine) { } QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2) { - return engine->newQObject(new ScriptVec2Float(vec2), QScriptEngine::ScriptOwnership); + auto prototype = engine->globalObject().property("__hifi_vec2_float__"); + if (!prototype.property("defined").toBool()) { + prototype = engine->evaluate( + "__hifi_vec2_float__ = Object.defineProperties({}, { " + "defined: { value: true }," + "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "u: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "v: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "width: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "height: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }" + "})" + ); + } + QScriptValue value = engine->newObject(); + value.setProperty("x", vec2.x); + value.setProperty("y", vec2.y); + value.setPrototype(prototype); + return value; } void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) { - if (object.isQObject()) { - auto qObject = object.toQObject(); - if (qObject) { - vec2 = *qobject_cast(qObject); - return; - } - } else { - QScriptValue x = object.property("x"); - if (!x.isValid()) { - x = object.property("u"); - } - if (!x.isValid()) { - x = object.property("width"); - } - - QScriptValue y = object.property("y"); - if (!y.isValid()) { - y = object.property("v"); - } - if (!y.isValid()) { - y = object.property("height"); - } - - vec2.x = x.toVariant().toFloat(); - vec2.y = y.toVariant().toFloat(); - return; + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("u"); } - vec2 = ScriptVec2Float(); + if (!x.isValid()) { + x = object.property("width"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("v"); + } + if (!y.isValid()) { + y = object.property("height"); + } + + vec2.x = x.toVariant().toFloat(); + vec2.y = y.toVariant().toFloat(); } QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { @@ -152,10 +159,12 @@ glm::vec2 vec2FromVariant(const QVariant &object, bool& isValid) { glm::vec2 result; if (object.canConvert()) { result = glm::vec2(object.toFloat()); + isValid = true; } else if (object.canConvert()) { auto qvec2 = qvariant_cast(object); result.x = qvec2.x(); result.y = qvec2.y(); + isValid = true; } else { auto map = object.toMap(); auto x = map["x"]; @@ -188,70 +197,104 @@ glm::vec2 vec2FromVariant(const QVariant &object) { } QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float& vec3) { - return engine->newQObject(new ScriptVec3Float(vec3), QScriptEngine::ScriptOwnership); + auto prototype = engine->globalObject().property("__hifi_vec3_float__"); + if (!prototype.property("defined").toBool()) { + prototype = engine->evaluate( + "__hifi_vec3_float__ = Object.defineProperties({}, { " + "defined: { value: true }," + "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "2: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "r: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "g: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "b: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "red: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "green: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "blue: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "width: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "height: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "depth: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }" + "})" + ); + } + QScriptValue value = engine->newObject(); + value.setProperty("x", vec3.x); + value.setProperty("y", vec3.y); + value.setProperty("z", vec3.z); + value.setPrototype(prototype); + return value; } void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) { - if (object.isQObject()) { - auto qObject = object.toQObject(); - if (qObject) { - vec3 = *qobject_cast(qObject); - return; - } - } else { - QScriptValue x = object.property("x"); - if (!x.isValid()) { - x = object.property("r"); - } - if (!x.isValid()) { - x = object.property("red"); - } - if (!x.isValid()) { - x = object.property("width"); - } - - QScriptValue y = object.property("y"); - if (!y.isValid()) { - y = object.property("g"); - } - if (!y.isValid()) { - y = object.property("green"); - } - if (!y.isValid()) { - y = object.property("height"); - } - - QScriptValue z = object.property("z"); - if (!z.isValid()) { - z = object.property("b"); - } - if (!z.isValid()) { - z = object.property("blue"); - } - if (!z.isValid()) { - z = object.property("depth"); - } - - vec3.x = x.toVariant().toFloat(); - vec3.y = y.toVariant().toFloat(); - vec3.z = z.toVariant().toFloat(); - return; + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("r"); } - vec3 = ScriptVec3Float(); + if (!x.isValid()) { + x = object.property("red"); + } + if (!x.isValid()) { + x = object.property("width"); + } + + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("g"); + } + if (!y.isValid()) { + y = object.property("green"); + } + if (!y.isValid()) { + y = object.property("height"); + } + + QScriptValue z = object.property("z"); + if (!z.isValid()) { + z = object.property("b"); + } + if (!z.isValid()) { + z = object.property("blue"); + } + if (!z.isValid()) { + z = object.property("depth"); + } + + vec3.x = x.toVariant().toFloat(); + vec3.y = y.toVariant().toFloat(); + vec3.z = z.toVariant().toFloat(); } QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar& vec3) { - return engine->newQObject(new ScriptVec3UChar(vec3), QScriptEngine::ScriptOwnership); + auto prototype = engine->globalObject().property("__hifi_vec3_uchar__"); + if (!prototype.property("defined").toBool()) { + prototype = engine->evaluate( + "__hifi_vec3_uchar__ = Object.defineProperties({}, { " + "defined: { value: true }," + "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "2: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "r: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "g: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "b: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "red: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "green: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "blue: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }," + "width: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," + "height: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," + "depth: { set: function(nv) { return this.z = nv; }, get: function() { return this.z; } }" + "})" + ); + } + QScriptValue value = engine->newObject(); + value.setProperty("x", vec3.x); + value.setProperty("y", vec3.y); + value.setProperty("z", vec3.z); + value.setPrototype(prototype); + return value; } void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) { - if (object.isQObject()) { - auto qObject = object.toQObject(); - if (qObject) { - vec3 = *qobject_cast(qObject); - return; - } - } else if (object.isString()) { + if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = (uint8_t)qColor.red(); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 712e63a26a..2b164f5542 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -53,17 +53,11 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); */ class ScriptVec2Float : public QObject { Q_OBJECT - Q_PROPERTY(float x MEMBER x) - Q_PROPERTY(float y MEMBER y) - Q_PROPERTY(float u MEMBER x) - Q_PROPERTY(float v MEMBER y) - Q_PROPERTY(float width MEMBER x) - Q_PROPERTY(float height MEMBER y) public: ScriptVec2Float() {} ScriptVec2Float(float xy) : x(xy), y(xy) {} ScriptVec2Float(float x, float y) : x(x), y(y) {} - ScriptVec2Float(const ScriptVec2Float& other) : QObject(), x(other.x), y(other.y) {} + ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } inline bool operator==(const ScriptVec2Float& other) const { return (x == other.x && y == other.y); } @@ -72,7 +66,7 @@ public: inline bool operator!=(const glm::vec2& other) const { return !(*this == other); } glm::vec2 toGlm() const { return glm::vec2(x, y); } - Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y" }).toObject().toVariantMap(); } + Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y" }).toVariant(); } float x { 0.0f }; float y { 0.0f }; @@ -82,7 +76,7 @@ private: friend bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2); }; inline QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2) { - debug << "(" << vec2.x << "," << vec2.y << ")"; + debug << "{" << vec2.x << "," << vec2.y << "}"; return debug; } inline bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return (glmVec2.x == vec2.x && glmVec2.y == vec2.y); } @@ -109,23 +103,11 @@ glm::vec2 vec2FromVariant(const QVariant& object); */ class ScriptVec3Float : public QObject { Q_OBJECT - Q_PROPERTY(float x MEMBER x) - Q_PROPERTY(float y MEMBER y) - Q_PROPERTY(float z MEMBER z) - Q_PROPERTY(float r MEMBER x) - Q_PROPERTY(float g MEMBER y) - Q_PROPERTY(float b MEMBER z) - Q_PROPERTY(float red MEMBER x) - Q_PROPERTY(float green MEMBER y) - Q_PROPERTY(float blue MEMBER z) - Q_PROPERTY(float width MEMBER x) - Q_PROPERTY(float height MEMBER y) - Q_PROPERTY(float depth MEMBER z) public: ScriptVec3Float() {} ScriptVec3Float(float xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3Float(float x, float y, float z) : x(x), y(y), z(z) {} - ScriptVec3Float(const ScriptVec3Float& other) : QObject(), x(other.x), y(other.y), z(other.z) {} + ScriptVec3Float(const ScriptVec3Float& other) : x(other.x), y(other.y), z(other.z) {} ScriptVec3Float(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } @@ -134,7 +116,7 @@ public: inline bool operator!=(const glm::vec3& other) const { return !(*this == other); } glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } + Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y", "z" }).toVariant(); } float x { 0.0f }; float y { 0.0f }; @@ -145,7 +127,7 @@ private: friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3Float& vec3); }; inline QDebug operator<<(QDebug debug, const ScriptVec3Float& vec3) { - debug << "(" << vec3.x << "," << vec3.y << "," << vec3.z << ")"; + debug << "{" << vec3.x << "," << vec3.y << "," << vec3.z << "}"; return debug; } inline bool operator==(glm::vec3 glmVec3, const ScriptVec3Float& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } @@ -164,30 +146,18 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) */ class ScriptVec3UChar : public QObject { Q_OBJECT - Q_PROPERTY(unsigned int x MEMBER x) - Q_PROPERTY(unsigned int y MEMBER y) - Q_PROPERTY(unsigned int z MEMBER z) - Q_PROPERTY(unsigned int r MEMBER x) - Q_PROPERTY(unsigned int g MEMBER y) - Q_PROPERTY(unsigned int b MEMBER z) - Q_PROPERTY(unsigned int red MEMBER x) - Q_PROPERTY(unsigned int green MEMBER y) - Q_PROPERTY(unsigned int blue MEMBER z) - Q_PROPERTY(unsigned int width MEMBER x) - Q_PROPERTY(unsigned int height MEMBER y) - Q_PROPERTY(unsigned int depth MEMBER z) public: ScriptVec3UChar() {} ScriptVec3UChar(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3UChar(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} - ScriptVec3UChar(const ScriptVec3UChar& other) : QObject(), x(other.x), y(other.y), z(other.z) {} + ScriptVec3UChar(const ScriptVec3UChar& other) : x(other.x), y(other.y), z(other.z) {} ScriptVec3UChar(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3UChar& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3UChar& other) const { return (x == other.x && y == other.y && z == other.z); } inline bool operator!=(const ScriptVec3UChar& other) const { return !(*this == other); } glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - Q_INVOKABLE QVariantMap toJSON() { return toJsonValue(*this, { "x", "y", "z" }).toObject().toVariantMap(); } + Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y", "z" }).toVariant(); } unsigned char x { 0 }; unsigned char y { 0 }; @@ -198,7 +168,7 @@ private: friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3UChar& vec3); }; inline QDebug operator<<(QDebug debug, const ScriptVec3UChar& vec3) { - debug << "(" << vec3.x << "," << vec3.y << "," << vec3.z << ")"; + debug << "{" << vec3.x << "," << vec3.y << "," << vec3.z << "}"; return debug; } inline bool operator==(glm::vec3 glmVec3, const ScriptVec3UChar& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } diff --git a/scripts/system/particle_explorer/hifi-entity-ui.js b/scripts/system/particle_explorer/hifi-entity-ui.js index 62a0aadc86..3e29e6bcb6 100644 --- a/scripts/system/particle_explorer/hifi-entity-ui.js +++ b/scripts/system/particle_explorer/hifi-entity-ui.js @@ -132,9 +132,9 @@ HifiEntityUI.prototype = { var red = document.getElementById(key + "-red"); var blue = document.getElementById(key + "-blue"); var green = document.getElementById(key + "-green"); - vector.red = red.value; - vector.blue = blue.value; - vector.green = green.value; + vector.x = red.value; + vector.y = blue.value; + vector.z = green.value; } else if (el.className.indexOf("pyr") !== -1) { var p = document.getElementById(key + "-Pitch"); var y = document.getElementById(key + "-Yaw"); @@ -209,15 +209,12 @@ HifiEntityUI.prototype = { } else if (field.className.indexOf("vector-section") !== -1) { if (field.className.indexOf("rgb") !== -1) { var red = document.getElementById(value + "-red"); - var blue = document.getElementById(value + "-blue"); var green = document.getElementById(value + "-green"); - red.value = parseInt(property.red); - blue.value = parseInt(property.blue); - green.value = parseInt(property.green); + var blue = document.getElementById(value + "-blue"); - red.oninput({ - target: red - }); + red.value = parseInt(property.x); + green.value = parseInt(property.y); + blue.value = parseInt(property.z); } else if (field.className.indexOf("xyz") !== -1) { var x = document.getElementById(value + "-x"); var y = document.getElementById(value + "-y"); @@ -468,9 +465,9 @@ HifiEntityUI.prototype = { domArray[1].value = rgb.g; domArray[2].value = rgb.b; self.webBridgeSync(group.id, { - red: rgb.r, - green: rgb.g, - blue: rgb.b + x: rgb.r, + y: rgb.g, + z: rgb.b }); }, onSubmit: function (hsb, hex, rgb, el) { @@ -482,9 +479,9 @@ HifiEntityUI.prototype = { domArray[1].value = rgb.g; domArray[2].value = rgb.b; self.webBridgeSync(group.id, { - red: rgb.r, - green: rgb.g, - blue: rgb.b + x: rgb.r, + y: rgb.g, + z: rgb.b }); } }); diff --git a/scripts/system/particle_explorer/particleExplorerTool.js b/scripts/system/particle_explorer/particleExplorerTool.js index 1914180ff9..34eca86a37 100644 --- a/scripts/system/particle_explorer/particleExplorerTool.js +++ b/scripts/system/particle_explorer/particleExplorerTool.js @@ -69,10 +69,10 @@ ParticleExplorerTool = function(createToolsWindow) { if (isNaN(properties.radiusFinish)) { properties.radiusFinish = properties.particleRadius; } - if (isNaN(properties.colorStart.red)) { + if (isNaN(properties.colorStart.x)) { properties.colorStart = properties.color; } - if (isNaN(properties.colorFinish.red)) { + if (isNaN(properties.colorFinish.x)) { properties.colorFinish = properties.color; } sendParticleProperties(properties); @@ -113,7 +113,7 @@ ParticleExplorerTool = function(createToolsWindow) { var fallbackValue = updatedSettings[fallbackProp]; if (fallbackValue) { var optionalProp = optionalProps[i]; - if ((fallbackProp !== "color" && isNaN(entityProps[optionalProp])) || (fallbackProp === "color" && isNaN(entityProps[optionalProp].red))) { + if ((fallbackProp !== "color" && isNaN(entityProps[optionalProp])) || (fallbackProp === "color" && isNaN(entityProps[optionalProp].x))) { that.updatedActiveParticleProperties[optionalProp] = fallbackValue; needsUpdate = true; } From 41c4ecd465559570743956c991326fb43cdbca23 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Aug 2018 15:20:51 +1200 Subject: [PATCH 007/434] Add HMD play area to API; Oculus and Vive --- .../src/scripting/HMDScriptingInterface.cpp | 9 +++ .../src/scripting/HMDScriptingInterface.h | 11 ++- libraries/plugins/src/plugins/DisplayPlugin.h | 3 + libraries/shared/src/RegisteredMetaTypes.cpp | 79 +++++++++++++++---- libraries/shared/src/RegisteredMetaTypes.h | 6 +- .../oculus/src/OculusBaseDisplayPlugin.cpp | 50 ++++++++++++ plugins/oculus/src/OculusBaseDisplayPlugin.h | 3 + plugins/openvr/src/OpenVrDisplayPlugin.cpp | 33 ++++++++ plugins/openvr/src/OpenVrDisplayPlugin.h | 2 + 9 files changed, 177 insertions(+), 19 deletions(-) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index ad8e265a01..ea24d6c793 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -201,3 +201,12 @@ bool HMDScriptingInterface::isKeyboardVisible() { void HMDScriptingInterface::centerUI() { QMetaObject::invokeMethod(qApp, "centerUI", Qt::QueuedConnection); } + +QVariant HMDScriptingInterface::getPlayAreaRect() { + auto rect = qApp->getActiveDisplayPlugin()->getPlayAreaRect(); + return qRectFToVariant(rect); +} + +QVector HMDScriptingInterface::getSensorPositions() { + return qApp->getActiveDisplayPlugin()->getSensorPositions(); +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 3d7cc5afb2..554bff8fa4 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -56,8 +56,10 @@ class QScriptEngine; * @property {Uuid} tabletID - The UUID of the tablet body model overlay. * @property {Uuid} tabletScreenID - The UUID of the tablet's screen overlay. * @property {Uuid} homeButtonID - The UUID of the tablet's "home" button overlay. - * @property {Uuid} homeButtonHighlightMaterialID - The UUID of the material entity used to highlight tablet button - * @property {Uuid} homeButtonUnhighlightMaterialID - The UUID of the material entity use to unhighlight the entity + * @property {Uuid} homeButtonHighlightMaterialID - The UUID of the material entity used to highlight tablet button. + * @property {Uuid} homeButtonUnhighlightMaterialID - The UUID of the material entity use to unhighlight the tablet button. + * @property {Rect} playArea=0,0,0,0 - The size and position of the HMD play area in sensor coordinates. Read-only. + * @property {Vec3[]} sensorPositions=[]] - The positions of the VR system sensors in sensor coordinates. Read-only. */ class HMDScriptingInterface : public AbstractHMDScriptingInterface, public Dependency { Q_OBJECT @@ -71,6 +73,8 @@ class HMDScriptingInterface : public AbstractHMDScriptingInterface, public Depen Q_PROPERTY(QUuid tabletScreenID READ getCurrentTabletScreenID WRITE setCurrentTabletScreenID) Q_PROPERTY(QUuid homeButtonHighlightMaterialID READ getCurrentHomeButtonHighlightMaterialID WRITE setCurrentHomeButtonHighlightMaterialID) Q_PROPERTY(QUuid homeButtonUnhighlightMaterialID READ getCurrentHomeButtonUnhighlightMaterialID WRITE setCurrentHomeButtonUnhighlightMaterialID) + Q_PROPERTY(QVariant playArea READ getPlayAreaRect); + Q_PROPERTY(QVector sensorPositions READ getSensorPositions); public: @@ -385,6 +389,9 @@ public: void setCurrentHomeButtonUnhighlightMaterialID(QUuid homeButtonUnhighlightMaterialID) { _homeButtonUnhighlightMaterialID = homeButtonUnhighlightMaterialID; } QUuid getCurrentHomeButtonUnhighlightMaterialID() { return _homeButtonUnhighlightMaterialID; } + QVariant getPlayAreaRect(); + QVector getSensorPositions(); + private: bool _showTablet { false }; bool _tabletContextualMode { false }; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index e330f6d7ec..ad49ceafe6 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -112,6 +112,9 @@ public: virtual bool suppressKeyboard() { return false; } virtual void unsuppressKeyboard() {}; virtual bool isKeyboardVisible() { return false; } + + virtual QRectF getPlayAreaRect() { return QRectF(); } + virtual QVector getSensorPositions() { return QVector(); } }; class DisplayPlugin : public Plugin, public HmdDisplay { diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index a9dbe83b06..0c8f4f0466 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -552,6 +552,14 @@ glm::vec2 vec2FromVariant(const QVariant &object) { return vec2FromVariant(object, valid); } +/**jsdoc + * Defines a rectangular portion of an image or screen, or similar. + * @typedef {object} Rect + * @property {number} x - Left, x-coordinate value. + * @property {number} y - Top, y-coordinate value. + * @property {number} width - Width of the rectangle. + * @property {number} height - Height of the rectangle. + */ QScriptValue qRectToScriptValue(QScriptEngine* engine, const QRect& rect) { QScriptValue obj = engine->newObject(); obj.setProperty("x", rect.x()); @@ -568,22 +576,6 @@ void qRectFromScriptValue(const QScriptValue &object, QRect& rect) { rect.setHeight(object.property("height").toVariant().toInt()); } -QScriptValue xColorToScriptValue(QScriptEngine *engine, const xColor& color) { - QScriptValue obj = engine->newObject(); - obj.setProperty("red", color.red); - obj.setProperty("green", color.green); - obj.setProperty("blue", color.blue); - return obj; -} - -/**jsdoc - * Defines a rectangular portion of an image or screen. - * @typedef {object} Rect - * @property {number} x - Integer left, x-coordinate value. - * @property {number} y - Integer top, y-coordinate value. - * @property {number} width - Integer width of the rectangle. - * @property {number} height - Integer height of the rectangle. - */ QVariant qRectToVariant(const QRect& rect) { QVariantMap obj; obj["x"] = rect.x(); @@ -615,6 +607,61 @@ QRect qRectFromVariant(const QVariant& object) { return qRectFromVariant(object, valid); } +QScriptValue qRectFToScriptValue(QScriptEngine* engine, const QRectF& rect) { + QScriptValue obj = engine->newObject(); + obj.setProperty("x", rect.x()); + obj.setProperty("y", rect.y()); + obj.setProperty("width", rect.width()); + obj.setProperty("height", rect.height()); + return obj; +} + +void qRectFFromScriptValue(const QScriptValue &object, QRectF& rect) { + rect.setX(object.property("x").toVariant().toFloat()); + rect.setY(object.property("y").toVariant().toFloat()); + rect.setWidth(object.property("width").toVariant().toFloat()); + rect.setHeight(object.property("height").toVariant().toFloat()); +} + +QVariant qRectFToVariant(const QRectF& rect) { + QVariantMap obj; + obj["x"] = rect.x(); + obj["y"] = rect.y(); + obj["width"] = rect.width(); + obj["height"] = rect.height(); + return obj; +} + +QRectF qRectFFromVariant(const QVariant& objectVar, bool& valid) { + QVariantMap object = objectVar.toMap(); + QRectF rect; + valid = false; + rect.setX(object["x"].toFloat(&valid)); + if (valid) { + rect.setY(object["y"].toFloat(&valid)); + } + if (valid) { + rect.setWidth(object["width"].toFloat(&valid)); + } + if (valid) { + rect.setHeight(object["height"].toFloat(&valid)); + } + return rect; +} + +QRectF qRectFFromVariant(const QVariant& object) { + bool valid; + return qRectFFromVariant(object, valid); +} + + +QScriptValue xColorToScriptValue(QScriptEngine *engine, const xColor& color) { + QScriptValue obj = engine->newObject(); + obj.setProperty("red", color.red); + obj.setProperty("green", color.green); + obj.setProperty("blue", color.blue); + return obj; +} void xColorFromScriptValue(const QScriptValue &object, xColor& color) { if (!object.isValid()) { diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index db63237c73..9952004547 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -97,7 +97,11 @@ void qRectFromScriptValue(const QScriptValue& object, QRect& rect); QRect qRectFromVariant(const QVariant& object, bool& isValid); QRect qRectFromVariant(const QVariant& object); QVariant qRectToVariant(const QRect& rect); - +QScriptValue qRectFToScriptValue(QScriptEngine* engine, const QRectF& rect); +void qRectFFromScriptValue(const QScriptValue& object, QRectF& rect); +QRectF qRectFFromVariant(const QVariant& object, bool& isValid); +QRectF qRectFFromVariant(const QVariant& object); +QVariant qRectFToVariant(const QRectF& rect); // xColor QScriptValue xColorToScriptValue(QScriptEngine* engine, const xColor& color); diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 5aa1e45943..321ee217b9 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -167,3 +167,53 @@ void OculusBaseDisplayPlugin::updatePresentPose() { _currentPresentFrameInfo.presentPose = ovr::toGlm(trackingState.HeadPose.ThePose); _currentPresentFrameInfo.renderPose = _currentPresentFrameInfo.presentPose; } + +QRectF OculusBaseDisplayPlugin::getPlayAreaRect() { + if (!_session) { + return QRectF(); + } + + int floorPointsCount = 0; + auto result = ovr_GetBoundaryGeometry(_session, ovrBoundary_PlayArea, nullptr, &floorPointsCount); + if (!OVR_SUCCESS(result) || floorPointsCount != 4) { + return QRectF(); + } + + auto floorPoints = new ovrVector3f[floorPointsCount]; + result = ovr_GetBoundaryGeometry(_session, ovrBoundary_PlayArea, floorPoints, nullptr); + if (!OVR_SUCCESS(result)) { + return QRectF(); + } + + auto minXZ = ovr::toGlm(floorPoints[0]); + auto maxXZ = minXZ; + for (int i = 1; i < floorPointsCount; i++) { + auto point = ovr::toGlm(floorPoints[i]); + minXZ.x = std::min(minXZ.x, point.x); + minXZ.z = std::min(minXZ.z, point.z); + maxXZ.x = std::max(maxXZ.x, point.x); + maxXZ.z = std::max(maxXZ.z, point.z); + } + + glm::vec2 center = glm::vec2((minXZ.x + maxXZ.x) / 2, (minXZ.z + maxXZ.z) / 2); + glm::vec2 dimensions = glm::vec2(maxXZ.x - minXZ.x, maxXZ.z - minXZ.z); + + return QRectF(center.x, center.y, dimensions.x, dimensions.y); +} + +QVector OculusBaseDisplayPlugin::getSensorPositions() { + if (!_session) { + return QVector(); + } + + QVector result; + auto numTrackers = ovr_GetTrackerCount(_session); + for (uint i = 0; i < numTrackers; i++) { + auto trackerPose = ovr_GetTrackerPose(_session, i); + if (trackerPose.TrackerFlags & ovrTracker_PoseTracked) { + result.append(ovr::toGlm(trackerPose.Pose.Position)); + } + } + + return result; +} diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index d70d14dc28..3c989e8a62 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -27,6 +27,9 @@ public: void resetSensors() override final; bool beginFrameRender(uint32_t frameIndex) override; float getTargetFrameRate() const override { return _hmdDesc.DisplayRefreshRate; } + + QRectF getPlayAreaRect() override; + QVector getSensorPositions() override; protected: void customizeContext() override; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 5e4079cbcf..cef7cbc490 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -765,3 +765,36 @@ QString OpenVrDisplayPlugin::getPreferredAudioOutDevice() const { return device; } +QRectF OpenVrDisplayPlugin::getPlayAreaRect() { + auto chaperone = vr::VRChaperone(); + if (!chaperone) { + qWarning() << "No chaperone"; + return QRectF(); + } + + if (chaperone->GetCalibrationState() >= vr::ChaperoneCalibrationState_Error) { + qWarning() << "Chaperone status =" << chaperone->GetCalibrationState(); + return QRectF(); + } + + vr::HmdQuad_t rect; + if (!chaperone->GetPlayAreaRect(&rect)) { + qWarning() << "Chaperone rect not obtained"; + return QRectF(); + } + + auto minXZ = transformPoint(_sensorResetMat, toGlm(rect.vCorners[0])); + auto maxXZ = minXZ; + for (int i = 1; i < 4; i++) { + auto point = transformPoint(_sensorResetMat, toGlm(rect.vCorners[i])); + minXZ.x = std::min(minXZ.x, point.x); + minXZ.z = std::min(minXZ.z, point.z); + maxXZ.x = std::max(maxXZ.x, point.x); + maxXZ.z = std::max(maxXZ.z, point.z); + } + + glm::vec2 center = glm::vec2((minXZ.x + maxXZ.x) / 2, (minXZ.z + maxXZ.z) / 2); + glm::vec2 dimensions = glm::vec2(maxXZ.x - minXZ.x, maxXZ.z - minXZ.z); + + return QRectF(center.x, center.y, dimensions.x, dimensions.y); +} diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 15a434341d..773b315449 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -64,6 +64,8 @@ public: QString getPreferredAudioInDevice() const override; QString getPreferredAudioOutDevice() const override; + QRectF getPlayAreaRect() override; + protected: bool internalActivate() override; void internalDeactivate() override; From 981b6fc4c9959aff7d5c6a36e93fbefb504d1e28 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Aug 2018 17:18:38 +1200 Subject: [PATCH 008/434] Display play area and sensor about teleport target --- scripts/system/assets/models/oculusSensor.fbx | Bin 0 -> 492876 bytes .../system/assets/models/trackingSpace.fbx | Bin 0 -> 137388 bytes .../controllers/controllerModules/teleport.js | 149 ++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 scripts/system/assets/models/oculusSensor.fbx create mode 100644 scripts/system/assets/models/trackingSpace.fbx diff --git a/scripts/system/assets/models/oculusSensor.fbx b/scripts/system/assets/models/oculusSensor.fbx new file mode 100644 index 0000000000000000000000000000000000000000..a914f1ce2fd3840a2521f3962a1f6b405fa1316a GIT binary patch literal 492876 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ð$9&G>9K2KV-OdU-`ut^PePcQj&z{LyFkBK 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 W_ZiC@gDP7_l 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

osf#0ZZ*Xs#?=OcR&2Ud^h zq5r73$@>bT39fFXs~`A44NVD3O};JRD@AUhcH}#MPmdI_TV{CKT2G1V>6-}Py{p{! zUc^zKZr7;`xg%c^o^uid(p@->!T+ic#uy*7UL}oRo>m17{Fr7so04!>CKDSSye{9lvU4QykIn;K<|cWuR8<~%X)Jza zL9qW?!hWhbc3+{9%!#l=IAp2LCEzk^fyWo-tHJ&?I&Mpp`HDvSa~@qtQ1wOwgZrxf z&iS4xu1m&7Tb|p1h4zEMD*i2K%#`O7y`HF~n1Ka0`HvCEo(CqM0|7xtR-nA(UujKHCn5g#a}471Yn;Yh)RheAs``C5t<9WBX?1C+eux}~be z){@>Lmg9%7vzzaCCd^GF5=}A9a+~QLtCHvs&V`sNe%X|2hxyfuQ>1)f`YAh0qAKbm z-E{u}&jLBg^B2)`h&_0XzdLJ5c`m30F#m#WDJ$~^|6t_DKvK~Gb}&1BEr`Fe`VmPI zWTDd{wyn8qIC=s9OnfgKI)J+frnH>nKOBle=}Md zOq}>__?P@AH!x$$?mKRg1lSFzmKWaXF1~mTc?^VJQU($x8`4Vyl;{&zZNJd(gWfrw z^pIVRgt}Jog(EgQ<)me=d_`<3luP^)PMX<~N{PXh10U&ke#LI> zVY2@ySSfuWPS+kA2nHTh)H_W)`@qBZ0Efk2ugcyCwi9vdxNBQ6SmjC$)G;IQLrq16 z+Zxo%o$k5<*Yelmg;r>PNUhj}AJdCH2RTY?A%x3-24Tm&6x?g^JFS($ z&RyyXmi^l$?*7(#wvEWc{$a+E6A?$|3g(#4U(_GQds=Z8Iq0hiLQXRF} zg*(-*nh)&RWVABuEBQ)9jU~I<1DiqdNd^bd(+MxpJtWJuSgFsw7^A*?_V0P^c113| zI}0fp5!esuQ$2k2SgD&JUYl>TqB7fAvK#ufuV9j%`S2~w`O3IVdP+>lxc`{cRB&bAtJk zeq3*iWq9<+)&OtoVU(B#zUU%`Mcl5Wz-Je?^m;z@8VCRT)%cnJl>oT zA@b;XB3a=G4>(=%=ochL zxU3{r0(tNu+t;zX2^Yn;cyA-HOVsJ24ntL($sf2fazXNruE}i64UY~u7-a4oa=Hhu zP7k|lK?``c2FSB!2()y0PF9cAW)5O@OH1g54XoMlQy{#VC3egO_`#ac#g(_$D!@3NH2xUKgn_z4CF7d~~`a zN4+e>P#jumKd!d;W5ph3<5^k|uGMA<7pqJEz!g|Li!xqNWv-E zqSO2zFTAwm%Mzk_;$!}#QA{j=C6B<*7pojew^4XtdL&_yVyI4YVMr%_Y9*^=f&FyOzs1{x^Ce^85+=*Ras|hfN_JgGZt+xQTu8as5Yq=`- z^T#&aPpxU?BB0Z+#^TETwS+ek#}4_*N^fbwZ#3Ow9oI^dn>Z6oe2#~&A9!Bc6Q=Qd z$B=R&)&y~w&w>8a;=BiSM6bl^O@yAP9N2HqK7P8nCh)_)EdU<(3eZ9n>6`kC&r zjr$y`+1GSF!ZXCMKh|*Pbz<_A%nwv9&iw`(lGql1&f&TD_{*v*<~AgYmcjN=0z z_N4y89zs7`cK!&gWq3pG?UeP8`MNJofV;9%4GaPg`s7FoqvZUE#5DazP=l#cbTEzBx>vLLU3f%_@7hwAoIxOnPgs-^r@4_ zyhAB)NYV5PQ6w)To*~2{#ajf3CEaO;7Zmb`xRs&C(|t*9DMZ|?(3dQ!4}V6j#qWY{ zqGn7>_C7XD>_0k9-{cn~jE%pyo8yZNZTC@kEP)eHQ=2={Y(_KL9DjvhZHB+nwAlYI z!o_V0J8vsb=*4btXQ+AW(T@y?h71f9fddd26d^ z0f0XNE9w!wQkc*-gLt*+G+$b@3t$3f&|>S6$)=()R3rO3%;SZNVm}_a(339d`2?7t zUqK1Y->$`m`hrQ-0n!UVksy0*nHgJ?u%+aT%XSpJdUXfD-6f=UIELHwg zva;85KCFcyNZrdw6Pn~TwUN5QyhIYeE?Gb3xui>x+EDEhhwZKj|8M^HKh6o{S?S@| z%+SxZjCbcL+Gof7k)Ku(ZUSumCEKYL3+TB_+Tb1Djjt#v(C^Ha&y$vG5iT>WS8K7K zVIDSq4~MJw1iS_=lW*4~FT)oq9^}@Wk8dPK8q3H1c{`x?^|WQYpTKuZ{gYZ6JH)(!SdIA*2S)O&_hzkS9X>hp=7KA}_@KEznK+fG#e_ z!GET#B{ms3Zb|0{N--4Sbekey(Pu`!GUhXq3@HcVjQZeIq0(d~^|p9iU^D$RXcW#v z_pd-M81?O==AUlocJBd`k)4b)lcV8S{&t99lv0Z#Ga^{oG^Sz z`G!b$N?TW@rZAwoL?SBlO6zrfIiG-fsaOb;!Co2OKT;tk&ywbwD-y5auMKwFaZJeA$DO_jGFHX}o3iPX9+SuhtyR$ZIZ5xas4R{V@ ziWzd$G$6B4jtQV0QWK0X($|MkO0@U_!q#PY;$^eymB=(mi{ z*k$ZZd8AZxBG*I684YgvZ9VGJB}1y?Kcb_T()hVGA5dGa8X4m92WMku`pT4fJt@aSv0gl>k>G%<`AiURd77*DkZn16^p}0p#H&h>dPmx9$CsVA{ zhld|>xCNcGVSI&6#h6#flF5}%EOWrq8#K+kthr;`^B z3YBhy{@3W+Mn)4JLDQnX-C)v|^D9Q)mTNkx#e4uxZPk^;F2C&>Ku;^o$qk1$C{Ex` z%`fEDhlV(9LHr@y5LkYtZ&(nSI0!CTU6|t!2kAv)o1CKVKc^?6FVW1QN&Z=zn_tDa zf$PQgw+ZWbrmboHxa~u+Ed>Gbw4YMWEtdq^)gPuaHf6-EXvnXM`}3=Egwu2bFWtxb ztn~OxW+(dXRDwSW<7SK=AumvddgfhTP7$4wkD-Q&GU%=oY4xge$^wxO^i%N%8!z24 zrOgrbs}73186KFfxWK2(?POE?B6X(G#hv15>AVtIIF&XAz®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

OhhF~0wjg(gIiV*e^wjbs`~ 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 literal 0 HcmV?d00001 diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 92e3168147..70d43d3c6d 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -183,11 +183,147 @@ Script.include("/~/system/libraries/controllers.js"); maxDistance: 8.0 }); + + this.PLAY_AREA_OVERLAY_OFFSET = { x: 0, y: 0.02, z: 0 }; // Raise above surface to make visible. + this.PLAY_AREA_OVERLAY_IMAGE_SIZE = 256; + this.PLAY_AREA_OVERLAY_IMAGE_RECTANGLE = 250; // Size of rectangle within image. + this.PLAY_AREA_OVERLAY_SCALE = this.PLAY_AREA_OVERLAY_IMAGE_SIZE / this.PLAY_AREA_OVERLAY_IMAGE_RECTANGLE; + this.playArea = { x: 0, y: 0 }; + this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; + this.isPlayAreaVisible = false; + this.isPlayAreaAvailable = false; + + this.playAreaSensorPositions = []; + this.playAreaSensorPositionOverlays = []; + this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpace.fbx"); + this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; + this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT = this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y + / this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.x; + this.PLAY_AREA_SENSOR_OVERLAY_MODEL = Script.resolvePath("../../assets/models/oculusSensor.fbx"); + this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS = { x: 0.1198, y: 0.2981, z: 0.1198 }; + this.PLAY_AREA_SENSOR_OVERLAY_ROTATION = Quat.fromVec3Degrees({ x: 0, y: -90, z: 0 }); + + this.playAreaOverlay = Overlays.addOverlay("model", { + url: this.PLAY_AREA_OVERLAY_MODEL, + drawInFront: false, + visible: false + }); + + this.addPlayAreaSensorPositionOverlay = function () { + var overlay = Overlays.addOverlay("model", { + url: this.PLAY_AREA_SENSOR_OVERLAY_MODEL, + dimensions: this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS, + parentID: this.playAreaOverlay, + localRotation: this.PLAY_AREA_SENSOR_OVERLAY_ROTATION, + solid: true, + drawInFront: false, + visible: false + }); + this.playAreaSensorPositionOverlays.push(overlay); + }; + + this.deletePlayAreaSensorPositionOverlay = function (index) { + Overlays.deleteOverlay(this.playAreaSensorPositionOverlays[index]); + this.playAreaSensorPositionOverlays.splice(index, 1); + }; + + this.setPlayAreaDimensions = function () { + var avatarScale = MyAvatar.scale; + + Overlays.editOverlay(this.playAreaOverlay, { + dimensions: + Vec3.multiply(avatarScale, { + x: this.playArea.width, + y: this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT, + z: this.playArea.height + }) + }); + + for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + var localPosition = this.playAreaSensorPositions[i]; + localPosition = Vec3.multiply(avatarScale, localPosition); + localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2; // Position on the floor. + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { + dimensions: Vec3.multiply(avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), + parentID: this.playAreaOverlay, + localPosition: localPosition + }); + } + }; + + this.updatePlayAreaScale = function () { + if (this.isPlayAreaAvailable) { + this.setPlayAreaDimensions(); + } + }; + + this.setPlayAreaVisible = function (visible) { + if (!this.isPlayAreaAvailable || this.isPlayAreaVisible === visible) { + return; + } + this.isPlayAreaVisible = visible; + Overlays.editOverlay(this.playAreaOverlay, { visible: visible }); + for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { visible: visible }); + } + }; + + this.setPlayAreaAvailable = function () { + this.playArea = HMD.playArea; + this.playArea.width = this.PLAY_AREA_OVERLAY_SCALE * this.playArea.width; + this.playArea.height = this.PLAY_AREA_OVERLAY_SCALE * this.playArea.height; + this.isPlayAreaAvailable = HMD.active && this.playArea.width !== 0 && this.playArea.height !== 0; + if (this.isPlayAreaAvailable) { + this.playAreaCenterOffset = Vec3.sum({ x: this.playArea.x, y: 0, z: this.playArea.y }, + this.PLAY_AREA_OVERLAY_OFFSET); + + this.playAreaSensorPositions = HMD.sensorPositions; + for (var i = 0; i < this.playAreaSensorPositions.length; i++) { + if (i > this.playAreaSensorPositionOverlays.length - 1) { + this.addPlayAreaSensorPositionOverlay(); + } + } + + for (i = this.playAreaSensorPositionOverlays.length; i > this.playAreaSensorPositions.length; i--) { + this.deletePlayAreaSensorPositionOverlay(i); + } + + this.setPlayAreaDimensions(); + } else { + Overlays.editOverlay(this.playAreaOverlay, { visible: false }); + for (i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { visible: false }); + } + } + }; + + this.setPlayAreaAvailable(); + + this.updatePlayArea = function (position) { + var sensorToWorldMatrix = MyAvatar.sensorToWorldMatrix; + var sensorToWorldRotation = Mat4.extractRotation(MyAvatar.sensorToWorldMatrix); + var worldToSensorMatrix = Mat4.inverse(sensorToWorldMatrix); + var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position); + avatarSensorPosition.y = 0; + + Overlays.editOverlay(this.playAreaOverlay, { + position: Vec3.sum(position, + Vec3.multiplyQbyV(sensorToWorldRotation, + Vec3.multiply(MyAvatar.scale, Vec3.subtract(this.playAreaCenterOffset, avatarSensorPosition)))), + rotation: sensorToWorldRotation + }); + }; + + this.cleanup = function() { Pointers.removePointer(this.teleportParabolaHandVisible); Pointers.removePointer(this.teleportParabolaHandInvisible); Pointers.removePointer(this.teleportParabolaHeadVisible); Pointers.removePointer(this.teleportParabolaHeadInvisible); + Overlays.deleteOverlay(this.playAreaOverlay); + for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + Overlays.deleteOverlay(this.playAreaSensorPositionOverlays[i]); + } }; this.buttonPress = function(value) { @@ -264,6 +400,7 @@ Script.include("/~/system/libraries/controllers.js"); this.setTeleportState(mode, "", "cancel"); } else if (teleportLocationType === TARGET.SURFACE) { this.setTeleportState(mode, "teleport", ""); + this.updatePlayArea(result.intersection); } else if (teleportLocationType === TARGET.SEAT) { this.setTeleportState(mode, "", "seat"); } @@ -294,6 +431,7 @@ Script.include("/~/system/libraries/controllers.js"); }; this.disableLasers = function() { + this.setPlayAreaVisible(false); Pointers.disablePointer(_this.teleportParabolaHandVisible); Pointers.disablePointer(_this.teleportParabolaHandInvisible); Pointers.disablePointer(_this.teleportParabolaHeadVisible); @@ -301,6 +439,7 @@ Script.include("/~/system/libraries/controllers.js"); }; this.setTeleportState = function(mode, visibleState, invisibleState) { + this.setPlayAreaVisible(visibleState === "teleport"); if (mode === 'head') { Pointers.setRenderState(_this.teleportParabolaHeadVisible, visibleState); Pointers.setRenderState(_this.teleportParabolaHeadInvisible, invisibleState); @@ -456,4 +595,14 @@ Script.include("/~/system/libraries/controllers.js"); Messages.subscribe('Hifi-Teleport-Ignore-Remove'); Messages.messageReceived.connect(handleTeleportMessages); + HMD.displayModeChanged.connect(function () { + leftTeleporter.setPlayAreaAvailable(); + rightTeleporter.setPlayAreaAvailable(); + }); + + MyAvatar.scaleChanged.connect(function () { + leftTeleporter.updatePlayAreaScale(); + rightTeleporter.updatePlayAreaScale(); + }); + }()); // END LOCAL_SCOPE From 07049b94813312ebce435683bfe306f41065fda1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 2 Aug 2018 11:08:21 +1200 Subject: [PATCH 009/434] Update and tidy play area and Oculus sensor models --- .../{oculusSensor.fbx => oculusSensorv2.fbx} | Bin 492876 -> 503788 bytes ...{trackingSpace.fbx => trackingSpacev2.fbx} | Bin 137388 -> 137404 bytes .../controllers/controllerModules/teleport.js | 30 ++++++++---------- 3 files changed, 13 insertions(+), 17 deletions(-) rename scripts/system/assets/models/{oculusSensor.fbx => oculusSensorv2.fbx} (66%) rename scripts/system/assets/models/{trackingSpace.fbx => trackingSpacev2.fbx} (95%) diff --git a/scripts/system/assets/models/oculusSensor.fbx b/scripts/system/assets/models/oculusSensorv2.fbx similarity index 66% rename from scripts/system/assets/models/oculusSensor.fbx rename to scripts/system/assets/models/oculusSensorv2.fbx index a914f1ce2fd3840a2521f3962a1f6b405fa1316a..9ac55267aa9c0767dcd7c48bd2471e29b4a4b3d7 100644 GIT binary patch delta 165784 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 J^b+*i{{q{E@V@{6 delta 153619 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 diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 70d43d3c6d..f4914c35a6 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -184,25 +184,21 @@ Script.include("/~/system/libraries/controllers.js"); }); - this.PLAY_AREA_OVERLAY_OFFSET = { x: 0, y: 0.02, z: 0 }; // Raise above surface to make visible. - this.PLAY_AREA_OVERLAY_IMAGE_SIZE = 256; - this.PLAY_AREA_OVERLAY_IMAGE_RECTANGLE = 250; // Size of rectangle within image. - this.PLAY_AREA_OVERLAY_SCALE = this.PLAY_AREA_OVERLAY_IMAGE_SIZE / this.PLAY_AREA_OVERLAY_IMAGE_RECTANGLE; + this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpacev2.fbx"); + this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; + this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT = this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y + / this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.x; + this.PLAY_AREA_OVERLAY_OFFSET = { x: 0, y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2, z: 0 }; + this.PLAY_AREA_SENSOR_OVERLAY_MODEL = Script.resolvePath("../../assets/models/oculusSensorv2.fbx"); + this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS = { x: 0.1198, y: 0.2981, z: 0.1198 }; + this.PLAY_AREA_SENSOR_OVERLAY_ROTATION = Quat.fromVec3Degrees({ x: 0, y: -90, z: 0 }); + this.playAreaSensorPositions = []; + this.playAreaSensorPositionOverlays = []; this.playArea = { x: 0, y: 0 }; this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; this.isPlayAreaVisible = false; this.isPlayAreaAvailable = false; - this.playAreaSensorPositions = []; - this.playAreaSensorPositionOverlays = []; - this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpace.fbx"); - this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; - this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT = this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y - / this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.x; - this.PLAY_AREA_SENSOR_OVERLAY_MODEL = Script.resolvePath("../../assets/models/oculusSensor.fbx"); - this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS = { x: 0.1198, y: 0.2981, z: 0.1198 }; - this.PLAY_AREA_SENSOR_OVERLAY_ROTATION = Quat.fromVec3Degrees({ x: 0, y: -90, z: 0 }); - this.playAreaOverlay = Overlays.addOverlay("model", { url: this.PLAY_AREA_OVERLAY_MODEL, drawInFront: false, @@ -242,7 +238,9 @@ Script.include("/~/system/libraries/controllers.js"); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { var localPosition = this.playAreaSensorPositions[i]; localPosition = Vec3.multiply(avatarScale, localPosition); - localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2; // Position on the floor. + localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 + - this.playAreaCenterOffset.y / 2; // Position on the floor. + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { dimensions: Vec3.multiply(avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), parentID: this.playAreaOverlay, @@ -270,8 +268,6 @@ Script.include("/~/system/libraries/controllers.js"); this.setPlayAreaAvailable = function () { this.playArea = HMD.playArea; - this.playArea.width = this.PLAY_AREA_OVERLAY_SCALE * this.playArea.width; - this.playArea.height = this.PLAY_AREA_OVERLAY_SCALE * this.playArea.height; this.isPlayAreaAvailable = HMD.active && this.playArea.width !== 0 && this.playArea.height !== 0; if (this.isPlayAreaAvailable) { this.playAreaCenterOffset = Vec3.sum({ x: this.playArea.x, y: 0, z: this.playArea.y }, From eed0159b5ef9cda0eab1e393d6d56b0d4e0aae0c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 2 Aug 2018 14:45:09 +1200 Subject: [PATCH 010/434] Scale-in play area from zero size --- .../controllers/controllerModules/teleport.js | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index f4914c35a6..e213322b34 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -198,6 +198,11 @@ Script.include("/~/system/libraries/controllers.js"); this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; this.isPlayAreaVisible = false; this.isPlayAreaAvailable = false; + this.PLAY_AREA_SCALE_DURATION = 500; + this.PLAY_AREA_SCALE_TIMEOUT = 20; + this.playAreaScaleTimer = null; + this.playAreaScaleStart = 0; + this.playAreaScaleFactor = 0; this.playAreaOverlay = Overlays.addOverlay("model", { url: this.PLAY_AREA_OVERLAY_MODEL, @@ -228,7 +233,7 @@ Script.include("/~/system/libraries/controllers.js"); Overlays.editOverlay(this.playAreaOverlay, { dimensions: - Vec3.multiply(avatarScale, { + Vec3.multiply(this.playAreaScaleFactor * avatarScale, { x: this.playArea.width, y: this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT, z: this.playArea.height @@ -239,10 +244,9 @@ Script.include("/~/system/libraries/controllers.js"); var localPosition = this.playAreaSensorPositions[i]; localPosition = Vec3.multiply(avatarScale, localPosition); localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - - this.playAreaCenterOffset.y / 2; // Position on the floor. - + - this.playAreaCenterOffset.y / 2; // Position on the floor. Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { - dimensions: Vec3.multiply(avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), + dimensions: Vec3.multiply(this.playAreaScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), parentID: this.playAreaOverlay, localPosition: localPosition }); @@ -255,14 +259,38 @@ Script.include("/~/system/libraries/controllers.js"); } }; + this.scaleInPlayArea = function () { + _this.playAreaScaleFactor = Math.min((Date.now() - _this.playAreaScaleStart) / _this.PLAY_AREA_SCALE_DURATION, 1); + _this.setPlayAreaDimensions(); + if (_this.playAreaScaleFactor < 1) { + _this.playAreaScaleTimer = Script.setTimeout(_this.scaleInPlayArea, _this.PLAY_AREA_SCALE_TIMEOUT); + } else { + _this.playAreaScaleTimer = null; + } + }; + this.setPlayAreaVisible = function (visible) { if (!this.isPlayAreaAvailable || this.isPlayAreaVisible === visible) { return; } this.isPlayAreaVisible = visible; - Overlays.editOverlay(this.playAreaOverlay, { visible: visible }); + Overlays.editOverlay(this.playAreaOverlay, { + visible: visible, + dimensions: Vec3.ZERO + }); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { - Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { visible: visible }); + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { + visible: visible, + dimensions: Vec3.ZERO + }); + } + if (visible) { + this.playAreaScaleStart = Date.now(); + this.playAreaScaleFactor = 0; + this.scaleInPlayArea(); + } else if (this.playAreaScaleTimer !== null) { + Script.clearTimeout(this.playAreaScaleTimer); + this.playAreaScaleTimer = null; } }; From 57da0fef63364a1f2afeec7e98268a5aa2f46ac3 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 2 Aug 2018 15:21:56 +1200 Subject: [PATCH 011/434] Show occluded parts of the play area overlays --- .../controllers/controllerModules/teleport.js | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index e213322b34..1a9e12e262 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -128,6 +128,22 @@ Script.include("/~/system/libraries/controllers.js"); return otherModule; }; + + this.teleporterSelectionName = "teleporterSelection" + hand.toString(); + this.TELEPORTER_SELECTION_STYLE = { + outlineUnoccludedColor: { red: 0, green: 0, blue: 0 }, + outlineUnoccludedAlpha: 0, + outlineOccludedColor: { red: 0, green: 0, blue: 0 }, + outlineOccludedAlpha: 0, + fillUnoccludedColor: { red: 0, green: 0, blue: 0 }, + fillUnoccludedAlpha: 0, + fillOccludedColor: { red: 0, green: 0, blue: 255 }, + fillOccludedAlpha: 0.84, + outlineWidth: 0, + isOutlineSmooth: false + }; + + this.teleportParabolaHandVisible = Pointers.createPointer(PickType.Parabola, { joint: (_this.hand === RIGHT_HAND) ? "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND" : "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND", dirOffset: { x: 0, y: 1, z: 0.1 }, @@ -209,6 +225,7 @@ Script.include("/~/system/libraries/controllers.js"); drawInFront: false, visible: false }); + Selection.addToSelectedItemsList(this.teleporterSelectionName, "overlay", this.playAreaOverlay); this.addPlayAreaSensorPositionOverlay = function () { var overlay = Overlays.addOverlay("model", { @@ -221,10 +238,13 @@ Script.include("/~/system/libraries/controllers.js"); visible: false }); this.playAreaSensorPositionOverlays.push(overlay); + Selection.addToSelectedItemsList(this.teleporterSelectionName, "overlay", overlay); }; this.deletePlayAreaSensorPositionOverlay = function (index) { - Overlays.deleteOverlay(this.playAreaSensorPositionOverlays[index]); + var overlay = this.playAreaSensorPositionOverlays[index]; + Selection.removeFromSelectedItemsList(this.teleporterSelectionName, "overlay", overlay); + Overlays.deleteOverlay(overlay); this.playAreaSensorPositionOverlays.splice(index, 1); }; @@ -339,7 +359,8 @@ Script.include("/~/system/libraries/controllers.js"); }; - this.cleanup = function() { + this.cleanup = function () { + Selection.removeListFromMap(this.teleporterSelectionName); Pointers.removePointer(this.teleportParabolaHandVisible); Pointers.removePointer(this.teleportParabolaHandInvisible); Pointers.removePointer(this.teleportParabolaHeadVisible); @@ -456,14 +477,21 @@ Script.include("/~/system/libraries/controllers.js"); this.disableLasers = function() { this.setPlayAreaVisible(false); + Selection.disableListHighlight(this.teleporterSelectionName); Pointers.disablePointer(_this.teleportParabolaHandVisible); Pointers.disablePointer(_this.teleportParabolaHandInvisible); Pointers.disablePointer(_this.teleportParabolaHeadVisible); Pointers.disablePointer(_this.teleportParabolaHeadInvisible); }; - this.setTeleportState = function(mode, visibleState, invisibleState) { - this.setPlayAreaVisible(visibleState === "teleport"); + this.setTeleportState = function (mode, visibleState, invisibleState) { + var visible = visibleState === "teleport"; + this.setPlayAreaVisible(visible); + if (visible) { + Selection.enableListHighlight(this.teleporterSelectionName, this.TELEPORTER_SELECTION_STYLE); + } else { + Selection.disableListHighlight(this.teleporterSelectionName); + } if (mode === 'head') { Pointers.setRenderState(_this.teleportParabolaHeadVisible, visibleState); Pointers.setRenderState(_this.teleportParabolaHeadInvisible, invisibleState); From 29dbc013611decdbd938adf2d2d67975b630360b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 3 Aug 2018 08:12:44 +1200 Subject: [PATCH 012/434] Add alternative code to position Oculus sensors at correct elevation --- scripts/system/controllers/controllerModules/teleport.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 1a9e12e262..2b273c60d6 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -263,8 +263,15 @@ Script.include("/~/system/libraries/controllers.js"); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { var localPosition = this.playAreaSensorPositions[i]; localPosition = Vec3.multiply(avatarScale, localPosition); + /* + // Position at the correct elevation. Tracking origin is at eye height. + localPosition.y = MyAvatar.getEyeHeight() + localPosition.y + - avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 + - this.playAreaCenterOffset.y / 2; + */ + // Position on the floor. localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - - this.playAreaCenterOffset.y / 2; // Position on the floor. + - this.playAreaCenterOffset.y / 2; Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { dimensions: Vec3.multiply(this.playAreaScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), parentID: this.playAreaOverlay, From 5be945715f584cfa8ad9f2547f9e933f805f39be Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 3 Aug 2018 08:22:36 +1200 Subject: [PATCH 013/434] Include the teleporter target in the occlusion --- interface/src/raypick/PathPointer.cpp | 17 ++++++++++++++++- interface/src/raypick/PathPointer.h | 2 ++ .../src/raypick/PointerScriptingInterface.cpp | 4 ++++ .../src/raypick/PointerScriptingInterface.h | 7 +++++++ interface/src/raypick/StylusPointer.cpp | 8 +++++++- interface/src/raypick/StylusPointer.h | 2 ++ libraries/pointers/src/Pointer.h | 2 ++ libraries/pointers/src/PointerManager.cpp | 11 ++++++++++- libraries/pointers/src/PointerManager.h | 2 ++ .../controllers/controllerModules/teleport.js | 11 +++++++++++ 10 files changed, 63 insertions(+), 3 deletions(-) diff --git a/interface/src/raypick/PathPointer.cpp b/interface/src/raypick/PathPointer.cpp index 685611d77b..d0f66cd240 100644 --- a/interface/src/raypick/PathPointer.cpp +++ b/interface/src/raypick/PathPointer.cpp @@ -350,4 +350,19 @@ glm::vec2 PathPointer::findPos2D(const PickedObject& pickedObject, const glm::ve default: return glm::vec2(NAN); } -} \ No newline at end of file +} + +QVector PathPointer::getOverlayIDs() { + QVector result; + for (auto& state : _renderStates) { + QUuid uuid = state.second->getStartID(); + if (!uuid.isNull()) { + result.append(uuid); + } + uuid = state.second->getEndID(); + if (!uuid.isNull()) { + result.append(uuid); + } + } + return result; +} diff --git a/interface/src/raypick/PathPointer.h b/interface/src/raypick/PathPointer.h index 44c1b7f82b..92d221aeb9 100644 --- a/interface/src/raypick/PathPointer.h +++ b/interface/src/raypick/PathPointer.h @@ -76,6 +76,8 @@ public: // You cannot use editRenderState to change the type of any part of the pointer. You can only edit the properties of the existing overlays. void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override; + QVector getOverlayIDs() override; + void setLength(float length) override; void setLockEndUUID(const QUuid& objectID, bool isOverlay, const glm::mat4& offsetMat = glm::mat4()) override; diff --git a/interface/src/raypick/PointerScriptingInterface.cpp b/interface/src/raypick/PointerScriptingInterface.cpp index 5bb4293ef3..259c02d943 100644 --- a/interface/src/raypick/PointerScriptingInterface.cpp +++ b/interface/src/raypick/PointerScriptingInterface.cpp @@ -374,4 +374,8 @@ QVariantMap PointerScriptingInterface::getPrevPickResult(unsigned int uid) const result = pickResult->toVariantMap(); } return result; +} + +QVector PointerScriptingInterface::getOverlayIDs(unsigned int uid) { + return DependencyManager::get()->getOverlayIDs(uid); } \ No newline at end of file diff --git a/interface/src/raypick/PointerScriptingInterface.h b/interface/src/raypick/PointerScriptingInterface.h index 9fe05182c7..65036c3104 100644 --- a/interface/src/raypick/PointerScriptingInterface.h +++ b/interface/src/raypick/PointerScriptingInterface.h @@ -203,6 +203,13 @@ public: */ Q_INVOKABLE bool isMouse(unsigned int uid) { return DependencyManager::get()->isMouse(uid); } + /**jsdoc + * Get the IDs of the overlays used by a Pointer. + * @function Pointers.getOverlayIDs + * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}. + * @returns {Uuid[]} The overlay IDs used by the Pointer. + */ + Q_INVOKABLE QVector getOverlayIDs(unsigned int uid); }; #endif // hifi_PointerScriptingInterface_h diff --git a/interface/src/raypick/StylusPointer.cpp b/interface/src/raypick/StylusPointer.cpp index 8c0fb59106..0d376bf3f1 100644 --- a/interface/src/raypick/StylusPointer.cpp +++ b/interface/src/raypick/StylusPointer.cpp @@ -225,4 +225,10 @@ glm::vec2 StylusPointer::findPos2D(const PickedObject& pickedObject, const glm:: default: return glm::vec2(NAN); } -} \ No newline at end of file +} + +QVector StylusPointer::getOverlayIDs() { + QVector result; + result.append(_stylusOverlay); + return result; +} diff --git a/interface/src/raypick/StylusPointer.h b/interface/src/raypick/StylusPointer.h index 950b03b7c9..a4778ffd97 100644 --- a/interface/src/raypick/StylusPointer.h +++ b/interface/src/raypick/StylusPointer.h @@ -33,6 +33,8 @@ public: void setRenderState(const std::string& state) override; void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override {} + QVector getOverlayIDs() override; + static OverlayID buildStylusOverlay(const QVariantMap& properties); protected: diff --git a/libraries/pointers/src/Pointer.h b/libraries/pointers/src/Pointer.h index 0c842dbd88..96b43e317b 100644 --- a/libraries/pointers/src/Pointer.h +++ b/libraries/pointers/src/Pointer.h @@ -50,6 +50,8 @@ public: virtual void setRenderState(const std::string& state) = 0; virtual void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) = 0; + virtual QVector getOverlayIDs() = 0; + virtual void setPrecisionPicking(bool precisionPicking); virtual void setIgnoreItems(const QVector& ignoreItems) const; virtual void setIncludeItems(const QVector& includeItems) const; diff --git a/libraries/pointers/src/PointerManager.cpp b/libraries/pointers/src/PointerManager.cpp index be890da392..6a395ecac2 100644 --- a/libraries/pointers/src/PointerManager.cpp +++ b/libraries/pointers/src/PointerManager.cpp @@ -144,4 +144,13 @@ bool PointerManager::isMouse(unsigned int uid) { return pointer->isMouse(); } return false; -} \ No newline at end of file +} + +QVector PointerManager::getOverlayIDs(unsigned int uid) { + auto pointer = find(uid); + if (pointer) { + return pointer->getOverlayIDs(); + } + QVector empty; + return empty; +} diff --git a/libraries/pointers/src/PointerManager.h b/libraries/pointers/src/PointerManager.h index b98558622f..0b6dcd6eae 100644 --- a/libraries/pointers/src/PointerManager.h +++ b/libraries/pointers/src/PointerManager.h @@ -44,6 +44,8 @@ public: bool isRightHand(unsigned int uid); bool isMouse(unsigned int uid); + QVector getOverlayIDs(unsigned int uid); + static const unsigned int MOUSE_POINTER_ID { PointerEvent::INVALID_POINTER_ID + 1 }; private: diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 2b273c60d6..a2d1c30793 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -199,6 +199,17 @@ Script.include("/~/system/libraries/controllers.js"); maxDistance: 8.0 }); + this.addToSelectedItemsList = function (overlays) { + for (var i = 0, length = overlays.length; i < length; i++) { + Selection.addToSelectedItemsList(this.teleporterSelectionName, "overlay", overlays[i]); + } + }; + + this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHandVisible)); + this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHandInvisible)); + this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHeadVisible)); + this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHeadInvisible)); + this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpacev2.fbx"); this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; From e9d1423c615614c6659372543a1dae3d30b79f06 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 2 Aug 2018 09:58:29 -0700 Subject: [PATCH 014/434] jsdoc fixes --- interface/src/raypick/PointerScriptingInterface.cpp | 13 +++++++------ libraries/pointers/src/Pick.h | 2 ++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/interface/src/raypick/PointerScriptingInterface.cpp b/interface/src/raypick/PointerScriptingInterface.cpp index 5bb4293ef3..a9b9b6e9ea 100644 --- a/interface/src/raypick/PointerScriptingInterface.cpp +++ b/interface/src/raypick/PointerScriptingInterface.cpp @@ -92,7 +92,7 @@ unsigned int PointerScriptingInterface::createStylus(const QVariant& properties) * @typedef {object} Pointers.LaserPointerProperties * @property {boolean} [faceAvatar=false] If true, the end of the Pointer will always rotate to face the avatar. * @property {boolean} [centerEndY=true] If false, the end of the Pointer will be moved up by half of its height. - * @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the laser is pointing. + * @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the pointer is pointing. * @property {boolean} [distanceScaleEnd=false] If true, the dimensions of the end of the Pointer will scale linearly with distance. * @property {boolean} [scaleWithAvatar=false] If true, the width of the Pointer's path will scale linearly with your avatar's scale. * @property {boolean} [followNormal=false] If true, the end of the Pointer will rotate to follow the normal of the intersected surface. @@ -207,9 +207,10 @@ unsigned int PointerScriptingInterface::createLaserPointer(const QVariant& prope * The rendering properties of the parabolic path * * @typedef {object} Pointers.ParabolaProperties -* @property {Color} color The color of the parabola. -* @property {number} alpha The alpha of the parabola. -* @property {number} width The width of the parabola, in meters. +* @property {Color} color=255,255,255 The color of the parabola. +* @property {number} alpha=1.0 The alpha of the parabola. +* @property {number} width=0.01 The width of the parabola, in meters. +* @property {boolean} isVisibleInSecondaryCamera=false The width of the parabola, in meters. */ /**jsdoc * A set of properties used to define the visual aspect of a Parabola Pointer in the case that the Pointer is not intersecting something. Same as a {@link Pointers.ParabolaPointerRenderState}, @@ -232,10 +233,10 @@ unsigned int PointerScriptingInterface::createLaserPointer(const QVariant& prope */ /**jsdoc * A set of properties that can be passed to {@link Pointers.createPointer} to create a new Pointer. Contains the relevant {@link Picks.PickProperties} to define the underlying Pick. -* @typedef {object} Pointers.LaserPointerProperties +* @typedef {object} Pointers.ParabolaPointerProperties * @property {boolean} [faceAvatar=false] If true, the end of the Pointer will always rotate to face the avatar. * @property {boolean} [centerEndY=true] If false, the end of the Pointer will be moved up by half of its height. -* @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the laser is pointing. +* @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the pointer is pointing. * @property {boolean} [distanceScaleEnd=false] If true, the dimensions of the end of the Pointer will scale linearly with distance. * @property {boolean} [scaleWithAvatar=false] If true, the width of the Pointer's path will scale linearly with your avatar's scale. * @property {boolean} [followNormal=false] If true, the end of the Pointer will rotate to follow the normal of the intersected surface. diff --git a/libraries/pointers/src/Pick.h b/libraries/pointers/src/Pick.h index dd59b50cc4..790c5dfd27 100644 --- a/libraries/pointers/src/Pick.h +++ b/libraries/pointers/src/Pick.h @@ -145,6 +145,7 @@ public: * * @property {number} Ray Ray Picks intersect a ray with the nearest object in front of them, along a given direction. * @property {number} Stylus Stylus Picks provide "tapping" functionality on/into flat surfaces. + * @property {number} Parabola Parabola Picks intersect a parabola with the nearest object in front of them, with a given initial velocity and acceleration. */ /**jsdoc * @@ -154,6 +155,7 @@ public: * * * + * * *
{@link PickType(0)|PickType.Ray}
{@link PickType(0)|PickType.Stylus}
{@link PickType(0)|PickType.Parabola}
* @typedef {number} PickType From 1cd3869b2ce403fd070886d3b0b9b8d9903d06e0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 4 Aug 2018 09:42:52 +1200 Subject: [PATCH 015/434] Reinstate FBX file that original version or parabolic branch deleted --- .../system/assets/models/teleport-cancel.fbx | Bin 0 -> 177324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/system/assets/models/teleport-cancel.fbx diff --git a/scripts/system/assets/models/teleport-cancel.fbx b/scripts/system/assets/models/teleport-cancel.fbx new file mode 100644 index 0000000000000000000000000000000000000000..1c12e28159056cadaafb840f7e449e683489d311 GIT binary patch literal 177324 zcmdSC2UHZx6E8gEpn{kK3Zj_FBAF#45(U8sxWE7_o7`P;G@_yc=753`GiGuy5){G6 zRV1iLmYiYXJ3TYNAS`gb|MR`~=6F2A%+#-|s;jH3yQ_OmiM}pG22s*TZ=<9hiArSn zN=ia=ph|HFau9$9t|>-(8`r=@7not_!-Avkg7_c^nmq8@4rYLtCN(?| zUv)~YywK%381k{OrHT0k+&oYY{Mc_=y^D5 zfdN<^2>OM4!Mh12GE7PZAgBlTl+T<-Wx1OOLJ%azH7Eg(0nyil7lNQAxQD!JXr2s{ z$q)n)a8LQoNmNf3Y{Cse&<6Z-8`zmfbup2FAc%!~KEa$sCX<-x%a(qj`mZePOC<<` z1Q0=K3>#Spg7nBR)dglqE@iTaPGlIVArs4Gk}{HtvMQ@3mohz_B;~=MO0uhE71s$s z5MXEt1VKVJ&M*}=p}Nv+rb7^9Or|*z$>2|jYw!(FfGrbd7!X;+h1{qjCP5Iy3#wqq zTTSdOsOSM@yFd^$k*8k>2of}hSww)fozvGlaWDARlUQWf29Te{Jr=O>blMI(vyc}L za4-0EJz4HF2J-w3?zx~T?CVWqxG<47<@h(&uonqfBJ!pW_eMaUMxnq|w2&c}0nXqj zS}|yJn86~!Oci-D4{GLWz>chJCO{BmKy&s4D7Fl;4IneMVKGQlHyfZ5@C*PWAIiDX zXih|itgDmH6AVTZg%JUtFr5De379%C)0VBHqUPZqs-mY#KQ`HdAljmg+| zK=O%0dOM&sU}ZA$3NrEvk_wousmsgDa|@#2|FP!?0nG!uM9{v%24=BHR5#{otb`$+ zANU?7j%J9b+$V_Yd>N{9e&7x1x;`W(;uuL(7Scpbs4UnGM%}py=;)tfWT5Nhva%5# zBqO;|M&sVN_^klpMJ9Kgh@Az!!s1MIl5%Wl>2i z8)qUJHX=HM_yyFv3(eDs3?sJ|o)jmnx(!fEYanD|C^{$#u=4>%{yo~f2@nLjVa$U7 z^VFp{kzguIpGKxJFo#K|F|3XCY=AkVj{!3nMh0HmkxSu(AAjJTwoi}o5NI3%3wER0y>0J zj0CiC%tnzQm`6n`kqV{jbg+gQebN$3$5W%D_a%RF^B5`P%3r_^@l>tI}-;Zb3T2VCzXY`iK~+! z2n1O3K)~7mu^B6KBJdj!A`24W4&M3U;D

m6Oo!b@8BHY-pYgXV?;rK!F9*27^&V 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

pf4{QakR4SQ?k?U>@n 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%0A+wcw$vE7a;M|kN2C>zu;{TX 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

y*>ar`ls37 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 Date: Sat, 4 Aug 2018 10:11:22 +1200 Subject: [PATCH 016/434] Use new teleport destination FBX --- .../assets/models/teleportationSpotBasev3.fbx | Bin 0 -> 54140 bytes .../controllers/controllerModules/teleport.js | 8 ++------ 2 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 scripts/system/assets/models/teleportationSpotBasev3.fbx diff --git a/scripts/system/assets/models/teleportationSpotBasev3.fbx b/scripts/system/assets/models/teleportationSpotBasev3.fbx new file mode 100644 index 0000000000000000000000000000000000000000..d9041762f385c4aeb58b9cb9bd81f70e3a641be0 GIT binary patch literal 54140 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 Date: Fri, 3 Aug 2018 16:43:13 -0700 Subject: [PATCH 017/434] drawInFront parabolas --- interface/src/raypick/ParabolaPointer.cpp | 31 ++++++++++++++----- interface/src/raypick/ParabolaPointer.h | 9 ++++-- .../controllers/controllerModules/teleport.js | 9 ++++-- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/interface/src/raypick/ParabolaPointer.cpp b/interface/src/raypick/ParabolaPointer.cpp index fd6bdc7dbb..4aaab4c654 100644 --- a/interface/src/raypick/ParabolaPointer.cpp +++ b/interface/src/raypick/ParabolaPointer.cpp @@ -20,6 +20,7 @@ const glm::vec4 ParabolaPointer::RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_COLOR { 1.0f }; const float ParabolaPointer::RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_WIDTH { 0.01f }; const bool ParabolaPointer::RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA { false }; +const bool ParabolaPointer::RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_DRAWINFRONT { false }; gpu::PipelinePointer ParabolaPointer::RenderState::ParabolaRenderItem::_parabolaPipeline { nullptr }; gpu::PipelinePointer ParabolaPointer::RenderState::ParabolaRenderItem::_transparentParabolaPipeline { nullptr }; @@ -40,6 +41,7 @@ void ParabolaPointer::editRenderStatePath(const std::string& state, const QVaria float alpha = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_COLOR.a; float width = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_WIDTH; bool isVisibleInSecondaryCamera = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA; + bool drawInFront = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_DRAWINFRONT; bool enabled = false; if (!pathMap.isEmpty()) { enabled = true; @@ -57,8 +59,11 @@ void ParabolaPointer::editRenderStatePath(const std::string& state, const QVaria if (pathMap["isVisibleInSecondaryCamera"].isValid()) { isVisibleInSecondaryCamera = pathMap["isVisibleInSecondaryCamera"].toBool(); } + if (pathMap["drawInFront"].isValid()) { + drawInFront = pathMap["drawInFront"].toBool(); + } } - renderState->editParabola(color, alpha, width, isVisibleInSecondaryCamera, enabled); + renderState->editParabola(color, alpha, width, isVisibleInSecondaryCamera, drawInFront, enabled); } } @@ -108,7 +113,7 @@ void ParabolaPointer::setVisualPickResultInternal(PickResultPointer pickResult, } ParabolaPointer::RenderState::RenderState(const OverlayID& startID, const OverlayID& endID, const glm::vec3& pathColor, float pathAlpha, float pathWidth, - bool isVisibleInSecondaryCamera, bool pathEnabled) : + bool isVisibleInSecondaryCamera, bool drawInFront, bool pathEnabled) : StartEndRenderState(startID, endID) { render::Transaction transaction; @@ -116,7 +121,7 @@ ParabolaPointer::RenderState::RenderState(const OverlayID& startID, const Overla _pathID = scene->allocateID(); _pathWidth = pathWidth; if (render::Item::isValidID(_pathID)) { - auto renderItem = std::make_shared(pathColor, pathAlpha, pathWidth, isVisibleInSecondaryCamera, pathEnabled); + auto renderItem = std::make_shared(pathColor, pathAlpha, pathWidth, isVisibleInSecondaryCamera, drawInFront, pathEnabled); transaction.resetItem(_pathID, std::make_shared(renderItem)); scene->enqueueTransaction(transaction); } @@ -144,15 +149,16 @@ void ParabolaPointer::RenderState::disable() { } } -void ParabolaPointer::RenderState::editParabola(const glm::vec3& color, float alpha, float width, bool isVisibleInSecondaryCamera, bool enabled) { +void ParabolaPointer::RenderState::editParabola(const glm::vec3& color, float alpha, float width, bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled) { if (render::Item::isValidID(_pathID)) { render::Transaction transaction; auto scene = qApp->getMain3DScene(); - transaction.updateItem(_pathID, [color, alpha, width, isVisibleInSecondaryCamera, enabled](ParabolaRenderItem& item) { + transaction.updateItem(_pathID, [color, alpha, width, isVisibleInSecondaryCamera, drawInFront, enabled](ParabolaRenderItem& item) { item.setColor(color); item.setAlpha(alpha); item.setWidth(width); item.setIsVisibleInSecondaryCamera(isVisibleInSecondaryCamera); + item.setDrawInFront(drawInFront); item.setEnabled(enabled); item.updateKey(); }); @@ -200,6 +206,7 @@ std::shared_ptr ParabolaPointer::buildRenderState(const QVa float alpha = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_COLOR.a; float width = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_WIDTH; bool isVisibleInSecondaryCamera = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA; + bool drawInFront = RenderState::ParabolaRenderItem::DEFAULT_PARABOLA_DRAWINFRONT; bool enabled = false; if (propMap["path"].isValid()) { enabled = true; @@ -220,6 +227,10 @@ std::shared_ptr ParabolaPointer::buildRenderState(const QVa if (pathMap["isVisibleInSecondaryCamera"].isValid()) { isVisibleInSecondaryCamera = pathMap["isVisibleInSecondaryCamera"].toBool(); } + + if (pathMap["drawInFront"].isValid()) { + drawInFront = pathMap["drawInFront"].toBool(); + } } QUuid endID; @@ -231,7 +242,7 @@ std::shared_ptr ParabolaPointer::buildRenderState(const QVa } } - return std::make_shared(startID, endID, color, alpha, width, isVisibleInSecondaryCamera, enabled); + return std::make_shared(startID, endID, color, alpha, width, isVisibleInSecondaryCamera, drawInFront, enabled); } PointerEvent ParabolaPointer::buildPointerEvent(const PickedObject& target, const PickResultPointer& pickResult, const std::string& button, bool hover) { @@ -283,8 +294,8 @@ glm::vec3 ParabolaPointer::findIntersection(const PickedObject& pickedObject, co } ParabolaPointer::RenderState::ParabolaRenderItem::ParabolaRenderItem(const glm::vec3& color, float alpha, float width, - bool isVisibleInSecondaryCamera, bool enabled) : - _isVisibleInSecondaryCamera(isVisibleInSecondaryCamera), _enabled(enabled) + bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled) : + _isVisibleInSecondaryCamera(isVisibleInSecondaryCamera), _drawInFront(drawInFront), _enabled(enabled) { _uniformBuffer->resize(sizeof(ParabolaData)); setColor(color); @@ -320,6 +331,10 @@ void ParabolaPointer::RenderState::ParabolaRenderItem::updateKey() { builder.withTagBits(render::hifi::TAG_MAIN_VIEW); } + if (_drawInFront) { + builder.withLayer(render::hifi::LAYER_3D_FRONT); + } + _key = builder.build(); } diff --git a/interface/src/raypick/ParabolaPointer.h b/interface/src/raypick/ParabolaPointer.h index 93f9a7b055..d655b27396 100644 --- a/interface/src/raypick/ParabolaPointer.h +++ b/interface/src/raypick/ParabolaPointer.h @@ -21,7 +21,7 @@ public: using Pointer = Payload::DataPointer; ParabolaRenderItem(const glm::vec3& color, float alpha, float width, - bool isVisibleInSecondaryCamera, bool enabled); + bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled); ~ParabolaRenderItem() {} static gpu::PipelinePointer _parabolaPipeline; @@ -46,11 +46,13 @@ public: void setAcceleration(const glm::vec3& acceleration) { _parabolaData.acceleration = acceleration; } void setOrigin(const glm::vec3& origin) { _origin = origin; } void setIsVisibleInSecondaryCamera(const bool& isVisibleInSecondaryCamera) { _isVisibleInSecondaryCamera = isVisibleInSecondaryCamera; } + void setDrawInFront(const bool& drawInFront) { _drawInFront = drawInFront; } void setEnabled(const bool& enabled) { _enabled = enabled; } static const glm::vec4 DEFAULT_PARABOLA_COLOR; static const float DEFAULT_PARABOLA_WIDTH; static const bool DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA; + static const bool DEFAULT_PARABOLA_DRAWINFRONT; private: render::Item::Bound _bound; @@ -58,6 +60,7 @@ public: glm::vec3 _origin { 0.0f }; bool _isVisibleInSecondaryCamera { DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA }; + bool _drawInFront { DEFAULT_PARABOLA_DRAWINFRONT }; bool _visible { false }; bool _enabled { false }; @@ -77,7 +80,7 @@ public: RenderState() {} RenderState(const OverlayID& startID, const OverlayID& endID, const glm::vec3& pathColor, float pathAlpha, float pathWidth, - bool isVisibleInSecondaryCamera, bool pathEnabled); + bool isVisibleInSecondaryCamera, bool drawInFront, bool pathEnabled); void setPathWidth(float width) { _pathWidth = width; } float getPathWidth() const { return _pathWidth; } @@ -87,7 +90,7 @@ public: void update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY, bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult) override; - void editParabola(const glm::vec3& color, float alpha, float width, bool isVisibleInSecondaryCamera, bool enabled); + void editParabola(const glm::vec3& color, float alpha, float width, bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled); private: int _pathID; diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 21acb9346b..d89cbf6e3b 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -60,17 +60,20 @@ Script.include("/~/system/libraries/controllers.js"); var cancelPath = { color: COLORS_TELEPORT_CANCEL, alpha: 1, - width: 0.025 + width: 0.025, + drawInFront: true }; var teleportPath = { color: COLORS_TELEPORT_CAN_TELEPORT, alpha: 1, - width: 0.025 + width: 0.025, + drawInFront: true }; var seatPath = { color: COLORS_TELEPORT_SEAT, alpha: 1, - width: 0.025 + width: 0.025, + drawInFront: true }; var teleportEnd = { type: "model", From ed5e77df37c6d63e05af15da348c3af8fb1008f0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 4 Aug 2018 15:11:53 +1200 Subject: [PATCH 018/434] Scale-in teleport target from zero size --- .../controllers/controllerModules/teleport.js | 86 +++++++++++++------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 257ad64114..2325f72d2a 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -221,11 +221,14 @@ Script.include("/~/system/libraries/controllers.js"); this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; this.isPlayAreaVisible = false; this.isPlayAreaAvailable = false; - this.PLAY_AREA_SCALE_DURATION = 500; - this.PLAY_AREA_SCALE_TIMEOUT = 20; - this.playAreaScaleTimer = null; - this.playAreaScaleStart = 0; - this.playAreaScaleFactor = 0; + + this.TELEPORT_SCALE_DURATION = 500; + this.TELEPORT_SCALE_TIMEOUT = 20; + this.isTeleportVisible = false; + this.teleportScaleTimer = null; + this.teleportScaleStart = 0; + this.teleportScaleFactor = 0; + this.teleportScaleMode = "head"; this.playAreaOverlay = Overlays.addOverlay("model", { url: this.PLAY_AREA_OVERLAY_MODEL, @@ -260,7 +263,7 @@ Script.include("/~/system/libraries/controllers.js"); Overlays.editOverlay(this.playAreaOverlay, { dimensions: - Vec3.multiply(this.playAreaScaleFactor * avatarScale, { + Vec3.multiply(this.teleportScaleFactor * avatarScale, { x: this.playArea.width, y: this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT, z: this.playArea.height @@ -280,7 +283,7 @@ Script.include("/~/system/libraries/controllers.js"); localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - this.playAreaCenterOffset.y / 2; Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { - dimensions: Vec3.multiply(this.playAreaScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), + dimensions: Vec3.multiply(this.teleportScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), parentID: this.playAreaOverlay, localPosition: localPosition }); @@ -293,16 +296,6 @@ Script.include("/~/system/libraries/controllers.js"); } }; - this.scaleInPlayArea = function () { - _this.playAreaScaleFactor = Math.min((Date.now() - _this.playAreaScaleStart) / _this.PLAY_AREA_SCALE_DURATION, 1); - _this.setPlayAreaDimensions(); - if (_this.playAreaScaleFactor < 1) { - _this.playAreaScaleTimer = Script.setTimeout(_this.scaleInPlayArea, _this.PLAY_AREA_SCALE_TIMEOUT); - } else { - _this.playAreaScaleTimer = null; - } - }; - this.setPlayAreaVisible = function (visible) { if (!this.isPlayAreaAvailable || this.isPlayAreaVisible === visible) { return; @@ -318,14 +311,6 @@ Script.include("/~/system/libraries/controllers.js"); dimensions: Vec3.ZERO }); } - if (visible) { - this.playAreaScaleStart = Date.now(); - this.playAreaScaleFactor = 0; - this.scaleInPlayArea(); - } else if (this.playAreaScaleTimer !== null) { - Script.clearTimeout(this.playAreaScaleTimer); - this.playAreaScaleTimer = null; - } }; this.setPlayAreaAvailable = function () { @@ -373,6 +358,54 @@ Script.include("/~/system/libraries/controllers.js"); }; + this.scaleInTeleport = function () { + _this.teleportScaleFactor = Math.min((Date.now() - _this.teleportScaleStart) / _this.TELEPORT_SCALE_DURATION, 1); + Pointers.editRenderState( + _this.teleportScaleMode === "head" ? _this.teleportParabolaHeadVisible : _this.teleportParabolaHandVisible, + "teleport", + { + path: teleportPath, // Teleport beam disappears if not included. + end: { dimensions: Vec3.multiply(_this.teleportScaleFactor, TARGET_MODEL_DIMENSIONS) } + } + ); + _this.setPlayAreaDimensions(); + if (_this.teleportScaleFactor < 1) { + _this.teleportScaleTimer = Script.setTimeout(_this.scaleInTeleport, _this.TELEPORT_SCALE_TIMEOUT); + } else { + _this.teleportScaleTimer = null; + } + }; + + this.setTeleportVisible = function (visible, mode) { + // Scales in teleport target and play area when start displaying them. + if (visible === this.isTeleportVisible) { + return; + } + + if (visible) { + this.teleportScaleMode = mode; + Pointers.editRenderState( + mode === "head" ? _this.teleportParabolaHeadVisible : _this.teleportParabolaHandVisible, + "teleport", + { + path: teleportPath, // Teleport beam disappears if not included. + end: { dimensions: Vec3.ZERO } + } + ); + this.teleportScaleStart = Date.now(); + this.teleportScaleFactor = 0; + this.scaleInTeleport(); + } else { + if (this.teleportScaleTimer !== null) { + Script.clearTimeout(this.teleportScaleTimer); + this.teleportScaleTimer = null; + } + } + + this.isTeleportVisible = visible; + }; + + this.cleanup = function () { Selection.removeListFromMap(this.teleporterSelectionName); Pointers.removePointer(this.teleportParabolaHandVisible); @@ -500,7 +533,6 @@ Script.include("/~/system/libraries/controllers.js"); this.setTeleportState = function (mode, visibleState, invisibleState) { var visible = visibleState === "teleport"; - this.setPlayAreaVisible(visible); if (visible) { Selection.enableListHighlight(this.teleporterSelectionName, this.TELEPORTER_SELECTION_STYLE); } else { @@ -513,6 +545,8 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.setRenderState(_this.teleportParabolaHandVisible, visibleState); Pointers.setRenderState(_this.teleportParabolaHandInvisible, invisibleState); } + this.setPlayAreaVisible(visible); + this.setTeleportVisible(visible); }; this.setIgnoreEntities = function(entitiesToIgnore) { From c0dc70c07695c96d7d26a022c960eb7b2be65f84 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 4 Aug 2018 17:26:18 +1200 Subject: [PATCH 019/434] Parent play area to teleport target unless underneath avatar --- interface/src/raypick/PathPointer.cpp | 14 ++++++ interface/src/raypick/PathPointer.h | 2 + .../src/raypick/PointerScriptingInterface.cpp | 10 +++- .../src/raypick/PointerScriptingInterface.h | 22 ++++++++- interface/src/raypick/StylusPointer.h | 2 + libraries/pointers/src/Pointer.h | 2 + libraries/pointers/src/PointerManager.cpp | 16 +++++++ libraries/pointers/src/PointerManager.h | 2 + .../controllers/controllerModules/teleport.js | 46 +++++++++++++++---- 9 files changed, 104 insertions(+), 12 deletions(-) diff --git a/interface/src/raypick/PathPointer.cpp b/interface/src/raypick/PathPointer.cpp index d0f66cd240..7e8ec74549 100644 --- a/interface/src/raypick/PathPointer.cpp +++ b/interface/src/raypick/PathPointer.cpp @@ -366,3 +366,17 @@ QVector PathPointer::getOverlayIDs() { } return result; } + +QUuid PathPointer::getStartOverlayID(const QString& state) { + if (_renderStates.find(_currentRenderState) != _renderStates.end()) { + return _renderStates[_currentRenderState]->getStartID(); + } + return QUuid(); +} + +QUuid PathPointer::getEndOverlayID(const QString& state) { + if (_renderStates.find(_currentRenderState) != _renderStates.end()) { + return _renderStates[_currentRenderState]->getEndID(); + } + return QUuid(); +} diff --git a/interface/src/raypick/PathPointer.h b/interface/src/raypick/PathPointer.h index 92d221aeb9..49db9ba95a 100644 --- a/interface/src/raypick/PathPointer.h +++ b/interface/src/raypick/PathPointer.h @@ -77,6 +77,8 @@ public: void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override; QVector getOverlayIDs() override; + QUuid getStartOverlayID(const QString& state) override; + QUuid getEndOverlayID(const QString& state) override; void setLength(float length) override; void setLockEndUUID(const QUuid& objectID, bool isOverlay, const glm::mat4& offsetMat = glm::mat4()) override; diff --git a/interface/src/raypick/PointerScriptingInterface.cpp b/interface/src/raypick/PointerScriptingInterface.cpp index 34f9841fe9..fd37efcdac 100644 --- a/interface/src/raypick/PointerScriptingInterface.cpp +++ b/interface/src/raypick/PointerScriptingInterface.cpp @@ -379,4 +379,12 @@ QVariantMap PointerScriptingInterface::getPrevPickResult(unsigned int uid) const QVector PointerScriptingInterface::getOverlayIDs(unsigned int uid) { return DependencyManager::get()->getOverlayIDs(uid); -} \ No newline at end of file +} + +QUuid PointerScriptingInterface::getStartOverlayID(unsigned int uid, const QString& state) { + return DependencyManager::get()->getStartOverlayID(uid, state); +} + +QUuid PointerScriptingInterface::getEndOverlayID(unsigned int uid, const QString& state) { + return DependencyManager::get()->getEndOverlayID(uid, state); +} diff --git a/interface/src/raypick/PointerScriptingInterface.h b/interface/src/raypick/PointerScriptingInterface.h index 65036c3104..830111f770 100644 --- a/interface/src/raypick/PointerScriptingInterface.h +++ b/interface/src/raypick/PointerScriptingInterface.h @@ -207,9 +207,29 @@ public: * Get the IDs of the overlays used by a Pointer. * @function Pointers.getOverlayIDs * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}. - * @returns {Uuid[]} The overlay IDs used by the Pointer. + * @returns {Uuid[]} The overlay IDs used by the Pointer if a {@link PickType|Parabola}, otherwise null. */ Q_INVOKABLE QVector getOverlayIDs(unsigned int uid); + + /**jsdoc + * Get the ID of the start overlay for a particular state used by a {@link PickType|Path} or {@link PickType|Parabola} + * Pointer. + * @function Pointers.getStartOverlayID + * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}. + * @returns {Uuid} The ID of the start overlay used by the Pointer if a {@link PickType|Path} or {@link PickType|Parabola}, + * otherwise Uuid.NULL. + */ + Q_INVOKABLE QUuid getStartOverlayID(unsigned int uid, const QString& state); + + /**jsdoc + * Get the ID of the end overlay for a particular state used by a {@link PickType|Path} or {@link PickType|Parabola} + * Pointer. + * @function Pointers.getEndOverlayID + * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}. + * @returns {Uuid} The ID of the end overlay used by the Pointer if a {@link PickType|Path} or {@link PickType|Parabola}, + * otherwise Uuid.NULL. + */ + Q_INVOKABLE QUuid getEndOverlayID(unsigned int uid, const QString& state); }; #endif // hifi_PointerScriptingInterface_h diff --git a/interface/src/raypick/StylusPointer.h b/interface/src/raypick/StylusPointer.h index a4778ffd97..4957943652 100644 --- a/interface/src/raypick/StylusPointer.h +++ b/interface/src/raypick/StylusPointer.h @@ -34,6 +34,8 @@ public: void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override {} QVector getOverlayIDs() override; + QUuid getStartOverlayID(const QString& state) override { return QUuid(); }; + QUuid getEndOverlayID(const QString& state) override { return QUuid(); };; static OverlayID buildStylusOverlay(const QVariantMap& properties); diff --git a/libraries/pointers/src/Pointer.h b/libraries/pointers/src/Pointer.h index 96b43e317b..2b3c1477ae 100644 --- a/libraries/pointers/src/Pointer.h +++ b/libraries/pointers/src/Pointer.h @@ -51,6 +51,8 @@ public: virtual void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) = 0; virtual QVector getOverlayIDs() = 0; + virtual QUuid getStartOverlayID(const QString& state) = 0; + virtual QUuid getEndOverlayID(const QString& state) = 0; virtual void setPrecisionPicking(bool precisionPicking); virtual void setIgnoreItems(const QVector& ignoreItems) const; diff --git a/libraries/pointers/src/PointerManager.cpp b/libraries/pointers/src/PointerManager.cpp index 6a395ecac2..484f946f2d 100644 --- a/libraries/pointers/src/PointerManager.cpp +++ b/libraries/pointers/src/PointerManager.cpp @@ -154,3 +154,19 @@ QVector PointerManager::getOverlayIDs(unsigned int uid) { QVector empty; return empty; } + +QUuid PointerManager::getStartOverlayID(unsigned int uid, const QString& state) { + auto pointer = find(uid); + if (pointer) { + return pointer->getStartOverlayID(state); + } + return QUuid(); +} + +QUuid PointerManager::getEndOverlayID(unsigned int uid, const QString& state) { + auto pointer = find(uid); + if (pointer) { + return pointer->getEndOverlayID(state); + } + return QUuid(); +} diff --git a/libraries/pointers/src/PointerManager.h b/libraries/pointers/src/PointerManager.h index 0b6dcd6eae..10482a74a7 100644 --- a/libraries/pointers/src/PointerManager.h +++ b/libraries/pointers/src/PointerManager.h @@ -45,6 +45,8 @@ public: bool isMouse(unsigned int uid); QVector getOverlayIDs(unsigned int uid); + QUuid getStartOverlayID(unsigned int uid, const QString& state); + QUuid getEndOverlayID(unsigned int uid, const QString& state); static const unsigned int MOUSE_POINTER_ID { PointerEvent::INVALID_POINTER_ID + 1 }; diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 2325f72d2a..6d08a9d51c 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -221,6 +221,7 @@ Script.include("/~/system/libraries/controllers.js"); this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; this.isPlayAreaVisible = false; this.isPlayAreaAvailable = false; + this.targetOverlayID = null; this.TELEPORT_SCALE_DURATION = 500; this.TELEPORT_SCALE_TIMEOUT = 20; @@ -296,14 +297,17 @@ Script.include("/~/system/libraries/controllers.js"); } }; - this.setPlayAreaVisible = function (visible) { + this.setPlayAreaVisible = function (visible, targetOverlayID) { if (!this.isPlayAreaAvailable || this.isPlayAreaVisible === visible) { return; } + this.isPlayAreaVisible = visible; + this.targetOverlayID = targetOverlayID; + Overlays.editOverlay(this.playAreaOverlay, { - visible: visible, - dimensions: Vec3.ZERO + dimensions: Vec3.ZERO, + visible: visible }); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { @@ -349,12 +353,31 @@ Script.include("/~/system/libraries/controllers.js"); var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position); avatarSensorPosition.y = 0; - Overlays.editOverlay(this.playAreaOverlay, { - position: Vec3.sum(position, - Vec3.multiplyQbyV(sensorToWorldRotation, - Vec3.multiply(MyAvatar.scale, Vec3.subtract(this.playAreaCenterOffset, avatarSensorPosition)))), - rotation: sensorToWorldRotation - }); + var targetXZPosition = { x: position.x, y: 0, z: position.z }; + var avatarXZPosition = MyAvatar.position; + avatarXZPosition.y = 0; + var MIN_PARENTING_DISTANCE = 0.2; // Parenting under this distance results in the play area's rotation jittering. + if (Vec3.distance(targetXZPosition, avatarXZPosition) < MIN_PARENTING_DISTANCE) { + // Set play area position and rotation in world coordinates with no parenting. + Overlays.editOverlay(this.playAreaOverlay, { + parentID: Uuid.NULL, + position: Vec3.sum(position, + Vec3.multiplyQbyV(sensorToWorldRotation, + Vec3.multiply(MyAvatar.scale, Vec3.subtract(this.playAreaCenterOffset, avatarSensorPosition)))), + rotation: sensorToWorldRotation + }); + } else { + // Set play area position and rotation in local coordinates with parenting. + var targetRotation = Overlays.getProperty(this.targetOverlayID, "rotation"); + var sensorToTargetRotation = Quat.multiply(Quat.inverse(targetRotation), sensorToWorldRotation); + Overlays.editOverlay(this.playAreaOverlay, { + parentID: this.targetOverlayID, + localPosition: Vec3.multiplyQbyV(Quat.inverse(targetRotation), + Vec3.multiplyQbyV(sensorToWorldRotation, + Vec3.multiply(MyAvatar.scale, Vec3.subtract(this.playAreaCenterOffset, avatarSensorPosition)))), + localRotation: sensorToTargetRotation + }); + } }; @@ -538,14 +561,17 @@ Script.include("/~/system/libraries/controllers.js"); } else { Selection.disableListHighlight(this.teleporterSelectionName); } + var pointerID; if (mode === 'head') { Pointers.setRenderState(_this.teleportParabolaHeadVisible, visibleState); Pointers.setRenderState(_this.teleportParabolaHeadInvisible, invisibleState); + pointerID = _this.teleportParabolaHeadVisible; } else { Pointers.setRenderState(_this.teleportParabolaHandVisible, visibleState); Pointers.setRenderState(_this.teleportParabolaHandInvisible, invisibleState); + pointerID = _this.teleportParabolaHandVisible; } - this.setPlayAreaVisible(visible); + this.setPlayAreaVisible(visible, Pointers.getEndOverlayID(pointerID, "teleport")); this.setTeleportVisible(visible); }; From e008f057ebff59cc628f459aa2267e86e100412e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 4 Aug 2018 18:19:59 +1200 Subject: [PATCH 020/434] Fade play area after teleport --- .../controllers/controllerModules/teleport.js | 65 ++++++++++++++++--- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 6d08a9d51c..c42956bb41 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -223,6 +223,13 @@ Script.include("/~/system/libraries/controllers.js"); this.isPlayAreaAvailable = false; this.targetOverlayID = null; + this.PLAY_AREA_FADE_DELAY = 500; + this.PLAY_AREA_FADE_DURATION = 200; + this.PLAY_AREA_FADE_INTERVAL = 25; + this.PLAY_AREA_BOX_ALPHA = 1.0; + this.PLAY_AREA_SENSOR_ALPHA = 0.8; + this.PLAY_AREA_FADE_DELTA = this.PLAY_AREA_FADE_INTERVAL / this.PLAY_AREA_FADE_DURATION; + this.TELEPORT_SCALE_DURATION = 500; this.TELEPORT_SCALE_TIMEOUT = 20; this.isTeleportVisible = false; @@ -297,7 +304,31 @@ Script.include("/~/system/libraries/controllers.js"); } }; - this.setPlayAreaVisible = function (visible, targetOverlayID) { + this.playAreaFadeTimer = null; + this.PlayAreaFadeFactor = 1.0; + + this.fadePlayArea = function () { + var i, length; + _this.PlayAreaFadeFactor = _this.PlayAreaFadeFactor - _this.PLAY_AREA_FADE_DELTA; + if (_this.PlayAreaFadeFactor > 0) { + // Fade. + Overlays.editOverlay(_this.playAreaOverlay, { alpha: _this.PlayAreaFadeFactor * _this.PLAY_AREA_BOX_ALPHA }); + var sensorAlpha = _this.PlayAreaFadeFactor * _this.PLAY_AREA_SENSOR_ALPHA; + for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { + Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { alpha: sensorAlpha }); + } + _this.playAreaFadeTimer = Script.setTimeout(_this.fadePlayArea, _this.PLAY_AREA_FADE_INTERVAL); + } else { + // Make invisible. + Overlays.editOverlay(_this.playAreaOverlay, { visible: false }); + for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { + Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { visible: false }); + } + _this.playAreaFadeTimer = null; + } + }; + + this.setPlayAreaVisible = function (visible, targetOverlayID, noFade) { if (!this.isPlayAreaAvailable || this.isPlayAreaVisible === visible) { return; } @@ -305,15 +336,29 @@ Script.include("/~/system/libraries/controllers.js"); this.isPlayAreaVisible = visible; this.targetOverlayID = targetOverlayID; - Overlays.editOverlay(this.playAreaOverlay, { - dimensions: Vec3.ZERO, - visible: visible - }); - for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { - Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { - visible: visible, - dimensions: Vec3.ZERO + if (this.playAreaFadeTimer !== null) { + Script.clearTimeout(this.playAreaFadeTimer); + this.playAreaFadeTimer = null; + } + if (visible || noFade) { + // Immediately make visible or invisible. + this.isPlayAreaVisible = visible; + Overlays.editOverlay(this.playAreaOverlay, { + dimensions: Vec3.ZERO, + alpha: this.PLAY_AREA_BOX_ALPHA, + visible: visible }); + for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { + dimensions: Vec3.ZERO, + alpha: this.PLAY_AREA_SENSOR_ALPHA, + visible: visible + }); + } + } else { + // Fade out over time. + this.PlayAreaFadeFactor = 1.0; + _this.playAreaFadeTimer = Script.setTimeout(this.fadePlayArea, this.PLAY_AREA_FADE_DELAY); } }; @@ -571,7 +616,7 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.setRenderState(_this.teleportParabolaHandInvisible, invisibleState); pointerID = _this.teleportParabolaHandVisible; } - this.setPlayAreaVisible(visible, Pointers.getEndOverlayID(pointerID, "teleport")); + this.setPlayAreaVisible(visible, Pointers.getEndOverlayID(pointerID, "teleport"), true); this.setTeleportVisible(visible); }; From 3c805df3cc7327c761a16963ccb30a32767b1497 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 6 Aug 2018 12:38:01 -0700 Subject: [PATCH 021/434] try to get rid of qobject vecs --- libraries/octree/src/OctreePacketData.cpp | 65 +++++---------------- libraries/shared/src/RegisteredMetaTypes.h | 18 ++---- libraries/shared/src/shared/JSONHelpers.cpp | 6 -- 3 files changed, 21 insertions(+), 68 deletions(-) diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 5b59990874..f961172b8a 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -25,23 +25,6 @@ AtomicUIntStat OctreePacketData::_totalBytesOfValues { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfPositions { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfRawData { 0 }; -struct vec2FloatData { - float x; - float y; -}; - -struct vec3FloatData { - float x; - float y; - float z; -}; - -struct vec3UCharData { - unsigned char x; - unsigned char y; - unsigned char z; -}; - struct aaCubeData { glm::vec3 corner; float scale; @@ -380,7 +363,6 @@ bool OctreePacketData::appendValue(quint64 value) { } bool OctreePacketData::appendValue(float value) { - const unsigned char* data = (const unsigned char*)&value; int length = sizeof(value); bool success = append(data, length); @@ -392,9 +374,8 @@ bool OctreePacketData::appendValue(float value) { } bool OctreePacketData::appendValue(const ScriptVec2Float& value) { - vec2FloatData vec { value.x, value.y }; - const unsigned char* data = (const unsigned char*)&vec; - int length = sizeof(vec2FloatData); + const unsigned char* data = (const unsigned char*)&value; + int length = sizeof(ScriptVec2Float); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -404,9 +385,8 @@ bool OctreePacketData::appendValue(const ScriptVec2Float& value) { } bool OctreePacketData::appendValue(const ScriptVec3Float& value) { - vec3FloatData vec { value.x, value.y, value.z }; - const unsigned char* data = (const unsigned char*)&vec; - int length = sizeof(vec3FloatData); + const unsigned char* data = (const unsigned char*)&value; + int length = sizeof(ScriptVec3Float); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -423,14 +403,10 @@ bool OctreePacketData::appendValue(const QVector& value) { uint16_t qVecSize = value.size(); bool success = appendValue(qVecSize); if (success) { - QVector rawVector(qVecSize); - for (int i = 0; i < qVecSize; i++) { - rawVector[i] = { value[i].x, value[i].y, value[i].z }; - } - success = append((const unsigned char*)rawVector.constData(), qVecSize * sizeof(vec3FloatData)); + success = append((const unsigned char*)value.constData(), qVecSize * sizeof(ScriptVec3Float)); if (success) { - _bytesOfValues += qVecSize * sizeof(vec3FloatData); - _totalBytesOfValues += qVecSize * sizeof(vec3FloatData); + _bytesOfValues += qVecSize * sizeof(ScriptVec3Float); + _totalBytesOfValues += qVecSize * sizeof(ScriptVec3Float); } } return success; @@ -693,24 +669,18 @@ void OctreePacketData::debugBytes() { } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { - vec2FloatData vec; - memcpy(&vec, dataBytes, sizeof(vec2FloatData)); - result = ScriptVec2Float(vec.x, vec.y); - return sizeof(vec2FloatData); + memcpy(&result, dataBytes, sizeof(result)); + return sizeof(result); } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { - vec3FloatData vec; - memcpy(&vec, dataBytes, sizeof(vec3FloatData)); - result = ScriptVec3Float(vec.x, vec.y, vec.z); - return sizeof(vec3FloatData); + memcpy(&result, dataBytes, sizeof(result)); + return sizeof(result); } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result) { - vec3UCharData vec; - memcpy(&vec, dataBytes, sizeof(vec3UCharData)); - result = ScriptVec3UChar(vec.x, vec.y, vec.z); - return sizeof(vec3UCharData); + memcpy(&result, dataBytes, sizeof(result)); + return sizeof(result); } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QString& result) { @@ -741,17 +711,12 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto dataBytes += sizeof(length); // FIXME - this size check is wrong if we allow larger packets - if (length * sizeof(vec3FloatData) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { + if (length * sizeof(ScriptVec3Float) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { result.resize(0); return sizeof(uint16_t); } result.resize(length); - QVector rawVector(length); - memcpy(rawVector.data(), dataBytes, length * sizeof(vec3FloatData)); - for (int i = 0; i < length; i++) { - auto v = rawVector[i]; - result[i] = ScriptVec3Float(v.x, v.y, v.z); - } + memcpy(result.data(), dataBytes, length * sizeof(ScriptVec3Float)); return sizeof(uint16_t) + length * sizeof(ScriptVec3Float); } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index bbadae2a14..c73a85f850 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -51,13 +51,12 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * @property {number} x - X-coordinate of the vector. Synonyms: u and width. * @property {number} y - Y-coordinate of the vector. Synonyms: v and height. */ -class ScriptVec2Float : public QObject { - Q_OBJECT +class ScriptVec2Float { public: ScriptVec2Float() {} ScriptVec2Float(float xy) : x(xy), y(xy) {} ScriptVec2Float(float x, float y) : x(x), y(y) {} - ScriptVec2Float(const ScriptVec2Float& other) : QObject(), x(other.x), y(other.y) {} + ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } inline bool operator==(const ScriptVec2Float& other) const { return (x == other.x && y == other.y); } @@ -66,7 +65,6 @@ public: inline bool operator!=(const glm::vec2& other) const { return !(*this == other); } glm::vec2 toGlm() const { return glm::vec2(x, y); } - Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y" }).toVariant(); } float x { 0.0f }; float y { 0.0f }; @@ -101,13 +99,12 @@ glm::vec2 vec2FromVariant(const QVariant& object); * @property {number} y - Y-coordinate of the vector. Synonyms: g, green, and height. * @property {number} z - Z-coordinate of the vector. Synonyms: b, blue, and depth. */ -class ScriptVec3Float : public QObject { - Q_OBJECT +class ScriptVec3Float { public: ScriptVec3Float() {} ScriptVec3Float(float xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3Float(float x, float y, float z) : x(x), y(y), z(z) {} - ScriptVec3Float(const ScriptVec3Float& other) : QObject(), x(other.x), y(other.y), z(other.z) {} + ScriptVec3Float(const ScriptVec3Float& other) : x(other.x), y(other.y), z(other.z) {} ScriptVec3Float(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } @@ -116,7 +113,6 @@ public: inline bool operator!=(const glm::vec3& other) const { return !(*this == other); } glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y", "z" }).toVariant(); } float x { 0.0f }; float y { 0.0f }; @@ -144,20 +140,18 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) * @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g, green, and height. * @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b, blue, and depth. */ -class ScriptVec3UChar : public QObject { - Q_OBJECT +class ScriptVec3UChar { public: ScriptVec3UChar() {} ScriptVec3UChar(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} ScriptVec3UChar(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} - ScriptVec3UChar(const ScriptVec3UChar& other) : QObject(), x(other.x), y(other.y), z(other.z) {} + ScriptVec3UChar(const ScriptVec3UChar& other) : x(other.x), y(other.y), z(other.z) {} ScriptVec3UChar(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} void operator=(const ScriptVec3UChar& other) { x = other.x; y = other.y; z = other.z; } inline bool operator==(const ScriptVec3UChar& other) const { return (x == other.x && y == other.y && z == other.z); } inline bool operator!=(const ScriptVec3UChar& other) const { return !(*this == other); } glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - Q_INVOKABLE QVariant toJSON() const { return toJsonValue(*this, { "x", "y", "z" }).toVariant(); } unsigned char x { 0 }; unsigned char y { 0 }; diff --git a/libraries/shared/src/shared/JSONHelpers.cpp b/libraries/shared/src/shared/JSONHelpers.cpp index afbdfdbd41..298a1ea85d 100644 --- a/libraries/shared/src/shared/JSONHelpers.cpp +++ b/libraries/shared/src/shared/JSONHelpers.cpp @@ -76,12 +76,6 @@ QJsonValue toJsonValueHelper(const QVariant& variant, int type) { return toJsonValue(variant.value()); } else if (type == qMetaTypeId()) { return toJsonValue(variant.value()); - } else if (type == qMetaTypeId()) { - return toJsonValue(variant.value(), {"x", "y"}); - } else if (type == qMetaTypeId()) { - return toJsonValue(variant.value(), { "x", "y", "z" }); - } else if (type == qMetaTypeId()) { - return toJsonValue(variant.value(), { "x", "y", "z" }); } else { // Qt types are converted automatically return QJsonValue::fromVariant(variant); From fd977a758bed08860ffff4ecb22e3af49b3b6e59 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 8 Aug 2018 10:49:34 +1200 Subject: [PATCH 022/434] Update teleport destination model --- .../assets/models/teleportationSpotBasev3.fbx | Bin 54140 -> 0 bytes .../assets/models/teleportationSpotBasev5.fbx | Bin 0 -> 672556 bytes .../controllers/controllerModules/teleport.js | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 scripts/system/assets/models/teleportationSpotBasev3.fbx create mode 100644 scripts/system/assets/models/teleportationSpotBasev5.fbx diff --git a/scripts/system/assets/models/teleportationSpotBasev3.fbx b/scripts/system/assets/models/teleportationSpotBasev3.fbx deleted file mode 100644 index d9041762f385c4aeb58b9cb9bd81f70e3a641be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54140 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%0A`B~yqBMned4t)OINmdt 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ÿ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%0Aum?Ws_%!euWq%JRFCT((rh_8JZhw zATR+F19yzx?fh`bBsK;VULMU^sc+({fENw7NzWvTXm!wvOO zsl4j%zpDTjIr_{0uHw=L3;>zx{O)zXO~ak7dv#LmjQ$r}KfVlW$EQNDJ?%-pjJTV| zPHPHG24sf$Zxi_ts;t@X<;R^(p%8Z~CZh2<0PEEq)!&H+ODlAc?N6 z^I6fX9ELR2{B+X!>UGyAc(RwCklIsLDhhJlj_*#MxVUO|>LQ1kkdPV-0GddGhPh%0 zCeY&xKLDh6_t#@rlol^r-&jThKyB~xuu9OFOu&;yVwgTQ9lah*hJ<$$3M6ffmC>LIZTxuP0@s&&z@)4d~S#wH3!Ga4?QU#B7!{{@{ zBr)QZK6E#?fVq?{8vrDAdvj4Ijn(C~hmHGaIJ3KVEg+vHn+W+Ns)n}vAs4zhD;_x= zk))vGAg?0O;Lch_{?+)Ew5t=9qwB4bWA4%5#WbhapTWIr% zMe`FnkX2H3{y!@q9KaBJVyCDq+C2&OW!gr<+xfyF7GXc6qs6C!V%u1YmG;ol$ZPoI zs4XAmR|9!G{I>9Rz5tpYVK&6tO-9U@4qZOlH9Tg8%O6S&sB@7)rjKGeo-0p5uBYv} zU_-`i6UA3qMgdL#@1gN++vTz!Na9fk20xUg$qa5!#wrHO$tXxtj@tiy*7nQM*O?ag z!U*z6PAVCc@uLK}Lm6q%;=Xh&o?J9P$yydkih3N=;r{kN ze^l4_4TW<+XP|TsD(WIs2#STx+hMgXR4s!biS6+)80yv ztf!$T5}<^;{?dVU(ewtR4u%0sxovp=KcOk@!w@s#h>0v+;L?q6+poQlYI7UQ&^ZFt zurc-*A^JA#qB6o_Xgc3yxN|%bdZKkzUtjcdv_uj*+<>YAhjNb(EI+Jt!`G46!dc&W zU|qDdK?}+9D|N+Z2+&L)9a-BWOrB=jJ9AIsWC)XYg_}>HAp{bSaO&HwmHCc6T9O2j z!;jgay>`Dxg#b>i@4V2em2|iTxMDJpT3`SE^yU`eB8M~Y39mps?8cUmhv|GYbfOmY z3;)k)f)Wx=hj~1KXv@TUQV$BtgfPMQT~SqGZa(PY`19b6A1!|^cAPN)@RsvN`+5ykxm{*e6xU3p8h{=uN{ zF47OLd?AQDdi4OJ0(1)#6FZGXKnPO`N>XGFdqeRZzuq>kvAq*ppT*8l$@z5hGnBay z4ruEKNNWV$R_Rv?VM;+(xc9FBh@VxjT3WHIv>H7`Tb#Ra?;H{eH~1cbhOn8bo>W#M z*?UFHZLEvt$YSvti$ynb56YS5R(DHvwgBRVRxID*T_NG0E0+H>oY{Ek9t;3dvs}dY zOT~9E#OW6lKi@me{Ra&LW-oM}LessT4?(-_Wvs8C_^+jO2=gq&9Q$A9 z{E}J>#r#!%rQqGfBIINHp^@~f0`4-#hW;T8wGmiT#3YyabBap6o%c{iwx6?itA^mcb+ERD^St5rpAkE^3%T6DL> zdy(vk(aCVvonl@<`qo_P>bO~w&8&~WGJ3O8QFU&{4=UzI#HyQ=;N_N?!8(4ggRP#! zD+CIwy?3q;lV)$CRRBO0%0x&G3;Bl%I@1cytD;HcT{06(JUh1Mc0XVAD@yn*H(%4k z*=Oay+Xn+6^tpokjGM*+oxk1<%P_qvFvdRpxEv3xh-S!c?oVVV8hC2L< z5TMRMfS=#_{``e|B51lG)Yy}Y`2GNNnr+VO9qMt^6?9jyBInAb<^azfVrdB`voYZwy|UG5)KL+G<_Jbjhn;9t>s& z!0c%}vkA-C@0<-|j4tu0@6*^Cy8g(yrB∾gru#-k+9>X}>q&pf0(bp`Mk#pXm&| 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 HlI#Bi>SG1W literal 0 HcmV?d00001 diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index ee0825625b..d63fe75910 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -21,10 +21,10 @@ Script.include("/~/system/libraries/controllers.js"); (function() { // BEGIN LOCAL_SCOPE - var TARGET_MODEL_URL = Script.resolvePath("../../assets/models/teleportationSpotBasev3.fbx"); + var TARGET_MODEL_URL = Script.resolvePath("../../assets/models/teleportationSpotBasev5.fbx"); var SEAT_MODEL_URL = Script.resolvePath("../../assets/models/teleport-seat.fbx"); - var TARGET_MODEL_DIMENSIONS = { x: 0.6552, y: 0.0010, z: 0.6552 }; + var TARGET_MODEL_DIMENSIONS = { x: 0.6552, y: 0.3063, z: 0.6552 }; var COLORS_TELEPORT_SEAT = { red: 255, From f7c17df6ccd6f8e97e876436211d2c8b29356658 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 8 Aug 2018 16:32:08 +1200 Subject: [PATCH 023/434] Float play area and sensors above the ground --- .../controllers/controllerModules/teleport.js | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index d63fe75910..8c57fc58ba 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -212,9 +212,9 @@ Script.include("/~/system/libraries/controllers.js"); this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpacev2.fbx"); this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; - this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT = this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y - / this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.x; - this.PLAY_AREA_OVERLAY_OFFSET = { x: 0, y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2, z: 0 }; + this.PLAY_AREA_FLOAT_ABOVE_FLOOR = 0.3; + this.PLAY_AREA_OVERLAY_OFFSET = // Offset from floor. + { x: 0, y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2 + this.PLAY_AREA_FLOAT_ABOVE_FLOOR, z: 0 }; this.PLAY_AREA_SENSOR_OVERLAY_MODEL = Script.resolvePath("../../assets/models/oculusSensorv2.fbx"); this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS = { x: 0.1198, y: 0.2981, z: 0.1198 }; this.PLAY_AREA_SENSOR_OVERLAY_ROTATION = Quat.fromVec3Degrees({ x: 0, y: -90, z: 0 }); @@ -272,27 +272,44 @@ Script.include("/~/system/libraries/controllers.js"); this.setPlayAreaDimensions = function () { var avatarScale = MyAvatar.scale; - Overlays.editOverlay(this.playAreaOverlay, { + var playAreaOverlayProperties = { dimensions: Vec3.multiply(this.teleportScaleFactor * avatarScale, { x: this.playArea.width, - y: this.PLAY_AREA_OVERLAY_MODEL_UNIT_HEIGHT, + y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y, z: this.playArea.height }) - }); + }; + + if (this.teleportScaleFactor < 1) { + // Adjust position of playAreOverlay so that its base is at correct height. + // Always parenting to teleport target is good enough for this. + var sensorToWorldMatrix = MyAvatar.sensorToWorldMatrix; + var sensorToWorldRotation = Mat4.extractRotation(MyAvatar.sensorToWorldMatrix); + var worldToSensorMatrix = Mat4.inverse(sensorToWorldMatrix); + var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position); + avatarSensorPosition.y = 0; + + var targetRotation = Overlays.getProperty(this.targetOverlayID, "rotation"); + var relativePlayAreaCenterOffset = + Vec3.sum(this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 }); + var localPosition = Vec3.multiplyQbyV(Quat.inverse(targetRotation), + Vec3.multiplyQbyV(sensorToWorldRotation, + Vec3.multiply(MyAvatar.scale, Vec3.subtract(relativePlayAreaCenterOffset, avatarSensorPosition)))); + localPosition.y = this.teleportScaleFactor * localPosition.y; + + playAreaOverlayProperties.parentID = this.targetOverlayID; + playAreaOverlayProperties.localPosition = localPosition; + } + + Overlays.editOverlay(this.playAreaOverlay, playAreaOverlayProperties); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { - var localPosition = this.playAreaSensorPositions[i]; + localPosition = this.playAreaSensorPositions[i]; localPosition = Vec3.multiply(avatarScale, localPosition); - /* - // Position at the correct elevation. Tracking origin is at eye height. - localPosition.y = MyAvatar.getEyeHeight() + localPosition.y - - avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - - this.playAreaCenterOffset.y / 2; - */ - // Position on the floor. - localPosition.y = avatarScale * this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - - this.playAreaCenterOffset.y / 2; + // Position relative to the play area. + localPosition.y = avatarScale * (this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 + - this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2); Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { dimensions: Vec3.multiply(this.teleportScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), parentID: this.playAreaOverlay, @@ -418,11 +435,14 @@ Script.include("/~/system/libraries/controllers.js"); // Set play area position and rotation in local coordinates with parenting. var targetRotation = Overlays.getProperty(this.targetOverlayID, "rotation"); var sensorToTargetRotation = Quat.multiply(Quat.inverse(targetRotation), sensorToWorldRotation); + var relativePlayAreaCenterOffset = + Vec3.sum(this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 }); + Overlays.editOverlay(this.playAreaOverlay, { parentID: this.targetOverlayID, localPosition: Vec3.multiplyQbyV(Quat.inverse(targetRotation), Vec3.multiplyQbyV(sensorToWorldRotation, - Vec3.multiply(MyAvatar.scale, Vec3.subtract(this.playAreaCenterOffset, avatarSensorPosition)))), + Vec3.multiply(MyAvatar.scale, Vec3.subtract(relativePlayAreaCenterOffset, avatarSensorPosition)))), localRotation: sensorToTargetRotation }); } From 71341cf700bc681d9e5567c5143aeca35f4ea1bf Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 9 Aug 2018 10:51:12 +1200 Subject: [PATCH 024/434] Display teleport target after teleport --- .../controllers/controllerModules/teleport.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 8c57fc58ba..b6bc3af700 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -248,6 +248,16 @@ Script.include("/~/system/libraries/controllers.js"); }); Selection.addToSelectedItemsList(this.teleporterSelectionName, "overlay", this.playAreaOverlay); + this.teleportedPosition = Vec3.ZERO; + this.TELEPORTED_TARGET_ALPHA = 1.0; + this.TELEPORTED_TARGET_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }); + this.teleportedTargetOverlay = Overlays.addOverlay("model", { + url: TARGET_MODEL_URL, + alpha: this.TELEPORTED_TARGET_ALPHA, + visible: false + }); + Selection.addToSelectedItemsList(this.teleportedTargetOverlay, "overlay", this.playAreaOverlay); + this.addPlayAreaSensorPositionOverlay = function () { var overlay = Overlays.addOverlay("model", { url: this.PLAY_AREA_SENSOR_OVERLAY_MODEL, @@ -332,6 +342,9 @@ Script.include("/~/system/libraries/controllers.js"); _this.PlayAreaFadeFactor = _this.PlayAreaFadeFactor - _this.PLAY_AREA_FADE_DELTA; if (_this.PlayAreaFadeFactor > 0) { // Fade. + Overlays.editOverlay(_this.teleportedTargetOverlay, { + alpha: _this.PlayAreaFadeFactor * _this.TELEPORTED_TARGET_ALPHA + }); Overlays.editOverlay(_this.playAreaOverlay, { alpha: _this.PlayAreaFadeFactor * _this.PLAY_AREA_BOX_ALPHA }); var sensorAlpha = _this.PlayAreaFadeFactor * _this.PLAY_AREA_SENSOR_ALPHA; for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { @@ -340,6 +353,7 @@ Script.include("/~/system/libraries/controllers.js"); _this.playAreaFadeTimer = Script.setTimeout(_this.fadePlayArea, _this.PLAY_AREA_FADE_INTERVAL); } else { // Make invisible. + Overlays.editOverlay(_this.teleportedTargetOverlay, { visible: false }); Overlays.editOverlay(_this.playAreaOverlay, { visible: false }); for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { visible: false }); @@ -376,6 +390,19 @@ Script.include("/~/system/libraries/controllers.js"); }); } } else { + // Copy of target at teleported position for fading. + Overlays.editOverlay(this.teleportedTargetOverlay, { + position: Vec3.sum(this.teleportedPosition, { + x: 0, + y: -getAvatarFootOffset() + MyAvatar.scale * TARGET_MODEL_DIMENSIONS.y / 2, + z: 0 + }), + rotation: Quat.multiply(this.TELEPORTED_TARGET_ROTATION, MyAvatar.orientation), + dimensions: Vec3.multiply(MyAvatar.scale, TARGET_MODEL_DIMENSIONS), + alpha: this.TELEPORTED_TARGET_ALPHA, + visible: true + }); + // Fade out over time. this.PlayAreaFadeFactor = 1.0; _this.playAreaFadeTimer = Script.setTimeout(this.fadePlayArea, this.PLAY_AREA_FADE_DELAY); @@ -503,6 +530,7 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.removePointer(this.teleportParabolaHandInvisible); Pointers.removePointer(this.teleportParabolaHeadVisible); Pointers.removePointer(this.teleportParabolaHeadInvisible); + Overlays.deleteOverlay(this.teleportedTargetOverlay); Overlays.deleteOverlay(this.playAreaOverlay); for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { Overlays.deleteOverlay(this.playAreaSensorPositionOverlays[i]); @@ -592,6 +620,7 @@ Script.include("/~/system/libraries/controllers.js"); this.teleport = function(newResult, target) { var result = newResult; + this.teleportedPosition = newResult.intersection; if (_this.buttonValue !== 0) { return makeRunningValues(true, [], []); } From 521797b32f0e75a053fcda8d891b915eabff1379 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 9 Aug 2018 20:44:01 +1200 Subject: [PATCH 025/434] Script and state machine basics --- scripts/system/tabletRezzer.js | 237 +++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 scripts/system/tabletRezzer.js diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js new file mode 100644 index 0000000000..ebc2c2cbea --- /dev/null +++ b/scripts/system/tabletRezzer.js @@ -0,0 +1,237 @@ +// +// tabletRezzer.js +// +// Created by David Rowe on 9 Aug 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 +// + +/* global */ + +(function () { + + "use strict"; + + var // Overlay + proxyOverlay, + + // State machine + PROXY_HIDDEN = 0, + PROXY_VISIBLE = 1, + PROXY_GRABBED = 2, + PROXY_EXPANDING = 3, + TABLET_OPEN = 4, + STATE_STRINGS = ["PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_GRABBED", "PROXY_EXPANDING", "TABLET_OPEN"], + STATE_MACHINE, + rezzerState = PROXY_HIDDEN, + proxyHand, + + // Events + MIN_HAND_CAMERA_ANGLE = 30, + DEGREES_180 = 180, + MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), + updateTimer = null, + UPDATE_INTERVAL = 250, + + LEFT_HAND = 0, + RIGHT_HAND = 1, + DEBUG = true; + + // #region Utilities ======================================================================================================= + + function debug(message) { + if (!DEBUG) { + return; + } + print("DEBUG: " + message); + } + + function error(message) { + print("ERROR: " + message); + } + + function handJointName(hand) { + var jointName; + if (hand === LEFT_HAND) { + if (Camera.mode === "first person") { + jointName = "_CONTROLLER_LEFTHAND"; + } else if (Camera.mode === "third person") { + jointName = "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"; + } else { + jointName = "LeftHand"; + } + } else { + if (Camera.mode === "first person") { + jointName = "_CONTROLLER_RIGHTHAND"; + } else if (Camera.mode === "third person") { + jointName = "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"; + } else { + jointName = "RightHand"; + } + } + return jointName; + } + + function handJointIndex(hand) { + return MyAvatar.getJointIndex(handJointName(hand)); + } + + // #endregion + + // #region State Machine =================================================================================================== + + function enterProxyHidden() { + } + + function enterProxyVisible(hand) { + proxyHand = hand; + } + + STATE_MACHINE = { + PROXY_HIDDEN: { // Tablet proxy could be shown but isn't because hand is oriented to show it or aren't in HMD mode. + enter: enterProxyHidden, + update: null, + exit: null + }, + PROXY_VISIBLE: { // Tablet proxy is visible and attached to hand. + enter: enterProxyVisible, + update: null, + exit: null + }, + PROXY_GRABBED: { // Other hand has grabbed and is holding the tablet proxy. + enter: null, + update: null, + exit: null + }, + PROXY_EXPANDING: { // Tablet proxy has been released from grab and is expanding before showing tablet proper. + enter: null, + update: null, + exit: null + }, + TABLET_OPEN: { // Tablet proper is being displayed. + enter: null, + update: null, + exit: null + } + }; + + function setState(state, data) { + if (state !== rezzerState) { + debug("State transition from " + STATE_STRINGS[rezzerState] + " to " + STATE_STRINGS[state]); + if (STATE_MACHINE[STATE_STRINGS[rezzerState]].exit) { + STATE_MACHINE[STATE_STRINGS[rezzerState]].exit(data); + } + if (STATE_MACHINE[STATE_STRINGS[state]].enter) { + STATE_MACHINE[STATE_STRINGS[state]].enter(data); + } + rezzerState = state; + } else { + error("Null state transition: " + state + "!"); + } + } + + function updateState() { + STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); + } + + // #endregion + + // #region Events ========================================================================================================== + + function shouldShowProxy(hand) { + // Should show tablet proxy if hand is oriented towards the camera. + var pose, + jointIndex, + handPosition, + handOrientation; + + pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); + if (!pose.valid) { + return false; + } + + jointIndex = handJointIndex(hand); + handPosition = Vec3.sum(MyAvatar.position, + Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); + handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); + + return Vec3.dot(Vec3.normalize(Vec3.subtract(handPosition, Camera.position)), Quat.getForward(handOrientation)) + > MIN_HAND_CAMERA_ANGLE_COS; + } + + function update() { + // Assumes that is HMD.mounted. + switch (rezzerState) { + case PROXY_HIDDEN: + // Compare palm directions of hands with vectors from palms to camera. + if (shouldShowProxy(LEFT_HAND)) { + setState(PROXY_VISIBLE, LEFT_HAND); + break; + } else if (shouldShowProxy(RIGHT_HAND)) { + setState(PROXY_VISIBLE, RIGHT_HAND); + break; + } + break; + case PROXY_VISIBLE: + // Check that palm direction of proxy hand still less than maximum angle. + if (!shouldShowProxy(proxyHand)) { + setState(PROXY_HIDDEN); + break; + } + break; + default: + error("Missing case: " + rezzerState); + } + + updateTimer = Script.setTimeout(update, UPDATE_INTERVAL); + } + + + function onMountedChanged() { + // Tablet proxy only available when HMD is mounted. + + if (HMD.mounted) { + if (updateTimer === null) { + update(); + } + return; + } + + if (updateTimer !== null) { + Script.clearTimeout(updateTimer); + updateTimer = null; + } + if (rezzerState !== PROXY_HIDDEN) { + setState(PROXY_HIDDEN); + } + } + + // #endregion + + // #region Start-up and tear-down ========================================================================================== + + function setUp() { + HMD.mountedChanged.connect(onMountedChanged); + HMD.displayModeChanged.connect(onMountedChanged); // For the case that the HMD is already worn when the script starts. + if (HMD.mounted) { + update(); + } + } + + function tearDown() { + HMD.displayModeChanged.disconnect(onMountedChanged); + HMD.mountedChanged.disconnect(onMountedChanged); + if (updateTimer !== null) { + Script.clearTimeout(updateTimer); + updateTimer = null; + } + } + + setUp(); + Script.scriptEnding.connect(tearDown); + + //#endregion + +}()); From 5bada416bb6570467a0343ad94493e732d3e3b5d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 09:41:25 +1200 Subject: [PATCH 026/434] Show/hide/expand tablet proxy --- scripts/system/tabletRezzer.js | 136 +++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 7 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index ebc2c2cbea..a62b0741bc 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -8,14 +8,29 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -/* global */ +/* global getTabletWidthFromSettings */ (function () { "use strict"; + Script.include("./libraries/utils.js"); + var // Overlay - proxyOverlay, + proxyOverlay = null, + TABLET_PROXY_DIMENSIONS = { x: 0.0638, y: 0.0965, z: 0.0045 }, + TABLET_PROXY_POSITION_LEFT_HAND = { + x: 0, + y: 0.07, // Distance from joint. + z: 0.07 // Distance above palm. + }, + TABLET_PROXY_POSITION_RIGHT_HAND = { + x: 0, + y: 0.07, // Distance from joint. + z: 0.07 // Distance above palm. + }, + TABLET_PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 90 }), + TABLET_PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), // State machine PROXY_HIDDEN = 0, @@ -27,6 +42,12 @@ STATE_MACHINE, rezzerState = PROXY_HIDDEN, proxyHand, + PROXY_EXPAND_DURATION = 500, + PROXY_EXPAND_TIMEOUT = 25, + proxyExpandTimer = null, + proxyExpandStart, + proxyInitialWidth, + proxyTargetWidth, // Events MIN_HAND_CAMERA_ANGLE = 30, @@ -34,10 +55,11 @@ MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), updateTimer = null, UPDATE_INTERVAL = 250, + HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", LEFT_HAND = 0, RIGHT_HAND = 1, - DEBUG = true; + DEBUG = false; // #region Utilities ======================================================================================================= @@ -83,10 +105,73 @@ // #region State Machine =================================================================================================== function enterProxyHidden() { + Overlays.deleteOverlay(proxyOverlay); + proxyOverlay = null; } function enterProxyVisible(hand) { proxyHand = hand; + proxyOverlay = Overlays.addOverlay("cube", { + parentID: MyAvatar.SELF_ID, + parentJointIndex: handJointIndex(proxyHand), + localPosition: proxyHand === LEFT_HAND ? TABLET_PROXY_POSITION_LEFT_HAND : TABLET_PROXY_POSITION_RIGHT_HAND, + localRotation: proxyHand === LEFT_HAND ? TABLET_PROXY_ROTATION_LEFT_HAND : TABLET_PROXY_ROTATION_RIGHT_HAND, + dimensions: TABLET_PROXY_DIMENSIONS, + solid: true, + grabbable: true, + displayInFront: true, + visible: true + }); + } + + function expandProxy() { + var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; + if (scaleFactor < 1) { + Overlays.editOverlay(proxyOverlay, { + dimensions: Vec3.multiply( + 1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth, + TABLET_PROXY_DIMENSIONS) + }); + proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); + return; + } + + proxyExpandTimer = null; + setState(TABLET_OPEN); + } + + function enterProxyExpanding() { + // Detach from hand. + Overlays.editOverlay(proxyOverlay, { + parentID: Uuid.NULL, + parentJointIndex: -1 + }); + + // Start expanding. + proxyInitialWidth = TABLET_PROXY_DIMENSIONS.x; + proxyTargetWidth = getTabletWidthFromSettings(); + proxyExpandStart = Date.now(); + proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); + } + + function exitProxyExpanding() { + if (proxyExpandTimer !== null) { + Script.clearTimeout(proxyExpandTimer); + proxyExpandTimer = null; + } + } + + function enterTabletOpen() { + var proxyOverlayProperties = Overlays.getProperties(proxyOverlay, ["position", "orientation"]); + + Overlays.deleteOverlay(proxyOverlay); + proxyOverlay = null; + + Overlays.editOverlay(HMD.tabletID, { + position: proxyOverlayProperties.position, + orientation: proxyOverlayProperties.orientation + }); + HMD.openTablet(true); } STATE_MACHINE = { @@ -106,12 +191,12 @@ exit: null }, PROXY_EXPANDING: { // Tablet proxy has been released from grab and is expanding before showing tablet proper. - enter: null, + enter: enterProxyExpanding, update: null, - exit: null + exit: exitProxyExpanding }, TABLET_OPEN: { // Tablet proper is being displayed. - enter: null, + enter: enterTabletOpen, update: null, exit: null } @@ -181,6 +266,14 @@ break; } break; + case PROXY_GRABBED: + case PROXY_EXPANDING: + break; + case TABLET_OPEN: + if (!HMD.showTablet) { + setState(PROXY_HIDDEN); + } + break; default: error("Missing case: " + rezzerState); } @@ -188,6 +281,24 @@ updateTimer = Script.setTimeout(update, UPDATE_INTERVAL); } + function onMessageReceived(channel, data, senderID, localOnly) { + var message; + + if (channel !== HIFI_OBJECT_MANIPULATION_CHANNEL) { + return; + } + + message = JSON.parse(data); + if (message.grabbedEntity !== proxyOverlay) { + return; + } + + if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { + setState(PROXY_GRABBED); + } else if (message.action === "release" && rezzerState === PROXY_GRABBED) { + setState(PROXY_EXPANDING); + } + } function onMountedChanged() { // Tablet proxy only available when HMD is mounted. @@ -213,6 +324,9 @@ // #region Start-up and tear-down ========================================================================================== function setUp() { + Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); + Messages.messageReceived.connect(onMessageReceived); + HMD.mountedChanged.connect(onMountedChanged); HMD.displayModeChanged.connect(onMountedChanged); // For the case that the HMD is already worn when the script starts. if (HMD.mounted) { @@ -221,17 +335,25 @@ } function tearDown() { + setState(PROXY_HIDDEN); // Or just tear right down? Perhaps so. + + Messages.messageReceived.disconnect(onMessageReceived); + Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); + HMD.displayModeChanged.disconnect(onMountedChanged); HMD.mountedChanged.disconnect(onMountedChanged); if (updateTimer !== null) { Script.clearTimeout(updateTimer); updateTimer = null; } + if (proxyOverlay !== null) { + Overlays.deleteOverlay(proxyOverlay); + } } setUp(); Script.scriptEnding.connect(tearDown); - //#endregion + // #endregion }()); From 047ea0deaf3ae4efd45f9b05ed57d7bcef1d5581 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 11:31:50 +1200 Subject: [PATCH 027/434] Remove the post-teleport spot if a new teleport is started --- scripts/system/controllers/controllerModules/teleport.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index b6bc3af700..bfd4a150e1 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -389,6 +389,7 @@ Script.include("/~/system/libraries/controllers.js"); visible: visible }); } + Overlays.editOverlay(this.teleportedTargetOverlay, { visible: false }); } else { // Copy of target at teleported position for fading. Overlays.editOverlay(this.teleportedTargetOverlay, { From 0aa42d70d65ac47cbcef5973d55801bc546cd047 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 12:37:21 +1200 Subject: [PATCH 028/434] Don't let the tablet proxy hand do the initial grab --- scripts/system/tabletRezzer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index a62b0741bc..e338e767bb 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -59,6 +59,7 @@ LEFT_HAND = 0, RIGHT_HAND = 1, + HAND_NAMES = ["LeftHand", "RightHand"], DEBUG = false; // #region Utilities ======================================================================================================= @@ -293,7 +294,9 @@ return; } - if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { + // Don't transition into PROXY_GRABBED unless the tablet proxy is grabbed with "other" hand. However, once it has been + // grabbed then the original hand can grab it back and grow it from there. + if (message.action === "grab" && message.joint !== HAND_NAMES[proxyHand] && rezzerState === PROXY_VISIBLE) { setState(PROXY_GRABBED); } else if (message.action === "release" && rezzerState === PROXY_GRABBED) { setState(PROXY_EXPANDING); From b240a4248dfe7476fa869c25559ef323ea6eec2e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 12:51:06 +1200 Subject: [PATCH 029/434] Size and position according to avatar scale --- scripts/system/tabletRezzer.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index e338e767bb..a34f79da11 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -56,6 +56,7 @@ updateTimer = null, UPDATE_INTERVAL = 250, HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", + avatarScale = 1, LEFT_HAND = 0, RIGHT_HAND = 1, @@ -115,9 +116,10 @@ proxyOverlay = Overlays.addOverlay("cube", { parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(proxyHand), - localPosition: proxyHand === LEFT_HAND ? TABLET_PROXY_POSITION_LEFT_HAND : TABLET_PROXY_POSITION_RIGHT_HAND, + localPosition: Vec3.multiply(avatarScale, + proxyHand === LEFT_HAND ? TABLET_PROXY_POSITION_LEFT_HAND : TABLET_PROXY_POSITION_RIGHT_HAND), localRotation: proxyHand === LEFT_HAND ? TABLET_PROXY_ROTATION_LEFT_HAND : TABLET_PROXY_ROTATION_RIGHT_HAND, - dimensions: TABLET_PROXY_DIMENSIONS, + dimensions: Vec3.multiply(avatarScale, TABLET_PROXY_DIMENSIONS), solid: true, grabbable: true, displayInFront: true, @@ -130,7 +132,7 @@ if (scaleFactor < 1) { Overlays.editOverlay(proxyOverlay, { dimensions: Vec3.multiply( - 1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth, + avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth), TABLET_PROXY_DIMENSIONS) }); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); @@ -282,6 +284,12 @@ updateTimer = Script.setTimeout(update, UPDATE_INTERVAL); } + function onScaleChanged() { + avatarScale = MyAvatar.scale; + // Clamp scale in order to work around M17434. + avatarScale = Math.max(MyAvatar.getDomainMinScale(), Math.min(MyAvatar.getDomainMaxScale(), avatarScale)); + } + function onMessageReceived(channel, data, senderID, localOnly) { var message; @@ -327,6 +335,8 @@ // #region Start-up and tear-down ========================================================================================== function setUp() { + MyAvatar.scaleChanged.connect(onScaleChanged); + Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); Messages.messageReceived.connect(onMessageReceived); @@ -343,6 +353,8 @@ Messages.messageReceived.disconnect(onMessageReceived); Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); + MyAvatar.scaleChanged.disconnect(onScaleChanged); + HMD.displayModeChanged.disconnect(onMountedChanged); HMD.mountedChanged.disconnect(onMountedChanged); if (updateTimer !== null) { From 557f18f370e9ac2bef5715beb881af7680b830d2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 13:10:24 +1200 Subject: [PATCH 030/434] Don't show proxy if tablet has been opened by other means --- scripts/system/tabletRezzer.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index a34f79da11..6efaa33ed6 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -107,8 +107,10 @@ // #region State Machine =================================================================================================== function enterProxyHidden() { - Overlays.deleteOverlay(proxyOverlay); - proxyOverlay = null; + if (proxyOverlay) { + Overlays.deleteOverlay(proxyOverlay); + proxyOverlay = null; + } } function enterProxyVisible(hand) { @@ -253,30 +255,39 @@ // Assumes that is HMD.mounted. switch (rezzerState) { case PROXY_HIDDEN: + // Don't show proxy is tablet is already displayed. + if (HMD.showTablet) { + break; + } // Compare palm directions of hands with vectors from palms to camera. if (shouldShowProxy(LEFT_HAND)) { setState(PROXY_VISIBLE, LEFT_HAND); - break; } else if (shouldShowProxy(RIGHT_HAND)) { setState(PROXY_VISIBLE, RIGHT_HAND); - break; } break; case PROXY_VISIBLE: + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + break; + } // Check that palm direction of proxy hand still less than maximum angle. if (!shouldShowProxy(proxyHand)) { setState(PROXY_HIDDEN); - break; } break; case PROXY_GRABBED: case PROXY_EXPANDING: - break; - case TABLET_OPEN: - if (!HMD.showTablet) { + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { setState(PROXY_HIDDEN); } break; + case TABLET_OPEN: + // Immediately transition back to PROXY_HIDDEN. + setState(PROXY_HIDDEN); + break; default: error("Missing case: " + rezzerState); } From bc456ae5c8c010b6784b9e058454fd8ed0e5b14f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 13:18:21 +1200 Subject: [PATCH 031/434] Don't show proxy if in toolbar mode --- scripts/system/tabletRezzer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 6efaa33ed6..390eaadded 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -48,6 +48,7 @@ proxyExpandStart, proxyInitialWidth, proxyTargetWidth, + tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), // Events MIN_HAND_CAMERA_ANGLE = 30, @@ -255,8 +256,8 @@ // Assumes that is HMD.mounted. switch (rezzerState) { case PROXY_HIDDEN: - // Don't show proxy is tablet is already displayed. - if (HMD.showTablet) { + // Don't show proxy is tablet is already displayed or are in toolbar mode. + if (HMD.showTablet || tablet.toolbarMode) { break; } // Compare palm directions of hands with vectors from palms to camera. From 3732de51a37f98c844527959d8a28d4c630f1c9d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 13:25:41 +1200 Subject: [PATCH 032/434] Tidying --- scripts/system/tabletRezzer.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 390eaadded..a84c53ad9e 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -55,7 +55,7 @@ DEGREES_180 = 180, MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), updateTimer = null, - UPDATE_INTERVAL = 250, + UPDATE_INTERVAL = 300, HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", avatarScale = 1, @@ -223,10 +223,6 @@ } } - function updateState() { - STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); - } - // #endregion // #region Events ========================================================================================================== @@ -360,22 +356,20 @@ } function tearDown() { - setState(PROXY_HIDDEN); // Or just tear right down? Perhaps so. + if (updateTimer !== null) { + Script.clearTimeout(updateTimer); + updateTimer = null; + } + + setState(PROXY_HIDDEN); + + HMD.displayModeChanged.disconnect(onMountedChanged); + HMD.mountedChanged.disconnect(onMountedChanged); Messages.messageReceived.disconnect(onMessageReceived); Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); MyAvatar.scaleChanged.disconnect(onScaleChanged); - - HMD.displayModeChanged.disconnect(onMountedChanged); - HMD.mountedChanged.disconnect(onMountedChanged); - if (updateTimer !== null) { - Script.clearTimeout(updateTimer); - updateTimer = null; - } - if (proxyOverlay !== null) { - Overlays.deleteOverlay(proxyOverlay); - } } setUp(); From c89955b416a446ea0746bd7e135a85b133e5b10a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Aug 2018 13:53:53 +1200 Subject: [PATCH 033/434] Use FBX for tablet proxy --- scripts/system/assets/models/tinyTablet.fbx | Bin 0 -> 42864 bytes scripts/system/tabletRezzer.js | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 scripts/system/assets/models/tinyTablet.fbx diff --git a/scripts/system/assets/models/tinyTablet.fbx b/scripts/system/assets/models/tinyTablet.fbx new file mode 100644 index 0000000000000000000000000000000000000000..104d2df8cdb57bdaf23310a3a82baa26f9e82d16 GIT binary patch literal 42864 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 literal 0 HcmV?d00001 diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index a84c53ad9e..792deec164 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -18,7 +18,8 @@ var // Overlay proxyOverlay = null, - TABLET_PROXY_DIMENSIONS = { x: 0.0638, y: 0.0965, z: 0.0045 }, + TABLET_PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), + TABLET_PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0046 }, // Proportional to tablet proper. TABLET_PROXY_POSITION_LEFT_HAND = { x: 0, y: 0.07, // Distance from joint. @@ -116,7 +117,8 @@ function enterProxyVisible(hand) { proxyHand = hand; - proxyOverlay = Overlays.addOverlay("cube", { + proxyOverlay = Overlays.addOverlay("model", { + url: TABLET_PROXY_MODEL, parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(proxyHand), localPosition: Vec3.multiply(avatarScale, From 7a7fca3982573f1bba648244e4dfe3982614e49e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 11 Aug 2018 05:34:01 +1200 Subject: [PATCH 034/434] Update tiny tablet model --- scripts/system/assets/models/tinyTablet.fbx | Bin 42864 -> 411712 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/system/assets/models/tinyTablet.fbx b/scripts/system/assets/models/tinyTablet.fbx index 104d2df8cdb57bdaf23310a3a82baa26f9e82d16..cdcdf8af3461946f9050f07f897312fb77f5ef38 100644 GIT binary patch literal 411712 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

T1vQwdFfn)XEo30mE8|8ko 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 delta 3350 zcmbtWYfxLq6+Wxgl^`HMAP5iw!j5Ct5Ddl`8!!?hWFaIZYzV325KBfEq97z!5`MH3 zB*)`Sr_+as+HRbQi@<0SNyXMQ~DSX;oQyRe5E}=Cbf( z%rz8G2v$l*(~4dznf_zRpCf0+UtfD_)n^OA8R^5RrJI#ymAqor=CbwS6$$@gBzvCu zS%pj#&P!=UlKTK)JT-Vyo*NFN${7ib@ei3nl=V>ff}#{5QTR^g$C(I)KPo!PAQXPC z>~%3hVf97{gL{S{sIM-TG{3vALM93#bwTjO>Vv*{EdULt5C9T%tgDChx(^s5D|gn( zL;x++BcMfkix>c!SkF`CTlfTDqFQaN+iUM&J+^EiD-mHXAVu_7{brU{O-Z?@##MAa zdzqsv*WFt1afCIR^K_0pkyk_o{hC_~@$|`Y!qF{XGi2HIE6z~lui2af|24%;s^>rY zHb=MQSA0d+YSSB^(An~AfU~21b4lLEDX5>x;uxWIyn>%9oDyPe2Y~cum*YT}%Sl6J z_v@WDcE4RAMA=L;B>dC-d=ZUC>5^tu0svn|qfwC{Lkn^~8jVsOrAh4o@ZV@ON)@TF zR50+B;Cu_MVy&%<_1KdIAEm-feNr3L7FDOVsfh#tpxc%N08}Rh019e>gz`{6{!k6% zTplW1|3q!9MWk)4+hcb*^(+9m;}~L-wTEq?{!Y{aDQ!X<@by|Ch6m9jzW3C;ff)oK zHM!h9R)@z{BVe246Jk04$^ngB_zmyyjh}LcBFD#gL(2hO#_^IJ-`5N+ z7n$<-k<7C+#l08XX{7!;(VH}a|CgS*Xec%gX@IC=CIldQw9U3gu&qXV;g9cUGf)&qIVh91t_znrL93q)l@t8uqh5S>^~^mkeyb1W*vS9#I$U_dU*`E3J# zxE0aEt;uC$9Y*Eb_id4hh_e$tgiTw4%=Mrwk)t7KRo#!rwgL(CigYBU3#H&J9T4?i z(N=zC)&a2|LL2d69gwMhR4#f?7qk|r$Q372U}Xc4{s7Y8T@659Rbf4TmQwsE1CKNS znR*dDl9O)W!4${9q+Q^^6mGIFa-8#zEb^@7uWz2J0OA9GsVC^+>u0@*e! zs(kQYmDTAt$gfrP-}o78Nx( zT73>{&u-T3-2iB@9JnK$HN;aKya~vl5!djUJ=_H3=1y$J?@+QGn{lQIh<`h-Cf8Y< zyXk`gKC3HfR@>}0)@2NwoX_H*)4QwF?qDkbaUAaPp>f#v^qGKsa0uTo(wR9}pP7JI zpBC@HRc0W6dRn{~VJe zZ2(^TWw$u3dDFlU4~Ra8q^<0JZ?Bs*?l~$zqP;CZ5_nuDt3p7|&M+%+O9+U3j>*D( zAs`DgOn!0&EK0Txa$v8AfYg1;sIYtx$muzz0_z5WgeDj@-Zuzj;Zr6%X))q6gFvo- z#8f3t4c-fV`Vf%QpED&`H3Vepb7n2J4*?ncH?tZ)KLq5;4W=B+hk-b6GdYq##V(~x zM1FFcDG-T=gL5xri;e;L%Wb9_dyfH;%rjM@-yeHkzA0(@lV{xY6u5m1$l-bByVx=e zWOAO#ky!e~8)YIAooA{Z_{T`>q)5`ZoKCjGYj-(4uM7i0UosgAzGVT7i*kP-1|meeGQqLm$u8e z)CIJZ>g}DKy&hKMa=6_75g=t!i6TR&wI!9~yr&Gs;saP{a)8StK+cIJ3ZKwfON_fl zWHh#9TCLrzCuNl1I(juoHN9>(>-4tJCmQ7{OH0ebaROpWyob}_@=HFTI0|0VLC+Ytm>Zne$ From b4ec1f43104b78512d2be55fa0f6cd9984546fd2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 11 Aug 2018 06:18:26 +1200 Subject: [PATCH 035/434] Reorient tablet proxy --- scripts/system/tabletRezzer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 792deec164..2b6e738a26 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -30,8 +30,14 @@ y: 0.07, // Distance from joint. z: 0.07 // Distance above palm. }, + /* + // Aligned cross-palm. TABLET_PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 90 }), TABLET_PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), + */ + // Aligned with palm. + TABLET_PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + TABLET_PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), // State machine PROXY_HIDDEN = 0, From 38d8a9a2da11eff836bdc1d184e3b56a4b5a6bbb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 11 Aug 2018 07:00:50 +1200 Subject: [PATCH 036/434] Send messages locally if not connected to a domain --- libraries/networking/src/MessagesClient.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/MessagesClient.cpp b/libraries/networking/src/MessagesClient.cpp index 2302c22a48..8f252ac69b 100644 --- a/libraries/networking/src/MessagesClient.cpp +++ b/libraries/networking/src/MessagesClient.cpp @@ -116,16 +116,16 @@ void MessagesClient::handleMessagesPacket(QSharedPointer receiv void MessagesClient::sendMessage(QString channel, QString message, bool localOnly) { auto nodeList = DependencyManager::get(); + QUuid senderID = nodeList->getSessionUUID(); if (localOnly) { - QUuid senderID = nodeList->getSessionUUID(); emit messageReceived(channel, message, senderID, true); } else { SharedNodePointer messagesMixer = nodeList->soloNodeOfType(NodeType::MessagesMixer); - if (messagesMixer) { - QUuid senderID = nodeList->getSessionUUID(); auto packetList = encodeMessagesPacket(channel, message, senderID); nodeList->sendPacketList(std::move(packetList), *messagesMixer); + } else { + emit messageReceived(channel, message, senderID, true); } } } From 2a177e04e165631145ae432775193ba08024c452 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 11 Aug 2018 10:11:56 +1200 Subject: [PATCH 037/434] Misc. tweaks --- libraries/networking/src/MessagesClient.cpp | 5 +++-- scripts/system/tabletRezzer.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/MessagesClient.cpp b/libraries/networking/src/MessagesClient.cpp index 8f252ac69b..d6f9d041ea 100644 --- a/libraries/networking/src/MessagesClient.cpp +++ b/libraries/networking/src/MessagesClient.cpp @@ -132,16 +132,17 @@ void MessagesClient::sendMessage(QString channel, QString message, bool localOnl void MessagesClient::sendData(QString channel, QByteArray data, bool localOnly) { auto nodeList = DependencyManager::get(); + QUuid senderID = nodeList->getSessionUUID(); if (localOnly) { - QUuid senderID = nodeList->getSessionUUID(); emit dataReceived(channel, data, senderID, true); } else { SharedNodePointer messagesMixer = nodeList->soloNodeOfType(NodeType::MessagesMixer); - if (messagesMixer) { QUuid senderID = nodeList->getSessionUUID(); auto packetList = encodeMessagesDataPacket(channel, data, senderID); nodeList->sendPacketList(std::move(packetList), *messagesMixer); + } else { + emit dataReceived(channel, data, senderID, true); } } } diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 2b6e738a26..b5f94a7c87 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -49,7 +49,7 @@ STATE_MACHINE, rezzerState = PROXY_HIDDEN, proxyHand, - PROXY_EXPAND_DURATION = 500, + PROXY_EXPAND_DURATION = 250, PROXY_EXPAND_TIMEOUT = 25, proxyExpandTimer = null, proxyExpandStart, From cd70c97e90f19101968bcae9b77df5aec9d1d1e1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 16 Aug 2018 10:58:14 +1200 Subject: [PATCH 038/434] Add tablet rezzer script to default scripts --- scripts/defaultScripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index b275660c0f..0e6aa08ba6 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -31,7 +31,8 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/dialTone.js", "system/firstPersonHMD.js", "system/tablet-ui/tabletUI.js", - "system/emote.js" + "system/emote.js", + "system/tabletRezzer.js" ]; var DEFAULT_SCRIPTS_SEPARATE = [ "system/controllers/controllerScripts.js", From cb9b7f567a1bdae3338668469f546cf0c92cb147 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 16 Aug 2018 16:08:36 +1200 Subject: [PATCH 039/434] Move update functions into state machine --- scripts/system/tabletRezzer.js | 98 +++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index b5f94a7c87..3033177b7e 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -121,6 +121,19 @@ } } + function updateProxyHidden() { + // Don't show proxy is tablet is already displayed or are in toolbar mode. + if (HMD.showTablet || tablet.toolbarMode) { + return; + } + // Compare palm directions of hands with vectors from palms to camera. + if (shouldShowProxy(LEFT_HAND)) { + setState(PROXY_VISIBLE, LEFT_HAND); + } else if (shouldShowProxy(RIGHT_HAND)) { + setState(PROXY_VISIBLE, RIGHT_HAND); + } + } + function enterProxyVisible(hand) { proxyHand = hand; proxyOverlay = Overlays.addOverlay("model", { @@ -138,6 +151,25 @@ }); } + function updateProxyVisible() { + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + return; + } + // Check that palm direction of proxy hand still less than maximum angle. + if (!shouldShowProxy(proxyHand)) { + setState(PROXY_HIDDEN); + } + } + + function updateProxyGrabbed() { + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + } + } + function expandProxy() { var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; if (scaleFactor < 1) { @@ -168,6 +200,13 @@ proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); } + function updateProxyExanding() { + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + } + } + function exitProxyExpanding() { if (proxyExpandTimer !== null) { Script.clearTimeout(proxyExpandTimer); @@ -188,30 +227,35 @@ HMD.openTablet(true); } + function updateTabletOpen() { + // Immediately transition back to PROXY_HIDDEN. + setState(PROXY_HIDDEN); + } + STATE_MACHINE = { PROXY_HIDDEN: { // Tablet proxy could be shown but isn't because hand is oriented to show it or aren't in HMD mode. enter: enterProxyHidden, - update: null, + update: updateProxyHidden, exit: null }, PROXY_VISIBLE: { // Tablet proxy is visible and attached to hand. enter: enterProxyVisible, - update: null, + update: updateProxyVisible, exit: null }, PROXY_GRABBED: { // Other hand has grabbed and is holding the tablet proxy. enter: null, - update: null, + update: updateProxyGrabbed, exit: null }, PROXY_EXPANDING: { // Tablet proxy has been released from grab and is expanding before showing tablet proper. enter: enterProxyExpanding, - update: null, + update: updateProxyExanding, exit: exitProxyExpanding }, TABLET_OPEN: { // Tablet proper is being displayed. enter: enterTabletOpen, - update: null, + update: updateTabletOpen, exit: null } }; @@ -231,6 +275,10 @@ } } + function updateState() { + STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); + } + // #endregion // #region Events ========================================================================================================== @@ -258,45 +306,7 @@ function update() { // Assumes that is HMD.mounted. - switch (rezzerState) { - case PROXY_HIDDEN: - // Don't show proxy is tablet is already displayed or are in toolbar mode. - if (HMD.showTablet || tablet.toolbarMode) { - break; - } - // Compare palm directions of hands with vectors from palms to camera. - if (shouldShowProxy(LEFT_HAND)) { - setState(PROXY_VISIBLE, LEFT_HAND); - } else if (shouldShowProxy(RIGHT_HAND)) { - setState(PROXY_VISIBLE, RIGHT_HAND); - } - break; - case PROXY_VISIBLE: - // Hide proxy if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - break; - } - // Check that palm direction of proxy hand still less than maximum angle. - if (!shouldShowProxy(proxyHand)) { - setState(PROXY_HIDDEN); - } - break; - case PROXY_GRABBED: - case PROXY_EXPANDING: - // Hide proxy if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - } - break; - case TABLET_OPEN: - // Immediately transition back to PROXY_HIDDEN. - setState(PROXY_HIDDEN); - break; - default: - error("Missing case: " + rezzerState); - } - + updateState(); updateTimer = Script.setTimeout(update, UPDATE_INTERVAL); } From 7a1a86f1824e57b2d44340be5f5b05e1b7db1a10 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 16 Aug 2018 16:20:28 +1200 Subject: [PATCH 040/434] Expand proxy tablet immediately it is grabbed; grab with either hand --- scripts/system/tabletRezzer.js | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 3033177b7e..c261ebb059 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -42,10 +42,9 @@ // State machine PROXY_HIDDEN = 0, PROXY_VISIBLE = 1, - PROXY_GRABBED = 2, - PROXY_EXPANDING = 3, - TABLET_OPEN = 4, - STATE_STRINGS = ["PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_GRABBED", "PROXY_EXPANDING", "TABLET_OPEN"], + PROXY_EXPANDING = 2, + TABLET_OPEN = 3, + STATE_STRINGS = ["PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_EXPANDING", "TABLET_OPEN"], STATE_MACHINE, rezzerState = PROXY_HIDDEN, proxyHand, @@ -163,13 +162,6 @@ } } - function updateProxyGrabbed() { - // Hide proxy if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - } - } - function expandProxy() { var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; if (scaleFactor < 1) { @@ -243,12 +235,7 @@ update: updateProxyVisible, exit: null }, - PROXY_GRABBED: { // Other hand has grabbed and is holding the tablet proxy. - enter: null, - update: updateProxyGrabbed, - exit: null - }, - PROXY_EXPANDING: { // Tablet proxy has been released from grab and is expanding before showing tablet proper. + PROXY_EXPANDING: { // Tablet proxy has been grabbed and is expanding before showing tablet proper. enter: enterProxyExpanding, update: updateProxyExanding, exit: exitProxyExpanding @@ -328,11 +315,7 @@ return; } - // Don't transition into PROXY_GRABBED unless the tablet proxy is grabbed with "other" hand. However, once it has been - // grabbed then the original hand can grab it back and grow it from there. - if (message.action === "grab" && message.joint !== HAND_NAMES[proxyHand] && rezzerState === PROXY_VISIBLE) { - setState(PROXY_GRABBED); - } else if (message.action === "release" && rezzerState === PROXY_GRABBED) { + if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { setState(PROXY_EXPANDING); } } From 40f7914aae987394397956ce86d95d1e10875b09 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 16 Aug 2018 19:11:03 +1200 Subject: [PATCH 041/434] Expand from lower left/right of proxy tablet --- scripts/system/tabletRezzer.js | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index c261ebb059..1779defb28 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -48,6 +48,13 @@ STATE_MACHINE, rezzerState = PROXY_HIDDEN, proxyHand, + PROXY_GRAB_HANDLES = [ + { x: 0.5, y: -0.4, z: 0 }, + { x: -0.5, y: -0.4, z: 0 } + ], + proxyGrabHand, + proxyGrabHandleLocalPosition, + proxyGrabLocalRotation = Quat.IDENTITY, PROXY_EXPAND_DURATION = 250, PROXY_EXPAND_TIMEOUT = 25, proxyExpandTimer = null, @@ -109,6 +116,10 @@ return MyAvatar.getJointIndex(handJointName(hand)); } + function otherHand(hand) { + return hand === LEFT_HAND ? RIGHT_HAND : LEFT_HAND; + } + // #endregion // #region State Machine =================================================================================================== @@ -164,11 +175,16 @@ function expandProxy() { var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; + var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); if (scaleFactor < 1) { Overlays.editOverlay(proxyOverlay, { - dimensions: Vec3.multiply( - avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth), - TABLET_PROXY_DIMENSIONS) + dimensions: Vec3.multiply(tabletScaleFactor, TABLET_PROXY_DIMENSIONS), + localPosition: + Vec3.sum(proxyGrabHandleLocalPosition, + Vec3.multiplyQbyV(proxyGrabLocalRotation, + Vec3.multiply(-tabletScaleFactor, + Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], TABLET_PROXY_DIMENSIONS))) + ) }); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); return; @@ -179,11 +195,12 @@ } function enterProxyExpanding() { - // Detach from hand. - Overlays.editOverlay(proxyOverlay, { - parentID: Uuid.NULL, - parentJointIndex: -1 - }); + // Grab details. + var properties = Overlays.getProperties(proxyOverlay, ["localPosition", "localRotation"]); + proxyGrabLocalRotation = properties.localRotation; + proxyGrabHandleLocalPosition = Vec3.sum(properties.localPosition, + Vec3.multiplyQbyV(proxyGrabLocalRotation, + Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], TABLET_PROXY_DIMENSIONS))); // Start expanding. proxyInitialWidth = TABLET_PROXY_DIMENSIONS.x; @@ -316,6 +333,7 @@ } if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { + proxyGrabHand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); setState(PROXY_EXPANDING); } } From 2c389af751d4710c1556eeb7e1183783b4f0b156 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 17 Aug 2018 16:18:22 +1200 Subject: [PATCH 042/434] Display mini tablet only if camera is also looking at the hand --- scripts/system/tabletRezzer.js | 44 ++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 1779defb28..8fe206e9e0 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -124,6 +124,29 @@ // #region State Machine =================================================================================================== + function shouldShowProxy(hand) { + // Should show tablet proxy if hand is oriented toward the camera and the camera is oriented toward the proxy tablet. + var pose, + jointIndex, + handPosition, + handOrientation, + cameraToHandDirection; + + pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); + if (!pose.valid) { + return false; + } + + jointIndex = handJointIndex(hand); + handPosition = Vec3.sum(MyAvatar.position, + Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); + handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); + cameraToHandDirection = Vec3.normalize(Vec3.subtract(handPosition, Camera.position)); + + return Vec3.dot(cameraToHandDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS + && Vec3.dot(cameraToHandDirection, Quat.getForward(Camera.orientation)) > MIN_HAND_CAMERA_ANGLE_COS; + } + function enterProxyHidden() { if (proxyOverlay) { Overlays.deleteOverlay(proxyOverlay); @@ -287,27 +310,6 @@ // #region Events ========================================================================================================== - function shouldShowProxy(hand) { - // Should show tablet proxy if hand is oriented towards the camera. - var pose, - jointIndex, - handPosition, - handOrientation; - - pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); - if (!pose.valid) { - return false; - } - - jointIndex = handJointIndex(hand); - handPosition = Vec3.sum(MyAvatar.position, - Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); - handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); - - return Vec3.dot(Vec3.normalize(Vec3.subtract(handPosition, Camera.position)), Quat.getForward(handOrientation)) - > MIN_HAND_CAMERA_ANGLE_COS; - } - function update() { // Assumes that is HMD.mounted. updateState(); From fce45339a2185a83d14e5ece84d0cc8c640653d1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 18 Aug 2018 12:39:34 +1200 Subject: [PATCH 043/434] Shorter teleport parabola --- scripts/system/controllers/controllerModules/teleport.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index bfd4a150e1..c19cebc6c7 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -109,7 +109,7 @@ Script.include("/~/system/libraries/controllers.js"); SEAT: 'seat' // The current target is a seat }; - var speed = 12.0; + var speed = 7.4422; var accelerationAxis = {x: 0.0, y: -5.0, z: 0.0}; function Teleporter(hand) { From 94041291d5c7e66b10ffac93d7b7a0cec39988b5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 20 Aug 2018 10:58:01 +1200 Subject: [PATCH 044/434] Add web3d overlay for UI surface --- scripts/system/html/tabletRezzer.html | 21 +++++++++ scripts/system/tabletRezzer.js | 66 ++++++++++++++++++++------- 2 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 scripts/system/html/tabletRezzer.html diff --git a/scripts/system/html/tabletRezzer.html b/scripts/system/html/tabletRezzer.html new file mode 100644 index 0000000000..6a0e0d0448 --- /dev/null +++ b/scripts/system/html/tabletRezzer.html @@ -0,0 +1,21 @@ + + + + + + + + + + + Hello world! + + diff --git a/scripts/system/tabletRezzer.js b/scripts/system/tabletRezzer.js index 8fe206e9e0..fe4bc6477b 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/tabletRezzer.js @@ -16,28 +16,39 @@ Script.include("./libraries/utils.js"); - var // Overlay + var // Base overlay proxyOverlay = null, - TABLET_PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), - TABLET_PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0046 }, // Proportional to tablet proper. - TABLET_PROXY_POSITION_LEFT_HAND = { + PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), + PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0046 }, // Proportional to tablet proper. + PROXY_POSITION_LEFT_HAND = { x: 0, y: 0.07, // Distance from joint. z: 0.07 // Distance above palm. }, - TABLET_PROXY_POSITION_RIGHT_HAND = { + PROXY_POSITION_RIGHT_HAND = { x: 0, y: 0.07, // Distance from joint. z: 0.07 // Distance above palm. }, /* // Aligned cross-palm. - TABLET_PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 90 }), - TABLET_PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), + PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 90 }), + PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), */ // Aligned with palm. - TABLET_PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), - TABLET_PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + + // UI overlay. + proxyUIOverlay = null, + PROXY_UI_HTML = Script.resolvePath("./html/tabletRezzer.html"), + PROXY_UI_DIMENSIONS = { x: 0.0577, y: 0.0905 }, + PROXY_UI_WIDTH_PIXELS = 150, + METERS_TO_INCHES = 39.3701, + PROXY_UI_DPI = PROXY_UI_WIDTH_PIXELS / (PROXY_UI_DIMENSIONS.x * METERS_TO_INCHES), + PROXY_UI_OFFSET = 0.001, // Above model surface. + PROXY_UI_LOCAL_POSITION = { x: 0, y: 0, z: -(PROXY_DIMENSIONS.z / 2 + PROXY_UI_OFFSET) }, + PROXY_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), // State machine PROXY_HIDDEN = 0, @@ -149,7 +160,9 @@ function enterProxyHidden() { if (proxyOverlay) { + Overlays.deleteOverlay(proxyUIOverlay); Overlays.deleteOverlay(proxyOverlay); + proxyUIOverlay = null; proxyOverlay = null; } } @@ -170,18 +183,30 @@ function enterProxyVisible(hand) { proxyHand = hand; proxyOverlay = Overlays.addOverlay("model", { - url: TABLET_PROXY_MODEL, + url: PROXY_MODEL, parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(proxyHand), localPosition: Vec3.multiply(avatarScale, - proxyHand === LEFT_HAND ? TABLET_PROXY_POSITION_LEFT_HAND : TABLET_PROXY_POSITION_RIGHT_HAND), - localRotation: proxyHand === LEFT_HAND ? TABLET_PROXY_ROTATION_LEFT_HAND : TABLET_PROXY_ROTATION_RIGHT_HAND, - dimensions: Vec3.multiply(avatarScale, TABLET_PROXY_DIMENSIONS), + proxyHand === LEFT_HAND ? PROXY_POSITION_LEFT_HAND : PROXY_POSITION_RIGHT_HAND), + localRotation: proxyHand === LEFT_HAND ? PROXY_ROTATION_LEFT_HAND : PROXY_ROTATION_RIGHT_HAND, + dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), solid: true, grabbable: true, displayInFront: true, visible: true }); + proxyUIOverlay = Overlays.addOverlay("web3d", { + url: PROXY_UI_HTML, + parentID: proxyOverlay, + localPosition: PROXY_UI_LOCAL_POSITION, + localRotation: PROXY_UI_LOCAL_ROTATION, + dimensions: PROXY_UI_DIMENSIONS, + dpi: PROXY_UI_DPI, + alpha: 1.0, + grabbable: false, + displayInFront: true, + visible: true + }); } function updateProxyVisible() { @@ -201,14 +226,19 @@ var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); if (scaleFactor < 1) { Overlays.editOverlay(proxyOverlay, { - dimensions: Vec3.multiply(tabletScaleFactor, TABLET_PROXY_DIMENSIONS), + dimensions: Vec3.multiply(tabletScaleFactor, PROXY_DIMENSIONS), localPosition: Vec3.sum(proxyGrabHandleLocalPosition, Vec3.multiplyQbyV(proxyGrabLocalRotation, Vec3.multiply(-tabletScaleFactor, - Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], TABLET_PROXY_DIMENSIONS))) + Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))) ) }); + Overlays.editOverlay(proxyUIOverlay, { + dimensions: Vec3.multiply(tabletScaleFactor, PROXY_UI_DIMENSIONS), + localPosition: Vec3.multiply(tabletScaleFactor, PROXY_UI_LOCAL_POSITION), + dpi: PROXY_UI_DPI / tabletScaleFactor + }); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); return; } @@ -223,10 +253,10 @@ proxyGrabLocalRotation = properties.localRotation; proxyGrabHandleLocalPosition = Vec3.sum(properties.localPosition, Vec3.multiplyQbyV(proxyGrabLocalRotation, - Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], TABLET_PROXY_DIMENSIONS))); + Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))); // Start expanding. - proxyInitialWidth = TABLET_PROXY_DIMENSIONS.x; + proxyInitialWidth = PROXY_DIMENSIONS.x; proxyTargetWidth = getTabletWidthFromSettings(); proxyExpandStart = Date.now(); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); @@ -249,6 +279,8 @@ function enterTabletOpen() { var proxyOverlayProperties = Overlays.getProperties(proxyOverlay, ["position", "orientation"]); + Overlays.deleteOverlay(proxyUIOverlay); + proxyUIOverlay = null; Overlays.deleteOverlay(proxyOverlay); proxyOverlay = null; From aca343330fb203d861a30e8b5c1a943df58b3dd4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 20 Aug 2018 16:00:02 +1200 Subject: [PATCH 045/434] Base UI elements --- scripts/defaultScripts.js | 2 +- scripts/system/html/css/miniTablet.css | 102 ++++++++++++++++++ scripts/system/html/miniTablet.html | 31 ++++++ scripts/system/html/tabletRezzer.html | 21 ---- .../system/{tabletRezzer.js => miniTablet.js} | 4 +- 5 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 scripts/system/html/css/miniTablet.css create mode 100644 scripts/system/html/miniTablet.html delete mode 100644 scripts/system/html/tabletRezzer.html rename scripts/system/{tabletRezzer.js => miniTablet.js} (99%) diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 0e6aa08ba6..2aee26f71e 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -32,7 +32,7 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/firstPersonHMD.js", "system/tablet-ui/tabletUI.js", "system/emote.js", - "system/tabletRezzer.js" + "system/miniTablet.js" ]; var DEFAULT_SCRIPTS_SEPARATE = [ "system/controllers/controllerScripts.js", diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css new file mode 100644 index 0000000000..d0585e489a --- /dev/null +++ b/scripts/system/html/css/miniTablet.css @@ -0,0 +1,102 @@ +/* +miniTablet.css + +Created by David Rowe on 20 Aug 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 +*/ + +* { + box-sizing: border-box; + padding: 0; + margin: 0; + user-select: none; +} + +html { + background-color: #121212; +} + +body { + height: 100%; +} + +section { + background-color: #404040; + position: relative; + padding: 15px; +} + +section .button { + width: 100%; + height: 88px; + background-color: #252525; + margin-top: 10px; + text-align: center; + border-radius: 8px; +} + + section .button.off { + border: 2px solid #6a6a6a; + background-color: #303030; + } + + section .button.off:hover { + border: 2px solid #1fc6a6; + } + + section .button.on { + border: 2px solid #1fc6a6; + background-color: #1fc6a6; + } + + section .button.on:hover { + border: 2px solid #e3e3e3; + } + + section .button:first-child { + margin-top: 0; + } + +img { + width: 60px; +} + +#mute { + padding-top: 12px; +} + +#bubble { + padding-top: 14px; +} + +footer { + position: absolute; + bottom: 0; + width: 100%; + height: 30px; + text-align: center; + color: #e3e3e3; + font-weight: bold; +} + + footer div { + display: inline-block; + height: 12px; + width: 24px; + position: relative; + top: 16px; + } + + footer div p { + position: relative; + top: -8px; + } + + footer .button:hover { + border: 1px solid #1fc6a6; + border-radius: 2px; + margin: -1px; + } \ No newline at end of file diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html new file mode 100644 index 0000000000..f8216e5515 --- /dev/null +++ b/scripts/system/html/miniTablet.html @@ -0,0 +1,31 @@ + + + + + + + + + + +

+
+ +
+
+ +
+
+
+

...

+
+ + diff --git a/scripts/system/html/tabletRezzer.html b/scripts/system/html/tabletRezzer.html deleted file mode 100644 index 6a0e0d0448..0000000000 --- a/scripts/system/html/tabletRezzer.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - Hello world! - - diff --git a/scripts/system/tabletRezzer.js b/scripts/system/miniTablet.js similarity index 99% rename from scripts/system/tabletRezzer.js rename to scripts/system/miniTablet.js index fe4bc6477b..aa8b96665b 100644 --- a/scripts/system/tabletRezzer.js +++ b/scripts/system/miniTablet.js @@ -1,5 +1,5 @@ // -// tabletRezzer.js +// miniTablet.js // // Created by David Rowe on 9 Aug 2018. // Copyright 2018 High Fidelity, Inc. @@ -41,7 +41,7 @@ // UI overlay. proxyUIOverlay = null, - PROXY_UI_HTML = Script.resolvePath("./html/tabletRezzer.html"), + PROXY_UI_HTML = Script.resolvePath("./html/miniTablet.html"), PROXY_UI_DIMENSIONS = { x: 0.0577, y: 0.0905 }, PROXY_UI_WIDTH_PIXELS = 150, METERS_TO_INCHES = 39.3701, From ff54516790fc6946d51810a0888207d15eb881ca Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 20 Aug 2018 17:46:07 +1200 Subject: [PATCH 046/434] Maintain overlays ready for display in HMD mode --- scripts/system/miniTablet.js | 225 ++++++++++++++++++++++------------- 1 file changed, 140 insertions(+), 85 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index aa8b96665b..f0741582c3 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -49,15 +49,18 @@ PROXY_UI_OFFSET = 0.001, // Above model surface. PROXY_UI_LOCAL_POSITION = { x: 0, y: 0, z: -(PROXY_DIMENSIONS.z / 2 + PROXY_UI_OFFSET) }, PROXY_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + proxyUIOverlayEnabled = false, + PROXY_UI_OVERLAY_ENABLED_DELAY = 500, // State machine - PROXY_HIDDEN = 0, - PROXY_VISIBLE = 1, - PROXY_EXPANDING = 2, - TABLET_OPEN = 3, - STATE_STRINGS = ["PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_EXPANDING", "TABLET_OPEN"], + PROXY_DISABLED = 0, + PROXY_HIDDEN = 1, + PROXY_VISIBLE = 2, + PROXY_EXPANDING = 3, + TABLET_OPEN = 4, + STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_EXPANDING", "TABLET_OPEN"], STATE_MACHINE, - rezzerState = PROXY_HIDDEN, + rezzerState = PROXY_DISABLED, proxyHand, PROXY_GRAB_HANDLES = [ { x: 0.5, y: -0.4, z: 0 }, @@ -86,7 +89,7 @@ LEFT_HAND = 0, RIGHT_HAND = 1, HAND_NAMES = ["LeftHand", "RightHand"], - DEBUG = false; + DEBUG = true; // #region Utilities ======================================================================================================= @@ -133,8 +136,117 @@ // #endregion + // #region UI ============================================================================================================== + + function createUI() { + proxyOverlay = Overlays.addOverlay("model", { + url: PROXY_MODEL, + dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), + solid: true, + grabbable: true, + displayInFront: true, + visible: false + }); + proxyUIOverlay = Overlays.addOverlay("web3d", { + url: PROXY_UI_HTML, + parentID: proxyOverlay, + localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), + localRotation: PROXY_UI_LOCAL_ROTATION, + dimensions: Vec3.multiply(avatarScale, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / avatarScale, + alpha: 0, // Hide overlay while its content is being created. + grabbable: false, + displayInFront: true, + visible: false + }); + + proxyUIOverlayEnabled = false; // This and alpha = 0 hides overlay while its content is being created. + } + + function showUI(hand) { + Overlays.editOverlay(proxyOverlay, { + parentID: MyAvatar.SELF_ID, + parentJointIndex: handJointIndex(proxyHand), + localPosition: Vec3.multiply(avatarScale, + proxyHand === LEFT_HAND ? PROXY_POSITION_LEFT_HAND : PROXY_POSITION_RIGHT_HAND), + localRotation: proxyHand === LEFT_HAND ? PROXY_ROTATION_LEFT_HAND : PROXY_ROTATION_RIGHT_HAND, + dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), + visible: true + }); + Overlays.editOverlay(proxyUIOverlay, { + localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(avatarScale, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / avatarScale, + visible: true + }); + + if (!proxyUIOverlayEnabled) { + // Overlay content is created the first time it is visible to the user. The initial creation displays artefacts. + // Delay showing UI overlay until after giving it time for its content to be created. + Script.setTimeout(function () { + Overlays.editOverlay(proxyUIOverlay, { alpha: 1.0 }); + }, PROXY_UI_OVERLAY_ENABLED_DELAY); + } + } + + function sizeUI(scaleFactor) { + Overlays.editOverlay(proxyOverlay, { + localPosition: + Vec3.sum(proxyGrabHandleLocalPosition, + Vec3.multiplyQbyV(proxyGrabLocalRotation, + Vec3.multiply(-scaleFactor, + Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))) + ), + dimensions: Vec3.multiply(scaleFactor, PROXY_DIMENSIONS) + }); + Overlays.editOverlay(proxyUIOverlay, { + localPosition: Vec3.multiply(scaleFactor, PROXY_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(scaleFactor, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / scaleFactor + }); + } + + function hideUI() { + Overlays.editOverlay(proxyOverlay, { + visible: false + }); + Overlays.editOverlay(proxyUIOverlay, { + visible: false + }); + } + + function destroyUI() { + if (proxyOverlay) { + Overlays.deleteOverlay(proxyUIOverlay); + Overlays.deleteOverlay(proxyOverlay); + proxyUIOverlay = null; + proxyOverlay = null; + } + } + + // #endregion + // #region State Machine =================================================================================================== + function enterProxyDisabled() { + // Stop updates. + if (updateTimer !== null) { + Script.clearTimeout(updateTimer); + updateTimer = null; + } + + // Don't keep overlays prepared if in desktop mode. + destroyUI(); + } + + function exitProxyDisabled() { + // Create UI so that it's ready to be displayed without seeing artefacts from creating the UI. + createUI(); + + // Start updates. + updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); + } + function shouldShowProxy(hand) { // Should show tablet proxy if hand is oriented toward the camera and the camera is oriented toward the proxy tablet. var pose, @@ -159,16 +271,11 @@ } function enterProxyHidden() { - if (proxyOverlay) { - Overlays.deleteOverlay(proxyUIOverlay); - Overlays.deleteOverlay(proxyOverlay); - proxyUIOverlay = null; - proxyOverlay = null; - } + hideUI(); } function updateProxyHidden() { - // Don't show proxy is tablet is already displayed or are in toolbar mode. + // Don't show proxy if tablet is already displayed or in toolbar mode. if (HMD.showTablet || tablet.toolbarMode) { return; } @@ -182,31 +289,7 @@ function enterProxyVisible(hand) { proxyHand = hand; - proxyOverlay = Overlays.addOverlay("model", { - url: PROXY_MODEL, - parentID: MyAvatar.SELF_ID, - parentJointIndex: handJointIndex(proxyHand), - localPosition: Vec3.multiply(avatarScale, - proxyHand === LEFT_HAND ? PROXY_POSITION_LEFT_HAND : PROXY_POSITION_RIGHT_HAND), - localRotation: proxyHand === LEFT_HAND ? PROXY_ROTATION_LEFT_HAND : PROXY_ROTATION_RIGHT_HAND, - dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), - solid: true, - grabbable: true, - displayInFront: true, - visible: true - }); - proxyUIOverlay = Overlays.addOverlay("web3d", { - url: PROXY_UI_HTML, - parentID: proxyOverlay, - localPosition: PROXY_UI_LOCAL_POSITION, - localRotation: PROXY_UI_LOCAL_ROTATION, - dimensions: PROXY_UI_DIMENSIONS, - dpi: PROXY_UI_DPI, - alpha: 1.0, - grabbable: false, - displayInFront: true, - visible: true - }); + showUI(proxyHand); } function updateProxyVisible() { @@ -225,20 +308,7 @@ var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); if (scaleFactor < 1) { - Overlays.editOverlay(proxyOverlay, { - dimensions: Vec3.multiply(tabletScaleFactor, PROXY_DIMENSIONS), - localPosition: - Vec3.sum(proxyGrabHandleLocalPosition, - Vec3.multiplyQbyV(proxyGrabLocalRotation, - Vec3.multiply(-tabletScaleFactor, - Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))) - ) - }); - Overlays.editOverlay(proxyUIOverlay, { - dimensions: Vec3.multiply(tabletScaleFactor, PROXY_UI_DIMENSIONS), - localPosition: Vec3.multiply(tabletScaleFactor, PROXY_UI_LOCAL_POSITION), - dpi: PROXY_UI_DPI / tabletScaleFactor - }); + sizeUI(tabletScaleFactor); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); return; } @@ -279,10 +349,7 @@ function enterTabletOpen() { var proxyOverlayProperties = Overlays.getProperties(proxyOverlay, ["position", "orientation"]); - Overlays.deleteOverlay(proxyUIOverlay); - proxyUIOverlay = null; - Overlays.deleteOverlay(proxyOverlay); - proxyOverlay = null; + hideUI(); Overlays.editOverlay(HMD.tabletID, { position: proxyOverlayProperties.position, @@ -297,6 +364,11 @@ } STATE_MACHINE = { + PROXY_DISABLED: { // Tablet proxy cannot be shown because in desktop mode. + enter: enterProxyDisabled, + update: null, + exit: exitProxyDisabled + }, PROXY_HIDDEN: { // Tablet proxy could be shown but isn't because hand is oriented to show it or aren't in HMD mode. enter: enterProxyHidden, update: updateProxyHidden, @@ -336,18 +408,13 @@ function updateState() { STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); + updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); } // #endregion // #region Events ========================================================================================================== - function update() { - // Assumes that is HMD.mounted. - updateState(); - updateTimer = Script.setTimeout(update, UPDATE_INTERVAL); - } - function onScaleChanged() { avatarScale = MyAvatar.scale; // Clamp scale in order to work around M17434. @@ -372,22 +439,12 @@ } } - function onMountedChanged() { - // Tablet proxy only available when HMD is mounted. - - if (HMD.mounted) { - if (updateTimer === null) { - update(); - } - return; - } - - if (updateTimer !== null) { - Script.clearTimeout(updateTimer); - updateTimer = null; - } - if (rezzerState !== PROXY_HIDDEN) { + function onDisplayModeChanged() { + // Tablet proxy only available when HMD is active. + if (HMD.active) { setState(PROXY_HIDDEN); + } else { + setState(PROXY_DISABLED); } } @@ -401,10 +458,9 @@ Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); Messages.messageReceived.connect(onMessageReceived); - HMD.mountedChanged.connect(onMountedChanged); - HMD.displayModeChanged.connect(onMountedChanged); // For the case that the HMD is already worn when the script starts. - if (HMD.mounted) { - update(); + HMD.displayModeChanged.connect(onDisplayModeChanged); + if (HMD.active) { + setState(PROXY_HIDDEN); } } @@ -414,10 +470,9 @@ updateTimer = null; } - setState(PROXY_HIDDEN); + setState(PROXY_DISABLED); - HMD.displayModeChanged.disconnect(onMountedChanged); - HMD.mountedChanged.disconnect(onMountedChanged); + HMD.displayModeChanged.disconnect(onDisplayModeChanged); Messages.messageReceived.disconnect(onMessageReceived); Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); From 4e23caf46deebd3a7f28fcd3179f735a47ec6cbb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 20 Aug 2018 17:57:59 +1200 Subject: [PATCH 047/434] Fix tablet proper not being grabbed once mini tablet has expanded --- scripts/system/miniTablet.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index f0741582c3..08e7103ba4 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -89,7 +89,7 @@ LEFT_HAND = 0, RIGHT_HAND = 1, HAND_NAMES = ["LeftHand", "RightHand"], - DEBUG = true; + DEBUG = false; // #region Utilities ======================================================================================================= @@ -208,6 +208,7 @@ function hideUI() { Overlays.editOverlay(proxyOverlay, { + parentID: Uuid.NULL, // Release hold so that hand can grab tablet proper. visible: false }); Overlays.editOverlay(proxyUIOverlay, { From 6791d3f1b6c6939bb9858c123a29e344aaa785dc Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 08:36:04 +1200 Subject: [PATCH 048/434] Mini tablet button icons and states --- scripts/system/html/css/miniTablet.css | 4 +- scripts/system/html/js/miniTablet.js | 88 ++++++++++++++++++++++++++ scripts/system/html/miniTablet.html | 1 + scripts/system/miniTablet.js | 67 +++++++++++++++++++- 4 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 scripts/system/html/js/miniTablet.js diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index d0585e489a..5ff9944a2c 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -96,7 +96,7 @@ footer { } footer .button:hover { - border: 1px solid #1fc6a6; + border: 1px solid #e3e3e3; border-radius: 2px; margin: -1px; - } \ No newline at end of file + } diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js new file mode 100644 index 0000000000..450a87ff8d --- /dev/null +++ b/scripts/system/html/js/miniTablet.js @@ -0,0 +1,88 @@ +// +// miniTablet.js +// +// Created by David Rowe on 20 Aug 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 +// + +/* global EventBridge */ +/* eslint-env browser */ + +(function () { + + "use strict"; + + var // EventBridge + READY_MESSAGE = "ready", // Engine <== Dialog + MUTE_MESSAGE = "mute", // Engine <=> Dialog + BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + + muteButton, + muteImage, + bubbleButton, + bubbleImage; + + // #region Communications ================================================================================================== + + function onScriptEventReceived(data) { + var message; + + try { + message = JSON.parse(data); + } catch (e) { + console.error("EventBridge message error"); + return; + } + + switch (message.type) { + case MUTE_MESSAGE: + muteImage.src = message.icon; + break; + case BUBBLE_MESSAGE: + bubbleButton.classList.remove(message.on ? "off" : "on"); + bubbleButton.classList.add(message.on ? "on" : "off"); + bubbleImage.src = message.icon; + break; + } + } + + function connectEventBridge() { + EventBridge.scriptEventReceived.connect(onScriptEventReceived); + EventBridge.emitWebEvent(JSON.stringify({ + type: READY_MESSAGE + })); + } + + function disconnectEventBridge() { + EventBridge.scriptEventReceived.disconnect(onScriptEventReceived); + } + + // #endregion + + // #region Set-up and tear-down ============================================================================================ + + function onUnload() { + disconnectEventBridge(); + } + + function onLoad() { + muteButton = document.getElementById("mute"); + muteImage = document.getElementById("mute-img"); + bubbleButton = document.getElementById("bubble"); + bubbleImage = document.getElementById("bubble-img"); + + connectEventBridge(); + + document.body.onunload = function () { + onUnload(); + }; + } + + onLoad(); + + // #endregion + +}()); diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html index f8216e5515..3ba8d66196 100644 --- a/scripts/system/html/miniTablet.html +++ b/scripts/system/html/miniTablet.html @@ -27,5 +27,6 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.

...

+ diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 08e7103ba4..044500979c 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -51,6 +51,12 @@ PROXY_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), proxyUIOverlayEnabled = false, PROXY_UI_OVERLAY_ENABLED_DELAY = 500, + proxyOverlayObject = null, + + MUTE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-mute-a.svg", + MUTE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-unmute-i.svg", + BUBBLE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-a.svg", + BUBBLE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-i.svg", // State machine PROXY_DISABLED = 0, @@ -77,6 +83,11 @@ proxyTargetWidth, tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), + // EventBridge + READY_MESSAGE = "ready", // Engine <== Dialog + MUTE_MESSAGE = "mute", // Engine <=> Dialog + BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + // Events MIN_HAND_CAMERA_ANGLE = 30, DEGREES_180 = 180, @@ -136,6 +147,47 @@ // #endregion + // #region Communications ================================================================================================== + + function updateMutedStatus() { + var isMuted = Audio.muted; + proxyOverlayObject.emitScriptEvent(JSON.stringify({ + type: MUTE_MESSAGE, + on: isMuted, + icon: isMuted ? MUTE_ON_ICON : MUTE_OFF_ICON + })); + } + + function updateBubbleStatus() { + var isBubbleOn = Users.getIgnoreRadiusEnabled(); + proxyOverlayObject.emitScriptEvent(JSON.stringify({ + type: BUBBLE_MESSAGE, + on: isBubbleOn, + icon: isBubbleOn ? BUBBLE_ON_ICON : BUBBLE_OFF_ICON + })); + } + + function onWebEventReceived(data) { + var message; + + try { + message = JSON.parse(data); + } catch (e) { + console.error("EventBridge message error"); + return; + } + + switch (message.type) { + case READY_MESSAGE: + // Send initial button statuses. + updateMutedStatus(); + updateBubbleStatus(); + break; + } + } + + // #endregion + // #region UI ============================================================================================================== function createUI() { @@ -161,6 +213,9 @@ }); proxyUIOverlayEnabled = false; // This and alpha = 0 hides overlay while its content is being created. + + proxyOverlayObject = Overlays.getOverlayObject(proxyUIOverlay); + proxyOverlayObject.webEventReceived.connect(onWebEventReceived); } function showUI(hand) { @@ -217,9 +272,11 @@ } function destroyUI() { - if (proxyOverlay) { + if (proxyOverlayObject) { + proxyOverlayObject.webEventReceived.disconnect(onWebEventReceived); Overlays.deleteOverlay(proxyUIOverlay); Overlays.deleteOverlay(proxyOverlay); + proxyOverlayObject = null; proxyUIOverlay = null; proxyOverlay = null; } @@ -236,6 +293,10 @@ updateTimer = null; } + // Stop monitoring mute and bubble changes. + Audio.mutedChanged.disconnect(updateMutedStatus); + Users.ignoreRadiusEnabledChanged.disconnect(updateBubbleStatus); + // Don't keep overlays prepared if in desktop mode. destroyUI(); } @@ -244,6 +305,10 @@ // Create UI so that it's ready to be displayed without seeing artefacts from creating the UI. createUI(); + // Start monitoring mute and bubble changes. + Audio.mutedChanged.connect(updateMutedStatus); + Users.ignoreRadiusEnabledChanged.connect(updateBubbleStatus); + // Start updates. updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); } From 4268297769387e2e7b37a0e71416ce9368b424cb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 09:17:53 +1200 Subject: [PATCH 049/434] Mini tablet button actions --- scripts/system/html/js/miniTablet.js | 27 ++++++++++++++- scripts/system/miniTablet.js | 51 +++++++++++++++++++--------- 2 files changed, 61 insertions(+), 17 deletions(-) diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js index 450a87ff8d..1260813448 100644 --- a/scripts/system/html/js/miniTablet.js +++ b/scripts/system/html/js/miniTablet.js @@ -19,11 +19,13 @@ READY_MESSAGE = "ready", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + EXPAND_MESSAGE = "expand", // Engine <== Dialog muteButton, muteImage, bubbleButton, - bubbleImage; + bubbleImage, + expandButton; // #region Communications ================================================================================================== @@ -49,6 +51,24 @@ } } + function onMuteButtonClick() { + EventBridge.emitWebEvent(JSON.stringify({ + type: MUTE_MESSAGE + })); + } + + function onBubbleButtonClick() { + EventBridge.emitWebEvent(JSON.stringify({ + type: BUBBLE_MESSAGE + })); + } + + function onExpandButtonClick() { + EventBridge.emitWebEvent(JSON.stringify({ + type: EXPAND_MESSAGE + })); + } + function connectEventBridge() { EventBridge.scriptEventReceived.connect(onScriptEventReceived); EventBridge.emitWebEvent(JSON.stringify({ @@ -73,9 +93,14 @@ muteImage = document.getElementById("mute-img"); bubbleButton = document.getElementById("bubble"); bubbleImage = document.getElementById("bubble-img"); + expandButton = document.getElementById("expand"); connectEventBridge(); + muteButton.addEventListener("click", onMuteButtonClick, true); + bubbleButton.addEventListener("click", onBubbleButtonClick, true); + expandButton.addEventListener("click", onExpandButtonClick, true); + document.body.onunload = function () { onUnload(); }; diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 044500979c..6f56f4ab93 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -68,13 +68,14 @@ STATE_MACHINE, rezzerState = PROXY_DISABLED, proxyHand, - PROXY_GRAB_HANDLES = [ + PROXY_EXPAND_HANDLES = [ { x: 0.5, y: -0.4, z: 0 }, - { x: -0.5, y: -0.4, z: 0 } + { x: -0.5, y: -0.4, z: 0 }, + { x: 0, y: -0.4, z: 0 } ], - proxyGrabHand, - proxyGrabHandleLocalPosition, - proxyGrabLocalRotation = Quat.IDENTITY, + proxyExpandHand, + proxyExpandLocalPosition, + proxyExpandLocalRotation = Quat.IDENTITY, PROXY_EXPAND_DURATION = 250, PROXY_EXPAND_TIMEOUT = 25, proxyExpandTimer = null, @@ -87,6 +88,7 @@ READY_MESSAGE = "ready", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + EXPAND_MESSAGE = "expand", // Engine <== Dialog // Events MIN_HAND_CAMERA_ANGLE = 30, @@ -97,8 +99,10 @@ HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", avatarScale = 1, + LEFT_HAND = 0, RIGHT_HAND = 1, + NO_HAND = 2, HAND_NAMES = ["LeftHand", "RightHand"], DEBUG = false; @@ -183,6 +187,18 @@ updateMutedStatus(); updateBubbleStatus(); break; + case MUTE_MESSAGE: + // Toggle mute. + Audio.muted = !Audio.muted; + break; + case BUBBLE_MESSAGE: + // Toggle bubble. + Users.toggleIgnoreRadius(); + break; + case EXPAND_MESSAGE: + // Expand tablet; + setState(PROXY_EXPANDING, NO_HAND); + break; } } @@ -196,6 +212,7 @@ dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), solid: true, grabbable: true, + showKeyboardFocusHighlight: false, displayInFront: true, visible: false }); @@ -208,6 +225,7 @@ dpi: PROXY_UI_DPI / avatarScale, alpha: 0, // Hide overlay while its content is being created. grabbable: false, + showKeyboardFocusHighlight: false, displayInFront: true, visible: false }); @@ -247,10 +265,10 @@ function sizeUI(scaleFactor) { Overlays.editOverlay(proxyOverlay, { localPosition: - Vec3.sum(proxyGrabHandleLocalPosition, - Vec3.multiplyQbyV(proxyGrabLocalRotation, + Vec3.sum(proxyExpandLocalPosition, + Vec3.multiplyQbyV(proxyExpandLocalRotation, Vec3.multiply(-scaleFactor, - Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))) + Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))) ), dimensions: Vec3.multiply(scaleFactor, PROXY_DIMENSIONS) }); @@ -383,13 +401,14 @@ setState(TABLET_OPEN); } - function enterProxyExpanding() { + function enterProxyExpanding(hand) { // Grab details. var properties = Overlays.getProperties(proxyOverlay, ["localPosition", "localRotation"]); - proxyGrabLocalRotation = properties.localRotation; - proxyGrabHandleLocalPosition = Vec3.sum(properties.localPosition, - Vec3.multiplyQbyV(proxyGrabLocalRotation, - Vec3.multiplyVbyV(PROXY_GRAB_HANDLES[proxyGrabHand], PROXY_DIMENSIONS))); + proxyExpandHand = hand; + proxyExpandLocalRotation = properties.localRotation; + proxyExpandLocalPosition = Vec3.sum(properties.localPosition, + Vec3.multiplyQbyV(proxyExpandLocalRotation, + Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))); // Start expanding. proxyInitialWidth = PROXY_DIMENSIONS.x; @@ -488,7 +507,7 @@ } function onMessageReceived(channel, data, senderID, localOnly) { - var message; + var message, hand; if (channel !== HIFI_OBJECT_MANIPULATION_CHANNEL) { return; @@ -500,8 +519,8 @@ } if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { - proxyGrabHand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); - setState(PROXY_EXPANDING); + hand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); + setState(PROXY_EXPANDING, hand); } } From f4a8dc49e963df2354526b0f109ba94e16fbd2f4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 10:28:23 +1200 Subject: [PATCH 050/434] Add button sounds --- scripts/system/assets/sounds/button-click.wav | Bin 0 -> 26898 bytes scripts/system/assets/sounds/button-hover.wav | Bin 0 -> 22432 bytes scripts/system/html/js/miniTablet.js | 10 +++++++ scripts/system/miniTablet.js | 25 ++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 scripts/system/assets/sounds/button-click.wav create mode 100644 scripts/system/assets/sounds/button-hover.wav diff --git a/scripts/system/assets/sounds/button-click.wav b/scripts/system/assets/sounds/button-click.wav new file mode 100644 index 0000000000000000000000000000000000000000..30a097ce456369195b2791ebe83fe4d20d0a0c57 GIT binary patch literal 26898 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 literal 0 HcmV?d00001 diff --git a/scripts/system/assets/sounds/button-hover.wav b/scripts/system/assets/sounds/button-hover.wav new file mode 100644 index 0000000000000000000000000000000000000000..cd76d0174cf7bfd5589dc26ba7f58793778a5456 GIT binary patch literal 22432 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 Dialog BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog @@ -57,6 +58,12 @@ })); } + function onButtonHover() { + EventBridge.emitWebEvent(JSON.stringify({ + type: HOVER_MESSAGE + })); + } + function onBubbleButtonClick() { EventBridge.emitWebEvent(JSON.stringify({ type: BUBBLE_MESSAGE @@ -97,6 +104,9 @@ connectEventBridge(); + muteButton.addEventListener("mouseenter", onButtonHover, false); + bubbleButton.addEventListener("mouseenter", onButtonHover, false); + expandButton.addEventListener("mouseenter", onButtonHover, false); muteButton.addEventListener("click", onMuteButtonClick, true); bubbleButton.addEventListener("click", onBubbleButtonClick, true); expandButton.addEventListener("click", onExpandButtonClick, true); diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 6f56f4ab93..a16ae50b29 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -86,6 +86,7 @@ // EventBridge READY_MESSAGE = "ready", // Engine <== Dialog + HOVER_MESSAGE = "hover", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog @@ -99,11 +100,20 @@ HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", avatarScale = 1, + // Sounds + HOVER_SOUND = "./assets/sounds/button-hover.wav", + HOVER_VOLUME = 0.5, + CLICK_SOUND = "./assets/sounds/button-click.wav", + CLICK_VOLUME = 0.8, + hoverSound = SoundCache.getSound(Script.resolvePath(HOVER_SOUND)), + clickSound = SoundCache.getSound(Script.resolvePath(CLICK_SOUND)), + // Hands LEFT_HAND = 0, RIGHT_HAND = 1, NO_HAND = 2, HAND_NAMES = ["LeftHand", "RightHand"], + DEBUG = false; // #region Utilities ======================================================================================================= @@ -149,6 +159,14 @@ return hand === LEFT_HAND ? RIGHT_HAND : LEFT_HAND; } + function playSound(sound, volume) { + Audio.playSound(sound, { + position: proxyHand === LEFT_HAND ? MyAvatar.getLeftPalmPosition() : MyAvatar.getRightPalmPosition(), + volume: volume, + localOnly: true + }); + } + // #endregion // #region Communications ================================================================================================== @@ -187,16 +205,23 @@ updateMutedStatus(); updateBubbleStatus(); break; + case HOVER_MESSAGE: + // Audio feedback. + playSound(hoverSound, HOVER_VOLUME); + break; case MUTE_MESSAGE: // Toggle mute. + playSound(clickSound, CLICK_VOLUME); Audio.muted = !Audio.muted; break; case BUBBLE_MESSAGE: // Toggle bubble. + playSound(clickSound, CLICK_VOLUME); Users.toggleIgnoreRadius(); break; case EXPAND_MESSAGE: // Expand tablet; + playSound(clickSound, CLICK_VOLUME); setState(PROXY_EXPANDING, NO_HAND); break; } From dc86230e40bda530ec7ceda38c9a432f5b661448 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 10:33:13 +1200 Subject: [PATCH 051/434] Make "..." expand tablet per display hand rather than centered --- scripts/system/miniTablet.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index a16ae50b29..f7a262b9c4 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -70,8 +70,7 @@ proxyHand, PROXY_EXPAND_HANDLES = [ { x: 0.5, y: -0.4, z: 0 }, - { x: -0.5, y: -0.4, z: 0 }, - { x: 0, y: -0.4, z: 0 } + { x: -0.5, y: -0.4, z: 0 } ], proxyExpandHand, proxyExpandLocalPosition, @@ -111,7 +110,6 @@ // Hands LEFT_HAND = 0, RIGHT_HAND = 1, - NO_HAND = 2, HAND_NAMES = ["LeftHand", "RightHand"], DEBUG = false; @@ -222,7 +220,7 @@ case EXPAND_MESSAGE: // Expand tablet; playSound(clickSound, CLICK_VOLUME); - setState(PROXY_EXPANDING, NO_HAND); + setState(PROXY_EXPANDING, proxyHand); break; } } From 69e5eb9b1c8f3a90cc9058d2a3d8d277ecbe8539 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 10:46:48 +1200 Subject: [PATCH 052/434] Move tablet towards fingertips as it expands --- scripts/system/miniTablet.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index f7a262b9c4..6d6180a964 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -68,9 +68,9 @@ STATE_MACHINE, rezzerState = PROXY_DISABLED, proxyHand, - PROXY_EXPAND_HANDLES = [ - { x: 0.5, y: -0.4, z: 0 }, - { x: -0.5, y: -0.4, z: 0 } + PROXY_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. + { x: 0.5, y: -0.75, z: 0 }, + { x: -0.5, y: -0.75, z: 0 } ], proxyExpandHand, proxyExpandLocalPosition, From 8a8bf6dc046f179371c94c1f6f8e8e90ab0b3d67 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 10:49:19 +1200 Subject: [PATCH 053/434] Reduce default size of tablet in HMD mode --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45ef336333..14a9af09d2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -971,7 +971,7 @@ Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; -const float DEFAULT_HMD_TABLET_SCALE_PERCENT = 70.0f; +const float DEFAULT_HMD_TABLET_SCALE_PERCENT = 60.0f; const float DEFAULT_DESKTOP_TABLET_SCALE_PERCENT = 75.0f; const bool DEFAULT_DESKTOP_TABLET_BECOMES_TOOLBAR = true; const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false; From e24d920bdd35c83420872fc1026c3009cada5b90 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 11:45:01 +1200 Subject: [PATCH 054/434] Tune teleport and play area --- scripts/system/controllers/controllerModules/teleport.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 7d587856e7..3c7426c2e5 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -109,7 +109,7 @@ Script.include("/~/system/libraries/controllers.js"); SEAT: 'seat' // The current target is a seat }; - var speed = 7.4422; + var speed = 9.3; var accelerationAxis = {x: 0.0, y: -5.0, z: 0.0}; function Teleporter(hand) { @@ -212,7 +212,7 @@ Script.include("/~/system/libraries/controllers.js"); this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpacev2.fbx"); this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 }; - this.PLAY_AREA_FLOAT_ABOVE_FLOOR = 0.3; + this.PLAY_AREA_FLOAT_ABOVE_FLOOR = 0; this.PLAY_AREA_OVERLAY_OFFSET = // Offset from floor. { x: 0, y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2 + this.PLAY_AREA_FLOAT_ABOVE_FLOOR, z: 0 }; this.PLAY_AREA_SENSOR_OVERLAY_MODEL = Script.resolvePath("../../assets/models/oculusSensorv2.fbx"); @@ -226,14 +226,14 @@ Script.include("/~/system/libraries/controllers.js"); this.isPlayAreaAvailable = false; this.targetOverlayID = null; - this.PLAY_AREA_FADE_DELAY = 500; + this.PLAY_AREA_FADE_DELAY = 900; this.PLAY_AREA_FADE_DURATION = 200; this.PLAY_AREA_FADE_INTERVAL = 25; this.PLAY_AREA_BOX_ALPHA = 1.0; this.PLAY_AREA_SENSOR_ALPHA = 0.8; this.PLAY_AREA_FADE_DELTA = this.PLAY_AREA_FADE_INTERVAL / this.PLAY_AREA_FADE_DURATION; - this.TELEPORT_SCALE_DURATION = 500; + this.TELEPORT_SCALE_DURATION = 130; this.TELEPORT_SCALE_TIMEOUT = 20; this.isTeleportVisible = false; this.teleportScaleTimer = null; From 5e7f68d4b7c7d080a4ee7316b0e09f111b84c8d3 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 14:00:20 +1200 Subject: [PATCH 055/434] Use a smaller near grab radius for tablet and mini-tablet --- .../controllers/controllerDispatcher.js | 23 +++++++++++++++++++ scripts/system/miniTablet.js | 8 +++++++ 2 files changed, 31 insertions(+) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 7a916392b9..f71af03e26 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -25,7 +25,9 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); (function() { Script.include("/~/system/libraries/pointersUtils.js"); + var NEAR_MAX_RADIUS = 0.1; + var NEAR_TABLET_MAX_RADIUS = 0.05; var TARGET_UPDATE_HZ = 60; // 50hz good enough, but we're using update var BASIC_TIMER_INTERVAL_MS = 1000 / TARGET_UPDATE_HZ; @@ -49,6 +51,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.tabletID = null; this.blacklist = []; this.pointerManager = new PointerManager(); + this.miniTabletID = null; // a module can occupy one or more "activity" slots while it's running. If all the required slots for a module are // not set to false (not in use), a module cannot start. When a module is using a slot, that module's name @@ -211,6 +214,22 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); if (controllerLocations[h].valid) { var nearbyOverlays = Overlays.findOverlays(controllerLocations[h].position, NEAR_MAX_RADIUS * sensorScaleFactor); + + // Tablet and mini-tablet must be within NEAR_TABLET_MAX_RADIUS in order to be grabbed. + var tabletIndex = nearbyOverlays.indexOf(HMD.tabletID); + var miniTabletIndex = nearbyOverlays.indexOf(_this.miniTabletID); + if (tabletIndex !== -1 || miniTabletIndex !== -1) { + var closebyOverlays = + Overlays.findOverlays(controllerLocations[h].position, NEAR_TABLET_MAX_RADIUS * sensorScaleFactor); + // Assumes that the tablet and mini-tablet are not displayed at the same time. + if (tabletIndex !== -1 && closebyOverlays.indexOf(HMD.tabletID) === -1) { + nearbyOverlays.splice(tabletIndex, 1); + } + if (miniTabletIndex !== -1 && closebyOverlays.indexOf(_this.miniTabletID) === -1) { + nearbyOverlays.splice(miniTabletIndex, 1); + } + } + nearbyOverlays.sort(function (a, b) { var aPosition = Overlays.getProperty(a, "position"); var aDistance = Vec3.distance(aPosition, controllerLocations[h].position); @@ -218,6 +237,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); var bDistance = Vec3.distance(bPosition, controllerLocations[h].position); return aDistance - bDistance; }); + nearbyOverlayIDs.push(nearbyOverlays); } else { nearbyOverlayIDs.push([]); @@ -470,6 +490,8 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); _this.setBlacklist(); } } + } else if (channel === 'Hifi-MiniTablet-ID') { + _this.miniTabletID = message; } } catch (e) { @@ -508,6 +530,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); Entities.mousePressOnEntity.connect(mousePress); var controllerDispatcher = new ControllerDispatcher(); Messages.subscribe('Hifi-Hand-RayPick-Blacklist'); + Messages.subscribe('Hifi-MiniTablet-ID'); Messages.messageReceived.connect(controllerDispatcher.handleHandMessage); Script.scriptEnding.connect(controllerDispatcher.cleanup); Script.setTimeout(controllerDispatcher.update, BASIC_TIMER_INTERVAL_MS); diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 6d6180a964..fdfa92d98a 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -169,6 +169,11 @@ // #region Communications ================================================================================================== + function updateMiniTabletID() { + // Send mini-tablet overlay ID to controllerDispatcher so that it can use a smaller near grab distance. + Messages.sendLocalMessage("Hifi-MiniTablet-ID", proxyOverlay); + } + function updateMutedStatus() { var isMuted = Audio.muted; proxyOverlayObject.emitScriptEvent(JSON.stringify({ @@ -257,6 +262,8 @@ proxyOverlayObject = Overlays.getOverlayObject(proxyUIOverlay); proxyOverlayObject.webEventReceived.connect(onWebEventReceived); + + updateMiniTabletID(); } function showUI(hand) { @@ -320,6 +327,7 @@ proxyOverlayObject = null; proxyUIOverlay = null; proxyOverlay = null; + updateMiniTabletID(); } } From f6a607efcc3b4f563cc5d75cbb6336004179ad4c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 15:43:37 +1200 Subject: [PATCH 056/434] Expand / shrink mini-tablet when showing / hiding --- scripts/system/miniTablet.js | 130 +++++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 20 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index fdfa92d98a..dcbaa34ad5 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -61,13 +61,20 @@ // State machine PROXY_DISABLED = 0, PROXY_HIDDEN = 1, - PROXY_VISIBLE = 2, - PROXY_EXPANDING = 3, - TABLET_OPEN = 4, - STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_VISIBLE", "PROXY_EXPANDING", "TABLET_OPEN"], + PROXY_HIDING = 2, + PROXY_SHOWING = 3, + PROXY_VISIBLE = 4, + PROXY_EXPANDING = 5, + TABLET_OPEN = 6, + STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_HIDING", "PROXY_SHOWING", "PROXY_VISIBLE", "PROXY_EXPANDING", + "TABLET_OPEN"], STATE_MACHINE, rezzerState = PROXY_DISABLED, proxyHand, + PROXY_SCALE_DURATION = 150, + PROXY_SCALE_TIMEOUT = 20, + proxyScaleTimer = null, + proxyScaleStart, PROXY_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. { x: 0.5, y: -0.75, z: 0 }, { x: -0.5, y: -0.75, z: 0 } @@ -76,12 +83,11 @@ proxyExpandLocalPosition, proxyExpandLocalRotation = Quat.IDENTITY, PROXY_EXPAND_DURATION = 250, - PROXY_EXPAND_TIMEOUT = 25, + PROXY_EXPAND_TIMEOUT = 20, proxyExpandTimer = null, proxyExpandStart, proxyInitialWidth, proxyTargetWidth, - tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), // EventBridge READY_MESSAGE = "ready", // Engine <== Dialog @@ -112,6 +118,8 @@ RIGHT_HAND = 1, HAND_NAMES = ["LeftHand", "RightHand"], + // Miscellaneous. + tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), DEBUG = false; // #region Utilities ======================================================================================================= @@ -266,20 +274,22 @@ updateMiniTabletID(); } - function showUI(hand) { + function showUI() { + var initialScale = 0.01; // Start very small. + Overlays.editOverlay(proxyOverlay, { parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(proxyHand), localPosition: Vec3.multiply(avatarScale, proxyHand === LEFT_HAND ? PROXY_POSITION_LEFT_HAND : PROXY_POSITION_RIGHT_HAND), localRotation: proxyHand === LEFT_HAND ? PROXY_ROTATION_LEFT_HAND : PROXY_ROTATION_RIGHT_HAND, - dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), + dimensions: Vec3.multiply(initialScale, PROXY_DIMENSIONS), visible: true }); Overlays.editOverlay(proxyUIOverlay, { localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), - dimensions: Vec3.multiply(avatarScale, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / avatarScale, + dimensions: Vec3.multiply(initialScale, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / initialScale, visible: true }); @@ -293,6 +303,19 @@ } function sizeUI(scaleFactor) { + // Scale UI in place. + Overlays.editOverlay(proxyOverlay, { + dimensions: Vec3.multiply(scaleFactor, PROXY_DIMENSIONS) + }); + Overlays.editOverlay(proxyUIOverlay, { + localPosition: Vec3.multiply(scaleFactor, PROXY_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(scaleFactor, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / scaleFactor + }); + } + + function sizeUIAboutHandles(scaleFactor) { + // Scale UI and move per handles. Overlays.editOverlay(proxyOverlay, { localPosition: Vec3.sum(proxyExpandLocalPosition, @@ -396,15 +419,71 @@ } // Compare palm directions of hands with vectors from palms to camera. if (shouldShowProxy(LEFT_HAND)) { - setState(PROXY_VISIBLE, LEFT_HAND); + setState(PROXY_SHOWING, LEFT_HAND); } else if (shouldShowProxy(RIGHT_HAND)) { - setState(PROXY_VISIBLE, RIGHT_HAND); + setState(PROXY_SHOWING, RIGHT_HAND); } } - function enterProxyVisible(hand) { + function scaleProxyDown() { + var scaleFactor = (Date.now() - proxyScaleStart) / PROXY_SCALE_DURATION; + if (scaleFactor < 1) { + sizeUI((1 - scaleFactor) * avatarScale); + proxyScaleTimer = Script.setTimeout(scaleProxyDown, PROXY_SCALE_TIMEOUT); + return; + } + proxyScaleTimer = null; + setState(PROXY_HIDDEN); + } + + function enterProxyHiding() { + proxyScaleStart = Date.now(); + proxyScaleTimer = Script.setTimeout(scaleProxyDown, PROXY_SCALE_TIMEOUT); + } + + function updateProxyHiding() { + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + } + } + + function exitProxyHiding() { + if (proxyScaleTimer) { + Script.clearTimeout(proxyScaleTimer); + proxyScaleTimer = null; + } + } + + function scaleProxyUp() { + var scaleFactor = (Date.now() - proxyScaleStart) / PROXY_SCALE_DURATION; + if (scaleFactor < 1) { + sizeUI(scaleFactor * avatarScale); + proxyScaleTimer = Script.setTimeout(scaleProxyUp, PROXY_SCALE_TIMEOUT); + return; + } + proxyScaleTimer = null; + sizeUI(avatarScale); + setState(PROXY_VISIBLE); + } + + function enterProxyShowing(hand) { proxyHand = hand; - showUI(proxyHand); + showUI(); + proxyScaleStart = Date.now(); + proxyScaleTimer = Script.setTimeout(scaleProxyUp, PROXY_SCALE_TIMEOUT); + } + + function updateProxyShowing() { + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + } + } + + function exitProxyShowing() { + if (proxyScaleTimer) { + Script.clearTimeout(proxyScaleTimer); + proxyScaleTimer = null; + } } function updateProxyVisible() { @@ -415,7 +494,7 @@ } // Check that palm direction of proxy hand still less than maximum angle. if (!shouldShowProxy(proxyHand)) { - setState(PROXY_HIDDEN); + setState(PROXY_HIDING); } } @@ -423,11 +502,10 @@ var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); if (scaleFactor < 1) { - sizeUI(tabletScaleFactor); + sizeUIAboutHandles(tabletScaleFactor); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); return; } - proxyExpandTimer = null; setState(TABLET_OPEN); } @@ -449,7 +527,7 @@ } function updateProxyExanding() { - // Hide proxy if tablet has been displayed by other means. + // Hide proxy immediately if tablet has been displayed by other means. if (HMD.showTablet) { setState(PROXY_HIDDEN); } @@ -490,8 +568,18 @@ update: updateProxyHidden, exit: null }, + PROXY_HIDING: { // Tablet proxy is reducing from PROXY_VISIBLE to PROXY_HIDDEN. + enter: enterProxyHiding, + update: updateProxyHiding, + exit: exitProxyHiding + }, + PROXY_SHOWING: { // Tablet proxy is expanding from PROXY_HIDDN to PROXY_VISIBLE. + enter: enterProxyShowing, + update: updateProxyShowing, + exit: exitProxyShowing + }, PROXY_VISIBLE: { // Tablet proxy is visible and attached to hand. - enter: enterProxyVisible, + enter: null, update: updateProxyVisible, exit: null }, @@ -523,7 +611,9 @@ } function updateState() { - STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); + if (STATE_MACHINE[STATE_STRINGS[rezzerState]].update) { + STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); + } updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); } From e25b2f6e0f3e02fc569a126262edfad3737444a2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 16:47:40 +1200 Subject: [PATCH 057/434] Support stylus input on the mini tablet --- .../controllerModules/stylusInput.js | 27 +++++++++++++++++++ scripts/system/miniTablet.js | 6 ++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/controllerModules/stylusInput.js b/scripts/system/controllers/controllerModules/stylusInput.js index a512fd89db..77615e361f 100644 --- a/scripts/system/controllers/controllerModules/stylusInput.js +++ b/scripts/system/controllers/controllerModules/stylusInput.js @@ -58,6 +58,12 @@ Script.include("/~/system/libraries/controllers.js"); enabled: true }); + this.miniTabletID = null; + + this.setMiniTabletID = function (id) { + this.miniTabletID = id; + }; + this.disable = false; this.otherModuleNeedsToRun = function(controllerData) { @@ -123,6 +129,14 @@ Script.include("/~/system/libraries/controllers.js"); } } + // Add the mini tablet. + if (this.miniTabletID && Overlays.getProperty(this.miniTabletID, "visible")) { + stylusTarget = getOverlayDistance(controllerPosition, this.miniTabletID); + if (stylusTarget) { + stylusTargets.push(stylusTarget); + } + } + var WEB_DISPLAY_STYLUS_DISTANCE = 0.5; var nearStylusTarget = isNearStylusTarget(stylusTargets, WEB_DISPLAY_STYLUS_DISTANCE * sensorScaleFactor); @@ -191,6 +205,15 @@ Script.include("/~/system/libraries/controllers.js"); } } + function onMessageReceived(channel, message, sender) { + if (sender === MyAvatar.sessionUUID) { + if (channel === 'Hifi-MiniTablet-UI-ID') { + leftTabletStylusInput.setMiniTabletID(message); + rightTabletStylusInput.setMiniTabletID(message); + } + } + } + var leftTabletStylusInput = new StylusInput(LEFT_HAND); var rightTabletStylusInput = new StylusInput(RIGHT_HAND); @@ -201,7 +224,11 @@ Script.include("/~/system/libraries/controllers.js"); Overlays.hoverLeaveOverlay.connect(mouseHoverLeave); Overlays.mousePressOnOverlay.connect(mousePress); + Messages.subscribe('Hifi-MiniTablet-UI-ID'); + Messages.messageReceived.connect(onMessageReceived); + this.cleanup = function () { + Messages.messageReceived.disconnect(onMessageReceived); leftTabletStylusInput.cleanup(); rightTabletStylusInput.cleanup(); disableDispatcherModule("LeftTabletStylusInput"); diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index dcbaa34ad5..30594392e2 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -180,6 +180,8 @@ function updateMiniTabletID() { // Send mini-tablet overlay ID to controllerDispatcher so that it can use a smaller near grab distance. Messages.sendLocalMessage("Hifi-MiniTablet-ID", proxyOverlay); + // Send mini-tablet UI overlay ID to stylusInput so that it styluses can be used on it. + Messages.sendLocalMessage("Hifi-MiniTablet-UI-ID", proxyUIOverlay); } function updateMutedStatus() { @@ -271,7 +273,7 @@ proxyOverlayObject = Overlays.getOverlayObject(proxyUIOverlay); proxyOverlayObject.webEventReceived.connect(onWebEventReceived); - updateMiniTabletID(); + // updateMiniTabletID(); Other scripts relying on this may not be ready yet so do this in showUI(). } function showUI() { @@ -293,6 +295,8 @@ visible: true }); + updateMiniTabletID(); + if (!proxyUIOverlayEnabled) { // Overlay content is created the first time it is visible to the user. The initial creation displays artefacts. // Delay showing UI overlay until after giving it time for its content to be created. From 536db64123c76d5854787f85cc50cbdcfae6d644 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 21 Aug 2018 16:48:35 +1200 Subject: [PATCH 058/434] Mitigate against UI overlay possibly getting rotated --- scripts/system/miniTablet.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 30594392e2..5c950cd594 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -290,6 +290,7 @@ }); Overlays.editOverlay(proxyUIOverlay, { localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), + localRotation: PROXY_UI_LOCAL_ROTATION, dimensions: Vec3.multiply(initialScale, PROXY_UI_DIMENSIONS), dpi: PROXY_UI_DPI / initialScale, visible: true From 6dcce0e953038e6f248ee9d9ee7b40f1b16c5343 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 23 Aug 2018 10:59:23 +1200 Subject: [PATCH 059/434] Revert display test to depending just on hand to camera angle for now --- scripts/system/miniTablet.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 5c950cd594..17b1587604 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -409,8 +409,7 @@ handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); cameraToHandDirection = Vec3.normalize(Vec3.subtract(handPosition, Camera.position)); - return Vec3.dot(cameraToHandDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS - && Vec3.dot(cameraToHandDirection, Quat.getForward(Camera.orientation)) > MIN_HAND_CAMERA_ANGLE_COS; + return Vec3.dot(cameraToHandDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; } function enterProxyHidden() { From 335eb98bb77364d6c86736185adeb900f2d106a6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 23 Aug 2018 11:14:21 +1200 Subject: [PATCH 060/434] Increase size of the "..." button --- scripts/system/html/css/miniTablet.css | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index 5ff9944a2c..75da2eaf82 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -80,23 +80,24 @@ footer { text-align: center; color: #e3e3e3; font-weight: bold; + font-size: 26px; } footer div { display: inline-block; - height: 12px; - width: 24px; + height: 14px; + width: 30px; position: relative; - top: 16px; + top: 14px; } footer div p { position: relative; - top: -8px; + top: -15px; } footer .button:hover { border: 1px solid #e3e3e3; - border-radius: 2px; - margin: -1px; + border-radius: 3px; + margin: -8px; } From b6e4a22db7938359792cd6d8853d1bd5b794213e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 23 Aug 2018 13:06:28 +1200 Subject: [PATCH 061/434] Rotate the mini tablet as it expands --- scripts/system/miniTablet.js | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 17b1587604..ca665b888a 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -79,6 +79,7 @@ { x: 0.5, y: -0.75, z: 0 }, { x: -0.5, y: -0.75, z: 0 } ], + PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -45, y: 0, z: 0 }), proxyExpandHand, proxyExpandLocalPosition, proxyExpandLocalRotation = Quat.IDENTITY, @@ -88,6 +89,7 @@ proxyExpandStart, proxyInitialWidth, proxyTargetWidth, + proxyTargetLocalRotation, // EventBridge READY_MESSAGE = "ready", // Engine <== Dialog @@ -321,19 +323,28 @@ function sizeUIAboutHandles(scaleFactor) { // Scale UI and move per handles. + var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); + var dimensions = Vec3.multiply(tabletScaleFactor, PROXY_DIMENSIONS); + var localRotation = Quat.mix(proxyExpandLocalRotation, proxyTargetLocalRotation, scaleFactor); + var localPosition = + Vec3.sum(proxyExpandLocalPosition, + Vec3.multiplyQbyV(proxyExpandLocalRotation, + Vec3.multiply(-tabletScaleFactor, + Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))) + ); + localPosition = Vec3.sum(localPosition, + Vec3.multiplyQbyV(proxyExpandLocalRotation, { x: 0, y: 0.5 * -dimensions.y, z: 0 })); + localPosition = Vec3.sum(localPosition, + Vec3.multiplyQbyV(localRotation, { x: 0, y: 0.5 * dimensions.y, z: 0 })); Overlays.editOverlay(proxyOverlay, { - localPosition: - Vec3.sum(proxyExpandLocalPosition, - Vec3.multiplyQbyV(proxyExpandLocalRotation, - Vec3.multiply(-scaleFactor, - Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))) - ), - dimensions: Vec3.multiply(scaleFactor, PROXY_DIMENSIONS) + localPosition: localPosition, + localRotation: localRotation, + dimensions: dimensions }); Overlays.editOverlay(proxyUIOverlay, { - localPosition: Vec3.multiply(scaleFactor, PROXY_UI_LOCAL_POSITION), - dimensions: Vec3.multiply(scaleFactor, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / scaleFactor + localPosition: Vec3.multiply(tabletScaleFactor, PROXY_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(tabletScaleFactor, PROXY_UI_DIMENSIONS), + dpi: PROXY_UI_DPI / tabletScaleFactor }); } @@ -504,9 +515,8 @@ function expandProxy() { var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; - var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); if (scaleFactor < 1) { - sizeUIAboutHandles(tabletScaleFactor); + sizeUIAboutHandles(scaleFactor); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); return; } @@ -526,6 +536,7 @@ // Start expanding. proxyInitialWidth = PROXY_DIMENSIONS.x; proxyTargetWidth = getTabletWidthFromSettings(); + proxyTargetLocalRotation = Quat.multiply(proxyExpandLocalRotation, PROXY_EXPAND_DELTA_ROTATION); proxyExpandStart = Date.now(); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); } From 283c0c03116bdc578684b56f73b42a5ee5b9cd70 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 23 Aug 2018 00:46:53 -0700 Subject: [PATCH 062/434] s i m p l i f y --- interface/src/Application.cpp | 10 +- interface/src/raypick/CollisionPick.cpp | 4 +- interface/src/raypick/LaserPointer.cpp | 6 +- interface/src/raypick/ParabolaPick.h | 4 +- interface/src/raypick/ParabolaPointer.cpp | 2 +- interface/src/raypick/PathPointer.cpp | 16 +- interface/src/raypick/RayPick.cpp | 4 +- interface/src/raypick/RayPick.h | 4 +- interface/src/raypick/StylusPick.h | 4 +- interface/src/raypick/StylusPointer.cpp | 4 +- .../scripting/SelectionScriptingInterface.cpp | 8 +- interface/src/ui/overlays/Base3DOverlay.cpp | 8 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 24 +- interface/src/ui/overlays/Circle3DOverlay.h | 20 +- .../ui/overlays/ContextOverlayInterface.cpp | 12 +- interface/src/ui/overlays/Cube3DOverlay.cpp | 2 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 2 +- interface/src/ui/overlays/Image3DOverlay.cpp | 4 +- interface/src/ui/overlays/Line3DOverlay.cpp | 10 +- interface/src/ui/overlays/ModelOverlay.cpp | 8 +- interface/src/ui/overlays/Overlay.cpp | 8 +- interface/src/ui/overlays/Overlay.h | 8 +- interface/src/ui/overlays/Overlays.cpp | 8 +- interface/src/ui/overlays/PanelAttachable.cpp | 4 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 14 +- interface/src/ui/overlays/Shape3DOverlay.cpp | 2 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 +- interface/src/ui/overlays/Text3DOverlay.cpp | 8 +- interface/src/ui/overlays/Text3DOverlay.h | 4 +- interface/src/ui/overlays/Volume3DOverlay.cpp | 2 +- interface/src/ui/overlays/Web3DOverlay.cpp | 4 +- libraries/animation/src/AnimVariant.cpp | 2 +- libraries/audio/src/AudioInjectorOptions.cpp | 4 +- .../src/avatars-renderer/Avatar.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 8 +- .../controllers/src/controllers/Pose.cpp | 12 +- .../src/RenderableLineEntityItem.h | 2 +- .../src/RenderableMaterialEntityItem.cpp | 4 +- .../src/RenderableModelEntityItem.cpp | 4 +- .../src/RenderableModelEntityItem.h | 2 +- .../src/RenderablePolyLineEntityItem.cpp | 22 +- .../src/RenderablePolyLineEntityItem.h | 12 +- .../src/RenderablePolyVoxEntityItem.cpp | 26 +- .../src/RenderablePolyVoxEntityItem.h | 2 +- .../src/RenderableWebEntityItem.cpp | 2 +- .../src/RenderableZoneEntityItem.cpp | 6 +- libraries/entities/src/EntityEditFilters.cpp | 8 +- libraries/entities/src/EntityItem.cpp | 44 ++-- libraries/entities/src/EntityItem.h | 11 - .../entities/src/EntityItemProperties.cpp | 216 ++++++++--------- libraries/entities/src/EntityItemProperties.h | 76 +++--- .../src/EntityItemPropertiesDefaults.h | 2 +- .../entities/src/EntityItemPropertiesMacros.h | 24 +- .../entities/src/EntityScriptingInterface.cpp | 26 +- .../entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/EntityTree.cpp | 10 +- libraries/entities/src/HazePropertyGroup.cpp | 12 +- libraries/entities/src/HazePropertyGroup.h | 8 +- .../entities/src/KeyLightPropertyGroup.cpp | 18 +- .../entities/src/KeyLightPropertyGroup.h | 6 +- libraries/entities/src/LightEntityItem.cpp | 8 +- libraries/entities/src/LightEntityItem.h | 6 +- libraries/entities/src/LineEntityItem.cpp | 20 +- libraries/entities/src/LineEntityItem.h | 14 +- libraries/entities/src/MaterialEntityItem.cpp | 12 +- libraries/entities/src/MaterialEntityItem.h | 8 +- libraries/entities/src/ModelEntityItem.cpp | 16 +- libraries/entities/src/ModelEntityItem.h | 10 +- .../entities/src/ParticleEffectEntityItem.cpp | 36 +-- .../entities/src/ParticleEffectEntityItem.h | 32 +-- libraries/entities/src/PolyLineEntityItem.cpp | 39 +-- libraries/entities/src/PolyLineEntityItem.h | 26 +- libraries/entities/src/PolyVoxEntityItem.cpp | 14 +- libraries/entities/src/PolyVoxEntityItem.h | 6 +- libraries/entities/src/ShapeEntityItem.cpp | 8 +- libraries/entities/src/ShapeEntityItem.h | 6 +- .../entities/src/SkyboxPropertyGroup.cpp | 8 +- libraries/entities/src/SkyboxPropertyGroup.h | 4 +- libraries/entities/src/TextEntityItem.cpp | 20 +- libraries/entities/src/TextEntityItem.h | 16 +- .../GraphicsScriptingInterface.cpp | 4 +- libraries/octree/src/OctreePacketData.cpp | 32 +-- libraries/octree/src/OctreePacketData.h | 16 +- libraries/render-utils/src/GeometryCache.cpp | 10 +- libraries/render-utils/src/GeometryCache.h | 6 +- libraries/render-utils/src/Model.cpp | 38 +-- .../src/ModelScriptingInterface.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- libraries/script-engine/src/SpatialEvent.cpp | 4 +- libraries/script-engine/src/TouchEvent.cpp | 6 +- libraries/script-engine/src/TouchEvent.h | 4 +- libraries/shared/src/ColorUtils.h | 6 +- libraries/shared/src/GLMHelpers.cpp | 13 +- libraries/shared/src/GLMHelpers.h | 9 +- libraries/shared/src/JointData.h | 4 +- libraries/shared/src/PointerEvent.cpp | 8 +- libraries/shared/src/RegisteredMetaTypes.cpp | 225 ++++++------------ libraries/shared/src/RegisteredMetaTypes.h | 143 ++--------- libraries/shared/src/SharedUtil.cpp | 4 +- libraries/shared/src/SpatiallyNestable.h | 5 - libraries/shared/src/StreamUtils.cpp | 5 + libraries/shared/src/StreamUtils.h | 1 + 102 files changed, 723 insertions(+), 926 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f77aa2b31a..45ef336333 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4812,7 +4812,7 @@ bool Application::exportEntities(const QString& filename, properties.setParentID(AVATAR_SELF_ID); } else { if (parentID.isInvalidID()) { - properties.setPosition(properties.getPosition().toGlm() - root); + properties.setPosition(properties.getPosition() - root); } else if (!entities.contains(parentID)) { entityDatum->globalizeProperties(properties, "Parent %3 of %2 %1 is not selected for export.", -root); } // else valid parent -- don't offset @@ -5462,9 +5462,9 @@ void Application::updateSecondaryCameraViewFrustum() { if (camera->mirrorProjection && !camera->attachedEntityId.isNull()) { auto entityScriptingInterface = DependencyManager::get(); auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId); - glm::vec3 mirrorPropertiesPosition = entityProperties.getPosition().toGlm(); + glm::vec3 mirrorPropertiesPosition = entityProperties.getPosition(); glm::quat mirrorPropertiesRotation = entityProperties.getRotation(); - glm::vec3 mirrorPropertiesDimensions = entityProperties.getDimensions().toGlm(); + glm::vec3 mirrorPropertiesDimensions = entityProperties.getDimensions(); glm::vec3 halfMirrorPropertiesDimensions = 0.5f * mirrorPropertiesDimensions; // setup mirror from world as inverse of world from mirror transformation using inverted x and z for mirrored image @@ -5496,7 +5496,7 @@ void Application::updateSecondaryCameraViewFrustum() { if (!camera->attachedEntityId.isNull()) { auto entityScriptingInterface = DependencyManager::get(); auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId); - secondaryViewFrustum.setPosition(entityProperties.getPosition().toGlm()); + secondaryViewFrustum.setPosition(entityProperties.getPosition()); secondaryViewFrustum.setOrientation(entityProperties.getRotation()); } else { secondaryViewFrustum.setPosition(camera->position); @@ -7349,7 +7349,7 @@ void Application::addAssetToWorldCheckModelSize() { auto entityScriptingInterface = DependencyManager::get(); auto properties = entityScriptingInterface->getEntityProperties(entityID, propertyFlags); auto name = properties.getName(); - auto dimensions = properties.getDimensions().toGlm(); + auto dimensions = properties.getDimensions(); bool doResize = false; diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index b50e38faa6..87c8c91e6d 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -28,8 +28,8 @@ void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::v } QVariantMap collisionPointPair; - collisionPointPair["pointOnPick"] = vec3ToVariant(objectIntersection.testCollisionPoint); - collisionPointPair["pointOnObject"] = vec3ToVariant(objectIntersection.foundCollisionPoint); + collisionPointPair["pointOnPick"] = vec3toVariant(objectIntersection.testCollisionPoint); + collisionPointPair["pointOnObject"] = vec3toVariant(objectIntersection.foundCollisionPoint); collisionPointPairs[objectIntersection.foundID].append(collisionPointPair); } diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index 2a984ffc82..2382a95105 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -74,7 +74,7 @@ void LaserPointer::setVisualPickResultInternal(PickResultPointer pickResult, Int rayPickResult->intersection = intersection; rayPickResult->distance = distance; rayPickResult->surfaceNormal = surfaceNormal; - rayPickResult->pickVariant["direction"] = vec3ToVariant(-surfaceNormal); + rayPickResult->pickVariant["direction"] = vec3toVariant(-surfaceNormal); } } @@ -107,10 +107,10 @@ void LaserPointer::RenderState::disable() { void LaserPointer::RenderState::update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY, bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult) { StartEndRenderState::update(origin, end, surfaceNormal, scaleWithAvatar, distanceScaleEnd, centerEndY, faceAvatar, followNormal, followNormalStrength, distance, pickResult); - QVariant endVariant = vec3ToVariant(end); + QVariant endVariant = vec3toVariant(end); if (!getPathID().isNull()) { QVariantMap pathProps; - pathProps.insert("start", vec3ToVariant(origin)); + pathProps.insert("start", vec3toVariant(origin)); pathProps.insert("end", endVariant); pathProps.insert("visible", true); pathProps.insert("ignoreRayIntersection", doesPathIgnoreRays()); diff --git a/interface/src/raypick/ParabolaPick.h b/interface/src/raypick/ParabolaPick.h index b7a33ecf2d..99a42a5380 100644 --- a/interface/src/raypick/ParabolaPick.h +++ b/interface/src/raypick/ParabolaPick.h @@ -50,8 +50,8 @@ public: toReturn["objectID"] = objectID; toReturn["distance"] = distance; toReturn["parabolicDistance"] = parabolicDistance; - toReturn["intersection"] = vec3ToVariant(intersection); - toReturn["surfaceNormal"] = vec3ToVariant(surfaceNormal); + toReturn["intersection"] = vec3toVariant(intersection); + toReturn["surfaceNormal"] = vec3toVariant(surfaceNormal); toReturn["parabola"] = PickResult::toVariantMap(); toReturn["extraInfo"] = extraInfo; return toReturn; diff --git a/interface/src/raypick/ParabolaPointer.cpp b/interface/src/raypick/ParabolaPointer.cpp index a6fcf0956a..da9d934861 100644 --- a/interface/src/raypick/ParabolaPointer.cpp +++ b/interface/src/raypick/ParabolaPointer.cpp @@ -100,7 +100,7 @@ void ParabolaPointer::setVisualPickResultInternal(PickResultPointer pickResult, parabolaPickResult->distance = distance; parabolaPickResult->surfaceNormal = surfaceNormal; PickParabola parabola = PickParabola(parabolaPickResult->pickVariant); - parabolaPickResult->pickVariant["velocity"] = vec3ToVariant((intersection - parabola.origin - + parabolaPickResult->pickVariant["velocity"] = vec3toVariant((intersection - parabola.origin - 0.5f * parabola.acceleration * parabolaPickResult->parabolicDistance * parabolaPickResult->parabolicDistance) / parabolaPickResult->parabolicDistance); } } diff --git a/interface/src/raypick/PathPointer.cpp b/interface/src/raypick/PathPointer.cpp index a6c03758b8..685611d77b 100644 --- a/interface/src/raypick/PathPointer.cpp +++ b/interface/src/raypick/PathPointer.cpp @@ -102,12 +102,12 @@ PickResultPointer PathPointer::getVisualPickResult(const PickResultPointer& pick registrationPoint = glm::vec3(0.5f); } else { EntityItemProperties props = DependencyManager::get()->getEntityProperties(_lockEndObject.id); - glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition().toGlm()); + glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition()); glm::mat4 finalPosAndRotMat = entityMat * _lockEndObject.offsetMat; pos = extractTranslation(finalPosAndRotMat); rot = glmExtractRotation(finalPosAndRotMat); - dim = props.getDimensions().toGlm(); - registrationPoint = props.getRegistrationPoint().toGlm(); + dim = props.getDimensions(); + registrationPoint = props.getRegistrationPoint(); } const glm::vec3 DEFAULT_REGISTRATION_POINT = glm::vec3(0.5f); endVec = pos + rot * (dim * (DEFAULT_REGISTRATION_POINT - registrationPoint)); @@ -277,10 +277,10 @@ void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end, bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult) { if (!getStartID().isNull()) { QVariantMap startProps; - startProps.insert("position", vec3ToVariant(origin)); + startProps.insert("position", vec3toVariant(origin)); startProps.insert("visible", true); if (scaleWithAvatar) { - startProps.insert("dimensions", vec3ToVariant(getStartDim() * DependencyManager::get()->getMyAvatar()->getSensorToWorldScale())); + startProps.insert("dimensions", vec3toVariant(getStartDim() * DependencyManager::get()->getMyAvatar()->getSensorToWorldScale())); } startProps.insert("ignoreRayIntersection", doesStartIgnoreRays()); qApp->getOverlays().editOverlay(getStartID(), startProps); @@ -291,10 +291,10 @@ void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end, glm::vec3 dim = vec3FromVariant(qApp->getOverlays().getProperty(getEndID(), "dimensions").value); if (distanceScaleEnd) { dim = getEndDim() * glm::distance(origin, end); - endProps.insert("dimensions", vec3ToVariant(dim)); + endProps.insert("dimensions", vec3toVariant(dim)); } else if (scaleWithAvatar) { dim = getEndDim() * DependencyManager::get()->getMyAvatar()->getSensorToWorldScale(); - endProps.insert("dimensions", vec3ToVariant(dim)); + endProps.insert("dimensions", vec3toVariant(dim)); } glm::quat normalQuat = Quat().lookAtSimple(Vectors::ZERO, surfaceNormal); @@ -331,7 +331,7 @@ void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end, _avgEndRot = rotation; } } - endProps.insert("position", vec3ToVariant(position)); + endProps.insert("position", vec3toVariant(position)); endProps.insert("rotation", quatToVariant(rotation)); endProps.insert("visible", true); endProps.insert("ignoreRayIntersection", doesEndIgnoreRays()); diff --git a/interface/src/raypick/RayPick.cpp b/interface/src/raypick/RayPick.cpp index f64e96a595..96b41dcc72 100644 --- a/interface/src/raypick/RayPick.cpp +++ b/interface/src/raypick/RayPick.cpp @@ -65,7 +65,7 @@ glm::vec3 RayPick::intersectRayWithOverlayXYPlane(const QUuid& overlayID, const glm::vec3 RayPick::intersectRayWithEntityXYPlane(const QUuid& entityID, const glm::vec3& origin, const glm::vec3& direction) { auto props = DependencyManager::get()->getEntityProperties(entityID); - return intersectRayWithXYPlane(origin, direction, props.getPosition().toGlm(), props.getRotation(), props.getRegistrationPoint().toGlm()); + return intersectRayWithXYPlane(origin, direction, props.getPosition(), props.getRotation(), props.getRegistrationPoint()); } glm::vec2 RayPick::projectOntoXYPlane(const glm::vec3& worldPos, const glm::vec3& position, const glm::quat& rotation, const glm::vec3& dimensions, const glm::vec3& registrationPoint, bool unNormalized) { @@ -91,5 +91,5 @@ glm::vec2 RayPick::projectOntoOverlayXYPlane(const QUuid& overlayID, const glm:: glm::vec2 RayPick::projectOntoEntityXYPlane(const QUuid& entityID, const glm::vec3& worldPos, bool unNormalized) { auto props = DependencyManager::get()->getEntityProperties(entityID); - return projectOntoXYPlane(worldPos, props.getPosition().toGlm(), props.getRotation(), props.getDimensions().toGlm(), props.getRegistrationPoint().toGlm(), unNormalized); + return projectOntoXYPlane(worldPos, props.getPosition(), props.getRotation(), props.getDimensions(), props.getRegistrationPoint(), unNormalized); } \ No newline at end of file diff --git a/interface/src/raypick/RayPick.h b/interface/src/raypick/RayPick.h index 1bea04308f..9410d39c1a 100644 --- a/interface/src/raypick/RayPick.h +++ b/interface/src/raypick/RayPick.h @@ -46,8 +46,8 @@ public: toReturn["intersects"] = intersects; toReturn["objectID"] = objectID; toReturn["distance"] = distance; - toReturn["intersection"] = vec3ToVariant(intersection); - toReturn["surfaceNormal"] = vec3ToVariant(surfaceNormal); + toReturn["intersection"] = vec3toVariant(intersection); + toReturn["surfaceNormal"] = vec3toVariant(surfaceNormal); toReturn["searchRay"] = PickResult::toVariantMap(); toReturn["extraInfo"] = extraInfo; return toReturn; diff --git a/interface/src/raypick/StylusPick.h b/interface/src/raypick/StylusPick.h index bea40f147e..f19e343f8d 100644 --- a/interface/src/raypick/StylusPick.h +++ b/interface/src/raypick/StylusPick.h @@ -44,8 +44,8 @@ public: toReturn["intersects"] = intersects; toReturn["objectID"] = objectID; toReturn["distance"] = distance; - toReturn["intersection"] = vec3ToVariant(intersection); - toReturn["surfaceNormal"] = vec3ToVariant(surfaceNormal); + toReturn["intersection"] = vec3toVariant(intersection); + toReturn["surfaceNormal"] = vec3toVariant(surfaceNormal); toReturn["stylusTip"] = PickResult::toVariantMap(); return toReturn; } diff --git a/interface/src/raypick/StylusPointer.cpp b/interface/src/raypick/StylusPointer.cpp index 4ad4c55b84..8c0fb59106 100644 --- a/interface/src/raypick/StylusPointer.cpp +++ b/interface/src/raypick/StylusPointer.cpp @@ -74,9 +74,9 @@ void StylusPointer::show(const StylusTip& tip) { auto modelOrientation = tip.orientation * X_ROT_NEG_90; auto sensorToWorldScale = DependencyManager::get()->getMyAvatar()->getSensorToWorldScale(); auto modelPositionOffset = modelOrientation * (vec3(0.0f, 0.0f, -WEB_STYLUS_LENGTH / 2.0f) * sensorToWorldScale); - props["position"] = vec3ToVariant(tip.position + modelPositionOffset); + props["position"] = vec3toVariant(tip.position + modelPositionOffset); props["rotation"] = quatToVariant(modelOrientation); - props["dimensions"] = vec3ToVariant(sensorToWorldScale * vec3(0.01f, 0.01f, WEB_STYLUS_LENGTH)); + props["dimensions"] = vec3toVariant(sensorToWorldScale * vec3(0.01f, 0.01f, WEB_STYLUS_LENGTH)); props["visible"] = true; qApp->getOverlays().editOverlay(_stylusOverlay, props); } diff --git a/interface/src/scripting/SelectionScriptingInterface.cpp b/interface/src/scripting/SelectionScriptingInterface.cpp index 64e570dd42..44e67191ee 100644 --- a/interface/src/scripting/SelectionScriptingInterface.cpp +++ b/interface/src/scripting/SelectionScriptingInterface.cpp @@ -498,10 +498,10 @@ QVariantMap SelectionHighlightStyle::toVariantMap() const { QVariantMap properties; const float MAX_COLOR = 255.0f; - properties["outlineUnoccludedColor"] = vec3ToVariant(_style._outlineUnoccluded.color * MAX_COLOR); - properties["outlineOccludedColor"] = vec3ToVariant(_style._outlineOccluded.color * MAX_COLOR); - properties["fillUnoccludedColor"] = vec3ToVariant(_style._fillUnoccluded.color * MAX_COLOR); - properties["fillOccludedColor"] = vec3ToVariant(_style._fillOccluded.color * MAX_COLOR); + properties["outlineUnoccludedColor"] = vec3toVariant(_style._outlineUnoccluded.color * MAX_COLOR); + properties["outlineOccludedColor"] = vec3toVariant(_style._outlineOccluded.color * MAX_COLOR); + properties["fillUnoccludedColor"] = vec3toVariant(_style._fillUnoccluded.color * MAX_COLOR); + properties["fillOccludedColor"] = vec3toVariant(_style._fillOccluded.color * MAX_COLOR); properties["outlineUnoccludedAlpha"] = _style._outlineUnoccluded.alpha; properties["outlineOccludedAlpha"] = _style._outlineOccluded.alpha; diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 62e374e782..6bce9d9283 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -59,7 +59,7 @@ QVariantMap convertOverlayLocationFromScriptSemantics(const QVariantMap& propert glm::vec3 localPosition = SpatiallyNestable::worldToLocal(vec3FromVariant(result["position"]), parentID, parentJointIndex, scalesWithParent, success); if (success) { - result["position"] = vec3ToVariant(localPosition); + result["position"] = vec3toVariant(localPosition); } } @@ -112,7 +112,7 @@ void Base3DOverlay::setProperties(const QVariantMap& originalProperties) { properties["parentJointIndex"] = getParentJointIndex(); } if (!properties["position"].isValid() && !properties["localPosition"].isValid()) { - properties["position"] = vec3ToVariant(getWorldPosition()); + properties["position"] = vec3toVariant(getWorldPosition()); } if (!properties["orientation"].isValid() && !properties["localOrientation"].isValid()) { properties["orientation"] = quatToVariant(getWorldOrientation()); @@ -241,10 +241,10 @@ QVariant Base3DOverlay::getProperty(const QString& property) { return _name; } if (property == "position" || property == "start" || property == "p1" || property == "point") { - return vec3ToVariant(getWorldPosition()); + return vec3toVariant(getWorldPosition()); } if (property == "localPosition") { - return vec3ToVariant(getLocalPosition()); + return vec3toVariant(getLocalPosition()); } if (property == "rotation" || property == "orientation") { return quatToVariant(getWorldOrientation()); diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 8940e9dc5f..3bac00d118 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -265,7 +265,7 @@ template T fromVariant(const QVariant& v, bool& valid) { return qvariant_cast(v); } -template<> ScriptVec3UChar fromVariant(const QVariant& v, bool& valid) { +template<> glm::u8vec3 fromVariant(const QVariant& v, bool& valid) { return vec3FromVariant(v, valid); } @@ -329,11 +329,11 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { _dirty |= updateIfValid(properties, "outerStartAlpha", _outerStartAlpha); _dirty |= updateIfValid(properties, "outerEndAlpha", _outerEndAlpha); - _dirty |= updateIfValid(properties, "color", { _innerStartColor, _innerEndColor, _outerStartColor, _outerEndColor }); - _dirty |= updateIfValid(properties, "startColor", { _innerStartColor, _outerStartColor } ); - _dirty |= updateIfValid(properties, "endColor", { _innerEndColor, _outerEndColor } ); - _dirty |= updateIfValid(properties, "innerColor", { _innerStartColor, _innerEndColor } ); - _dirty |= updateIfValid(properties, "outerColor", { _outerStartColor, _outerEndColor } ); + _dirty |= updateIfValid(properties, "color", { _innerStartColor, _innerEndColor, _outerStartColor, _outerEndColor }); + _dirty |= updateIfValid(properties, "startColor", { _innerStartColor, _outerStartColor } ); + _dirty |= updateIfValid(properties, "endColor", { _innerEndColor, _outerEndColor } ); + _dirty |= updateIfValid(properties, "innerColor", { _innerStartColor, _innerEndColor } ); + _dirty |= updateIfValid(properties, "outerColor", { _outerStartColor, _outerEndColor } ); _dirty |= updateIfValid(properties, "innerStartColor", _innerStartColor); _dirty |= updateIfValid(properties, "innerEndColor", _innerEndColor); _dirty |= updateIfValid(properties, "outerStartColor", _outerStartColor); @@ -463,16 +463,16 @@ QVariant Circle3DOverlay::getProperty(const QString& property) { return _innerRadius; } if (property == "innerStartColor") { - return vec3ToVariant(_innerStartColor.toGlm()); + return vec3toVariant(_innerStartColor); } if (property == "innerEndColor") { - return vec3ToVariant(_innerEndColor.toGlm()); + return vec3toVariant(_innerEndColor); } if (property == "outerStartColor") { - return vec3ToVariant(_outerStartColor.toGlm()); + return vec3toVariant(_outerStartColor); } if (property == "outerEndColor") { - return vec3ToVariant(_outerEndColor.toGlm()); + return vec3toVariant(_outerEndColor); } if (property == "innerStartAlpha") { return _innerStartAlpha; @@ -502,10 +502,10 @@ QVariant Circle3DOverlay::getProperty(const QString& property) { return _minorTickMarksLength; } if (property == "majorTickMarksColor") { - return vec3ToVariant(_majorTickMarksColor.toGlm()); + return vec3toVariant(_majorTickMarksColor); } if (property == "minorTickMarksColor") { - return vec3ToVariant(_minorTickMarksColor.toGlm()); + return vec3toVariant(_minorTickMarksColor); } return Planar3DOverlay::getProperty(property); diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index 71aaf1fc4a..ca5e05a53b 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -39,8 +39,8 @@ public: float getMinorTickMarksAngle() const { return _minorTickMarksAngle; } float getMajorTickMarksLength() const { return _majorTickMarksLength; } float getMinorTickMarksLength() const { return _minorTickMarksLength; } - ScriptVec3UChar getMajorTickMarksColor() const { return _majorTickMarksColor; } - ScriptVec3UChar getMinorTickMarksColor() const { return _minorTickMarksColor; } + glm::u8vec3 getMajorTickMarksColor() const { return _majorTickMarksColor; } + glm::u8vec3 getMinorTickMarksColor() const { return _minorTickMarksColor; } void setStartAt(float value) { _startAt = value; } void setEndAt(float value) { _endAt = value; } @@ -51,8 +51,8 @@ public: void setMinorTickMarksAngle(float value) { _minorTickMarksAngle = value; } void setMajorTickMarksLength(float value) { _majorTickMarksLength = value; } void setMinorTickMarksLength(float value) { _minorTickMarksLength = value; } - void setMajorTickMarksColor(const ScriptVec3UChar& value) { _majorTickMarksColor = value; } - void setMinorTickMarksColor(const ScriptVec3UChar& value) { _minorTickMarksColor = value; } + void setMajorTickMarksColor(const glm::u8vec3& value) { _majorTickMarksColor = value; } + void setMinorTickMarksColor(const glm::u8vec3& value) { _minorTickMarksColor = value; } virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal, bool precisionPicking = false) override; @@ -67,10 +67,10 @@ protected: float _outerRadius { 1 }; float _innerRadius { 0 }; - ScriptVec3UChar _innerStartColor { DEFAULT_OVERLAY_COLOR }; - ScriptVec3UChar _innerEndColor { DEFAULT_OVERLAY_COLOR }; - ScriptVec3UChar _outerStartColor { DEFAULT_OVERLAY_COLOR }; - ScriptVec3UChar _outerEndColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _innerStartColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _innerEndColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _outerStartColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _outerEndColor { DEFAULT_OVERLAY_COLOR }; float _innerStartAlpha { DEFAULT_ALPHA }; float _innerEndAlpha { DEFAULT_ALPHA }; float _outerStartAlpha { DEFAULT_ALPHA }; @@ -81,8 +81,8 @@ protected: float _minorTickMarksAngle { 0 }; float _majorTickMarksLength { 0 }; float _minorTickMarksLength { 0 }; - ScriptVec3UChar _majorTickMarksColor { DEFAULT_OVERLAY_COLOR }; - ScriptVec3UChar _minorTickMarksColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _majorTickMarksColor { DEFAULT_OVERLAY_COLOR }; + glm::u8vec3 _minorTickMarksColor { DEFAULT_OVERLAY_COLOR }; gpu::Primitive _solidPrimitive { gpu::TRIANGLE_FAN }; int _quadVerticesID { 0 }; int _lineVerticesID { 0 }; diff --git a/interface/src/ui/overlays/ContextOverlayInterface.cpp b/interface/src/ui/overlays/ContextOverlayInterface.cpp index b0a4a64e14..ca89393ea3 100644 --- a/interface/src/ui/overlays/ContextOverlayInterface.cpp +++ b/interface/src/ui/overlays/ContextOverlayInterface.cpp @@ -62,7 +62,7 @@ ContextOverlayInterface::ContextOverlayInterface() { glm::quat cameraOrientation = qApp->getCamera().getOrientation(); QVariantMap props; float sensorToWorldScale = myAvatar->getSensorToWorldScale(); - props.insert("position", vec3ToVariant(myAvatar->getEyePosition() + glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_OFFSET, 0.0f))) * ((CONTEXT_OVERLAY_TABLET_DISTANCE * sensorToWorldScale) * (cameraOrientation * Vectors::FRONT)))); + props.insert("position", vec3toVariant(myAvatar->getEyePosition() + glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_OFFSET, 0.0f))) * ((CONTEXT_OVERLAY_TABLET_DISTANCE * sensorToWorldScale) * (cameraOrientation * Vectors::FRONT)))); props.insert("orientation", quatToVariant(cameraOrientation * glm::quat(glm::radians(glm::vec3(0.0f, CONTEXT_OVERLAY_TABLET_ORIENTATION, 0.0f))))); qApp->getOverlays().editOverlay(tabletFrameID, props); _contextOverlayJustClicked = false; @@ -83,7 +83,7 @@ ContextOverlayInterface::ContextOverlayInterface() { _challengeOwnershipTimeoutTimer.setSingleShot(true); } -static const ScriptVec3UChar CONTEXT_OVERLAY_COLOR = { 255, 255, 255 }; +static const glm::u8vec3 CONTEXT_OVERLAY_COLOR = { 255, 255, 255 }; static const float CONTEXT_OVERLAY_INSIDE_DISTANCE = 1.0f; // in meters static const float CONTEXT_OVERLAY_SIZE = 0.09f; // in meters, same x and y dims static const float CONTEXT_OVERLAY_OFFSET_DISTANCE = 0.1f; @@ -140,10 +140,10 @@ bool ContextOverlayInterface::createOrDestroyContextOverlay(const EntityItemID& // Add all necessary variables to the stack EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(entityItemID, _entityPropertyFlags); glm::vec3 cameraPosition = qApp->getCamera().getPosition(); - glm::vec3 entityDimensions = entityProperties.getDimensions().toGlm(); - glm::vec3 entityPosition = entityProperties.getPosition().toGlm(); - glm::vec3 registrationPoint = entityProperties.getRegistrationPoint().toGlm(); - glm::vec3 contextOverlayPosition = entityProperties.getPosition().toGlm(); + glm::vec3 entityDimensions = entityProperties.getDimensions(); + glm::vec3 entityPosition = entityProperties.getPosition(); + glm::vec3 registrationPoint = entityProperties.getRegistrationPoint(); + glm::vec3 contextOverlayPosition = entityProperties.getPosition(); glm::vec2 contextOverlayDimensions; // Update the position of the overlay if the registration point of the entity diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index faedd7839f..64e719df68 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -49,7 +49,7 @@ void Cube3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 cubeColor(toGlm(color), alpha); auto batch = args->_batch; diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index e6afc50faa..daf0831f27 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -58,7 +58,7 @@ void Grid3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 gridColor(toGlm(color), alpha); auto batch = args->_batch; diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index f6c1c052f7..5480a611b3 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -108,7 +108,7 @@ void Image3DOverlay::render(RenderArgs* args) { (fromImage.y() + fromImage.height() - 0.5f) / imageHeight); float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 imageColor(toGlm(color), alpha); batch->setModelTransform(getRenderTransform()); @@ -241,7 +241,7 @@ QVariant Image3DOverlay::getProperty(const QString& property) { return _fromImage; } if (property == "offsetPosition") { - return vec3ToVariant(getOffsetPosition()); + return vec3toVariant(getOffsetPosition()); } if (property == "emissive") { return _emissive; diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 39a707320f..4019c8d084 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -128,7 +128,7 @@ void Line3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 colorv4(toGlm(color), alpha); auto batch = args->_batch; if (batch) { @@ -312,10 +312,10 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { */ QVariant Line3DOverlay::getProperty(const QString& property) { if (property == "start" || property == "startPoint" || property == "p1") { - return vec3ToVariant(getStart()); + return vec3toVariant(getStart()); } if (property == "end" || property == "endPoint" || property == "p2") { - return vec3ToVariant(getEnd()); + return vec3toVariant(getEnd()); } if (property == "length") { return QVariant(getLength()); @@ -327,10 +327,10 @@ QVariant Line3DOverlay::getProperty(const QString& property) { return _endParentJointIndex; } if (property == "localStart") { - return vec3ToVariant(getLocalStart()); + return vec3toVariant(getLocalStart()); } if (property == "localEnd") { - return vec3ToVariant(getLocalEnd()); + return vec3toVariant(getLocalEnd()); } if (property == "glow") { return getGlow(); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 1afe0e1b84..6ebda067a2 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -423,10 +423,10 @@ QVariant ModelOverlay::getProperty(const QString& property) { return _url.toString(); } if (property == "dimensions" || property == "size") { - return vec3ToVariant(getDimensions()); + return vec3toVariant(getDimensions()); } if (property == "scale") { - return vec3ToVariant(getSNScale()); + return vec3toVariant(getSNScale()); } if (property == "textures") { if (_modelTextures.size() > 0) { @@ -470,7 +470,7 @@ QVariant ModelOverlay::getProperty(const QString& property) { [this](int jointIndex) -> QVariant { glm::vec3 translation; _model->getJointTranslation(jointIndex, translation); - return vec3ToVariant(translation); + return vec3toVariant(translation); }); } @@ -490,7 +490,7 @@ QVariant ModelOverlay::getProperty(const QString& property) { [this](int jointIndex) -> QVariant { glm::vec3 position; _model->getJointPositionInWorldFrame(jointIndex, position); - return vec3ToVariant(position); + return vec3toVariant(position); }); } diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 6f46fc7dde..b2f08b57bb 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -15,7 +15,7 @@ #include "Application.h" -const ScriptVec3UChar Overlay::DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; +const glm::u8vec3 Overlay::DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; const float Overlay::DEFAULT_ALPHA = 0.7f; Overlay::Overlay() : @@ -116,7 +116,7 @@ QVariant Overlay::getProperty(const QString& property) { return QVariant(getType()); } if (property == "color") { - return vec3ToVariant(_color.toGlm()); + return vec3toVariant(_color); } if (property == "alpha") { return _alpha; @@ -143,13 +143,13 @@ QVariant Overlay::getProperty(const QString& property) { return QVariant(); } -ScriptVec3UChar Overlay::getColor() { +glm::u8vec3 Overlay::getColor() { if (_colorPulse == 0.0f) { return _color; } float pulseLevel = updatePulse(); - ScriptVec3UChar result = _color; + glm::u8vec3 result = _color; if (_colorPulse < 0.0f) { result.x *= (1.0f - pulseLevel); result.y *= (1.0f - pulseLevel); diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 8b9118cecd..8e430f7e85 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -57,7 +57,7 @@ public: virtual bool isTransparent() { return getAlphaPulse() != 0.0f || getAlpha() != 1.0f; }; virtual bool getIsVisibleInSecondaryCamera() const { return false; } - ScriptVec3UChar getColor(); + glm::u8vec3 getColor(); float getAlpha(); float getPulseMax() const { return _pulseMax; } @@ -71,7 +71,7 @@ public: // setters virtual void setVisible(bool visible) { _visible = visible; } void setDrawHUDLayer(bool drawHUDLayer); - void setColor(const ScriptVec3UChar& color) { _color = color; } + void setColor(const glm::u8vec3& color) { _color = color; } void setAlpha(float alpha) { _alpha = alpha; } void setPulseMax(float value) { _pulseMax = value; } @@ -113,12 +113,12 @@ protected: float _alphaPulse; // ratio of the pulse to the alpha float _colorPulse; // ratio of the pulse to the color - ScriptVec3UChar _color; + glm::u8vec3 _color; bool _visible; // should the overlay be drawn at all unsigned int _stackOrder { 0 }; - static const ScriptVec3UChar DEFAULT_OVERLAY_COLOR; + static const glm::u8vec3 DEFAULT_OVERLAY_COLOR; static const float DEFAULT_ALPHA; std::unordered_map _materials; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index e05c44c264..5c6598dd88 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -629,9 +629,9 @@ QScriptValue RayToOverlayIntersectionResultToScriptValue(QScriptEngine* engine, obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -646,11 +646,11 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FromScriptValue(intersection, value.intersection); + vec3FloatFromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } diff --git a/interface/src/ui/overlays/PanelAttachable.cpp b/interface/src/ui/overlays/PanelAttachable.cpp index 7daa199181..b53474390c 100644 --- a/interface/src/ui/overlays/PanelAttachable.cpp +++ b/interface/src/ui/overlays/PanelAttachable.cpp @@ -21,13 +21,13 @@ bool PanelAttachable::getParentVisible() const { // No JSDoc because these properties are not actually used. QVariant PanelAttachable::getProperty(const QString& property) { if (property == "offsetPosition") { - return vec3ToVariant(getOffsetPosition()); + return vec3toVariant(getOffsetPosition()); } if (property == "offsetRotation") { return quatToVariant(getOffsetRotation()); } if (property == "offsetScale") { - return vec3ToVariant(getOffsetScale()); + return vec3toVariant(getOffsetScale()); } return QVariant(); } diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 1f2fa34524..8f62b53453 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -51,7 +51,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 rectangleColor(toGlm(color), alpha); auto batch = args->_batch; @@ -82,12 +82,12 @@ void Rectangle3DOverlay::render(RenderArgs* args) { geometryCache->renderDashedLine(*batch, point4, point1, rectangleColor, _rectGeometryIds[3]); } else { if (halfDimensions != _previousHalfDimensions) { - QVector border; - border << ScriptVec3Float(-halfDimensions.x, -halfDimensions.y, 0.0f); - border << ScriptVec3Float(halfDimensions.x, -halfDimensions.y, 0.0f); - border << ScriptVec3Float(halfDimensions.x, halfDimensions.y, 0.0f); - border << ScriptVec3Float(-halfDimensions.x, halfDimensions.y, 0.0f); - border << ScriptVec3Float(-halfDimensions.x, -halfDimensions.y, 0.0f); + QVector border; + border << glm::vec3(-halfDimensions.x, -halfDimensions.y, 0.0f); + border << glm::vec3(halfDimensions.x, -halfDimensions.y, 0.0f); + border << glm::vec3(halfDimensions.x, halfDimensions.y, 0.0f); + border << glm::vec3(-halfDimensions.x, halfDimensions.y, 0.0f); + border << glm::vec3(-halfDimensions.x, -halfDimensions.y, 0.0f); geometryCache->updateVertices(_geometryCacheID, border, rectangleColor); _previousHalfDimensions = halfDimensions; diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index 17bb584e70..fd33cd6c5d 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -30,7 +30,7 @@ void Shape3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 shapeColor(toGlm(color), alpha); auto batch = args->_batch; diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 1ea3b6c2c1..6cc9aad9e7 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -77,7 +77,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { } float alpha = getAlpha(); - ScriptVec3UChar color = getColor(); + glm::u8vec3 color = getColor(); glm::vec4 sphereColor(toGlm(color), alpha); auto batch = args->_batch; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 58fc3127f2..ec3f9eba34 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -64,13 +64,13 @@ void Text3DOverlay::setText(const QString& text) { _text = text; } -ScriptVec3UChar Text3DOverlay::getBackgroundColor() { +glm::u8vec3 Text3DOverlay::getBackgroundColor() { if (_colorPulse == 0.0f) { return _backgroundColor; } float pulseLevel = updatePulse(); - ScriptVec3UChar result = _backgroundColor; + glm::u8vec3 result = _backgroundColor; if (_colorPulse < 0.0f) { result.x *= (1.0f - pulseLevel); result.y *= (1.0f - pulseLevel); @@ -94,7 +94,7 @@ void Text3DOverlay::render(RenderArgs* args) { auto transform = getRenderTransform(); batch.setModelTransform(transform); - ScriptVec3UChar backgroundColor = getBackgroundColor(); + glm::u8vec3 backgroundColor = getBackgroundColor(); glm::vec4 quadColor(toGlm(backgroundColor), getBackgroundAlpha()); glm::vec2 dimensions = getDimensions(); @@ -258,7 +258,7 @@ QVariant Text3DOverlay::getProperty(const QString& property) { return _textAlpha; } if (property == "backgroundColor") { - return vec3ToVariant(_backgroundColor.toGlm()); + return vec3toVariant(_backgroundColor); } if (property == "backgroundAlpha") { return Billboard3DOverlay::getProperty("alpha"); diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 5c3c8e7381..16bbdcb4c4 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -39,7 +39,7 @@ public: float getTopMargin() const { return _topMargin; } float getRightMargin() const { return _rightMargin; } float getBottomMargin() const { return _bottomMargin; } - ScriptVec3UChar getBackgroundColor(); + glm::u8vec3 getBackgroundColor(); float getTextAlpha() { return _textAlpha; } float getBackgroundAlpha() { return getAlpha(); } bool isTransparent() override { return Overlay::isTransparent() || _textAlpha < 1.0f; } @@ -65,7 +65,7 @@ private: QString _text; mutable QMutex _mutex; // used to make get/setText threadsafe, mutable so can be used in const functions - ScriptVec3UChar _backgroundColor { 0, 0, 0 }; + glm::u8vec3 _backgroundColor { 0, 0, 0 }; float _textAlpha { 1.0f }; float _lineHeight { 1.0f }; float _leftMargin { 0.1f }; diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index bce99c3efa..c87650a77b 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -69,7 +69,7 @@ void Volume3DOverlay::setProperties(const QVariantMap& properties) { */ QVariant Volume3DOverlay::getProperty(const QString& property) { if (property == "dimensions" || property == "scale" || property == "size") { - return vec3ToVariant(getDimensions()); + return vec3toVariant(getDimensions()); } return Base3DOverlay::getProperty(property); diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index bc6b435996..3df26735f0 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -190,7 +190,7 @@ void Web3DOverlay::buildWebSurface() { _webSurface->load(_url); _cachedWebSurface = false; } - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(getWorldPosition())); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getWorldPosition())); onResizeWebSurface(); _webSurface->resume(); }); @@ -202,7 +202,7 @@ void Web3DOverlay::buildWebSurface() { void Web3DOverlay::update(float deltatime) { if (_webSurface) { // update globalPosition - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(getWorldPosition())); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getWorldPosition())); } Parent::update(deltatime); } diff --git a/libraries/animation/src/AnimVariant.cpp b/libraries/animation/src/AnimVariant.cpp index a9294aa00f..4c0d15f06b 100644 --- a/libraries/animation/src/AnimVariant.cpp +++ b/libraries/animation/src/AnimVariant.cpp @@ -40,7 +40,7 @@ QScriptValue AnimVariantMap::animVariantMapToScriptValue(QScriptEngine* engine, target.setProperty(name, value.getString()); break; case AnimVariant::Type::Vec3: - target.setProperty(name, vec3ToScriptValue(engine, value.getVec3())); + target.setProperty(name, vec3FloatToScriptValue(engine, value.getVec3())); break; case AnimVariant::Type::Quat: target.setProperty(name, quatToScriptValue(engine, value.getQuat())); diff --git a/libraries/audio/src/AudioInjectorOptions.cpp b/libraries/audio/src/AudioInjectorOptions.cpp index 295da1506e..296b7b7f8f 100644 --- a/libraries/audio/src/AudioInjectorOptions.cpp +++ b/libraries/audio/src/AudioInjectorOptions.cpp @@ -34,7 +34,7 @@ AudioInjectorOptions::AudioInjectorOptions() : QScriptValue injectorOptionsToScriptValue(QScriptEngine* engine, const AudioInjectorOptions& injectorOptions) { QScriptValue obj = engine->newObject(); - obj.setProperty("position", vec3ToScriptValue(engine, injectorOptions.position)); + obj.setProperty("position", vec3FloatToScriptValue(engine, injectorOptions.position)); obj.setProperty("volume", injectorOptions.volume); obj.setProperty("loop", injectorOptions.loop); obj.setProperty("orientation", quatToScriptValue(engine, injectorOptions.orientation)); @@ -73,7 +73,7 @@ void injectorOptionsFromScriptValue(const QScriptValue& object, AudioInjectorOpt it.next(); if (it.name() == "position") { - vec3FromScriptValue(object.property("position"), injectorOptions.position); + vec3FloatFromScriptValue(object.property("position"), injectorOptions.position); } else if (it.name() == "orientation") { quatFromScriptValue(object.property("orientation"), injectorOptions.orientation); } else if (it.name() == "volume") { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index e33864de0d..0b43fd5433 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1504,7 +1504,7 @@ void Avatar::renderJointConnectingCone(gpu::Batch& batch, glm::vec3 position1, g perpSin = glm::cross(perpCos, axis); float angleb = 0.0f; - QVector points; + QVector points; for (int i = 0; i < NUM_BODY_CONE_SIDES; i ++) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 7df6222127..7209e33702 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2723,10 +2723,10 @@ QScriptValue RayToAvatarIntersectionResultToScriptValue(QScriptEngine* engine, c obj.setProperty("avatarID", avatarIDValue); obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -2741,11 +2741,11 @@ void RayToAvatarIntersectionResultFromScriptValue(const QScriptValue& object, Ra QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FromScriptValue(intersection, value.intersection); + vec3FloatFromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } diff --git a/libraries/controllers/src/controllers/Pose.cpp b/libraries/controllers/src/controllers/Pose.cpp index 6df4b4af81..abe76ea38e 100644 --- a/libraries/controllers/src/controllers/Pose.cpp +++ b/libraries/controllers/src/controllers/Pose.cpp @@ -41,10 +41,10 @@ namespace controller { */ QScriptValue Pose::toScriptValue(QScriptEngine* engine, const Pose& pose) { QScriptValue obj = engine->newObject(); - obj.setProperty("translation", vec3ToScriptValue(engine, pose.translation)); + obj.setProperty("translation", vec3FloatToScriptValue(engine, pose.translation)); obj.setProperty("rotation", quatToScriptValue(engine, pose.rotation)); - obj.setProperty("velocity", vec3ToScriptValue(engine, pose.velocity)); - obj.setProperty("angularVelocity", vec3ToScriptValue(engine, pose.angularVelocity)); + obj.setProperty("velocity", vec3FloatToScriptValue(engine, pose.velocity)); + obj.setProperty("angularVelocity", vec3FloatToScriptValue(engine, pose.angularVelocity)); obj.setProperty("valid", pose.valid); return obj; } @@ -58,10 +58,10 @@ namespace controller { rotation.isValid() && velocity.isValid() && angularVelocity.isValid()) { - vec3FromScriptValue(translation, pose.translation); + vec3FloatFromScriptValue(translation, pose.translation); quatFromScriptValue(rotation, pose.rotation); - vec3FromScriptValue(velocity, pose.velocity); - vec3FromScriptValue(angularVelocity, pose.angularVelocity); + vec3FloatFromScriptValue(velocity, pose.velocity); + vec3FloatFromScriptValue(angularVelocity, pose.angularVelocity); pose.valid = true; } else { pose.valid = false; diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h index fa26259dec..799ba5b78c 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -34,7 +34,7 @@ protected: private: int _lineVerticesID { GeometryCache::UNKNOWN_ID }; - QVector _linePoints; + QVector _linePoints; }; } } // namespace diff --git a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp index 7f45fd2b79..d7a0cfd18d 100644 --- a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp @@ -31,8 +31,8 @@ void MaterialEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& withWriteLock([&] { _drawMaterial = entity->getMaterial(); _parentID = entity->getParentID(); - _materialMappingPos = entity->getMaterialMappingPos().toGlm(); - _materialMappingScale = entity->getMaterialMappingScale().toGlm(); + _materialMappingPos = entity->getMaterialMappingPos(); + _materialMappingScale = entity->getMaterialMappingScale(); _materialMappingRot = entity->getMaterialMappingRot(); _renderTransform = getModelTransform(); const float MATERIAL_ENTITY_SCALE = 0.5f; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 99aafa325a..34936c2c48 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -917,7 +917,7 @@ void RenderableModelEntityItem::setJointRotationsSet(const QVector& rotati _needsJointSimulation = true; } -void RenderableModelEntityItem::setJointTranslations(const QVector& translations) { +void RenderableModelEntityItem::setJointTranslations(const QVector& translations) { ModelEntityItem::setJointTranslations(translations); _needsJointSimulation = true; } @@ -1033,7 +1033,7 @@ void RenderableModelEntityItem::copyAnimationJointDataToModel() { changed = true; } if (jointData.translationDirty) { - model->setJointTranslation(index, true, jointData.joint.translation.toGlm(), 1.0f); + model->setJointTranslation(index, true, jointData.joint.translation, 1.0f); jointData.translationDirty = false; changed = true; } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 9dee354db6..45892fdd7f 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -105,7 +105,7 @@ public: virtual void setJointRotations(const QVector& rotations) override; virtual void setJointRotationsSet(const QVector& rotationsSet) override; - virtual void setJointTranslations(const QVector& translations) override; + virtual void setJointTranslations(const QVector& translations) override; virtual void setJointTranslationsSet(const QVector& translationsSet) override; virtual void locationChanged(bool tellPhysics = true) override; diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 618f595dee..0d9e948db8 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -142,7 +142,7 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo } if (strokeColorsChanged) { _lastStrokeColors = entity->getStrokeColors(); - _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getColor()) }); + _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getColor()) }); } if (pointsChanged || strokeWidthsChanged || normalsChanged || strokeColorsChanged) { _empty = std::min(_lastPoints.size(), std::min(_lastNormals.size(), _lastStrokeWidths.size())) < 2; @@ -161,10 +161,10 @@ void PolyLineEntityRenderer::updateGeometry(const std::vector& vertices) _verticesBuffer->setSubData(0, vertices); } -std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, - const QVector& normals, +std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, + const QVector& normals, const QVector& strokeWidths, - const QVector& strokeColors, + const QVector& strokeColors, const bool isUVModeStretch, const float textureAspectRatio) { // Calculate the minimum vector size out of normals, points, and stroke widths @@ -197,14 +197,14 @@ std::vector PolyLineEntityRenderer::updateVertic for (int i = 0; i <= finalIndex; i++) { const float& width = strokeWidths.at(i); - const auto& point = points.at(i).toGlm(); - const auto& normal = normals.at(i).toGlm(); - const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i).toGlm() : strokeColors.at(0).toGlm(); + const auto& point = points.at(i); + const auto& normal = normals.at(i); + const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i) : strokeColors.at(0); int vertexIndex = i * 2; if (!isUVModeStretch && i >= 1) { - distanceToLastPoint = glm::distance(points.at(i).toGlm(), points.at(i - 1).toGlm()); + distanceToLastPoint = glm::distance(points.at(i), points.at(i - 1)); accumulatedDistance += distanceToLastPoint; strokeWidth = 2 * strokeWidths[i]; @@ -230,7 +230,7 @@ std::vector PolyLineEntityRenderer::updateVertic // For last point we can assume binormals are the same since it represents the last two vertices of quad if (i < finalIndex) { - const auto tangent = points.at(i + 1).toGlm() - point; + const auto tangent = points.at(i + 1) - point; binormal = glm::normalize(glm::cross(tangent, normal)) * width; // Check to make sure binormal is not a NAN. If it is, don't add to vertices vector @@ -239,8 +239,8 @@ std::vector PolyLineEntityRenderer::updateVertic } } - const auto v1 = points.at(i).toGlm() + binormal; - const auto v2 = points.at(i).toGlm() - binormal; + const auto v1 = points.at(i) + binormal; + const auto v2 = points.at(i) - binormal; vertices.emplace_back(v1, normal, vec2(uCoord, 0.0f), color); vertices.emplace_back(v2, normal, vec2(uCoord, 1.0f), color); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 202daddbe5..8130171da8 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -52,17 +52,17 @@ protected: }; void updateGeometry(const std::vector& vertices); - static std::vector updateVertices(const QVector& points, - const QVector& normals, + static std::vector updateVertices(const QVector& points, + const QVector& normals, const QVector& strokeWidths, - const QVector& strokeColors, + const QVector& strokeColors, const bool isUVModeStretch, const float textureAspectRatio); Transform _polylineTransform; - QVector _lastPoints; - QVector _lastNormals; - QVector _lastStrokeColors; + QVector _lastPoints; + QVector _lastNormals; + QVector _lastStrokeColors; QVector _lastStrokeWidths; gpu::BufferPointer _verticesBuffer; diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 0158cc1590..c11ccb70a0 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -211,7 +211,7 @@ void RenderablePolyVoxEntityItem::setVoxelSurfaceStyle(PolyVoxSurfaceStyle voxel glm::vec3 RenderablePolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::vec3 result; withReadLock([&] { - glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize.toGlm(); // meters / voxel-units + glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize; // meters / voxel-units if (isEdged(_voxelSurfaceStyle)) { result = scale / -2.0f; } @@ -223,7 +223,7 @@ glm::vec3 RenderablePolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::mat4 RenderablePolyVoxEntityItem::voxelToLocalMatrix() const { glm::vec3 voxelVolumeSize; withReadLock([&] { - voxelVolumeSize = _voxelVolumeSize.toGlm(); + voxelVolumeSize = _voxelVolumeSize; }); glm::vec3 dimensions = getScaledDimensions(); @@ -309,7 +309,7 @@ bool RenderablePolyVoxEntityItem::setAll(uint8_t toValue) { } withWriteLock([&] { - loop3(ivec3(0), ivec3(_voxelVolumeSize.toGlm()), [&](const ivec3& v) { + loop3(ivec3(0), ivec3(_voxelVolumeSize), [&](const ivec3& v) { result |= setVoxelInternal(v, toValue); }); }); @@ -328,7 +328,7 @@ bool RenderablePolyVoxEntityItem::setCuboid(const glm::vec3& lowPosition, const ivec3 iLowPosition = ivec3{ glm::round(lowPosition) }; ivec3 iCuboidSize = ivec3{ glm::round(cuboidSize) }; - ivec3 iVoxelVolumeSize = ivec3{ glm::round(_voxelVolumeSize.toGlm()) }; + ivec3 iVoxelVolumeSize = ivec3{ glm::round(_voxelVolumeSize) }; ivec3 low = glm::max(glm::min(iLowPosition, iVoxelVolumeSize - 1), ivec3(0)); ivec3 high = glm::max(glm::min(low + iCuboidSize, iVoxelVolumeSize), low); @@ -364,7 +364,7 @@ bool RenderablePolyVoxEntityItem::setSphereInVolume(const vec3& center, float ra float radiusSquared = radius * radius; // This three-level for loop iterates over every voxel in the volume withWriteLock([&] { - loop3(ivec3(0), ivec3(_voxelVolumeSize.toGlm()), [&](const ivec3& v) { + loop3(ivec3(0), ivec3(_voxelVolumeSize), [&](const ivec3& v) { // Store our current position as a vector... glm::vec3 pos = vec3(v) + 0.5f; // consider voxels cenetered on their coordinates // And compute how far the current position is from the center of the volume @@ -392,7 +392,7 @@ bool RenderablePolyVoxEntityItem::setSphere(const vec3& centerWorldCoords, float glm::mat4 wtvMatrix = glm::inverse(vtwMatrix); glm::vec3 dimensions = getScaledDimensions(); - glm::vec3 voxelSize = dimensions / _voxelVolumeSize.toGlm(); + glm::vec3 voxelSize = dimensions / _voxelVolumeSize; float smallestDimensionSize = voxelSize.x; smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.y); smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.z); @@ -406,8 +406,8 @@ bool RenderablePolyVoxEntityItem::setSphere(const vec3& centerWorldCoords, float glm::vec3 low = glm::floor(centerInVoxelCoords - maxRadiusInVoxelCoords); glm::vec3 high = glm::ceil(centerInVoxelCoords + maxRadiusInVoxelCoords); - glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); - glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); + glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize); + glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize); glm::vec3 radials(radiusWorldCoords / voxelSize.x, radiusWorldCoords / voxelSize.y, @@ -453,7 +453,7 @@ bool RenderablePolyVoxEntityItem::setCapsule(const vec3& startWorldCoords, const glm::mat4 wtvMatrix = glm::inverse(vtwMatrix); glm::vec3 dimensions = getScaledDimensions(); - glm::vec3 voxelSize = dimensions / _voxelVolumeSize.toGlm(); + glm::vec3 voxelSize = dimensions / _voxelVolumeSize; float smallestDimensionSize = voxelSize.x; smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.y); smallestDimensionSize = glm::min(smallestDimensionSize, voxelSize.z); @@ -468,8 +468,8 @@ bool RenderablePolyVoxEntityItem::setCapsule(const vec3& startWorldCoords, const glm::vec3 high = glm::max(glm::ceil(startInVoxelCoords + maxRadiusInVoxelCoords), glm::ceil(endInVoxelCoords + maxRadiusInVoxelCoords)); - glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); - glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize.toGlm()); + glm::ivec3 lowI = glm::clamp(low, glm::vec3(0.0f), _voxelVolumeSize); + glm::ivec3 highI = glm::clamp(high, glm::vec3(0.0f), _voxelVolumeSize); // This three-level for loop iterates over every voxel in the volume that might be in the capsule withWriteLock([&] { @@ -778,7 +778,7 @@ bool RenderablePolyVoxEntityItem::updateDependents() { return !volDataDirty; } -void RenderablePolyVoxEntityItem::setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) { +void RenderablePolyVoxEntityItem::setVoxelVolumeSize(const glm::vec3& voxelVolumeSize) { // This controls how many individual voxels are in the entity. This is unrelated to // the dimentions of the entity -- it defines the sizes of the arrays that hold voxel values. // In addition to setting the number of voxels, this is used in a few places for its @@ -1245,7 +1245,7 @@ void RenderablePolyVoxEntityItem::computeShapeInfoWorker() { withReadLock([&] { voxelSurfaceStyle = _voxelSurfaceStyle; - voxelVolumeSize = _voxelVolumeSize.toGlm(); + voxelVolumeSize = _voxelVolumeSize; mesh = _mesh; }); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index a252e6b038..7afb9b41b4 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -62,7 +62,7 @@ public: QVariantMap& extraInfo, bool precisionPicking) const override; virtual void setVoxelData(const QByteArray& voxelData) override; - virtual void setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) override; + virtual void setVoxelVolumeSize(const glm::vec3& voxelVolumeSize) override; virtual void setVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle) override; glm::vec3 getSurfacePositionAdjustment() const; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 3ba38da6f6..bc9ac84c91 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -199,7 +199,7 @@ void WebEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene if (_contextPosition != entity->getWorldPosition()) { // update globalPosition _contextPosition = entity->getWorldPosition(); - _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3ToVariant(_contextPosition)); + _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(_contextPosition)); } _lastDPI = entity->getDPI(); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 137f256de2..9ebf2cbd28 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -333,7 +333,7 @@ void ZoneEntityRenderer::updateKeySunFromEntity(const TypedEntityPointer& entity // Set the keylight sunLight->setColor(ColorUtils::toVec3(_keyLightProperties.getColor())); sunLight->setIntensity(_keyLightProperties.getIntensity()); - sunLight->setDirection(entity->getTransform().getRotation() * _keyLightProperties.getDirection().toGlm()); + sunLight->setDirection(entity->getTransform().getRotation() * _keyLightProperties.getDirection()); sunLight->setCastShadows(_keyLightProperties.getCastShadows()); } @@ -368,9 +368,9 @@ void ZoneEntityRenderer::updateHazeFromEntity(const TypedEntityPointer& entity) haze->setAltitudeBased(_hazeProperties.getHazeAltitudeEffect()); haze->setHazeRangeFactor(graphics::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeRange())); - ScriptVec3UChar hazeColor = _hazeProperties.getHazeColor(); + glm::u8vec3 hazeColor = _hazeProperties.getHazeColor(); haze->setHazeColor(toGlm(hazeColor)); - ScriptVec3UChar hazeGlareColor = _hazeProperties.getHazeGlareColor(); + glm::u8vec3 hazeGlareColor = _hazeProperties.getHazeGlareColor(); haze->setHazeGlareColor(toGlm(hazeGlareColor)); haze->setHazeEnableGlare(_hazeProperties.getHazeEnableGlare()); haze->setHazeGlareBlend(graphics::Haze::convertGlareAngleToPower(_hazeProperties.getHazeGlareAngle())); diff --git a/libraries/entities/src/EntityEditFilters.cpp b/libraries/entities/src/EntityEditFilters.cpp index 6f7e012bc4..3396e91452 100644 --- a/libraries/entities/src/EntityEditFilters.cpp +++ b/libraries/entities/src/EntityEditFilters.cpp @@ -104,10 +104,10 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper AABox aaBox = zoneEntity->getAABox(success); if (success) { QScriptValue boundingBox = filterData.engine->newObject(); - QScriptValue bottomRightNear = vec3ToScriptValue(filterData.engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3ToScriptValue(filterData.engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3ToScriptValue(filterData.engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3ToScriptValue(filterData.engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3FloatToScriptValue(filterData.engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3FloatToScriptValue(filterData.engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3FloatToScriptValue(filterData.engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3FloatToScriptValue(filterData.engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 36a6a9dfa0..d0bc49fc48 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -238,15 +238,15 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_CUSTOM_PROPERTIES_INCLUDED, APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, _simulationOwner.toByteArray()); - APPEND_ENTITY_PROPERTY(PROP_POSITION, getScriptLocalPosition()); + APPEND_ENTITY_PROPERTY(PROP_POSITION, getLocalPosition()); APPEND_ENTITY_PROPERTY(PROP_ROTATION, getLocalOrientation()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getScriptLocalVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getScriptLocalAngularVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getScriptAcceleration()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getLocalVelocity()); + APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getLocalAngularVelocity()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getScriptUnscaledDimensions()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions()); APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getScriptGravity()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getGravity()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, getDamping()); APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, getRestitution()); APPEND_ENTITY_PROPERTY(PROP_FRICTION, getFriction()); @@ -254,7 +254,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp()); APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts()); - APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getScriptRegistrationPoint()); + APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping()); APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible()); APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow()); @@ -766,11 +766,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // Note: duplicate packets are expected and not wrong. They may be sent for any number of // reasons and the contract is that the client handles them in an idempotent manner. - auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ + auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) { setPosition(value); _lastUpdatedPositionTimestamp = lastEdited; - _lastUpdatedPositionValue = value.toGlm(); + _lastUpdatedPositionValue = value; } }; @@ -782,40 +782,40 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } }; - auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ + auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) { setVelocity(value); _lastUpdatedVelocityTimestamp = lastEdited; - _lastUpdatedVelocityValue = value.toGlm(); + _lastUpdatedVelocityValue = value; } }; - auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ + auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedAngularVelocityTimestamp, value != _lastUpdatedAngularVelocityValue)) { setAngularVelocity(value); _lastUpdatedAngularVelocityTimestamp = lastEdited; - _lastUpdatedAngularVelocityValue = value.toGlm(); + _lastUpdatedAngularVelocityValue = value; } }; - auto customSetAcceleration = [this, shouldUpdate, lastEdited](ScriptVec3Float value){ + auto customSetAcceleration = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedAccelerationTimestamp, value != _lastUpdatedAccelerationValue)) { setAcceleration(value); _lastUpdatedAccelerationTimestamp = lastEdited; - _lastUpdatedAccelerationValue = value.toGlm(); + _lastUpdatedAccelerationValue = value; } }; - READ_ENTITY_PROPERTY(PROP_POSITION, ScriptVec3Float, customUpdatePositionFromNetwork); + READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork); READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork); - READ_ENTITY_PROPERTY(PROP_VELOCITY, ScriptVec3Float, customUpdateVelocityFromNetwork); - READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, ScriptVec3Float, customUpdateAngularVelocityFromNetwork); - READ_ENTITY_PROPERTY(PROP_ACCELERATION, ScriptVec3Float, customSetAcceleration); + READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork); + READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork); + READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, customSetAcceleration); } - READ_ENTITY_PROPERTY(PROP_DIMENSIONS, ScriptVec3Float, setUnscaledDimensions); + READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions); READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY(PROP_GRAVITY, ScriptVec3Float, setGravity); + READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity); READ_ENTITY_PROPERTY(PROP_DAMPING, float, setDamping); READ_ENTITY_PROPERTY(PROP_RESTITUTION, float, setRestitution); @@ -836,7 +836,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts); } - READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); + READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 71855409cb..93b3ea7a94 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -192,9 +192,7 @@ public: virtual glm::vec3 getRaycastDimensions() const { return getScaledDimensions(); } glm::vec3 getUnscaledDimensions() const; - ScriptVec3Float getScriptUnscaledDimensions() const { return getUnscaledDimensions(); } virtual void setUnscaledDimensions(const glm::vec3& value); - void setUnscaledDimensions(const ScriptVec3Float& value) { setUnscaledDimensions(value.toGlm()); } float getLocalRenderAlpha() const; void setLocalRenderAlpha(float localRenderAlpha); @@ -209,15 +207,11 @@ public: bool hasLocalVelocity() const { return getLocalVelocity() != ENTITY_ITEM_ZERO_VEC3; } glm::vec3 getGravity() const; /// get gravity in meters - ScriptVec3Float getScriptGravity() const { return getGravity(); } void setGravity(const glm::vec3& value); /// gravity in meters - void setGravity(const ScriptVec3Float& value) { setGravity(value.toGlm()); } bool hasGravity() const { return getGravity() != ENTITY_ITEM_ZERO_VEC3; } glm::vec3 getAcceleration() const; /// get acceleration in meters/second/second - ScriptVec3Float getScriptAcceleration() const { return getAcceleration(); } void setAcceleration(const glm::vec3& value); /// acceleration in meters/second/second - void setAcceleration(const ScriptVec3Float& value) { setAcceleration(value.toGlm()); } bool hasAcceleration() const { return getAcceleration() != ENTITY_ITEM_ZERO_VEC3; } float getDamping() const; @@ -269,16 +263,13 @@ public: void setCollisionSoundURL(const QString& value); glm::vec3 getRegistrationPoint() const; /// registration point as ratio of entity - ScriptVec3Float getScriptRegistrationPoint() const { return getRegistrationPoint(); } /// registration point as ratio of entity virtual void setRegistrationPoint(const glm::vec3& value); // FIXME: this is suspicious! - void setRegistrationPoint(const ScriptVec3Float& value) { setRegistrationPoint(value.toGlm()); } bool hasAngularVelocity() const { return getWorldAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; } bool hasLocalAngularVelocity() const { return getLocalAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; } virtual void setAngularVelocity(const glm::vec3& angularVelocity); - void setAngularVelocity(const ScriptVec3Float& angularVelocity) { setAngularVelocity(angularVelocity.toGlm()); } float getAngularDamping() const; void setAngularDamping(float value); @@ -391,13 +382,11 @@ public: virtual ShapeType getShapeType() const { return SHAPE_TYPE_NONE; } void setPosition(const glm::vec3& value); - void setPosition(const ScriptVec3Float& value) { setPosition(value.toGlm()); } virtual void setParentID(const QUuid& parentID) override; virtual void setShapeType(ShapeType type) { /* do nothing */ } void setRotation(glm::quat orientation); void setVelocity(const glm::vec3& velocity); - void setVelocity(const ScriptVec3Float& velocity) { setVelocity(velocity.toGlm()); } uint32_t getDirtyFlags() const; void markDirtyFlags(uint32_t mask); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 49a344cc64..f7d6aed47b 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -60,8 +60,8 @@ EntityItemProperties::EntityItemProperties(EntityPropertyFlags desiredProperties } -void EntityItemProperties::calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max) { - glm::vec3 halfDimension = (max - min) / 2.0f; +void EntityItemProperties::calculateNaturalPosition(const vec3& min, const vec3& max) { + vec3 halfDimension = (max - min) / 2.0f; _naturalPosition = max - halfDimension; } @@ -1447,10 +1447,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (!skipDefaults && !strictSemantics) { AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); - QScriptValue bottomRightNear = vec3ToScriptValue(engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3ToScriptValue(engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3ToScriptValue(engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3ToScriptValue(engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3FloatToScriptValue(engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3FloatToScriptValue(engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3FloatToScriptValue(engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3FloatToScriptValue(engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); @@ -1527,13 +1527,13 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool } COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy); - COPY_PROPERTY_FROM_QSCRIPTVALUE(position, ScriptVec3Float, setPosition); - COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, ScriptVec3Float, setDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(position, vec3, setPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, vec3, setDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, quat, setRotation); COPY_PROPERTY_FROM_QSCRIPTVALUE(density, float, setDensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, ScriptVec3Float, setVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, ScriptVec3Float, setGravity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, ScriptVec3Float, setAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, vec3, setVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, vec3, setGravity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, vec3, setAcceleration); COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(restitution, float, setRestitution); COPY_PROPERTY_FROM_QSCRIPTVALUE(friction, float, setFriction); @@ -1541,15 +1541,15 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp); COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts); - COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, ScriptVec3Float, setRegistrationPoint); - COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, ScriptVec3Float, setAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint); + COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); - COPY_PROPERTY_FROM_QSCRIPTVALUE(color, ScriptVec3UChar, setColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, ScriptVec3UChar, setColorSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, ScriptVec3Float, setColorStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, ScriptVec3Float, setColorFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3, setColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3, setColorSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3, setColorStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3, setColorFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart); @@ -1574,8 +1574,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData); COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); - COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, ScriptVec3UChar, setTextColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, ScriptVec3UChar, setBackgroundColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3, setTextColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3, setBackgroundColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, quint32, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); @@ -1584,14 +1584,14 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(emitSpeed, float, setEmitSpeed); COPY_PROPERTY_FROM_QSCRIPTVALUE(speedSpread, float, setSpeedSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitOrientation, quat, setEmitOrientation); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, ScriptVec3Float, setEmitDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, vec3, setEmitDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRadiusStart, float, setEmitRadiusStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarStart, float, setPolarStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarFinish, float, setPolarFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthStart, float, setAzimuthStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthFinish, float, setAzimuthFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, ScriptVec3Float, setEmitAcceleration); - COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, ScriptVec3Float, setAccelerationSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); @@ -1601,8 +1601,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(materialMappingMode, MaterialMappingMode); COPY_PROPERTY_FROM_QSCRIPTVALUE(priority, quint16, setPriority); COPY_PROPERTY_FROM_QSCRIPTVALUE(parentMaterialName, QString, setParentMaterialName); - COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, ScriptVec2Float, setMaterialMappingPos); - COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, ScriptVec2Float, setMaterialMappingScale); + COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingPos, vec2, setMaterialMappingPos); + COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingScale, vec2, setMaterialMappingScale); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialData, QString, setMaterialData); COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera); @@ -1634,7 +1634,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode); COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl); - COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, ScriptVec3Float, setVoxelVolumeSize); + COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize); COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData); COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineWidth, float, setLineWidth); @@ -1681,11 +1681,11 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex); COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, ScriptVec3Float, setLocalPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition); COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, ScriptVec3Float, setLocalVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, ScriptVec3Float, setLocalAngularVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, ScriptVec3Float, setLocalDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet); COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations); @@ -1917,13 +1917,13 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue std::call_once(initMap, [](){ ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); - ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, glm::quat); + ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, vec3); + ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, vec3); + ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, quat); ADD_PROPERTY_TO_MAP(PROP_DENSITY, Density, density, float); - ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, vec3); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, vec3); ADD_PROPERTY_TO_MAP(PROP_DAMPING, Damping, damping, float); ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, Restitution, restitution, float); ADD_PROPERTY_TO_MAP(PROP_FRICTION, Friction, friction, float); @@ -1932,10 +1932,10 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, ScriptVec3UChar); - ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, ScriptVec3UChar); - ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3); + ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3); + ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3); + ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3); ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); @@ -1943,8 +1943,8 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool); ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString); ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); - ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, vec3); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, vec3); ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, Collisionless, collisionless, bool); ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, unused, ignoreForCollisions, unused); // legacy support @@ -1963,24 +1963,24 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); - ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, ScriptVec3UChar); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3); ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float); ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, EmitRate, emitRate, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat); - ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, vec3); + ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, vec3); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, quat); + ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, vec3); ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); ADD_PROPERTY_TO_MAP(PROP_POLAR_START, EmitPolarStart, polarStart, float); ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, EmitPolarFinish, polarFinish, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, EmitAzimuthStart, azimuthStart, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, EmitAzimuthFinish, azimuthFinish, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, vec3); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, vec3); ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); @@ -1990,8 +1990,8 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16); ADD_PROPERTY_TO_MAP(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2UChar); - ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2UChar); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, vec2); + ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, vec2); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString); @@ -2016,24 +2016,24 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, ScriptVec3UChar); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, u8vec3); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, vec3); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, vec3); ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, LineWidth, lineWidth, float); - ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); + ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString); ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString); ADD_PROPERTY_TO_MAP(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); - ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector); - ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); + ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); @@ -2049,16 +2049,16 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid); ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, glm::quat); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, ScriptVec3Float); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, ScriptVec3Float); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3); ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool); ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); @@ -2163,7 +2163,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy // Always include the root octcode. This is only because the OctreeEditPacketSender will check these octcodes // to determine which server to send the changes to in the case of multiple jurisdictions. The root will be sent // to all servers. - glm::vec3 rootPosition(0); + vec3 rootPosition(0); float rootScale = 0.5f; unsigned char* octcode = pointToOctalCode(rootPosition.x, rootPosition.y, rootPosition.z, rootScale); @@ -2501,7 +2501,7 @@ QByteArray EntityItemProperties::getPackedNormals() const { return packNormals(getNormals()); } -QByteArray EntityItemProperties::packNormals(const QVector& normals) const { +QByteArray EntityItemProperties::packNormals(const QVector& normals) const { int normalsSize = normals.size(); QByteArray packedNormals = QByteArray(normalsSize * 6 + 1, '0'); // add size of the array @@ -2509,7 +2509,7 @@ QByteArray EntityItemProperties::packNormals(const QVector& nor int index = 1; for (int i = 0; i < normalsSize; i++) { - int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, normals[i].toGlm(), 15); + int numBytes = packFloatVec3ToSignedTwoByteFixed((unsigned char*)packedNormals.data() + index, normals[i], 15); index += numBytes; } return packedNormals; @@ -2518,7 +2518,7 @@ QByteArray EntityItemProperties::packNormals(const QVector& nor QByteArray EntityItemProperties::getPackedStrokeColors() const { return packStrokeColors(getStrokeColors()); } -QByteArray EntityItemProperties::packStrokeColors(const QVector& strokeColors) const { +QByteArray EntityItemProperties::packStrokeColors(const QVector& strokeColors) const { int strokeColorsSize = strokeColors.size(); QByteArray packedStrokeColors = QByteArray(strokeColorsSize * 3 + 1, '0'); @@ -2619,13 +2619,13 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int processedBytes += propertyFlags.getEncodedLength(); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, ScriptVec3Float, setPosition); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, ScriptVec3Float, setDimensions); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, glm::quat, setRotation); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, vec3, setPosition); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, vec3, setDimensions); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, quat, setRotation); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, ScriptVec3Float, setVelocity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, ScriptVec3Float, setGravity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, ScriptVec3Float, setAcceleration); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, vec3, setVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, vec3, setGravity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, vec3, setAcceleration); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction); @@ -2633,8 +2633,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, ScriptVec3Float, setRegistrationPoint); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, ScriptVec3Float, setAngularVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, vec3, setRegistrationPoint); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, vec3, setAngularVelocity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); @@ -2657,8 +2657,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Text) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, ScriptVec3UChar, setTextColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, ScriptVec3UChar, setBackgroundColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3, setTextColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3, setBackgroundColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FACE_CAMERA, bool, setFaceCamera); } @@ -2667,20 +2667,20 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints); } if (properties.getType() == EntityTypes::Light) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); @@ -2695,23 +2695,23 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_SPEED, float, setEmitSpeed); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SPEED_SPREAD, float, setSpeedSpread); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ORIENTATION, glm::quat, setEmitOrientation); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_DIMENSIONS, ScriptVec3Float, setEmitDimensions); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ORIENTATION, quat, setEmitOrientation); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_DIMENSIONS, vec3, setEmitDimensions); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RADIUS_START, float, setEmitRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POLAR_START, float, setPolarStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POLAR_FINISH, float, setPolarFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_AZIMUTH_START, float, setAzimuthStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_AZIMUTH_FINISH, float, setAzimuthFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ACCELERATION, ScriptVec3Float, setEmitAcceleration); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION_SPREAD, ScriptVec3Float, setAccelerationSpread); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ACCELERATION, vec3, setEmitAcceleration); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION_SPREAD, vec3, setAccelerationSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_RADIUS, float, setParticleRadius); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_SPREAD, float, setRadiusSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, ScriptVec3UChar, setColorSpread); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, ScriptVec3Float, setColorStart); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, u8vec3, setColorSpread); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3, setColorStart); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3, setColorFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_START, float, setAlphaStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_FINISH, float, setAlphaFinish); @@ -2744,7 +2744,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::PolyVox) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_VOLUME_SIZE, ScriptVec3Float, setVoxelVolumeSize); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_VOLUME_SIZE, vec3, setVoxelVolumeSize); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_X_TEXTURE_URL, QString, setXTextureURL); @@ -2759,16 +2759,16 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Line) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } if (properties.getType() == EntityTypes::PolyLine) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); @@ -2782,7 +2782,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); } // Materials @@ -2791,8 +2791,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, setMaterialMappingMode); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_PRIORITY, quint16, setPriority); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_MATERIAL_NAME, QString, setParentMaterialName); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, ScriptVec2Float, setMaterialMappingPos); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, ScriptVec2Float, setMaterialMappingScale); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_POS, vec2, setMaterialMappingPos); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_SCALE, vec2, setMaterialMappingScale); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MATERIAL_DATA, QString, setMaterialData); } @@ -2828,14 +2828,14 @@ void EntityItemProperties::setPackedNormals(const QByteArray& value) { setNormals(unpackNormals(value)); } -QVector EntityItemProperties::unpackNormals(const QByteArray& normals) { +QVector EntityItemProperties::unpackNormals(const QByteArray& normals) { // the size of the vector is packed first - QVector unpackedNormals = QVector((int)normals[0]); + QVector unpackedNormals = QVector((int)normals[0]); if ((int)normals[0] == normals.size() / 6) { int j = 0; for (int i = 1; i < normals.size();) { - glm::vec3 aux = glm::vec3(); + vec3 aux = vec3(); i += unpackFloatVec3FromSignedTwoByteFixed((unsigned char*)normals.data() + i, aux, 15); unpackedNormals[j] = aux; j++; @@ -2851,9 +2851,9 @@ void EntityItemProperties::setPackedStrokeColors(const QByteArray& value) { setStrokeColors(unpackStrokeColors(value)); } -QVector EntityItemProperties::unpackStrokeColors(const QByteArray& strokeColors) { +QVector EntityItemProperties::unpackStrokeColors(const QByteArray& strokeColors) { // the size of the vector is packed first - QVector unpackedStrokeColors = QVector((int)strokeColors[0]); + QVector unpackedStrokeColors = QVector((int)strokeColors[0]); if ((int)strokeColors[0] == strokeColors.size() / 3) { int j = 0; @@ -2862,7 +2862,7 @@ QVector EntityItemProperties::unpackStrokeColors(const QByteArr float r = (uint8_t)strokeColors[i++] / 255.0f; float g = (uint8_t)strokeColors[i++] / 255.0f; float b = (uint8_t)strokeColors[i++] / 255.0f; - unpackedStrokeColors[j++] = ScriptVec3Float(r, g, b); + unpackedStrokeColors[j++] = vec3(r, g, b); } } else { qCDebug(entities) << "WARNING - Expected received size for stroke colors does not match. Expected: " @@ -3123,15 +3123,15 @@ void EntityItemProperties::markAllChanged() { AABox EntityItemProperties::getAABox() const { // _position represents the position of the registration point. - glm::vec3 registrationRemainder = glm::vec3(1.0f) - _registrationPoint.toGlm(); + vec3 registrationRemainder = vec3(1.0f) - _registrationPoint; - glm::vec3 unrotatedMinRelativeToEntity = - (_dimensions.toGlm() * _registrationPoint.toGlm()); - glm::vec3 unrotatedMaxRelativeToEntity = _dimensions.toGlm() * registrationRemainder; + vec3 unrotatedMinRelativeToEntity = - (_dimensions * _registrationPoint); + vec3 unrotatedMaxRelativeToEntity = _dimensions * registrationRemainder; Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(_rotation); // shift the extents to be relative to the position/registration point - rotatedExtentsRelativeToRegistrationPoint.shiftBy(_position.toGlm()); + rotatedExtentsRelativeToRegistrationPoint.shiftBy(_position); return AABox(rotatedExtentsRelativeToRegistrationPoint); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index c0de67715b..e41a195a6f 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -119,13 +119,13 @@ public: DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE); DEFINE_PROPERTY(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool, ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW); - DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, ScriptVec3Float, ENTITY_ITEM_DEFAULT_DIMENSIONS); + DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3, ENTITY_ITEM_DEFAULT_DIMENSIONS); DEFINE_PROPERTY_REF(PROP_ROTATION, Rotation, rotation, glm::quat, ENTITY_ITEM_DEFAULT_ROTATION); DEFINE_PROPERTY(PROP_DENSITY, Density, density, float, ENTITY_ITEM_DEFAULT_DENSITY); - DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_VELOCITY); - DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_GRAVITY); - DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, ScriptVec3Float, ENTITY_ITEM_DEFAULT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, glm::vec3, ENTITY_ITEM_DEFAULT_VELOCITY); + DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, glm::vec3, ENTITY_ITEM_DEFAULT_GRAVITY); + DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3, ENTITY_ITEM_DEFAULT_ACCELERATION); DEFINE_PROPERTY(PROP_DAMPING, Damping, damping, float, ENTITY_ITEM_DEFAULT_DAMPING); DEFINE_PROPERTY(PROP_RESTITUTION, Restitution, restitution, float, ENTITY_ITEM_DEFAULT_RESTITUTION); DEFINE_PROPERTY(PROP_FRICTION, Friction, friction, float, ENTITY_ITEM_DEFAULT_FRICTION); @@ -134,18 +134,18 @@ public: DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString, ENTITY_ITEM_DEFAULT_SCRIPT); DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP); DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL); - DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, ScriptVec3UChar, particle::DEFAULT_COLOR); - DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, ScriptVec3UChar, particle::DEFAULT_COLOR_SPREAD); - DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); - DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, ScriptVec3Float, particle::DEFAULT_COLOR_UNINITIALIZED); + DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, glm::u8vec3, particle::DEFAULT_COLOR); + DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, glm::u8vec3, particle::DEFAULT_COLOR_SPREAD); + DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); + DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, particle::DEFAULT_ALPHA_SPREAD); DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, particle::DEFAULT_ALPHA_START); DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, particle::DEFAULT_ALPHA_FINISH); DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString, ""); DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, ""); - DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, ScriptVec3Float, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT); - DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, ScriptVec3Float, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY); + DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT); + DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY); DEFINE_PROPERTY(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING); DEFINE_PROPERTY(PROP_COLLISIONLESS, Collisionless, collisionless, bool, ENTITY_ITEM_DEFAULT_COLLISIONLESS); DEFINE_PROPERTY(PROP_COLLISION_MASK, CollisionMask, collisionMask, uint16_t, ENTITY_COLLISION_MASK_DEFAULT); @@ -161,8 +161,8 @@ public: DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner()); DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString, TextEntityItem::DEFAULT_TEXT); DEFINE_PROPERTY(PROP_LINE_HEIGHT, LineHeight, lineHeight, float, TextEntityItem::DEFAULT_LINE_HEIGHT); - DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, ScriptVec3UChar, TextEntityItem::DEFAULT_TEXT_COLOR); - DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, ScriptVec3UChar, TextEntityItem::DEFAULT_BACKGROUND_COLOR); + DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, glm::u8vec3, TextEntityItem::DEFAULT_TEXT_COLOR); + DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, glm::u8vec3, TextEntityItem::DEFAULT_BACKGROUND_COLOR); DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES); DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN); @@ -171,14 +171,14 @@ public: DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float, particle::DEFAULT_EMIT_SPEED); DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float, particle::DEFAULT_SPEED_SPREAD); DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, particle::DEFAULT_EMIT_ORIENTATION); - DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, ScriptVec3Float, particle::DEFAULT_EMIT_DIMENSIONS); + DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, particle::DEFAULT_EMIT_DIMENSIONS); DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, particle::DEFAULT_EMIT_RADIUS_START); DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, particle::DEFAULT_POLAR_START); DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, particle::DEFAULT_POLAR_FINISH); DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, particle::DEFAULT_AZIMUTH_START); DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, particle::DEFAULT_AZIMUTH_FINISH); - DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, ScriptVec3Float, particle::DEFAULT_EMIT_ACCELERATION); - DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, ScriptVec3Float, particle::DEFAULT_ACCELERATION_SPREAD); + DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD); DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, particle::DEFAULT_PARTICLE_RADIUS); DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD); DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START); @@ -186,7 +186,7 @@ public: DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL); DEFINE_PROPERTY_GROUP(KeyLight, keyLight, KeyLightPropertyGroup); DEFINE_PROPERTY_GROUP(AmbientLight, ambientLight, AmbientLightPropertyGroup); - DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, ScriptVec3Float, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); + DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray, PolyVoxEntityItem::DEFAULT_VOXEL_DATA); DEFINE_PROPERTY_REF(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t, PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME); @@ -201,13 +201,13 @@ public: DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString, ""); DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float, LineEntityItem::DEFAULT_LINE_WIDTH); - DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY_REF(PROP_HREF, Href, href, QString, ""); DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString, ""); DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool, TextEntityItem::DEFAULT_FACE_CAMERA); DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray, QByteArray()); - DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); - DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector, QVector()); DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString, ""); @@ -228,8 +228,8 @@ public: DEFINE_PROPERTY_REF_ENUM(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode, UV); DEFINE_PROPERTY_REF(PROP_MATERIAL_PRIORITY, Priority, priority, quint16, 0); DEFINE_PROPERTY_REF(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString, "0"); - DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, ScriptVec2Float, ScriptVec2Float(0.0f)); - DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, ScriptVec2Float, ScriptVec2Float(1.0f)); + DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glm::vec2, glm::vec2(0.0f)); + DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glm::vec2, glm::vec2(1.0f)); DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float, 0); DEFINE_PROPERTY_REF(PROP_MATERIAL_DATA, MaterialData, materialData, QString, ""); @@ -255,16 +255,16 @@ public: DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION); // these are used when bouncing location data into and out of scripts - DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION); - DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, ScriptVec3Float, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector, QVector()); - DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool, ZoneEntityItem::DEFAULT_FLYING_ALLOWED); DEFINE_PROPERTY(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool, ZoneEntityItem::DEFAULT_GHOSTING_ALLOWED); @@ -293,7 +293,7 @@ public: std::array::const_iterator findComponent(const QString& mode); public: - float getMaxDimension() const { return glm::compMax(_dimensions.toGlm()); } + float getMaxDimension() const { return glm::compMax(_dimensions); } float getAge() const { return (float)(usecTimestampNow() - _created) / (float)USECS_PER_SECOND; } bool hasCreatedTime() const { return (_created != UNKNOWN_CREATED_TIME); } @@ -320,10 +320,10 @@ public: void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; } void markAllChanged(); - glm::vec3 getNaturalDimensions() const { return _naturalDimensions.toGlm(); } + const glm::vec3& getNaturalDimensions() const { return _naturalDimensions; } void setNaturalDimensions(const glm::vec3& value) { _naturalDimensions = value; } - glm::vec3 getNaturalPosition() const { return _naturalPosition.toGlm(); } + const glm::vec3& getNaturalPosition() const { return _naturalPosition; } void calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max); const QVariantMap& getTextureNames() const { return _textureNames; } @@ -370,16 +370,16 @@ public: void setRenderInfoHasTransparent(bool value) { _renderInfoHasTransparent = value; } void setPackedNormals(const QByteArray& value); - QVector unpackNormals(const QByteArray& normals); + QVector unpackNormals(const QByteArray& normals); void setPackedStrokeColors(const QByteArray& value); - QVector unpackStrokeColors(const QByteArray& strokeColors); + QVector unpackStrokeColors(const QByteArray& strokeColors); QByteArray getPackedNormals() const; - QByteArray packNormals(const QVector& normals) const; + QByteArray packNormals(const QVector& normals) const; QByteArray getPackedStrokeColors() const; - QByteArray packStrokeColors(const QVector& strokeColors) const; + QByteArray packStrokeColors(const QVector& strokeColors) const; QByteArray getStaticCertificateJSON() const; QByteArray getStaticCertificateHash() const; @@ -407,8 +407,8 @@ private: // NOTE: The following are pseudo client only properties. They are only used in clients which can access // properties of model geometry. But these properties are not serialized like other properties. QVariantMap _textureNames; - ScriptVec3Float _naturalDimensions; - ScriptVec3Float _naturalPosition; + glm::vec3 _naturalDimensions; + glm::vec3 _naturalPosition; size_t _renderInfoVertexCount { 0 }; int _renderInfoTextureCount { 0 }; @@ -431,8 +431,8 @@ void EntityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityProper // define these inline here so the macros work -inline void EntityItemProperties::setPosition(const ScriptVec3Float& value) - { _position = glm::clamp(value.toGlm(), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } +inline void EntityItemProperties::setPosition(const glm::vec3& value) + { _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { debug << "EntityItemProperties[" << "\n"; diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 78e718d593..6c39e90c91 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -24,7 +24,7 @@ const glm::vec3 ENTITY_ITEM_ZERO_VEC3 = glm::vec3(0.0f); const glm::vec3 ENTITY_ITEM_ONE_VEC3 = glm::vec3(1.0f); const glm::vec3 ENTITY_ITEM_HALF_VEC3 = glm::vec3(0.5f); -const QVector ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC = QVector(); +const QVector ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC = QVector(); const bool ENTITY_ITEM_DEFAULT_LOCKED = false; const QString ENTITY_ITEM_DEFAULT_USER_DATA = QString(""); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index fed06b43f5..6becd133e6 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -101,9 +101,9 @@ changedProperties += P; \ } -inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec2Float& v) { return vec2FloatToScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3Float& v) { return vec3FloatToScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const ScriptVec3UChar& v) { return vec3UCharToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec2& v) { return vec2FloatToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3FloatToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::u8vec3& v) { return vec3UCharToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, float v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, int v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, bool v) { return QScriptValue(v); } @@ -114,7 +114,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QString& v) { ret inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::quat& v) { return quatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) { return v; } -inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3FloatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorQuatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorBoolToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) { return qVectorFloatToScriptValue(e, v); } @@ -185,7 +185,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { retu properties.setProperty(#P, V); \ } -typedef QVector qVectorVec3; +typedef QVector qVectorVec3; typedef QVector qVectorQuat; typedef QVector qVectorBool; typedef QVector qVectorFloat; @@ -221,23 +221,23 @@ inline QByteArray QByteArray_convertFromScriptValue(const QScriptValue& v, bool& return QByteArray::fromBase64(b64.toUtf8()); } -inline ScriptVec2Float ScriptVec2Float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { +inline glm::vec2 vec2_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - ScriptVec2Float vec2; + glm::vec2 vec2; vec2FloatFromScriptValue(v, vec2); return vec2; } -inline ScriptVec3Float ScriptVec3Float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { +inline glm::vec3 vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - ScriptVec3Float vec3; + glm::vec3 vec3; vec3FloatFromScriptValue(v, vec3); return vec3; } -inline ScriptVec3UChar ScriptVec3UChar_convertFromScriptValue(const QScriptValue& v, bool& isValid) { +inline glm::u8vec3 u8vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - ScriptVec3UChar vec3; + glm::u8vec3 vec3; vec3UCharFromScriptValue(v, vec3); return vec3; } @@ -256,7 +256,7 @@ inline qVectorFloat qVectorFloat_convertFromScriptValue(const QScriptValue& v, b inline qVectorVec3 qVectorVec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - return qVectorVec3FromScriptValue(v); + return qVectorVec3FloatFromScriptValue(v); } inline qVectorQuat qVectorQuat_convertFromScriptValue(const QScriptValue& v, bool& isValid) { diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3ddc2409bb..7694b1d4e6 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -137,7 +137,7 @@ EntityItemProperties convertPropertiesToScriptSemantics(const EntityItemProperti scriptSideProperties.setLocalDimensions(entitySideProperties.getDimensions()); bool success; - glm::vec3 worldPosition = SpatiallyNestable::localToWorld(entitySideProperties.getPosition().toGlm(), + glm::vec3 worldPosition = SpatiallyNestable::localToWorld(entitySideProperties.getPosition(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, @@ -147,17 +147,17 @@ EntityItemProperties convertPropertiesToScriptSemantics(const EntityItemProperti entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldVelocity = SpatiallyNestable::localToWorldVelocity(entitySideProperties.getVelocity().toGlm(), + glm::vec3 worldVelocity = SpatiallyNestable::localToWorldVelocity(entitySideProperties.getVelocity(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldAngularVelocity = SpatiallyNestable::localToWorldAngularVelocity(entitySideProperties.getAngularVelocity().toGlm(), + glm::vec3 worldAngularVelocity = SpatiallyNestable::localToWorldAngularVelocity(entitySideProperties.getAngularVelocity(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); - glm::vec3 worldDimensions = SpatiallyNestable::localToWorldDimensions(entitySideProperties.getDimensions().toGlm(), + glm::vec3 worldDimensions = SpatiallyNestable::localToWorldDimensions(entitySideProperties.getDimensions(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, @@ -186,7 +186,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localPositionChanged()) { entitySideProperties.setPosition(scriptSideProperties.getLocalPosition()); } else if (scriptSideProperties.positionChanged()) { - glm::vec3 localPosition = SpatiallyNestable::worldToLocal(entitySideProperties.getPosition().toGlm(), + glm::vec3 localPosition = SpatiallyNestable::worldToLocal(entitySideProperties.getPosition(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -206,7 +206,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localVelocityChanged()) { entitySideProperties.setVelocity(scriptSideProperties.getLocalVelocity()); } else if (scriptSideProperties.velocityChanged()) { - glm::vec3 localVelocity = SpatiallyNestable::worldToLocalVelocity(entitySideProperties.getVelocity().toGlm(), + glm::vec3 localVelocity = SpatiallyNestable::worldToLocalVelocity(entitySideProperties.getVelocity(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -217,7 +217,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper entitySideProperties.setAngularVelocity(scriptSideProperties.getLocalAngularVelocity()); } else if (scriptSideProperties.angularVelocityChanged()) { glm::vec3 localAngularVelocity = - SpatiallyNestable::worldToLocalAngularVelocity(entitySideProperties.getAngularVelocity().toGlm(), + SpatiallyNestable::worldToLocalAngularVelocity(entitySideProperties.getAngularVelocity(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -227,7 +227,7 @@ EntityItemProperties convertPropertiesFromScriptSemantics(const EntityItemProper if (scriptSideProperties.localDimensionsChanged()) { entitySideProperties.setDimensions(scriptSideProperties.getLocalDimensions()); } else if (scriptSideProperties.dimensionsChanged()) { - glm::vec3 localDimensions = SpatiallyNestable::worldToLocalDimensions(entitySideProperties.getDimensions().toGlm(), + glm::vec3 localDimensions = SpatiallyNestable::worldToLocalDimensions(entitySideProperties.getDimensions(), entitySideProperties.getParentID(), entitySideProperties.getParentJointIndex(), scalesWithParent, success); @@ -1061,9 +1061,9 @@ QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, c obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -1079,11 +1079,11 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FromScriptValue(intersection, value.intersection); + vec3FloatFromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } @@ -1196,7 +1196,7 @@ bool EntityScriptingInterface::setVoxelsInCuboid(QUuid entityID, const glm::vec3 }); } -bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { +bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { PROFILE_RANGE(script_entities, __FUNCTION__); EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 7701556bda..3e0f040fd6 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -850,7 +850,7 @@ public slots: * ]); * }, 2000); */ - Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); + Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); /**jsdoc * Append a point to a {@link Entities.EntityType|Line} entity. diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 64ee417524..377e192bb1 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1071,7 +1071,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList= 0) { - glm::vec3 value = properties.getVelocity().toGlm(); + glm::vec3 value = properties.getVelocity(); changedProperties[index] = QString("velocity:") + QString::number((int)value.x) + "," + QString::number((int)value.y) + "," + @@ -1082,7 +1082,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList= 0) { - glm::vec3 value = properties.getGravity().toGlm(); + glm::vec3 value = properties.getGravity(); QString changeHint = "0"; if (value.x + value.y + value.z > 0) { changeHint = "+"; @@ -1200,7 +1200,7 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList(); if (entityEditFilters) { - auto position = existingEntity ? existingEntity->getWorldPosition() : propertiesIn.getPosition().toGlm(); + auto position = existingEntity ? existingEntity->getWorldPosition() : propertiesIn.getPosition(); auto entityID = existingEntity ? existingEntity->getEntityItemID() : EntityItemID(); accepted = entityEditFilters->filter(position, propertiesIn, propertiesOut, wasChanged, filterType, entityID, existingEntity); } @@ -2379,7 +2379,7 @@ bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void EntityItemID oldParentID = properties.getParentID(); if (oldParentID.isInvalidID()) { // no parent - properties.setPosition(properties.getPosition().toGlm() + args->root); + properties.setPosition(properties.getPosition() + args->root); } else { EntityItemPointer parentEntity = args->ourTree->findEntityByEntityItemID(oldParentID); if (parentEntity || oldParentID == AVATAR_SELF_ID) { // map the parent diff --git a/libraries/entities/src/HazePropertyGroup.cpp b/libraries/entities/src/HazePropertyGroup.cpp index e1b0e4e49a..9f9830e7d9 100644 --- a/libraries/entities/src/HazePropertyGroup.cpp +++ b/libraries/entities/src/HazePropertyGroup.cpp @@ -36,8 +36,8 @@ void HazePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProp void HazePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeRange, float, setHazeRange); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, ScriptVec3UChar, setHazeColor); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, ScriptVec3UChar, setHazeGlareColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, u8vec3, setHazeColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, u8vec3, setHazeGlareColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeEnableGlare, bool, setHazeEnableGlare); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareAngle, float, setHazeGlareAngle); @@ -167,8 +167,8 @@ bool HazePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, ScriptVec3UChar, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, ScriptVec3UChar, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, glm::u8vec3, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, glm::u8vec3, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); @@ -343,8 +343,8 @@ int HazePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* dat const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, ScriptVec3UChar, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, ScriptVec3UChar, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, glm::u8vec3, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, glm::u8vec3, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index cb5cfec014..ab54e8483b 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -28,8 +28,8 @@ class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; static const float INITIAL_HAZE_RANGE{ 1000.0f }; -static const ScriptVec3UChar initialHazeGlareColor { 255, 229, 179 }; -static const ScriptVec3UChar initialHazeColor { 128, 154, 179 }; +static const glm::u8vec3 initialHazeGlareColor { 255, 229, 179 }; +static const glm::u8vec3 initialHazeColor { 128, 154, 179 }; static const float INITIAL_HAZE_GLARE_ANGLE{ 20.0f }; static const float INITIAL_HAZE_BASE_REFERENCE{ 0.0f }; @@ -118,8 +118,8 @@ public: // Range only parameters DEFINE_PROPERTY(PROP_HAZE_RANGE, HazeRange, hazeRange, float, INITIAL_HAZE_RANGE); - DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, ScriptVec3UChar, initialHazeColor); - DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, ScriptVec3UChar, initialHazeGlareColor); + DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, glm::u8vec3, initialHazeColor); + DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, glm::u8vec3, initialHazeGlareColor); DEFINE_PROPERTY(PROP_HAZE_ENABLE_GLARE, HazeEnableGlare, hazeEnableGlare, bool, false); DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_ANGLE, HazeGlareAngle, hazeGlareAngle, float, INITIAL_HAZE_GLARE_ANGLE); diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index 0657d22073..ac744948f0 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -17,7 +17,7 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -const ScriptVec3UChar KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; +const glm::u8vec3 KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_INTENSITY = 1.0f; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY = 0.5f; const glm::vec3 KeyLightPropertyGroup::DEFAULT_KEYLIGHT_DIRECTION = { 0.0f, -1.0f, 0.0f }; @@ -33,15 +33,15 @@ void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desired } void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, ScriptVec3UChar, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, u8vec3, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, intensity, float, setIntensity); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, ScriptVec3Float, setDirection); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, vec3, setDirection); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, castShadows, bool, setCastShadows); // legacy property support - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, ScriptVec3UChar, setColor, getColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, u8vec3, setColor, getColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightIntensity, float, setIntensity, getIntensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, ScriptVec3Float, setDirection, getDirection); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, vec3, setDirection, getDirection); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightCastShadows, bool, setCastShadows, getCastShadows); } @@ -99,9 +99,9 @@ bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFl bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_COLOR, Color); @@ -187,9 +187,9 @@ int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, ScriptVec3Float, setDirection); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); return bytesRead; diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index 3972b71254..8144bf2a6e 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -84,15 +84,15 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - static const ScriptVec3UChar DEFAULT_KEYLIGHT_COLOR; + static const glm::u8vec3 DEFAULT_KEYLIGHT_COLOR; static const float DEFAULT_KEYLIGHT_INTENSITY; static const float DEFAULT_KEYLIGHT_AMBIENT_INTENSITY; static const glm::vec3 DEFAULT_KEYLIGHT_DIRECTION; static const bool DEFAULT_KEYLIGHT_CAST_SHADOWS; - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, ScriptVec3UChar, DEFAULT_KEYLIGHT_COLOR); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, glm::u8vec3, DEFAULT_KEYLIGHT_COLOR); DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, Intensity, intensity, float, DEFAULT_KEYLIGHT_INTENSITY); - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, ScriptVec3Float, DEFAULT_KEYLIGHT_DIRECTION); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, glm::vec3, DEFAULT_KEYLIGHT_DIRECTION); DEFINE_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, CastShadows, castShadows, bool, DEFAULT_KEYLIGHT_CAST_SHADOWS); }; diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 0466e4d9f5..5e0a7bb9f2 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -175,7 +175,7 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_EXPONENT, float, setExponent); READ_ENTITY_PROPERTY(PROP_CUTOFF, float, setCutoff); @@ -213,13 +213,13 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, getFalloffRadius()); } -ScriptVec3UChar LightEntityItem::getColor() const { - return resultWithReadLock([&] { +glm::u8vec3 LightEntityItem::getColor() const { + return resultWithReadLock([&] { return _color; }); } -void LightEntityItem::setColor(const ScriptVec3UChar& value) { +void LightEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { _color = value; _lightPropertiesChanged = true; diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 27a31cd737..617d4079f5 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -52,8 +52,8 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - ScriptVec3UChar getColor() const; - void setColor(const ScriptVec3UChar& value); + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); bool getIsSpotlight() const; void setIsSpotlight(bool value); @@ -90,7 +90,7 @@ public: private: // properties of a light - ScriptVec3UChar _color; + glm::u8vec3 _color; bool _isSpotlight { DEFAULT_IS_SPOTLIGHT }; float _intensity { DEFAULT_INTENSITY }; float _falloffRadius { DEFAULT_FALLOFF_RADIUS }; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 639e4a64e5..42b2dc1480 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -69,7 +69,7 @@ bool LineEntityItem::setProperties(const EntityItemProperties& properties) { return somethingChanged; } -bool LineEntityItem::appendPoint(const ScriptVec3Float& point) { +bool LineEntityItem::appendPoint(const glm::vec3& point) { if (_points.size() > MAX_POINTS_PER_LINE - 1) { qCDebug(entities) << "MAX POINTS REACHED!"; return false; @@ -86,13 +86,13 @@ bool LineEntityItem::appendPoint(const ScriptVec3Float& point) { return true; } -bool LineEntityItem::setLinePoints(const QVector& points) { +bool LineEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } glm::vec3 halfBox = getScaledDimensions() * 0.5f; for (int i = 0; i < points.size(); i++) { - ScriptVec3Float point = points.at(i); + glm::vec3 point = points.at(i); if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { qCDebug(entities) << "Point is outside entity's bounding box"; return false; @@ -114,9 +114,9 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); return bytesRead; } @@ -154,13 +154,13 @@ void LineEntityItem::debugDump() const { qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); } -ScriptVec3UChar LineEntityItem::getColor() const { - return resultWithReadLock([&] { +glm::u8vec3 LineEntityItem::getColor() const { + return resultWithReadLock([&] { return _color; }); } -void LineEntityItem::setColor(const ScriptVec3UChar& value) { +void LineEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { _color = value; }); @@ -180,8 +180,8 @@ float LineEntityItem::getLineWidth() const { return result; } -QVector LineEntityItem::getLinePoints() const { - QVector result; +QVector LineEntityItem::getLinePoints() const { + QVector result; withReadLock([&] { result = _points; }); diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index d78313f387..9c50f6c0e4 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -41,16 +41,16 @@ class LineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - ScriptVec3UChar getColor() const; - void setColor(const ScriptVec3UChar& value); + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); void setLineWidth(float lineWidth); float getLineWidth() const; - bool setLinePoints(const QVector& points); - bool appendPoint(const ScriptVec3Float& point); + bool setLinePoints(const QVector& points); + bool appendPoint(const glm::vec3& point); - QVector getLinePoints() const; + QVector getLinePoints() const; virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } @@ -73,9 +73,9 @@ class LineEntityItem : public EntityItem { static const int MAX_POINTS_PER_LINE; private: - ScriptVec3UChar _color; + glm::u8vec3 _color; float _lineWidth { DEFAULT_LINE_WIDTH }; - QVector _points; + QVector _points; bool _pointsChanged { true }; }; diff --git a/libraries/entities/src/MaterialEntityItem.cpp b/libraries/entities/src/MaterialEntityItem.cpp index a10937d537..265bcf209a 100644 --- a/libraries/entities/src/MaterialEntityItem.cpp +++ b/libraries/entities/src/MaterialEntityItem.cpp @@ -81,8 +81,8 @@ int MaterialEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, setMaterialMappingMode); READ_ENTITY_PROPERTY(PROP_MATERIAL_PRIORITY, quint16, setPriority); READ_ENTITY_PROPERTY(PROP_PARENT_MATERIAL_NAME, QString, setParentMaterialName); - READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, ScriptVec2Float, setMaterialMappingPos); - READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, ScriptVec2Float, setMaterialMappingScale); + READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, glm::vec2, setMaterialMappingPos); + READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, glm::vec2, setMaterialMappingScale); READ_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, float, setMaterialMappingRot); READ_ENTITY_PROPERTY(PROP_MATERIAL_DATA, QString, setMaterialData); @@ -208,18 +208,18 @@ void MaterialEntityItem::setMaterialData(const QString& materialData) { } } -void MaterialEntityItem::setMaterialMappingPos(const ScriptVec2Float& materialMappingPos) { +void MaterialEntityItem::setMaterialMappingPos(const glm::vec2& materialMappingPos) { if (_materialMappingPos != materialMappingPos) { removeMaterial(); - _materialMappingPos = materialMappingPos.toGlm(); + _materialMappingPos = materialMappingPos; applyMaterial(); } } -void MaterialEntityItem::setMaterialMappingScale(const ScriptVec2Float& materialMappingScale) { +void MaterialEntityItem::setMaterialMappingScale(const glm::vec2& materialMappingScale) { if (_materialMappingScale != materialMappingScale) { removeMaterial(); - _materialMappingScale = materialMappingScale.toGlm(); + _materialMappingScale = materialMappingScale; applyMaterial(); } } diff --git a/libraries/entities/src/MaterialEntityItem.h b/libraries/entities/src/MaterialEntityItem.h index 9920014991..30743850dd 100644 --- a/libraries/entities/src/MaterialEntityItem.h +++ b/libraries/entities/src/MaterialEntityItem.h @@ -66,10 +66,10 @@ public: QString getParentMaterialName() const { return _parentMaterialName; } void setParentMaterialName(const QString& parentMaterialName); - ScriptVec2Float getMaterialMappingPos() const { return _materialMappingPos; } - void setMaterialMappingPos(const ScriptVec2Float& materialMappingPos); - ScriptVec2Float getMaterialMappingScale() const { return _materialMappingScale; } - void setMaterialMappingScale(const ScriptVec2Float& materialMappingScale); + glm::vec2 getMaterialMappingPos() const { return _materialMappingPos; } + void setMaterialMappingPos(const glm::vec2& materialMappingPos); + glm::vec2 getMaterialMappingScale() const { return _materialMappingScale; } + void setMaterialMappingScale(const glm::vec2& materialMappingScale); float getMaterialMappingRot() const { return _materialMappingRot; } void setMaterialMappingRot(const float& materialMappingRot); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 5cddd7fba1..31e0a3deb6 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -113,7 +113,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; bool animationPropertiesChanged = false; - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); @@ -139,7 +139,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); - READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); + READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); return bytesRead; } @@ -428,7 +428,7 @@ void ModelEntityItem::setJointRotationsSet(const QVector& rotationsSet) { }); } -void ModelEntityItem::setJointTranslations(const QVector& translations) { +void ModelEntityItem::setJointTranslations(const QVector& translations) { resizeJointArrays(translations.size()); _jointDataLock.withWriteLock([&] { _jointTranslationsExplicitlySet = translations.size() > 0; @@ -479,8 +479,8 @@ QVector ModelEntityItem::getJointRotationsSet() const { return result; } -QVector ModelEntityItem::getJointTranslations() const { - QVector result; +QVector ModelEntityItem::getJointTranslations() const { + QVector result; _jointDataLock.withReadLock([&] { if (_jointTranslationsExplicitlySet) { result.resize(_localJointData.size()); @@ -537,14 +537,14 @@ QString ModelEntityItem::getCompoundShapeURL() const { return _compoundShapeURL.get(); } -void ModelEntityItem::setColor(const ScriptVec3UChar& value) { +void ModelEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { _color = value; }); } -ScriptVec3UChar ModelEntityItem::getColor() const { - return resultWithReadLock([&] { +glm::u8vec3 ModelEntityItem::getColor() const { + return resultWithReadLock([&] { return _color; }); } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 0700fea476..de25c56929 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -57,8 +57,8 @@ public: // TODO: Move these to subclasses, or other appropriate abstraction // getters/setters applicable to models and particles - ScriptVec3UChar getColor() const; - void setColor(const ScriptVec3UChar& value); + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); bool hasModel() const; virtual bool hasCompoundShapeURL() const; @@ -115,14 +115,14 @@ public: virtual void setJointRotations(const QVector& rotations); virtual void setJointRotationsSet(const QVector& rotationsSet); - virtual void setJointTranslations(const QVector& translations); + virtual void setJointTranslations(const QVector& translations); virtual void setJointTranslationsSet(const QVector& translationsSet); virtual void setAnimationJointsData(const QVector& jointsData); QVector getJointRotations() const; QVector getJointRotationsSet() const; - QVector getJointTranslations() const; + QVector getJointTranslations() const; QVector getJointTranslationsSet() const; private: @@ -153,7 +153,7 @@ protected: QVector _localJointData; int _lastKnownCurrentFrame{-1}; - ScriptVec3UChar _color; + glm::u8vec3 _color; QString _modelURL; bool _relayParentJoints; diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 0ba9977710..d9e8ef0414 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -498,9 +498,9 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert return somethingChanged; } -void ParticleEffectEntityItem::setColor(const ScriptVec3UChar& value) { +void ParticleEffectEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { - _particleProperties.color.gradient.target = value.toGlm(); + _particleProperties.color.gradient.target = value; }); } @@ -512,15 +512,15 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, bool, setIsEmitting); READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles); READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan); READ_ENTITY_PROPERTY(PROP_EMIT_RATE, float, setEmitRate); - READ_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, ScriptVec3Float, setEmitAcceleration); - READ_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, ScriptVec3Float, setAccelerationSpread); + READ_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, glm::vec3, setEmitAcceleration); + READ_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, glm::vec3, setAccelerationSpread); READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); @@ -528,9 +528,9 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, ScriptVec3UChar, setColorSpread); - READ_ENTITY_PROPERTY(PROP_COLOR_START, ScriptVec3Float, setColorStart); - READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, ScriptVec3Float, setColorFinish); + READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, glm::u8vec3, setColorSpread); + READ_ENTITY_PROPERTY(PROP_COLOR_START, glm::vec3, setColorStart); + READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, glm::vec3, setColorFinish); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); READ_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY(PROP_ALPHA_START, float, setAlphaStart); @@ -539,7 +539,7 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_EMIT_SPEED, float, setEmitSpeed); READ_ENTITY_PROPERTY(PROP_SPEED_SPREAD, float, setSpeedSpread); READ_ENTITY_PROPERTY(PROP_EMIT_ORIENTATION, quat, setEmitOrientation); - READ_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, ScriptVec3Float, setEmitDimensions); + READ_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, glm::vec3, setEmitDimensions); READ_ENTITY_PROPERTY(PROP_EMIT_RADIUS_START, float, setEmitRadiusStart); READ_ENTITY_PROPERTY(PROP_POLAR_START, float, setPolarStart); READ_ENTITY_PROPERTY(PROP_POLAR_FINISH, float, setPolarFinish); @@ -614,16 +614,16 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate()); - APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, getScriptEmitAcceleration()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, getScriptAccelerationSpread()); + APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, getEmitAcceleration()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, getAccelerationSpread()); APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, getParticleRadius()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_SPREAD, getRadiusSpread()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, getRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, getRadiusFinish()); APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, getColorSpread()); - APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getScriptColorStart()); - APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getScriptColorFinish()); + APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getColorStart()); + APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getColorFinish()); APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, getAlphaSpread()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, getAlphaStart()); @@ -631,7 +631,7 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_EMIT_SPEED, getEmitSpeed()); APPEND_ENTITY_PROPERTY(PROP_SPEED_SPREAD, getSpeedSpread()); APPEND_ENTITY_PROPERTY(PROP_EMIT_ORIENTATION, getEmitOrientation()); - APPEND_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, getScriptEmitDimensions()); + APPEND_ENTITY_PROPERTY(PROP_EMIT_DIMENSIONS, getEmitDimensions()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RADIUS_START, getEmitRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_POLAR_START, getPolarStart()); APPEND_ENTITY_PROPERTY(PROP_POLAR_FINISH, getPolarFinish()); @@ -692,9 +692,9 @@ void ParticleEffectEntityItem::setColorFinish(const vec3& colorFinish) { }); } -void ParticleEffectEntityItem::setColorSpread(const ScriptVec3UChar& value) { +void ParticleEffectEntityItem::setColorSpread(const glm::u8vec3& value) { withWriteLock([&] { - _particleProperties.color.gradient.spread = value.toGlm(); + _particleProperties.color.gradient.spread = value; }); } @@ -717,10 +717,10 @@ particle::Properties ParticleEffectEntityItem::getParticleProperties() const { // Special case the properties that get treated differently if they're unintialized if (glm::any(glm::isnan(result.color.range.start))) { - result.color.range.start = getColor().toGlm(); + result.color.range.start = getColor(); } if (glm::any(glm::isnan(result.color.range.finish))) { - result.color.range.finish = getColor().toGlm(); + result.color.range.finish = getColor(); } if (glm::isnan(result.alpha.range.start)) { result.alpha.range.start = getAlpha(); diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index d1b2adeeab..7be25cc34f 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -20,9 +20,9 @@ namespace particle { static const float SCRIPT_MAXIMUM_PI = 3.1416f; // Round up so that reasonable property values work static const float UNINITIALIZED = NAN; - static const ScriptVec3UChar DEFAULT_COLOR = { 255, 255, 255 }; + static const u8vec3 DEFAULT_COLOR = { 255, 255, 255 }; static const vec3 DEFAULT_COLOR_UNINITIALIZED = { UNINITIALIZED, UNINITIALIZED, UNINITIALIZED }; - static const ScriptVec3UChar DEFAULT_COLOR_SPREAD = { 0, 0, 0 }; + static const u8vec3 DEFAULT_COLOR_SPREAD = { 0, 0, 0 }; static const float DEFAULT_ALPHA = 1.0f; static const float DEFAULT_ALPHA_SPREAD = 0.0f; static const float DEFAULT_ALPHA_START = UNINITIALIZED; @@ -42,8 +42,8 @@ namespace particle { static const float MINIMUM_EMIT_SPEED = -1000.0f; static const float MAXIMUM_EMIT_SPEED = 1000.0f; // Approx mach 3 static const float DEFAULT_SPEED_SPREAD = 1.0f; - static const glm::quat DEFAULT_EMIT_ORIENTATION = glm::angleAxis(-PI_OVER_TWO, Vectors::UNIT_X); // Vertical - static const glm::vec3 DEFAULT_EMIT_DIMENSIONS = Vectors::ZERO; // Emit from point + static const quat DEFAULT_EMIT_ORIENTATION = glm::angleAxis(-PI_OVER_TWO, Vectors::UNIT_X); // Vertical + static const vec3 DEFAULT_EMIT_DIMENSIONS = Vectors::ZERO; // Emit from point static const float MINIMUM_EMIT_DIMENSION = 0.0f; static const float MAXIMUM_EMIT_DIMENSION = (float)TREE_SCALE; static const float DEFAULT_EMIT_RADIUS_START = 1.0f; // Emit from surface (when emitDimensions > 0) @@ -57,10 +57,10 @@ namespace particle { static const float MAXIMUM_AZIMUTH = SCRIPT_MAXIMUM_PI; static const float DEFAULT_AZIMUTH_START = -PI; // Emit full circumference (when polarFinish > 0) static const float DEFAULT_AZIMUTH_FINISH = PI; // "" - static const glm::vec3 DEFAULT_EMIT_ACCELERATION(0.0f, -9.8f, 0.0f); + static const vec3 DEFAULT_EMIT_ACCELERATION(0.0f, -9.8f, 0.0f); static const float MINIMUM_EMIT_ACCELERATION = -100.0f; // ~ 10g static const float MAXIMUM_EMIT_ACCELERATION = 100.0f; - static const glm::vec3 DEFAULT_ACCELERATION_SPREAD(0.0f, 0.0f, 0.0f); + static const vec3 DEFAULT_ACCELERATION_SPREAD(0.0f, 0.0f, 0.0f); static const float MINIMUM_ACCELERATION_SPREAD = 0.0f; static const float MAXIMUM_ACCELERATION_SPREAD = 100.0f; static const float DEFAULT_PARTICLE_RADIUS = 0.025f; @@ -154,7 +154,7 @@ namespace particle { }; struct Properties { - RangeGradient color { DEFAULT_COLOR.toGlm(), DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_SPREAD.toGlm() }; + RangeGradient color { DEFAULT_COLOR, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_SPREAD }; RangeGradient alpha { DEFAULT_ALPHA, DEFAULT_ALPHA_START, DEFAULT_ALPHA_FINISH, DEFAULT_ALPHA_SPREAD }; float radiusStart { DEFAULT_EMIT_RADIUS_START }; RangeGradient radius { DEFAULT_PARTICLE_RADIUS, DEFAULT_RADIUS_START, DEFAULT_RADIUS_FINISH, DEFAULT_RADIUS_SPREAD }; @@ -228,21 +228,17 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - void setColor(const ScriptVec3UChar& value); - ScriptVec3UChar getColor() const { return _particleProperties.color.gradient.target; } + void setColor(const glm::u8vec3& value); + glm::u8vec3 getColor() const { return _particleProperties.color.gradient.target; } void setColorStart(const vec3& colorStart); - void setColorStart(const ScriptVec3Float& colorStart) { setColorStart(colorStart.toGlm()); } vec3 getColorStart() const { return _particleProperties.color.range.start; } - ScriptVec3Float getScriptColorStart() const { return getColorStart(); } void setColorFinish(const vec3& colorFinish); - void setColorFinish(const ScriptVec3Float& colorFinish) { setColorFinish(colorFinish.toGlm()); } vec3 getColorFinish() const { return _particleProperties.color.range.finish; } - ScriptVec3Float getScriptColorFinish() const { return getColorFinish(); } - void setColorSpread(const ScriptVec3UChar& colorSpread); - ScriptVec3UChar getColorSpread() const { return _particleProperties.color.gradient.spread; } + void setColorSpread(const glm::u8vec3& colorSpread); + glm::u8vec3 getColorSpread() const { return _particleProperties.color.gradient.spread; } void setAlpha(float alpha); float getAlpha() const { return _particleProperties.alpha.gradient.target; } @@ -283,9 +279,7 @@ public: const glm::quat& getEmitOrientation() const { return _particleProperties.emission.orientation; } void setEmitDimensions(const glm::vec3& emitDimensions); - void setEmitDimensions(const ScriptVec3Float& emitDimensions) { setEmitDimensions(emitDimensions.toGlm()); } const glm::vec3& getEmitDimensions() const { return _particleProperties.emission.dimensions; } - ScriptVec3Float getScriptEmitDimensions() const { return getEmitDimensions(); } void setEmitRadiusStart(float emitRadiusStart); float getEmitRadiusStart() const { return _particleProperties.radiusStart; } @@ -303,14 +297,10 @@ public: float getAzimuthFinish() const { return _particleProperties.azimuth.finish; } void setEmitAcceleration(const glm::vec3& emitAcceleration); - void setEmitAcceleration(const ScriptVec3Float& emitAcceleration) { setEmitAcceleration(emitAcceleration.toGlm()); } const glm::vec3& getEmitAcceleration() const { return _particleProperties.emission.acceleration.target; } - ScriptVec3Float getScriptEmitAcceleration() const { return getEmitAcceleration(); } void setAccelerationSpread(const glm::vec3& accelerationSpread); - void setAccelerationSpread(const ScriptVec3Float& accelerationSpread) { setAccelerationSpread(accelerationSpread.toGlm()); } const glm::vec3& getAccelerationSpread() const { return _particleProperties.emission.acceleration.spread; } - ScriptVec3Float getScriptAccelerationSpread() const { return getAccelerationSpread(); } void setParticleRadius(float particleRadius); float getParticleRadius() const { return _particleProperties.radius.gradient.target; } diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index d5bd204c1f..827c89bae3 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -79,7 +79,7 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { } -bool PolyLineEntityItem::appendPoint(const ScriptVec3Float& point) { +bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { if (_points.size() > MAX_POINTS_PER_LINE - 1) { qCDebug(entities) << "MAX POINTS REACHED!"; return false; @@ -102,7 +102,7 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { return true; } -bool PolyLineEntityItem::setNormals(const QVector& normals) { +bool PolyLineEntityItem::setNormals(const QVector& normals) { withWriteLock([&] { _normals = normals; _normalsChanged = true; @@ -110,7 +110,7 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { return true; } -bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { +bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { withWriteLock([&] { _strokeColors = strokeColors; _strokeColorsChanged = true; @@ -119,7 +119,7 @@ bool PolyLineEntityItem::setStrokeColors(const QVector& strokeC } -bool PolyLineEntityItem::setLinePoints(const QVector& points) { +bool PolyLineEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } @@ -161,10 +161,10 @@ void PolyLineEntityItem::calculateScaleAndRegistrationPoint() { withReadLock([&] { pointCount = _points.size(); if (pointCount > 0) { - firstPoint = _points.at(0).toGlm(); + firstPoint = _points.at(0); } for (int i = 0; i < pointCount; i++) { - const glm::vec3& point = _points.at(i).toGlm(); + const glm::vec3& point = _points.at(i); high = glm::max(point, high); low = glm::min(point, low); } @@ -200,11 +200,11 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); - READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); - READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); + READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); @@ -257,24 +257,24 @@ void PolyLineEntityItem::debugDump() const { -QVector PolyLineEntityItem::getLinePoints() const { - QVector result; +QVector PolyLineEntityItem::getLinePoints() const { + QVector result; withReadLock([&] { result = _points; }); return result; } -QVector PolyLineEntityItem::getNormals() const { - QVector result; +QVector PolyLineEntityItem::getNormals() const { + QVector result; withReadLock([&] { result = _normals; }); return result; } -QVector PolyLineEntityItem::getStrokeColors() const { - QVector result; +QVector PolyLineEntityItem::getStrokeColors() const { + QVector result; withReadLock([&] { result = _strokeColors; }); @@ -306,14 +306,15 @@ void PolyLineEntityItem::setTextures(const QString& textures) { }); } -void PolyLineEntityItem::setColor(const ScriptVec3UChar& value) { +void PolyLineEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { + _strokeColorsChanged = true; _color = value; }); } -ScriptVec3UChar PolyLineEntityItem::getColor() const { - return resultWithReadLock([&] { +glm::u8vec3 PolyLineEntityItem::getColor() const { + return resultWithReadLock([&] { return _color; }); } diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index 31b1d04aec..2906aa9b9a 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -41,21 +41,21 @@ class PolyLineEntityItem : public EntityItem { EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - ScriptVec3UChar getColor() const; - void setColor(const ScriptVec3UChar& value); + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } float getLineWidth() const{ return _lineWidth; } - bool setLinePoints(const QVector& points); - bool appendPoint(const ScriptVec3Float& point); - QVector getLinePoints() const; + bool setLinePoints(const QVector& points); + bool appendPoint(const glm::vec3& point); + QVector getLinePoints() const; - bool setNormals(const QVector& normals); - QVector getNormals() const; + bool setNormals(const QVector& normals); + QVector getNormals() const; - bool setStrokeColors(const QVector& strokeColors); - QVector getStrokeColors() const; + bool setStrokeColors(const QVector& strokeColors); + QVector getStrokeColors() const; bool setStrokeWidths(const QVector& strokeWidths); QVector getStrokeWidths() const; @@ -98,15 +98,15 @@ private: void calculateScaleAndRegistrationPoint(); protected: - ScriptVec3UChar _color; + glm::u8vec3 _color; float _lineWidth { DEFAULT_LINE_WIDTH }; bool _pointsChanged { true }; bool _normalsChanged { true }; bool _strokeColorsChanged { true }; bool _strokeWidthsChanged { true }; - QVector _points; - QVector _normals; - QVector _strokeColors; + QVector _points; + QVector _normals; + QVector _strokeColors; QVector _strokeWidths; QString _textures; bool _isUVModeStretch; diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index de4aeb14e0..090c971e53 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -70,9 +70,9 @@ PolyVoxEntityItem::PolyVoxEntityItem(const EntityItemID& entityItemID) : EntityI _type = EntityTypes::PolyVox; } -void PolyVoxEntityItem::setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize) { +void PolyVoxEntityItem::setVoxelVolumeSize(const glm::vec3& voxelVolumeSize) { withWriteLock([&] { - assert(!glm::any(glm::isnan(voxelVolumeSize.toGlm()))); + assert(!glm::any(glm::isnan(voxelVolumeSize))); _voxelVolumeSize = glm::vec3(roundf(voxelVolumeSize.x), roundf(voxelVolumeSize.y), roundf(voxelVolumeSize.z)); if (_voxelVolumeSize.x < 1) { @@ -104,8 +104,8 @@ void PolyVoxEntityItem::setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSiz }); } -ScriptVec3Float PolyVoxEntityItem::getVoxelVolumeSize() const { - ScriptVec3Float voxelVolumeSize; +glm::vec3 PolyVoxEntityItem::getVoxelVolumeSize() const { + glm::vec3 voxelVolumeSize; withReadLock([&] { voxelVolumeSize = _voxelVolumeSize; }); @@ -167,7 +167,7 @@ int PolyVoxEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* dat int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, ScriptVec3Float, setVoxelVolumeSize); + READ_ENTITY_PROPERTY(PROP_VOXEL_VOLUME_SIZE, glm::vec3, setVoxelVolumeSize); READ_ENTITY_PROPERTY(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); READ_ENTITY_PROPERTY(PROP_X_TEXTURE_URL, QString, setXTextureURL); @@ -375,7 +375,7 @@ EntityItemID PolyVoxEntityItem::getZPNeighborID() const { glm::vec3 PolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::vec3 result; withReadLock([&] { - glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize.toGlm(); // meters / voxel-units + glm::vec3 scale = getScaledDimensions() / _voxelVolumeSize; // meters / voxel-units if (isEdged()) { result = scale / -2.0f; } @@ -387,7 +387,7 @@ glm::vec3 PolyVoxEntityItem::getSurfacePositionAdjustment() const { glm::mat4 PolyVoxEntityItem::voxelToLocalMatrix() const { glm::vec3 voxelVolumeSize; withReadLock([&] { - voxelVolumeSize = _voxelVolumeSize.toGlm(); + voxelVolumeSize = _voxelVolumeSize; }); glm::vec3 dimensions = getScaledDimensions(); diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 25a2a12637..2c8afe6a5e 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -54,8 +54,8 @@ class PolyVoxEntityItem : public EntityItem { virtual void debugDump() const override; - virtual void setVoxelVolumeSize(const ScriptVec3Float& voxelVolumeSize); - virtual ScriptVec3Float getVoxelVolumeSize() const; + virtual void setVoxelVolumeSize(const glm::vec3& voxelVolumeSize); + virtual glm::vec3 getVoxelVolumeSize() const; virtual void setVoxelData(const QByteArray& voxelData); virtual QByteArray getVoxelData() const; @@ -176,7 +176,7 @@ class PolyVoxEntityItem : public EntityItem { protected: void setVoxelDataDirty(bool value) { withWriteLock([&] { _voxelDataDirty = value; }); } - ScriptVec3Float _voxelVolumeSize { DEFAULT_VOXEL_VOLUME_SIZE }; // this is always 3 bytes + glm::vec3 _voxelVolumeSize { DEFAULT_VOXEL_VOLUME_SIZE }; // this is always 3 bytes QByteArray _voxelData { DEFAULT_VOXEL_DATA }; bool _voxelDataDirty { true }; // _voxelData has changed, things that depend on it should be updated diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index eb5109a494..0cf695b747 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -184,7 +184,7 @@ int ShapeEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape); - READ_ENTITY_PROPERTY(PROP_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); return bytesRead; @@ -212,15 +212,15 @@ void ShapeEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); } -void ShapeEntityItem::setColor(const ScriptVec3UChar& value) { +void ShapeEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { _color = value; _material->setAlbedo(toGlm(_color)); }); } -ScriptVec3UChar ShapeEntityItem::getColor() const { - return resultWithReadLock([&] { +glm::u8vec3 ShapeEntityItem::getColor() const { + return resultWithReadLock([&] { return _color; }); } diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index 66fb868ad7..1bc754322b 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -77,8 +77,8 @@ public: float getAlpha() const { return _alpha; }; void setAlpha(float alpha); - ScriptVec3UChar getColor() const; - void setColor(const ScriptVec3UChar& value); + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); void setUnscaledDimensions(const glm::vec3& value) override; @@ -104,7 +104,7 @@ public: protected: float _alpha { 1.0f }; - ScriptVec3UChar _color; + glm::u8vec3 _color; entity::Shape _shape { entity::Shape::Sphere }; //! This is SHAPE_TYPE_ELLIPSOID rather than SHAPE_TYPE_NONE to maintain diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index 2ed3253536..16bb5c1ccd 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -16,7 +16,7 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -const ScriptVec3UChar SkyboxPropertyGroup::DEFAULT_COLOR = { 0, 0, 0 }; +const glm::u8vec3 SkyboxPropertyGroup::DEFAULT_COLOR = { 0, 0, 0 }; void SkyboxPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); @@ -24,7 +24,7 @@ void SkyboxPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredPr } void SkyboxPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, ScriptVec3UChar, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, u8vec3, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, url, QString, setURL); } @@ -71,7 +71,7 @@ bool SkyboxPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlag bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_SKYBOX_COLOR, Color); @@ -143,7 +143,7 @@ int SkyboxPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* d int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, ScriptVec3UChar, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); return bytesRead; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 447d36f842..6370dacba2 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -83,8 +83,8 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - static const ScriptVec3UChar DEFAULT_COLOR; - DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, ScriptVec3UChar, DEFAULT_COLOR); + static const glm::u8vec3 DEFAULT_COLOR; + DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, glm::u8vec3, DEFAULT_COLOR); DEFINE_PROPERTY_REF(PROP_SKYBOX_URL, URL, url, QString, ""); }; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 3423a6c03f..2a7c61d919 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -25,8 +25,8 @@ const QString TextEntityItem::DEFAULT_TEXT(""); const float TextEntityItem::DEFAULT_LINE_HEIGHT = 0.1f; -const ScriptVec3UChar TextEntityItem::DEFAULT_TEXT_COLOR = { 255, 255, 255 }; -const ScriptVec3UChar TextEntityItem::DEFAULT_BACKGROUND_COLOR = { 0, 0, 0}; +const glm::u8vec3 TextEntityItem::DEFAULT_TEXT_COLOR = { 255, 255, 255 }; +const glm::u8vec3 TextEntityItem::DEFAULT_BACKGROUND_COLOR = { 0, 0, 0}; const bool TextEntityItem::DEFAULT_FACE_CAMERA = false; EntityItemPointer TextEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -91,8 +91,8 @@ int TextEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY(PROP_TEXT_COLOR, ScriptVec3UChar, setTextColor); - READ_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, ScriptVec3UChar, setBackgroundColor); + READ_ENTITY_PROPERTY(PROP_TEXT_COLOR, glm::u8vec3, setTextColor); + READ_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, glm::u8vec3, setBackgroundColor); READ_ENTITY_PROPERTY(PROP_FACE_CAMERA, bool, setFaceCamera); return bytesRead; @@ -206,26 +206,26 @@ float TextEntityItem::getLineHeight() const { return result; } -void TextEntityItem::setTextColor(const ScriptVec3UChar& value) { +void TextEntityItem::setTextColor(const glm::u8vec3& value) { withWriteLock([&] { _textColor = value; }); } -ScriptVec3UChar TextEntityItem::getTextColor() const { - return resultWithReadLock([&] { +glm::u8vec3 TextEntityItem::getTextColor() const { + return resultWithReadLock([&] { return _textColor; }); } -void TextEntityItem::setBackgroundColor(const ScriptVec3UChar& value) { +void TextEntityItem::setBackgroundColor(const glm::u8vec3& value) { withWriteLock([&] { _backgroundColor = value; }); } -ScriptVec3UChar TextEntityItem::getBackgroundColor() const { - return resultWithReadLock([&] { +glm::u8vec3 TextEntityItem::getBackgroundColor() const { + return resultWithReadLock([&] { return _backgroundColor; }); } diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 2a186ad206..ca2623ec94 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -63,13 +63,13 @@ public: void setLineHeight(float value); float getLineHeight() const; - static const ScriptVec3UChar DEFAULT_TEXT_COLOR; - ScriptVec3UChar getTextColor() const; - void setTextColor(const ScriptVec3UChar& value); + static const glm::u8vec3 DEFAULT_TEXT_COLOR; + glm::u8vec3 getTextColor() const; + void setTextColor(const glm::u8vec3& value); - static const ScriptVec3UChar DEFAULT_BACKGROUND_COLOR; - ScriptVec3UChar getBackgroundColor() const; - void setBackgroundColor(const ScriptVec3UChar& value); + static const glm::u8vec3 DEFAULT_BACKGROUND_COLOR; + glm::u8vec3 getBackgroundColor() const; + void setBackgroundColor(const glm::u8vec3& value); static const bool DEFAULT_FACE_CAMERA; bool getFaceCamera() const; @@ -78,8 +78,8 @@ public: private: QString _text; float _lineHeight; - ScriptVec3UChar _textColor; - ScriptVec3UChar _backgroundColor; + glm::u8vec3 _textColor; + glm::u8vec3 _backgroundColor; bool _faceCamera; }; diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp index 6f40e9fbb4..2a84d8c9d6 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp @@ -367,8 +367,8 @@ namespace scriptable { obj.setProperty("metallic", material.metallic); obj.setProperty("scattering", material.scattering); obj.setProperty("unlit", material.unlit); - obj.setProperty("emissive", vec3ToScriptValue(engine, material.emissive)); - obj.setProperty("albedo", vec3ToScriptValue(engine, material.albedo)); + obj.setProperty("emissive", vec3FloatToScriptValue(engine, material.emissive)); + obj.setProperty("albedo", vec3FloatToScriptValue(engine, material.albedo)); obj.setProperty("emissiveMap", material.emissiveMap); obj.setProperty("albedoMap", material.albedoMap); obj.setProperty("opacityMap", material.opacityMap); diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index f961172b8a..05da50b3c9 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -373,9 +373,9 @@ bool OctreePacketData::appendValue(float value) { return success; } -bool OctreePacketData::appendValue(const ScriptVec2Float& value) { +bool OctreePacketData::appendValue(const glm::vec2& value) { const unsigned char* data = (const unsigned char*)&value; - int length = sizeof(ScriptVec2Float); + int length = sizeof(glm::vec2); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -384,9 +384,9 @@ bool OctreePacketData::appendValue(const ScriptVec2Float& value) { return success; } -bool OctreePacketData::appendValue(const ScriptVec3Float& value) { +bool OctreePacketData::appendValue(const glm::vec3& value) { const unsigned char* data = (const unsigned char*)&value; - int length = sizeof(ScriptVec3Float); + int length = sizeof(glm::vec3); bool success = append(data, length); if (success) { _bytesOfValues += length; @@ -395,18 +395,18 @@ bool OctreePacketData::appendValue(const ScriptVec3Float& value) { return success; } -bool OctreePacketData::appendValue(const ScriptVec3UChar& color) { +bool OctreePacketData::appendValue(const glm::u8vec3& color) { return appendColor(color.x, color.y, color.z); } -bool OctreePacketData::appendValue(const QVector& value) { +bool OctreePacketData::appendValue(const QVector& value) { uint16_t qVecSize = value.size(); bool success = appendValue(qVecSize); if (success) { - success = append((const unsigned char*)value.constData(), qVecSize * sizeof(ScriptVec3Float)); + success = append((const unsigned char*)value.constData(), qVecSize * sizeof(glm::vec3)); if (success) { - _bytesOfValues += qVecSize * sizeof(ScriptVec3Float); - _totalBytesOfValues += qVecSize * sizeof(ScriptVec3Float); + _bytesOfValues += qVecSize * sizeof(glm::vec3); + _totalBytesOfValues += qVecSize * sizeof(glm::vec3); } } return success; @@ -668,17 +668,17 @@ void OctreePacketData::debugBytes() { qCDebug(octree) << " _bytesReserved=" << _bytesReserved; } -int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::vec2& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } -int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::vec3& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } -int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::u8vec3& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } @@ -705,19 +705,19 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QUuid& return sizeof(length) + length; } -int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(uint16_t)); dataBytes += sizeof(length); // FIXME - this size check is wrong if we allow larger packets - if (length * sizeof(ScriptVec3Float) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { + if (length * sizeof(glm::vec3) > MAX_OCTREE_UNCOMRESSED_PACKET_SIZE) { result.resize(0); return sizeof(uint16_t); } result.resize(length); - memcpy(result.data(), dataBytes, length * sizeof(ScriptVec3Float)); - return sizeof(uint16_t) + length * sizeof(ScriptVec3Float); + memcpy(result.data(), dataBytes, length * sizeof(glm::vec3)); + return sizeof(uint16_t) + length * sizeof(glm::vec3); } int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 2b82712b01..46726d83a6 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -159,16 +159,16 @@ public: bool appendValue(float value); /// appends a vec2 to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const ScriptVec2Float& value); + bool appendValue(const glm::vec2& value); /// appends a non-position vector to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const ScriptVec3Float& value); + bool appendValue(const glm::vec3& value); /// appends a color to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const ScriptVec3UChar& value); + bool appendValue(const glm::u8vec3& value); /// appends a QVector of vec3s to the end of the stream, may fail if new data stream is too long to fit in packet - bool appendValue(const QVector& value); + bool appendValue(const QVector& value); /// appends a QVector of quats to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const QVector& value); @@ -258,12 +258,12 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, glm::quat& result) { int bytes = unpackOrientationQuatFromBytes(dataBytes, result); return bytes; } static int unpackDataFromBytes(const unsigned char* dataBytes, ShapeType& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } static int unpackDataFromBytes(const unsigned char* dataBytes, MaterialMappingMode& result) { memcpy(&result, dataBytes, sizeof(result)); return sizeof(result); } - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec2Float& result); - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3Float& result); - static int unpackDataFromBytes(const unsigned char* dataBytes, ScriptVec3UChar& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, glm::vec2& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, glm::vec3& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, glm::u8vec3& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QString& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QUuid& result); - static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 53da185ca6..cbc9b40129 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1061,7 +1061,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con updateVertices(id, points, QVector({ color })); } -void GeometryCache::updateVertices(int id, const QVector& points, const QVector& colors) { +void GeometryCache::updateVertices(int id, const QVector& points, const QVector& colors) { BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { details.clear(); @@ -1109,7 +1109,7 @@ void GeometryCache::updateVertices(int id, const QVector& point auto pointCount = points.size(); auto colorCount = colors.size(); for (auto i = 0; i < pointCount; i++) { - const glm::vec3& point = points[i].toGlm(); + const glm::vec3& point = points[i]; if (i < colorCount) { const glm::vec4& color = colors[i]; compactColor = ((int(color.x * 255.0f) & 0xFF)) | @@ -1136,11 +1136,11 @@ void GeometryCache::updateVertices(int id, const QVector& point #endif } -void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { +void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { updateVertices(id, points, QVector({ color })); } -void GeometryCache::updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color) { +void GeometryCache::updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color) { BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -1195,7 +1195,7 @@ void GeometryCache::updateVertices(int id, const QVector& point const glm::vec3 NORMAL(0.0f, 0.0f, 1.0f); for (int i = 0; i < points.size(); i++) { - glm::vec3 point = points[i].toGlm(); + glm::vec3 point = points[i]; glm::vec2 texCoord = texCoords[i]; *(vertex++) = point.x; *(vertex++) = point.y; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 9e1f4878bd..fcbf5ee128 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -346,9 +346,9 @@ public: void updateVertices(int id, const QVector& points, const glm::vec4& color); void updateVertices(int id, const QVector& points, const QVector& colors); - void updateVertices(int id, const QVector& points, const glm::vec4& color); - void updateVertices(int id, const QVector& points, const QVector& colors); - void updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color); + void updateVertices(int id, const QVector& points, const glm::vec4& color); + void updateVertices(int id, const QVector& points, const QVector& colors); + void updateVertices(int id, const QVector& points, const QVector& texCoords, const glm::vec4& color); void renderVertices(gpu::Batch& batch, gpu::Primitive primitiveType, int id); /// Set a batch to the simple pipeline, returning the previous pipeline diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 9788e2e91e..ba0d714f7a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -415,8 +415,8 @@ bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const g face = triangleSetFace; bestModelTriangle = triangleSetTriangle; bestWorldTriangle = triangleSetTriangle * meshToWorldMatrix; - extraInfo["worldIntersectionPoint"] = vec3ToVariant(worldIntersectionPoint); - extraInfo["meshIntersectionPoint"] = vec3ToVariant(meshIntersectionPoint); + extraInfo["worldIntersectionPoint"] = vec3toVariant(worldIntersectionPoint); + extraInfo["meshIntersectionPoint"] = vec3toVariant(meshIntersectionPoint); extraInfo["partIndex"] = partIndex; extraInfo["shapeID"] = shapeID; bestSubMeshIndex = subMeshIndex; @@ -435,15 +435,15 @@ bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const g extraInfo["subMeshIndex"] = bestSubMeshIndex; extraInfo["subMeshName"] = geometry.getModelNameOfMesh(bestSubMeshIndex); extraInfo["subMeshTriangleWorld"] = QVariantMap{ - { "v0", vec3ToVariant(bestWorldTriangle.v0) }, - { "v1", vec3ToVariant(bestWorldTriangle.v1) }, - { "v2", vec3ToVariant(bestWorldTriangle.v2) }, + { "v0", vec3toVariant(bestWorldTriangle.v0) }, + { "v1", vec3toVariant(bestWorldTriangle.v1) }, + { "v2", vec3toVariant(bestWorldTriangle.v2) }, }; - extraInfo["subMeshNormal"] = vec3ToVariant(bestModelTriangle.getNormal()); + extraInfo["subMeshNormal"] = vec3toVariant(bestModelTriangle.getNormal()); extraInfo["subMeshTriangle"] = QVariantMap{ - { "v0", vec3ToVariant(bestModelTriangle.v0) }, - { "v1", vec3ToVariant(bestModelTriangle.v1) }, - { "v2", vec3ToVariant(bestModelTriangle.v2) }, + { "v0", vec3toVariant(bestModelTriangle.v0) }, + { "v1", vec3toVariant(bestModelTriangle.v1) }, + { "v2", vec3toVariant(bestModelTriangle.v2) }, }; } } @@ -520,8 +520,8 @@ bool Model::findParabolaIntersectionAgainstSubMeshes(const glm::vec3& origin, co 0.5f * meshFrameAcceleration * triangleSetDistance * triangleSetDistance; glm::vec3 worldIntersectionPoint = origin + velocity * triangleSetDistance + 0.5f * acceleration * triangleSetDistance * triangleSetDistance; - extraInfo["worldIntersectionPoint"] = vec3ToVariant(worldIntersectionPoint); - extraInfo["meshIntersectionPoint"] = vec3ToVariant(meshIntersectionPoint); + extraInfo["worldIntersectionPoint"] = vec3toVariant(worldIntersectionPoint); + extraInfo["meshIntersectionPoint"] = vec3toVariant(meshIntersectionPoint); extraInfo["partIndex"] = partIndex; extraInfo["shapeID"] = shapeID; bestSubMeshIndex = subMeshIndex; @@ -540,15 +540,15 @@ bool Model::findParabolaIntersectionAgainstSubMeshes(const glm::vec3& origin, co extraInfo["subMeshIndex"] = bestSubMeshIndex; extraInfo["subMeshName"] = geometry.getModelNameOfMesh(bestSubMeshIndex); extraInfo["subMeshTriangleWorld"] = QVariantMap{ - { "v0", vec3ToVariant(bestWorldTriangle.v0) }, - { "v1", vec3ToVariant(bestWorldTriangle.v1) }, - { "v2", vec3ToVariant(bestWorldTriangle.v2) }, + { "v0", vec3toVariant(bestWorldTriangle.v0) }, + { "v1", vec3toVariant(bestWorldTriangle.v1) }, + { "v2", vec3toVariant(bestWorldTriangle.v2) }, }; - extraInfo["subMeshNormal"] = vec3ToVariant(bestModelTriangle.getNormal()); + extraInfo["subMeshNormal"] = vec3toVariant(bestModelTriangle.getNormal()); extraInfo["subMeshTriangle"] = QVariantMap{ - { "v0", vec3ToVariant(bestModelTriangle.v0) }, - { "v1", vec3ToVariant(bestModelTriangle.v1) }, - { "v2", vec3ToVariant(bestModelTriangle.v2) }, + { "v0", vec3toVariant(bestModelTriangle.v0) }, + { "v1", vec3toVariant(bestModelTriangle.v1) }, + { "v2", vec3toVariant(bestModelTriangle.v2) }, }; } } @@ -999,7 +999,7 @@ void Model::renderDebugMeshBoxes(gpu::Batch& batch) { if (_debugMeshBoxesID == GeometryCache::UNKNOWN_ID) { _debugMeshBoxesID = DependencyManager::get()->allocateID(); } - QVector points; + QVector points; glm::vec3 brn = box.getCorner(); glm::vec3 bln = brn + glm::vec3(box.getDimensions().x, 0, 0); diff --git a/libraries/script-engine/src/ModelScriptingInterface.cpp b/libraries/script-engine/src/ModelScriptingInterface.cpp index 1716ea72ff..ff0328367a 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.cpp +++ b/libraries/script-engine/src/ModelScriptingInterface.cpp @@ -192,7 +192,7 @@ QScriptValue ModelScriptingInterface::getVertex(MeshProxy* meshProxy, int vertex } glm::vec3 pos = vertexBufferView.get(vertexIndex); - return vec3ToScriptValue(_modelScriptEngine, pos); + return vec3FloatToScriptValue(_modelScriptEngine, pos); } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d5a8bb6a00..c007ba913a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -681,7 +681,7 @@ void ScriptEngine::init() { qScriptRegisterSequenceMetaType>(this); qScriptRegisterSequenceMetaType>(this); - qScriptRegisterSequenceMetaType>(this); + qScriptRegisterSequenceMetaType>(this); qScriptRegisterSequenceMetaType>(this); qScriptRegisterSequenceMetaType>(this); diff --git a/libraries/script-engine/src/SpatialEvent.cpp b/libraries/script-engine/src/SpatialEvent.cpp index 8520c0c485..33a261c087 100644 --- a/libraries/script-engine/src/SpatialEvent.cpp +++ b/libraries/script-engine/src/SpatialEvent.cpp @@ -33,9 +33,9 @@ SpatialEvent::SpatialEvent(const SpatialEvent& event) { QScriptValue SpatialEvent::toScriptValue(QScriptEngine* engine, const SpatialEvent& event) { QScriptValue obj = engine->newObject(); - obj.setProperty("locTranslation", vec3ToScriptValue(engine, event.locTranslation) ); + obj.setProperty("locTranslation", vec3FloatToScriptValue(engine, event.locTranslation) ); obj.setProperty("locRotation", quatToScriptValue(engine, event.locRotation) ); - obj.setProperty("absTranslation", vec3ToScriptValue(engine, event.absTranslation) ); + obj.setProperty("absTranslation", vec3FloatToScriptValue(engine, event.absTranslation) ); obj.setProperty("absRotation", quatToScriptValue(engine, event.absRotation) ); return obj; diff --git a/libraries/script-engine/src/TouchEvent.cpp b/libraries/script-engine/src/TouchEvent.cpp index be2a9e2c44..82b584c3ca 100644 --- a/libraries/script-engine/src/TouchEvent.cpp +++ b/libraries/script-engine/src/TouchEvent.cpp @@ -16,6 +16,8 @@ #include +#include "RegisteredMetaTypes.h" + TouchEvent::TouchEvent() : x(0.0f), y(0.0f), @@ -79,7 +81,7 @@ void TouchEvent::initWithQTouchEvent(const QTouchEvent& event) { touchAvgY += (float)tPoints[i].pos().y(); // add it to our points vector - ScriptVec2Float thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); + glm::vec2 thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); points << thisPoint; } touchAvgX /= (float)(touchPoints); @@ -218,7 +220,7 @@ QScriptValue TouchEvent::toScriptValue(QScriptEngine* engine, const TouchEvent& QScriptValue pointsObj = engine->newArray(); int index = 0; - foreach (ScriptVec2Float point, event.points) { + foreach (glm::vec2 point, event.points) { QScriptValue thisPoint = vec2FloatToScriptValue(engine, point); pointsObj.setProperty(index, thisPoint); index++; diff --git a/libraries/script-engine/src/TouchEvent.h b/libraries/script-engine/src/TouchEvent.h index 1898eef024..62cb1b1801 100644 --- a/libraries/script-engine/src/TouchEvent.h +++ b/libraries/script-engine/src/TouchEvent.h @@ -17,8 +17,6 @@ #include #include -#include - class QScriptValue; class QScriptEngine; @@ -42,7 +40,7 @@ public: bool isMeta; bool isAlt; int touchPoints; - QVector points; + QVector points; float radius; bool isPinching; bool isPinchOpening; diff --git a/libraries/shared/src/ColorUtils.h b/libraries/shared/src/ColorUtils.h index d73fb478c8..dd9fd8dcd6 100644 --- a/libraries/shared/src/ColorUtils.h +++ b/libraries/shared/src/ColorUtils.h @@ -18,13 +18,11 @@ #include "DependencyManager.h" -#include "RegisteredMetaTypes.h" - extern const float srgbToLinearLookupTable[256]; class ColorUtils { public: - inline static glm::vec3 toVec3(const ScriptVec3UChar& color); + inline static glm::vec3 toVec3(const glm::u8vec3& color); // Convert to gamma 2.2 space from linear inline static glm::vec3 toGamma22Vec3(const glm::vec3& linear); @@ -42,7 +40,7 @@ public: inline static float tosRGBFloat(const float& linear); }; -inline glm::vec3 ColorUtils::toVec3(const ScriptVec3UChar& color) { +inline glm::vec3 ColorUtils::toVec3(const glm::u8vec3& color) { const float ONE_OVER_255 = 1.0f / 255.0f; return glm::vec3(color.x * ONE_OVER_255, color.y * ONE_OVER_255, color.z * ONE_OVER_255); } diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index ea20c1c77c..f6951abb82 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -13,8 +13,6 @@ #include #include "NumericalConstants.h" -#include "RegisteredMetaTypes.h" - const vec3 Vectors::UNIT_X{ 1.0f, 0.0f, 0.0f }; const vec3 Vectors::UNIT_Y{ 0.0f, 1.0f, 0.0f }; const vec3 Vectors::UNIT_Z{ 0.0f, 0.0f, 1.0f }; @@ -450,22 +448,21 @@ glm::vec2 toGlm(const QPointF& pt) { return glm::vec2(pt.x(), pt.y()); } -glm::vec3 toGlm(const ScriptVec3UChar& color) { +glm::vec3 toGlm(const glm::u8vec3& color) { static const float MAX_COLOR = 255.0f; - return color.toGlm() / MAX_COLOR; + return glm::vec3(color) / MAX_COLOR; } -vec4 toGlm(const ScriptVec3UChar& color, float alpha) { +vec4 toGlm(const glm::u8vec3& color, float alpha) { static const float MAX_COLOR = 255.0f; - return vec4(color.toGlm() / MAX_COLOR, alpha); + return vec4(glm::vec3(color) / MAX_COLOR, alpha); } -ScriptVec3UChar scriptVec3UCharFromGlm(const glm::vec3 & color) { +glm::u8vec3 vec3UCharFromGlm(const glm::vec3 & color) { static const float MAX_COLOR = 255.0f; return { (uint8_t)(color.x * MAX_COLOR), (uint8_t)(color.y * MAX_COLOR), (uint8_t)(color.z * MAX_COLOR) }; } - glm::vec4 toGlm(const QColor& color) { return glm::vec4(color.redF(), color.greenF(), color.blueF(), color.alphaF()); } diff --git a/libraries/shared/src/GLMHelpers.h b/libraries/shared/src/GLMHelpers.h index b2b5226c7f..b2972c61d3 100644 --- a/libraries/shared/src/GLMHelpers.h +++ b/libraries/shared/src/GLMHelpers.h @@ -24,6 +24,7 @@ using glm::ivec2; using glm::ivec3; using glm::ivec4; using glm::uvec2; +using glm::u8vec3; using glm::uvec3; using glm::uvec4; using glm::mat3; @@ -33,8 +34,6 @@ using glm::vec3; using glm::vec4; using glm::quat; -class ScriptVec3UChar; - #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" @@ -176,12 +175,12 @@ bool isSimilarPosition(const glm::vec3& positionA, const glm::vec3& positionB, f uvec2 toGlm(const QSize& size); ivec2 toGlm(const QPoint& pt); vec2 toGlm(const QPointF& pt); -vec3 toGlm(const ScriptVec3UChar& color); +vec3 toGlm(const glm::u8vec3& color); vec4 toGlm(const QColor& color); ivec4 toGlm(const QRect& rect); -vec4 toGlm(const ScriptVec3UChar& color, float alpha); +vec4 toGlm(const glm::u8vec3& color, float alpha); -ScriptVec3UChar scriptVec3UCharFromGlm(const glm::vec3 & c); +glm::u8vec3 vec3UCharFromGlm(const glm::vec3 & c); QSize fromGlm(const glm::ivec2 & v); QMatrix4x4 fromGlm(const glm::mat4 & m); diff --git a/libraries/shared/src/JointData.h b/libraries/shared/src/JointData.h index 7fa0e5e8da..f4c8b89e7a 100644 --- a/libraries/shared/src/JointData.h +++ b/libraries/shared/src/JointData.h @@ -5,12 +5,10 @@ #include #include -#include "RegisteredMetaTypes.h" - class EntityJointData { public: glm::quat rotation; - ScriptVec3Float translation; + glm::vec3 translation; bool rotationSet = false; bool translationSet = false; }; diff --git a/libraries/shared/src/PointerEvent.cpp b/libraries/shared/src/PointerEvent.cpp index fb855922c2..d406c0f92a 100644 --- a/libraries/shared/src/PointerEvent.cpp +++ b/libraries/shared/src/PointerEvent.cpp @@ -230,16 +230,16 @@ void PointerEvent::fromScriptValue(const QScriptValue& object, PointerEvent& eve event._id = id.isNumber() ? (uint32_t)id.toNumber() : 0; glm::vec2 pos2D; - vec2FromScriptValue(object.property("pos2D"), event._pos2D); + vec2FloatFromScriptValue(object.property("pos2D"), event._pos2D); glm::vec3 pos3D; - vec3FromScriptValue(object.property("pos3D"), event._pos3D); + vec3FloatFromScriptValue(object.property("pos3D"), event._pos3D); glm::vec3 normal; - vec3FromScriptValue(object.property("normal"), event._normal); + vec3FloatFromScriptValue(object.property("normal"), event._normal); glm::vec3 direction; - vec3FromScriptValue(object.property("direction"), event._direction); + vec3FloatFromScriptValue(object.property("direction"), event._direction); QScriptValue button = object.property("button"); QString buttonStr = type.isString() ? button.toString() : "NoButtons"; diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 20ee2a52b8..5894671171 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -25,13 +25,11 @@ #include #include -int glmVec2MetaTypeId = qRegisterMetaType(); -int vec2FloatMetaTypeId = qRegisterMetaType(); -int glmVec3MetaTypeId = qRegisterMetaType(); -int vec3FloatMetaTypeId = qRegisterMetaType(); -int vec3UintMetaTypeId = qRegisterMetaType(); +int vec2FloatMetaTypeId = qRegisterMetaType(); +int vec3FloatMetaTypeId = qRegisterMetaType(); +int vec3UintMetaTypeId = qRegisterMetaType(); int vec4MetaTypeId = qRegisterMetaType(); -int qVectorVec3MetaTypeId = qRegisterMetaType>(); +int qVectorVec3MetaTypeId = qRegisterMetaType>(); int qVectorQuatMetaTypeId = qRegisterMetaType>(); int qVectorBoolMetaTypeId = qRegisterMetaType>(); int quatMetaTypeId = qRegisterMetaType(); @@ -43,16 +41,14 @@ int voidLambdaType = qRegisterMetaType>(); int variantLambdaType = qRegisterMetaType>(); void registerMetaTypes(QScriptEngine* engine) { - qScriptRegisterMetaType(engine, vec2ToScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, vec2FloatToScriptValue, vec2FloatFromScriptValue); - qScriptRegisterMetaType(engine, vec3ToScriptValue, vec3FromScriptValue); qScriptRegisterMetaType(engine, vec3FloatToScriptValue, vec3FloatFromScriptValue); qScriptRegisterMetaType(engine, vec3UCharToScriptValue, vec3UCharFromScriptValue); qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, mat4toScriptValue, mat4FromScriptValue); - qScriptRegisterMetaType(engine, qVectorVec3ToScriptValue, qVectorVec3FromScriptValue); + qScriptRegisterMetaType(engine, qVectorVec3FloatToScriptValue, qVectorVec3FloatFromScriptValue); qScriptRegisterMetaType(engine, qVectorQuatToScriptValue, qVectorQuatFromScriptValue); qScriptRegisterMetaType(engine, qVectorBoolToScriptValue, qVectorBoolFromScriptValue); qScriptRegisterMetaType(engine, qVectorFloatToScriptValue, qVectorFloatFromScriptValue); @@ -69,7 +65,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, aaCubeToScriptValue, aaCubeFromScriptValue); } -QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2) { +QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { auto prototype = engine->globalObject().property("__hifi_vec2_float__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( @@ -91,7 +87,7 @@ QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float return value; } -void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) { +void vec2FloatFromScriptValue(const QScriptValue& object, glm::vec2& vec2) { QScriptValue x = object.property("x"); if (!x.isValid()) { x = object.property("u"); @@ -112,37 +108,6 @@ void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2) vec2.y = y.toVariant().toFloat(); } -QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { - QScriptValue obj = engine->newObject(); - obj.setProperty("x", vec2.x); - obj.setProperty("y", vec2.y); - return obj; -} - -void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { - auto x = object.property("x"); - if (!x.isValid()) { - x = object.property("u"); - } - if (!x.isValid()) { - x = object.property("width"); - } - auto y = object.property("y"); - if (!y.isValid()) { - y = object.property("v"); - } - if (!y.isValid()) { - y = object.property("height"); - } - if (x.isValid() && y.isValid()) { - vec2.x = x.toVariant().toFloat(); - vec2.y = y.toVariant().toFloat(); - return; - } - - vec2 = glm::vec2(); -} - QVariant vec2ToVariant(const glm::vec2 &vec2) { if (vec2.x != vec2.x || vec2.y != vec2.y) { // if vec2 contains a NaN don't try to convert it @@ -196,7 +161,7 @@ glm::vec2 vec2FromVariant(const QVariant &object) { return vec2FromVariant(object, valid); } -QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float& vec3) { +QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const glm::vec3& vec3) { auto prototype = engine->globalObject().property("__hifi_vec3_float__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( @@ -225,46 +190,57 @@ QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float return value; } -void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) { - QScriptValue x = object.property("x"); - if (!x.isValid()) { - x = object.property("r"); - } - if (!x.isValid()) { - x = object.property("red"); - } - if (!x.isValid()) { - x = object.property("width"); - } +void vec3FloatFromScriptValue(const QScriptValue& object, glm::vec3& vec3) { + if (object.isString()) { + QColor qColor(object.toString()); + if (qColor.isValid()) { + vec3.x = qColor.red(); + vec3.y = qColor.green(); + vec3.z = qColor.blue(); + return; + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("r"); + } + if (!x.isValid()) { + x = object.property("red"); + } + if (!x.isValid()) { + x = object.property("width"); + } - QScriptValue y = object.property("y"); - if (!y.isValid()) { - y = object.property("g"); - } - if (!y.isValid()) { - y = object.property("green"); - } - if (!y.isValid()) { - y = object.property("height"); - } + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("g"); + } + if (!y.isValid()) { + y = object.property("green"); + } + if (!y.isValid()) { + y = object.property("height"); + } - QScriptValue z = object.property("z"); - if (!z.isValid()) { - z = object.property("b"); - } - if (!z.isValid()) { - z = object.property("blue"); - } - if (!z.isValid()) { - z = object.property("depth"); - } + QScriptValue z = object.property("z"); + if (!z.isValid()) { + z = object.property("b"); + } + if (!z.isValid()) { + z = object.property("blue"); + } + if (!z.isValid()) { + z = object.property("depth"); + } - vec3.x = x.toVariant().toFloat(); - vec3.y = y.toVariant().toFloat(); - vec3.z = z.toVariant().toFloat(); + vec3.x = x.toVariant().toFloat(); + vec3.y = y.toVariant().toFloat(); + vec3.z = z.toVariant().toFloat(); + return; + } } -QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar& vec3) { +QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3) { auto prototype = engine->globalObject().property("__hifi_vec3_uchar__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( @@ -293,13 +269,13 @@ QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar return value; } -void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) { +void vec3UCharFromScriptValue(const QScriptValue& object, glm::u8vec3& vec3) { if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = (uint8_t)qColor.red(); - vec3.y = (uint8_t)qColor.blue(); - vec3.z = (uint8_t)qColor.green(); + vec3.y = (uint8_t)qColor.green(); + vec3.z = (uint8_t)qColor.blue(); return; } } else { @@ -341,64 +317,9 @@ void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3) vec3.z = z.toVariant().toUInt(); return; } - vec3 = ScriptVec3UChar(); } -QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { - QScriptValue obj = engine->newObject(); - if (vec3.x != vec3.x || vec3.y != vec3.y || vec3.z != vec3.z) { - // if vec3 contains a NaN don't try to convert it - return obj; - } - obj.setProperty("x", vec3.x); - obj.setProperty("y", vec3.y); - obj.setProperty("z", vec3.z); - return obj; -} - -void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { - auto x = object.property("x"); - if (!x.isValid()) { - x = object.property("r"); - } - if (!x.isValid()) { - x = object.property("red"); - } - if (!x.isValid()) { - x = object.property("width"); - } - auto y = object.property("y"); - if (!y.isValid()) { - y = object.property("g"); - } - if (!y.isValid()) { - y = object.property("green"); - } - if (!y.isValid()) { - y = object.property("height"); - } - auto z = object.property("z"); - if (!z.isValid()) { - z = object.property("b"); - } - if (!z.isValid()) { - z = object.property("blue"); - } - if (!z.isValid()) { - z = object.property("depth"); - } - if (x.isValid() && y.isValid() && z.isValid()) { - vec3.x = x.toVariant().toFloat(); - vec3.y = y.toVariant().toFloat(); - vec3.z = z.toVariant().toFloat(); - return; - } - - vec3 = glm::vec3(); - return; -} - -QVariant vec3ToVariant(const glm::vec3& vec3) { +QVariant vec3toVariant(const glm::vec3& vec3) { if (vec3.x != vec3.x || vec3.y != vec3.y || vec3.z != vec3.z) { // if vec3 contains a NaN don't try to convert it return QVariant(); @@ -428,16 +349,16 @@ glm::vec3 vec3FromVariant(const QVariant& object, bool& valid) { QColor qColor(object.toString()); if (qColor.isValid()) { v.x = (uint8_t)qColor.red(); - v.y = (uint8_t)qColor.blue(); - v.z = (uint8_t)qColor.green(); + v.y = (uint8_t)qColor.green(); + v.z = (uint8_t)qColor.blue(); valid = true; } } else if (object.canConvert()) { QColor qColor = qvariant_cast(object); if (qColor.isValid()) { v.x = (uint8_t)qColor.red(); - v.y = (uint8_t)qColor.blue(); - v.z = (uint8_t)qColor.green(); + v.y = (uint8_t)qColor.green(); + v.z = (uint8_t)qColor.blue(); valid = true; } } else { @@ -594,7 +515,7 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { mat4[3][3] = object.property("r3c3").toVariant().toFloat(); } -QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector) { +QScriptValue qVectorVec3FloatToScriptValue(QScriptEngine* engine, const QVector& vector) { QScriptValue array = engine->newArray(); for (int i = 0; i < vector.size(); i++) { array.setProperty(i, vec3FloatToScriptValue(engine, vector.at(i))); @@ -602,23 +523,23 @@ QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector qVectorVec3FromScriptValue(const QScriptValue& array) { - QVector newVector; +QVector qVectorVec3FloatFromScriptValue(const QScriptValue& array) { + QVector newVector; int length = array.property("length").toInteger(); for (int i = 0; i < length; i++) { - ScriptVec3Float newVec3 = ScriptVec3Float(); + glm::vec3 newVec3 = glm::vec3(); vec3FloatFromScriptValue(array.property(i), newVec3); newVector << newVec3; } return newVector; } -void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector) { +void qVectorVec3FloatFromScriptValue(const QScriptValue& array, QVector& vector) { int length = array.property("length").toInteger(); for (int i = 0; i < length; i++) { - ScriptVec3Float newVec3 = ScriptVec3Float(); + glm::vec3 newVec3 = glm::vec3(); vec3FloatFromScriptValue(array.property(i), newVec3); vector << newVec3; } @@ -947,9 +868,9 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url) { QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) { QScriptValue obj = engine->newObject(); - QScriptValue origin = vec3ToScriptValue(engine, pickRay.origin); + QScriptValue origin = vec3FloatToScriptValue(engine, pickRay.origin); obj.setProperty("origin", origin); - QScriptValue direction = vec3ToScriptValue(engine, pickRay.direction); + QScriptValue direction = vec3FloatToScriptValue(engine, pickRay.direction); obj.setProperty("direction", direction); return obj; } @@ -993,9 +914,9 @@ QScriptValue collisionToScriptValue(QScriptEngine* engine, const Collision& coll obj.setProperty("type", collision.type); obj.setProperty("idA", quuidToScriptValue(engine, collision.idA)); obj.setProperty("idB", quuidToScriptValue(engine, collision.idB)); - obj.setProperty("penetration", vec3ToScriptValue(engine, collision.penetration)); - obj.setProperty("contactPoint", vec3ToScriptValue(engine, collision.contactPoint)); - obj.setProperty("velocityChange", vec3ToScriptValue(engine, collision.velocityChange)); + obj.setProperty("penetration", vec3FloatToScriptValue(engine, collision.penetration)); + obj.setProperty("contactPoint", vec3FloatToScriptValue(engine, collision.contactPoint)); + obj.setProperty("velocityChange", vec3FloatToScriptValue(engine, collision.velocityChange)); return obj; } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index c1d23e9877..413624aa34 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -25,13 +25,12 @@ #include "shared/Bilateral.h" #include "Transform.h" -#include -#include -#include "shared/JSONHelpers.h" - class QColor; class QUrl; +Q_DECLARE_METATYPE(glm::vec2) +Q_DECLARE_METATYPE(glm::u8vec3) +Q_DECLARE_METATYPE(glm::vec3) Q_DECLARE_METATYPE(glm::vec4) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(glm::mat4) @@ -53,41 +52,8 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * @property {number} x - X-coordinate of the vector. Synonyms: u and width. * @property {number} y - Y-coordinate of the vector. Synonyms: v and height. */ -class ScriptVec2Float { -public: - ScriptVec2Float() {} - ScriptVec2Float(float xy) : x(xy), y(xy) {} - ScriptVec2Float(float x, float y) : x(x), y(y) {} - ScriptVec2Float(const ScriptVec2Float& other) : x(other.x), y(other.y) {} - ScriptVec2Float(const glm::vec2& other) : x(other.x), y(other.y) {} - void operator=(const ScriptVec2Float& other) { x = other.x; y = other.y; } - inline bool operator==(const ScriptVec2Float& other) const { return (x == other.x && y == other.y); } - inline bool operator!=(const ScriptVec2Float& other) const { return !(*this == other); } - inline bool operator==(const glm::vec2& other) const { return (x == other.x && y == other.y); } - inline bool operator!=(const glm::vec2& other) const { return !(*this == other); } - - glm::vec2 toGlm() const { return glm::vec2(x, y); } - - float x { 0.0f }; - float y { 0.0f }; -private: - friend QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2); - friend bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2); - friend bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2); -}; -inline QDebug operator<<(QDebug debug, const ScriptVec2Float& vec2) { - debug << "{" << vec2.x << "," << vec2.y << "}"; - return debug; -} -inline bool operator==(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return (glmVec2.x == vec2.x && glmVec2.y == vec2.y); } -inline bool operator!=(glm::vec2 glmVec2, const ScriptVec2Float& vec2) { return !(glmVec2 == vec2); } -Q_DECLARE_METATYPE(ScriptVec2Float) -QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const ScriptVec2Float& vec2); -void vec2FloatFromScriptValue(const QScriptValue& object, ScriptVec2Float& vec2); - -Q_DECLARE_METATYPE(glm::vec2) -QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); -void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); +QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); +void vec2FloatFromScriptValue(const QScriptValue& object, glm::vec2& vec2); QVariant vec2ToVariant(const glm::vec2& vec2); glm::vec2 vec2FromVariant(const QVariant& object, bool& valid); @@ -101,38 +67,8 @@ glm::vec2 vec2FromVariant(const QVariant& object); * @property {number} y - Y-coordinate of the vector. Synonyms: g, green, and height. * @property {number} z - Z-coordinate of the vector. Synonyms: b, blue, and depth. */ -class ScriptVec3Float { -public: - ScriptVec3Float() {} - ScriptVec3Float(float xyz) : x(xyz), y(xyz), z(xyz) {} - ScriptVec3Float(float x, float y, float z) : x(x), y(y), z(z) {} - ScriptVec3Float(const ScriptVec3Float& other) : x(other.x), y(other.y), z(other.z) {} - ScriptVec3Float(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} - void operator=(const ScriptVec3Float& other) { x = other.x; y = other.y; z = other.z; } - inline bool operator==(const ScriptVec3Float& other) const { return (x == other.x && y == other.y && z == other.z); } - inline bool operator!=(const ScriptVec3Float& other) const { return !(*this == other); } - inline bool operator==(const glm::vec3& other) const { return (x == other.x && y == other.y && z == other.z); } - inline bool operator!=(const glm::vec3& other) const { return !(*this == other); } - - glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - - float x { 0.0f }; - float y { 0.0f }; - float z { 0.0f }; -private: - friend QDebug operator<<(QDebug debug, const ScriptVec3Float& vec3); - friend bool operator==(glm::vec3 glmVec3, const ScriptVec3Float& vec3); - friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3Float& vec3); -}; -inline QDebug operator<<(QDebug debug, const ScriptVec3Float& vec3) { - debug << "{" << vec3.x << "," << vec3.y << "," << vec3.z << "}"; - return debug; -} -inline bool operator==(glm::vec3 glmVec3, const ScriptVec3Float& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } -inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3Float& vec3) { return !(glmVec3 == vec3); } -Q_DECLARE_METATYPE(ScriptVec3Float) -QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const ScriptVec3Float& vec3); -void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3); +QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); +void vec3FloatFromScriptValue(const QScriptValue& object, glm::vec3& vec3); /**jsdoc * A color vector. See also the {@link Vec3(0)|Vec3} object. @@ -142,42 +78,10 @@ void vec3FloatFromScriptValue(const QScriptValue& object, ScriptVec3Float& vec3) * @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g, green, and height. * @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b, blue, and depth. */ -class ScriptVec3UChar { -public: - ScriptVec3UChar() {} - ScriptVec3UChar(unsigned int xyz) : x(xyz), y(xyz), z(xyz) {} - ScriptVec3UChar(unsigned int x, unsigned int y, unsigned int z) : x(x), y(y), z(z) {} - ScriptVec3UChar(const ScriptVec3UChar& other) : x(other.x), y(other.y), z(other.z) {} - ScriptVec3UChar(const glm::vec3& other) : x(other.x), y(other.y), z(other.z) {} - void operator=(const ScriptVec3UChar& other) { x = other.x; y = other.y; z = other.z; } - inline bool operator==(const ScriptVec3UChar& other) const { return (x == other.x && y == other.y && z == other.z); } - inline bool operator!=(const ScriptVec3UChar& other) const { return !(*this == other); } +QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); +void vec3UCharFromScriptValue(const QScriptValue& object, glm::u8vec3& vec3); - glm::vec3 toGlm() const { return glm::vec3(x, y, z); } - - unsigned char x { 0 }; - unsigned char y { 0 }; - unsigned char z { 0 }; -private: - friend QDebug operator<<(QDebug debug, const ScriptVec3UChar& vec3); - friend bool operator==(glm::vec3 glmVec3, const ScriptVec3UChar& vec3); - friend bool operator!=(glm::vec3 glmVec3, const ScriptVec3UChar& vec3); -}; -inline QDebug operator<<(QDebug debug, const ScriptVec3UChar& vec3) { - debug << "{" << vec3.x << "," << vec3.y << "," << vec3.z << "}"; - return debug; -} -inline bool operator==(glm::vec3 glmVec3, const ScriptVec3UChar& vec3) { return (glmVec3.x == vec3.x && glmVec3.y == vec3.y && glmVec3.z == vec3.z); } -inline bool operator!=(glm::vec3 glmVec3, const ScriptVec3UChar& vec3) { return !(glmVec3 == vec3); } -Q_DECLARE_METATYPE(ScriptVec3UChar) -QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const ScriptVec3UChar& vec3); -void vec3UCharFromScriptValue(const QScriptValue& object, ScriptVec3UChar& vec3); - -Q_DECLARE_METATYPE(glm::vec3) -QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); -void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3); - -QVariant vec3ToVariant(const glm::vec3& vec3); +QVariant vec3toVariant(const glm::vec3& vec3); glm::vec3 vec3FromVariant(const QVariant &object, bool& valid); glm::vec3 vec3FromVariant(const QVariant &object); @@ -219,12 +123,13 @@ QScriptValue qURLToScriptValue(QScriptEngine* engine, const QUrl& url); void qURLFromScriptValue(const QScriptValue& object, QUrl& url); // vector -Q_DECLARE_METATYPE(QVector) -QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); -void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector); -QVector qVectorVec3FromScriptValue(const QScriptValue& array); +Q_DECLARE_METATYPE(QVector) +QScriptValue qVectorVec3FloatToScriptValue(QScriptEngine* engine, const QVector& vector); +void qVectorVec3FloatFromScriptValue(const QScriptValue& array, QVector& vector); +QVector qVectorVec3FloatFromScriptValue(const QScriptValue& array); // vector +Q_DECLARE_METATYPE(QVector) QScriptValue qVectorQuatToScriptValue(QScriptEngine* engine, const QVector& vector); void qVectorQuatFromScriptValue(const QScriptValue& array, QVector& vector); QVector qVectorQuatFromScriptValue(const QScriptValue& array); @@ -280,8 +185,8 @@ public: } QVariantMap toVariantMap() const override { QVariantMap pickRay; - pickRay["origin"] = vec3ToVariant(origin); - pickRay["direction"] = vec3ToVariant(direction); + pickRay["origin"] = vec3toVariant(origin); + pickRay["direction"] = vec3toVariant(direction); return pickRay; } }; @@ -318,9 +223,9 @@ public: QVariantMap toVariantMap() const override { QVariantMap stylusTip; stylusTip["side"] = (int)side; - stylusTip["position"] = vec3ToVariant(position); + stylusTip["position"] = vec3toVariant(position); stylusTip["orientation"] = quatToVariant(orientation); - stylusTip["velocity"] = vec3ToVariant(velocity); + stylusTip["velocity"] = vec3toVariant(velocity); return stylusTip; } }; @@ -350,9 +255,9 @@ public: } QVariantMap toVariantMap() const override { QVariantMap pickParabola; - pickParabola["origin"] = vec3ToVariant(origin); - pickParabola["velocity"] = vec3ToVariant(velocity); - pickParabola["acceleration"] = vec3ToVariant(acceleration); + pickParabola["origin"] = vec3toVariant(origin); + pickParabola["velocity"] = vec3toVariant(velocity); + pickParabola["acceleration"] = vec3toVariant(acceleration); return pickParabola; } }; @@ -405,11 +310,11 @@ public: QVariantMap shape; shape["shapeType"] = ShapeInfo::getNameForShapeType(shapeInfo->getType()); shape["modelURL"] = modelURL.toString(); - shape["dimensions"] = vec3ToVariant(transform.getScale()); + shape["dimensions"] = vec3toVariant(transform.getScale()); collisionRegion["shape"] = shape; - collisionRegion["position"] = vec3ToVariant(transform.getTranslation()); + collisionRegion["position"] = vec3toVariant(transform.getTranslation()); collisionRegion["orientation"] = quatToVariant(transform.getRotation()); return collisionRegion; diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 5c042d87e1..34c675b25a 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -24,8 +24,6 @@ #include -#include "RegisteredMetaTypes.h" - #ifdef Q_OS_WIN #include #include "CPUIdent.h" @@ -421,7 +419,7 @@ unsigned char* pointToVoxel(float x, float y, float z, float s, unsigned char r, } auto voxelSizeInBytes = bytesRequiredForCodeLength(voxelSizeInOctets); // (voxelSizeInBits/8)+1; - auto voxelBufferSize = voxelSizeInBytes + sizeof(ScriptVec3UChar); // 3 for color + auto voxelBufferSize = voxelSizeInBytes + sizeof(glm::u8vec3); // 3 for color // allocate our resulting buffer unsigned char* voxelOut = new unsigned char[voxelBufferSize]; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 494283be2b..497a5bb5fd 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -19,8 +19,6 @@ #include "SpatialParentFinder.h" #include "shared/ReadWriteLockable.h" -#include "RegisteredMetaTypes.h" - class SpatiallyNestable; using SpatiallyNestableWeakPointer = std::weak_ptr; using SpatiallyNestableWeakConstPointer = std::weak_ptr; @@ -137,18 +135,15 @@ public: virtual void setLocalTransform(const Transform& transform); virtual glm::vec3 getLocalPosition() const; - virtual ScriptVec3Float getScriptLocalPosition() const { return getLocalPosition(); } virtual void setLocalPosition(const glm::vec3& position, bool tellPhysics = true); virtual glm::quat getLocalOrientation() const; virtual void setLocalOrientation(const glm::quat& orientation); virtual glm::vec3 getLocalVelocity() const; - virtual ScriptVec3Float getScriptLocalVelocity() const { return getLocalVelocity(); } virtual void setLocalVelocity(const glm::vec3& velocity); virtual glm::vec3 getLocalAngularVelocity() const; - virtual ScriptVec3Float getScriptLocalAngularVelocity() const { return getLocalAngularVelocity(); } virtual void setLocalAngularVelocity(const glm::vec3& angularVelocity); virtual glm::vec3 getLocalSNScale() const; diff --git a/libraries/shared/src/StreamUtils.cpp b/libraries/shared/src/StreamUtils.cpp index 9ed0e24593..abacb012e5 100644 --- a/libraries/shared/src/StreamUtils.cpp +++ b/libraries/shared/src/StreamUtils.cpp @@ -78,6 +78,11 @@ QDebug& operator<<(QDebug& dbg, const glm::vec3& v) { return dbg; } +QDebug& operator<<(QDebug& dbg, const glm::u8vec3& v) { + dbg.nospace() << '(' << v.x << ", " << v.y << ", " << v.z << ')'; + return dbg; +} + QDebug& operator<<(QDebug& dbg, const glm::vec4& v) { dbg.nospace() << '(' << v.x << ", " << v.y << ", " << v.z << ", " << v.w << ')'; return dbg; diff --git a/libraries/shared/src/StreamUtils.h b/libraries/shared/src/StreamUtils.h index caf7b565f4..b6d6c522c5 100644 --- a/libraries/shared/src/StreamUtils.h +++ b/libraries/shared/src/StreamUtils.h @@ -42,6 +42,7 @@ class QDebug; // Add support for writing these to qDebug(). QDebug& operator<<(QDebug& s, const glm::vec2& v); QDebug& operator<<(QDebug& s, const glm::vec3& v); +QDebug& operator<<(QDebug& s, const glm::u8vec3& v); QDebug& operator<<(QDebug& s, const glm::vec4& v); QDebug& operator<<(QDebug& s, const glm::quat& q); QDebug& operator<<(QDebug& s, const glm::mat4& m); From 49f5d5f2b7dd7fccb1a7bfc73733c12daf28b431 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Aug 2018 08:55:46 +1200 Subject: [PATCH 063/434] Display mini tablet rotated in palm --- scripts/system/miniTablet.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index ca665b888a..25a3389539 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -22,12 +22,12 @@ PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0046 }, // Proportional to tablet proper. PROXY_POSITION_LEFT_HAND = { x: 0, - y: 0.07, // Distance from joint. + y: 0.1, // Distance from joint. z: 0.07 // Distance above palm. }, PROXY_POSITION_RIGHT_HAND = { x: 0, - y: 0.07, // Distance from joint. + y: 0.1, // Distance from joint. z: 0.07 // Distance above palm. }, /* @@ -36,8 +36,8 @@ PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), */ // Aligned with palm. - PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), - PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: -40, y: 180, z: 0 }), + PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: -40, y: 180, z: 0 }), // UI overlay. proxyUIOverlay = null, @@ -79,7 +79,7 @@ { x: 0.5, y: -0.75, z: 0 }, { x: -0.5, y: -0.75, z: 0 } ], - PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -45, y: 0, z: 0 }), + PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -5, y: 0, z: 0 }), proxyExpandHand, proxyExpandLocalPosition, proxyExpandLocalRotation = Quat.IDENTITY, From f5c49026abebf14d166a7c6ef2bc5f0e545141f4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Aug 2018 09:49:42 +1200 Subject: [PATCH 064/434] Expand tablet after it's been released from grab by other hand --- scripts/system/miniTablet.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 25a3389539..c7f04cca11 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -64,10 +64,11 @@ PROXY_HIDING = 2, PROXY_SHOWING = 3, PROXY_VISIBLE = 4, - PROXY_EXPANDING = 5, - TABLET_OPEN = 6, - STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_HIDING", "PROXY_SHOWING", "PROXY_VISIBLE", "PROXY_EXPANDING", - "TABLET_OPEN"], + PROXY_GRABBED = 5, + PROXY_EXPANDING = 6, + TABLET_OPEN = 7, + STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_HIDING", "PROXY_SHOWING", "PROXY_VISIBLE", "PROXY_GRABBED", + "PROXY_EXPANDING", "TABLET_OPEN"], STATE_MACHINE, rezzerState = PROXY_DISABLED, proxyHand, @@ -513,6 +514,13 @@ } } + function updateProxyGrabbed() { + // Hide proxy if tablet has been displayed by other means. + if (HMD.showTablet) { + setState(PROXY_HIDDEN); + } + } + function expandProxy() { var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; if (scaleFactor < 1) { @@ -598,7 +606,12 @@ update: updateProxyVisible, exit: null }, - PROXY_EXPANDING: { // Tablet proxy has been grabbed and is expanding before showing tablet proper. + PROXY_GRABBED: { // Tablet proxy is grabbed by other hand. + enter: null, + update: updateProxyGrabbed, + exit: null + }, + PROXY_EXPANDING: { // Tablet proxy is expanding before showing tablet proper. enter: enterProxyExpanding, update: updateProxyExanding, exit: exitProxyExpanding @@ -655,6 +668,13 @@ } if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { + hand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); + if (hand === proxyHand) { + setState(PROXY_EXPANDING, hand); + } else { + setState(PROXY_GRABBED); + } + } else if (message.action === "release" && rezzerState === PROXY_GRABBED) { hand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); setState(PROXY_EXPANDING, hand); } From 91c1e1b27679f44b118c350a3f5d6be4465a3714 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Aug 2018 09:59:04 +1200 Subject: [PATCH 065/434] Different expansion points and delta rotations if grabbed by other hand --- scripts/system/miniTablet.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index c7f04cca11..efe33303a8 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -81,7 +81,14 @@ { x: -0.5, y: -0.75, z: 0 } ], PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -5, y: 0, z: 0 }), + PROXY_EXPAND_HANDLES_OTHER = [ // Different handles when expanding after being grabbed by other hand, + { x: 0.5, y: -0.4, z: 0 }, + { x: -0.5, y: -0.4, z: 0 } + ], + PROXY_EXPAND_DELTA_ROTATION_OTHER = Quat.IDENTITY, proxyExpandHand, + proxyExpandHandles = PROXY_EXPAND_HANDLES, + proxyExpandDeltaRotation = PROXY_EXPAND_HANDLES_OTHER, proxyExpandLocalPosition, proxyExpandLocalRotation = Quat.IDENTITY, PROXY_EXPAND_DURATION = 250, @@ -331,7 +338,7 @@ Vec3.sum(proxyExpandLocalPosition, Vec3.multiplyQbyV(proxyExpandLocalRotation, Vec3.multiply(-tabletScaleFactor, - Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))) + Vec3.multiplyVbyV(proxyExpandHandles[proxyExpandHand], PROXY_DIMENSIONS))) ); localPosition = Vec3.sum(localPosition, Vec3.multiplyQbyV(proxyExpandLocalRotation, { x: 0, y: 0.5 * -dimensions.y, z: 0 })); @@ -533,18 +540,27 @@ } function enterProxyExpanding(hand) { + // Expansion details. + if (hand === proxyHand) { + proxyExpandHandles = PROXY_EXPAND_HANDLES; + proxyExpandDeltaRotation = PROXY_EXPAND_DELTA_ROTATION; + } else { + proxyExpandHandles = PROXY_EXPAND_HANDLES_OTHER; + proxyExpandDeltaRotation = PROXY_EXPAND_DELTA_ROTATION_OTHER; + } + // Grab details. var properties = Overlays.getProperties(proxyOverlay, ["localPosition", "localRotation"]); proxyExpandHand = hand; proxyExpandLocalRotation = properties.localRotation; proxyExpandLocalPosition = Vec3.sum(properties.localPosition, Vec3.multiplyQbyV(proxyExpandLocalRotation, - Vec3.multiplyVbyV(PROXY_EXPAND_HANDLES[proxyExpandHand], PROXY_DIMENSIONS))); + Vec3.multiplyVbyV(proxyExpandHandles[proxyExpandHand], PROXY_DIMENSIONS))); // Start expanding. proxyInitialWidth = PROXY_DIMENSIONS.x; proxyTargetWidth = getTabletWidthFromSettings(); - proxyTargetLocalRotation = Quat.multiply(proxyExpandLocalRotation, PROXY_EXPAND_DELTA_ROTATION); + proxyTargetLocalRotation = Quat.multiply(proxyExpandLocalRotation, proxyExpandDeltaRotation); proxyExpandStart = Date.now(); proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); } From b338c9f6fa42f354c30294b6f499d87bfaa992b2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Aug 2018 22:10:24 +1200 Subject: [PATCH 066/434] Updated tiny table model and layout --- scripts/system/assets/models/tinyTablet.fbx | Bin 411712 -> 476000 bytes scripts/system/html/css/miniTablet.css | 54 ++++++++++---------- scripts/system/html/miniTablet.html | 4 +- scripts/system/miniTablet.js | 6 +-- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/scripts/system/assets/models/tinyTablet.fbx b/scripts/system/assets/models/tinyTablet.fbx index cdcdf8af3461946f9050f07f897312fb77f5ef38..4ad5d8760fcb2828ff0011eb2925066e9cd9d6ae 100644 GIT binary patch literal 476000 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%0DpIuU8KG@@UbK& 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.|9_K=*k&m*FjF(-ie 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

~y{jVIB$JG{1IMNo@mcB`e&CPw3 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 delta 151033 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ξhFML9FrF(}WHqzm`gwz7sl(6**E{vM=cJ4F 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 S{ixaLH{}lrH^yt5hyEXxI +

`
-
-

...

-
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 25a3389539..403511365b 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -19,7 +19,7 @@ var // Base overlay proxyOverlay = null, PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), - PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0046 }, // Proportional to tablet proper. + PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. PROXY_POSITION_LEFT_HAND = { x: 0, y: 0.1, // Distance from joint. @@ -42,12 +42,12 @@ // UI overlay. proxyUIOverlay = null, PROXY_UI_HTML = Script.resolvePath("./html/miniTablet.html"), - PROXY_UI_DIMENSIONS = { x: 0.0577, y: 0.0905 }, + PROXY_UI_DIMENSIONS = { x: 0.059, y: 0.0865 }, PROXY_UI_WIDTH_PIXELS = 150, METERS_TO_INCHES = 39.3701, PROXY_UI_DPI = PROXY_UI_WIDTH_PIXELS / (PROXY_UI_DIMENSIONS.x * METERS_TO_INCHES), PROXY_UI_OFFSET = 0.001, // Above model surface. - PROXY_UI_LOCAL_POSITION = { x: 0, y: 0, z: -(PROXY_DIMENSIONS.z / 2 + PROXY_UI_OFFSET) }, + PROXY_UI_LOCAL_POSITION = { x: 0.0002, y: 0.0024, z: -(PROXY_DIMENSIONS.z / 2 + PROXY_UI_OFFSET) }, PROXY_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), proxyUIOverlayEnabled = false, PROXY_UI_OVERLAY_ENABLED_DELAY = 500, From 15fcafa2f5babf9ec6ac53302c4cdc8e4c2af5ae Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Aug 2018 22:13:09 +1200 Subject: [PATCH 067/434] Use SVGs for buttons --- .../system/html/css/img/mt-bubble-a-hover.svg | 5 ++ .../html/css/img/mt-bubble-a-normal.svg | 5 ++ .../system/html/css/img/mt-bubble-i-hover.svg | 5 ++ .../html/css/img/mt-bubble-i-normal.svg | 5 ++ .../system/html/css/img/mt-expand-hover.svg | 31 +++++++ .../system/html/css/img/mt-expand-normal.svg | 31 +++++++ scripts/system/html/css/img/mt-mute-hover.svg | 5 ++ .../system/html/css/img/mt-mute-normal.svg | 5 ++ scripts/system/html/css/miniTablet.css | 82 +++++++++---------- scripts/system/html/miniTablet.html | 2 +- 10 files changed, 134 insertions(+), 42 deletions(-) create mode 100644 scripts/system/html/css/img/mt-bubble-a-hover.svg create mode 100644 scripts/system/html/css/img/mt-bubble-a-normal.svg create mode 100644 scripts/system/html/css/img/mt-bubble-i-hover.svg create mode 100644 scripts/system/html/css/img/mt-bubble-i-normal.svg create mode 100644 scripts/system/html/css/img/mt-expand-hover.svg create mode 100644 scripts/system/html/css/img/mt-expand-normal.svg create mode 100644 scripts/system/html/css/img/mt-mute-hover.svg create mode 100644 scripts/system/html/css/img/mt-mute-normal.svg diff --git a/scripts/system/html/css/img/mt-bubble-a-hover.svg b/scripts/system/html/css/img/mt-bubble-a-hover.svg new file mode 100644 index 0000000000..36abbf5c34 --- /dev/null +++ b/scripts/system/html/css/img/mt-bubble-a-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/img/mt-bubble-a-normal.svg b/scripts/system/html/css/img/mt-bubble-a-normal.svg new file mode 100644 index 0000000000..e6e8021bf5 --- /dev/null +++ b/scripts/system/html/css/img/mt-bubble-a-normal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/img/mt-bubble-i-hover.svg b/scripts/system/html/css/img/mt-bubble-i-hover.svg new file mode 100644 index 0000000000..e39dff3888 --- /dev/null +++ b/scripts/system/html/css/img/mt-bubble-i-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/img/mt-bubble-i-normal.svg b/scripts/system/html/css/img/mt-bubble-i-normal.svg new file mode 100644 index 0000000000..ef2591ba16 --- /dev/null +++ b/scripts/system/html/css/img/mt-bubble-i-normal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/img/mt-expand-hover.svg b/scripts/system/html/css/img/mt-expand-hover.svg new file mode 100644 index 0000000000..eea3487bd8 --- /dev/null +++ b/scripts/system/html/css/img/mt-expand-hover.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/html/css/img/mt-expand-normal.svg b/scripts/system/html/css/img/mt-expand-normal.svg new file mode 100644 index 0000000000..7b5b59a7c9 --- /dev/null +++ b/scripts/system/html/css/img/mt-expand-normal.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/html/css/img/mt-mute-hover.svg b/scripts/system/html/css/img/mt-mute-hover.svg new file mode 100644 index 0000000000..59c38ca5a0 --- /dev/null +++ b/scripts/system/html/css/img/mt-mute-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/img/mt-mute-normal.svg b/scripts/system/html/css/img/mt-mute-normal.svg new file mode 100644 index 0000000000..1f25bce9c6 --- /dev/null +++ b/scripts/system/html/css/img/mt-mute-normal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index 35a8354750..e633f93664 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -8,14 +8,6 @@ Distributed under the Apache License, Version 2.0. See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html */ -@font-face { - font-family: HiFi-Glyphs; - src: url(../../../../resources/fonts/hifi-glyphs.ttf), - url(../../../../fonts/hifi-glyphs.ttf), - url(../../../../interface/resources/fonts/hifi-glyphs.ttf), - url(../fonts/hifi-glyphs.ttf); -} - * { box-sizing: border-box; padding: 0; @@ -37,34 +29,14 @@ section { padding: 13px; } -section .button { +.button { width: 100%; height: 90px; - background-color: #252525; margin-top: 10px; text-align: center; - border-radius: 8px; } - section .button.off { - border: 2px solid #6a6a6a; - background-color: #303030; - } - - section .button.off:hover { - border: 2px solid #1fc6a6; - } - - section .button.on { - border: 2px solid #1fc6a6; - background-color: #1fc6a6; - } - - section .button.on:hover { - border: 2px solid #e3e3e3; - } - - section .button:first-child { + .button:first-child { margin-top: 0; } @@ -74,28 +46,56 @@ img { #mute { padding-top: 19px; + background-size: 100% 100%; } + #mute.off { + background-image: url("./img/mt-mute-normal.svg"); + } + + #mute.off:hover { + background-image: url("./img/mt-mute-hover.svg"); + } + #bubble { padding-top: 19px; + background-size: 100% 100%; } + #bubble.off { + background-image: url("./img/mt-bubble-i-normal.svg"); + } + + #bubble.off:hover { + background-image: url("./img/mt-bubble-i-hover.svg"); + } + + #bubble.on { + background-image: url("./img/mt-bubble-a-normal.svg"); + } + + #bubble.on:hover { + background-image: url("./img/mt-bubble-a-hover.svg"); + } + + #bubble img { + position: relative; + left: -2px; + } + #expand { position: absolute; - right: 13px; + right: 14px; bottom: 13px; width: 40px; height: 40px; - border-radius: 20px; + background-size: 100% 100%; } - #expand span { - display: inline-block; - transform: rotate(45deg); - position: relative; - left: 0; - top: 5px; - font-family: hifi-glyphs; - font-size: 24px; - color: #ffffff; + #expand.off { + background-image: url("./img/mt-expand-normal.svg"); } + + #expand.off:hover { + background-image: url("./img/mt-expand-hover.svg"); + } diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html index 1f18228987..4b3129fca9 100644 --- a/scripts/system/html/miniTablet.html +++ b/scripts/system/html/miniTablet.html @@ -23,7 +23,7 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.
-
`
+
From a5c3450bfcad201b95d044cae6cb0aeff90f63f1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 30 Aug 2018 13:43:31 +1200 Subject: [PATCH 068/434] Tweak mini tablet UI layout --- .../system/html/css/img/mt-bubble-a-hover.svg | 4 ++-- .../html/css/img/mt-bubble-a-normal.svg | 4 ++-- .../system/html/css/img/mt-bubble-i-hover.svg | 4 ++-- .../html/css/img/mt-bubble-i-normal.svg | 4 ++-- .../system/html/css/img/mt-expand-hover.svg | 24 +++++++++---------- .../system/html/css/img/mt-expand-normal.svg | 24 +++++++++---------- scripts/system/html/css/img/mt-mute-hover.svg | 4 ++-- .../system/html/css/img/mt-mute-normal.svg | 4 ++-- scripts/system/html/css/miniTablet.css | 13 ++++------ 9 files changed, 40 insertions(+), 45 deletions(-) diff --git a/scripts/system/html/css/img/mt-bubble-a-hover.svg b/scripts/system/html/css/img/mt-bubble-a-hover.svg index 36abbf5c34..88ddfff808 100644 --- a/scripts/system/html/css/img/mt-bubble-a-hover.svg +++ b/scripts/system/html/css/img/mt-bubble-a-hover.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-bubble-a-normal.svg b/scripts/system/html/css/img/mt-bubble-a-normal.svg index e6e8021bf5..3d9d0a1286 100644 --- a/scripts/system/html/css/img/mt-bubble-a-normal.svg +++ b/scripts/system/html/css/img/mt-bubble-a-normal.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-bubble-i-hover.svg b/scripts/system/html/css/img/mt-bubble-i-hover.svg index e39dff3888..c8c407139b 100644 --- a/scripts/system/html/css/img/mt-bubble-i-hover.svg +++ b/scripts/system/html/css/img/mt-bubble-i-hover.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-bubble-i-normal.svg b/scripts/system/html/css/img/mt-bubble-i-normal.svg index ef2591ba16..6be11c464e 100644 --- a/scripts/system/html/css/img/mt-bubble-i-normal.svg +++ b/scripts/system/html/css/img/mt-bubble-i-normal.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-expand-hover.svg b/scripts/system/html/css/img/mt-expand-hover.svg index eea3487bd8..97737f42c0 100644 --- a/scripts/system/html/css/img/mt-expand-hover.svg +++ b/scripts/system/html/css/img/mt-expand-hover.svg @@ -5,26 +5,26 @@ - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/scripts/system/html/css/img/mt-expand-normal.svg b/scripts/system/html/css/img/mt-expand-normal.svg index 7b5b59a7c9..8b849ecc70 100644 --- a/scripts/system/html/css/img/mt-expand-normal.svg +++ b/scripts/system/html/css/img/mt-expand-normal.svg @@ -5,26 +5,26 @@ - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/scripts/system/html/css/img/mt-mute-hover.svg b/scripts/system/html/css/img/mt-mute-hover.svg index 59c38ca5a0..909ecb0272 100644 --- a/scripts/system/html/css/img/mt-mute-hover.svg +++ b/scripts/system/html/css/img/mt-mute-hover.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-mute-normal.svg b/scripts/system/html/css/img/mt-mute-normal.svg index 1f25bce9c6..506756216f 100644 --- a/scripts/system/html/css/img/mt-mute-normal.svg +++ b/scripts/system/html/css/img/mt-mute-normal.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index e633f93664..3b01a45613 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -26,11 +26,11 @@ body { section { background-color: #404040; position: relative; - padding: 13px; + padding: 13px 9px; } .button { - width: 100%; + width: 128px; height: 90px; margin-top: 10px; text-align: center; @@ -41,7 +41,7 @@ section { } img { - width: 44px; + width: 46px; } #mute { @@ -78,14 +78,9 @@ img { background-image: url("./img/mt-bubble-a-hover.svg"); } - #bubble img { - position: relative; - left: -2px; - } - #expand { position: absolute; - right: 14px; + right: 12px; bottom: 13px; width: 40px; height: 40px; From ec20fb7edb21cbb0c9af41163c70eff93217826f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 30 Aug 2018 16:16:49 +1200 Subject: [PATCH 069/434] Reorient and reposition mini tablet --- scripts/system/miniTablet.js | 59 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 403511365b..b91b016caf 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -20,24 +20,22 @@ proxyOverlay = null, PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. - PROXY_POSITION_LEFT_HAND = { - x: 0, - y: 0.1, // Distance from joint. - z: 0.07 // Distance above palm. - }, - PROXY_POSITION_RIGHT_HAND = { - x: 0, - y: 0.1, // Distance from joint. - z: 0.07 // Distance above palm. - }, - /* - // Aligned cross-palm. - PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: 90 }), - PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: 0, y: 180, z: -90 }), - */ - // Aligned with palm. - PROXY_ROTATION_LEFT_HAND = Quat.fromVec3Degrees({ x: -40, y: 180, z: 0 }), - PROXY_ROTATION_RIGHT_HAND = Quat.fromVec3Degrees({ x: -40, y: 180, z: 0 }), + PROXY_POSITIONS = [ + { + x: -0.03, // Distance across hand. + y: 0.08, // Distance from joint. + z: 0.06 // Distance above palm. + }, + { + x: 0.03, // Distance across hand. + y: 0.08, // Distance from joint. + z: 0.06 // Distance above palm. + } + ], + PROXY_ROTATIONS = [ + Quat.fromVec3Degrees({ x: 0, y: 180 - 40, z: 90 }), + Quat.fromVec3Degrees({ x: 0, y: 180 + 40, z: -90 }), + ], // UI overlay. proxyUIOverlay = null, @@ -76,10 +74,10 @@ proxyScaleTimer = null, proxyScaleStart, PROXY_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. - { x: 0.5, y: -0.75, z: 0 }, - { x: -0.5, y: -0.75, z: 0 } + { x: 0.5, y: -0.65, z: 0 }, + { x: -0.5, y: -0.65, z: 0 } ], - PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -5, y: 0, z: 0 }), + PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 0, z: 0 }), proxyExpandHand, proxyExpandLocalPosition, proxyExpandLocalRotation = Quat.IDENTITY, @@ -284,9 +282,8 @@ Overlays.editOverlay(proxyOverlay, { parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(proxyHand), - localPosition: Vec3.multiply(avatarScale, - proxyHand === LEFT_HAND ? PROXY_POSITION_LEFT_HAND : PROXY_POSITION_RIGHT_HAND), - localRotation: proxyHand === LEFT_HAND ? PROXY_ROTATION_LEFT_HAND : PROXY_ROTATION_RIGHT_HAND, + localPosition: Vec3.multiply(avatarScale, PROXY_POSITIONS[proxyHand]), + localRotation: PROXY_ROTATIONS[proxyHand], dimensions: Vec3.multiply(initialScale, PROXY_DIMENSIONS), visible: true }); @@ -402,12 +399,14 @@ } function shouldShowProxy(hand) { - // Should show tablet proxy if hand is oriented toward the camera and the camera is oriented toward the proxy tablet. + // Should show proxy if it would be oriented toward the camera. var pose, jointIndex, handPosition, handOrientation, - cameraToHandDirection; + proxyPosition, + proxyOrientation, + proxyToCameraDirection; pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); if (!pose.valid) { @@ -418,9 +417,11 @@ handPosition = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); - cameraToHandDirection = Vec3.normalize(Vec3.subtract(handPosition, Camera.position)); - - return Vec3.dot(cameraToHandDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; + proxyPosition = Vec3.sum(handPosition, Vec3.multiply(avatarScale, + Vec3.multiplyQbyV(handOrientation, PROXY_POSITIONS[hand]))); + proxyOrientation = Quat.multiply(handOrientation, PROXY_ROTATIONS[hand]); + proxyToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, proxyPosition)); + return Vec3.dot(proxyToCameraDirection, Quat.getForward(proxyOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; } function enterProxyHidden() { From 9b75c7e07f5e3e7229f007455554e322bb87deeb Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 4 Sep 2018 17:20:05 -0700 Subject: [PATCH 070/434] trying to separate colors and vectors --- .../scripting/SelectionScriptingInterface.cpp | 8 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 22 +-- interface/src/ui/overlays/Cube3DOverlay.cpp | 2 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 2 +- interface/src/ui/overlays/Image3DOverlay.cpp | 2 +- interface/src/ui/overlays/ImageOverlay.cpp | 2 +- interface/src/ui/overlays/Line3DOverlay.cpp | 2 +- interface/src/ui/overlays/ModelOverlay.cpp | 2 +- interface/src/ui/overlays/Overlay.cpp | 2 +- interface/src/ui/overlays/Overlays.cpp | 8 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 2 +- .../src/ui/overlays/RectangleOverlay.cpp | 4 +- interface/src/ui/overlays/Shape3DOverlay.cpp | 2 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 +- interface/src/ui/overlays/Text3DOverlay.cpp | 4 +- interface/src/ui/overlays/TextOverlay.cpp | 4 +- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- libraries/animation/src/AnimVariant.cpp | 2 +- libraries/audio/src/AudioInjectorOptions.cpp | 4 +- libraries/avatars/src/AvatarData.cpp | 8 +- .../controllers/src/controllers/Pose.cpp | 12 +- libraries/entities/src/EntityEditFilters.cpp | 8 +- .../entities/src/EntityItemProperties.cpp | 100 +++++----- libraries/entities/src/EntityItemProperties.h | 11 +- .../entities/src/EntityItemPropertiesMacros.h | 59 ++++-- .../entities/src/EntityScriptingInterface.cpp | 8 +- libraries/entities/src/HazePropertyGroup.cpp | 16 +- libraries/entities/src/HazePropertyGroup.h | 4 +- .../entities/src/KeyLightPropertyGroup.cpp | 10 +- .../entities/src/KeyLightPropertyGroup.h | 2 +- .../entities/src/ParticleEffectEntityItem.cpp | 8 +- .../entities/src/SkyboxPropertyGroup.cpp | 8 +- libraries/entities/src/SkyboxPropertyGroup.h | 2 +- .../GraphicsScriptingInterface.cpp | 4 +- .../src/model-networking/MaterialCache.cpp | 4 +- .../src/ModelScriptingInterface.cpp | 2 +- libraries/script-engine/src/SpatialEvent.cpp | 4 +- libraries/script-engine/src/TouchEvent.cpp | 2 +- libraries/shared/src/PointerEvent.cpp | 8 +- libraries/shared/src/RegisteredMetaTypes.cpp | 184 +++++++++++++----- libraries/shared/src/RegisteredMetaTypes.h | 37 ++-- 41 files changed, 354 insertions(+), 225 deletions(-) diff --git a/interface/src/scripting/SelectionScriptingInterface.cpp b/interface/src/scripting/SelectionScriptingInterface.cpp index 44e67191ee..748583b639 100644 --- a/interface/src/scripting/SelectionScriptingInterface.cpp +++ b/interface/src/scripting/SelectionScriptingInterface.cpp @@ -482,10 +482,10 @@ bool SelectionHighlightStyle::fromVariantMap(const QVariantMap& properties) { /**jsdoc * @typedef {object} Selection.HighlightStyle - * @property {Vec3Color} outlineUnoccludedColor - Color of the specified highlight region. - * @property {Vec3Color} outlineOccludedColor - "" - * @property {Vec3Color} fillUnoccludedColor- "" - * @property {Vec3Color} fillOccludedColor- "" + * @property {Color} outlineUnoccludedColor - Color of the specified highlight region. + * @property {Color} outlineOccludedColor - "" + * @property {Color} fillUnoccludedColor- "" + * @property {Color} fillOccludedColor- "" * @property {number} outlineUnoccludedAlpha - Alpha value ranging from 0.0 (not visible) to 1.0 * (fully opaque) for the specified highlight region. * @property {number} outlineOccludedAlpha - "" diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 3bac00d118..121d3d1e0d 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -406,20 +406,20 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { * @property {number} endAt=360 - The counter-clockwise angle from the overlay's x-axis that drawing ends at, in degrees. * @property {number} outerRadius=1 - The outer radius of the overlay, in meters. Synonym: radius. * @property {number} innerRadius=0 - The inner radius of the overlay, in meters. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. Setting this value also sets the values of + * @property {Color} color=255,255,255 - The color of the overlay. Setting this value also sets the values of * innerStartColor, innerEndColor, outerStartColor, and outerEndColor. - * @property {Vec3Color} startColor - Sets the values of innerStartColor and outerStartColor. + * @property {Color} startColor - Sets the values of innerStartColor and outerStartColor. * Write-only. - * @property {Vec3Color} endColor - Sets the values of innerEndColor and outerEndColor. + * @property {Color} endColor - Sets the values of innerEndColor and outerEndColor. * Write-only. - * @property {Vec3Color} innerColor - Sets the values of innerStartColor and innerEndColor. + * @property {Color} innerColor - Sets the values of innerStartColor and innerEndColor. * Write-only. - * @property {Vec3Color} outerColor - Sets the values of outerStartColor and outerEndColor. + * @property {Color} outerColor - Sets the values of outerStartColor and outerEndColor. * Write-only. - * @property {Vec3Color} innerStartcolor - The color at the inner start point of the overlay. - * @property {Vec3Color} innerEndColor - The color at the inner end point of the overlay. - * @property {Vec3Color} outerStartColor - The color at the outer start point of the overlay. - * @property {Vec3Color} outerEndColor - The color at the outer end point of the overlay. + * @property {Color} innerStartcolor - The color at the inner start point of the overlay. + * @property {Color} innerEndColor - The color at the inner end point of the overlay. + * @property {Color} outerStartColor - The color at the outer start point of the overlay. + * @property {Color} outerEndColor - The color at the outer end point of the overlay. * @property {number} alpha=0.5 - The opacity of the overlay, 0.0 - 1.0. Setting this value also sets * the values of innerStartAlpha, innerEndAlpha, outerStartAlpha, and * outerEndAlpha. Synonym: Alpha; write-only. @@ -443,8 +443,8 @@ void Circle3DOverlay::setProperties(const QVariantMap& properties) { * outwards from the inner radius; a negative value draws tick marks inwards from the outer radius. * @property {number} minorTickMarksLength=0 - The length of the minor tick marks, in meters. A positive value draws tick marks * outwards from the inner radius; a negative value draws tick marks inwards from the outer radius. - * @property {Vec3Color} majorTickMarksColor=0,0,0 - The color of the major tick marks. - * @property {Vec3Color} minorTickMarksColor=0,0,0 - The color of the minor tick marks. + * @property {Color} majorTickMarksColor=0,0,0 - The color of the major tick marks. + * @property {Color} minorTickMarksColor=0,0,0 - The color of the minor tick marks. */ QVariant Circle3DOverlay::getProperty(const QString& property) { if (property == "startAt") { diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 64e719df68..581db672a3 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -129,7 +129,7 @@ void Cube3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.CubeProperties * * @property {string} type=cube - Has the value "cube". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index daf0831f27..87ab0fb2e8 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -115,7 +115,7 @@ void Grid3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.GridProperties * * @property {string} type=grid - Has the value "grid". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index 5480a611b3..18da15f019 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -187,7 +187,7 @@ void Image3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Image3DProperties * * @property {string} type=image3d - Has the value "image3d". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 3c04de8568..19f32511f6 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -35,7 +35,7 @@ QUrl const ImageOverlay::URL(QString("hifi/overlays/ImageOverlay.qml")); * Write-only. * @property {Vec2} subImage=0,0 - Integer coordinates of the top left pixel to start using image content from. * Write-only. - * @property {Vec3Color} color=0,0,0 - The color to apply over the top of the image to colorize it. Write-only. + * @property {Color} color=0,0,0 - The color to apply over the top of the image to colorize it. Write-only. * @property {number} alpha=0.0 - The opacity of the color applied over the top of the image, 0.0 - * 1.0. Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 4019c8d084..e6546686b0 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -259,7 +259,7 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { * @typedef {object} Overlays.Line3DProperties * * @property {string} type=line3d - Has the value "line3d". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 6ebda067a2..eee8222051 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -353,7 +353,7 @@ vectorType ModelOverlay::mapJoints(mapFunction function) const { * @typedef {object} Overlays.ModelProperties * * @property {string} type=sphere - Has the value "model". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index b2f08b57bb..ac720ea90b 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -95,7 +95,7 @@ void Overlay::setProperties(const QVariantMap& properties) { // JSDoc for copying to @typedefs of overlay types that inherit Overlay. /**jsdoc * @property {string} type=TODO - Has the value "TODO". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 5c6598dd88..e05c44c264 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -629,9 +629,9 @@ QScriptValue RayToOverlayIntersectionResultToScriptValue(QScriptEngine* engine, obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -646,11 +646,11 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FloatFromScriptValue(intersection, value.intersection); + vec3FromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 8f62b53453..73606c0467 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -111,7 +111,7 @@ const render::ShapeKey Rectangle3DOverlay::getShapeKey() { * @typedef {object} Overlays.Rectangle3DProperties * * @property {string} type=rectangle3d - Has the value "rectangle3d". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/RectangleOverlay.cpp b/interface/src/ui/overlays/RectangleOverlay.cpp index 356457a50f..af37a4ac02 100644 --- a/interface/src/ui/overlays/RectangleOverlay.cpp +++ b/interface/src/ui/overlays/RectangleOverlay.cpp @@ -22,12 +22,12 @@ QUrl const RectangleOverlay::URL(QString("hifi/overlays/RectangleOverlay.qml")); * @property {number} width - Integer width of the rectangle = bounds.width. Write-only. * @property {number} height - Integer height of the rectangle = bounds.height. Write-only. * - * @property {Vec3Color} color=0,0,0 - The color of the overlay. Write-only. + * @property {Color} color=0,0,0 - The color of the overlay. Write-only. * @property {number} alpha=1.0 - The opacity of the overlay, 0.0 - 1.0. Write-only. * @property {number} borderWidth=1 - Integer width of the border, in pixels. The border is drawn within the rectangle's bounds. * It is not drawn unless either borderColor or borderAlpha are specified. Write-only. * @property {number} radius=0 - Integer corner radius, in pixels. Write-only. - * @property {Vec3Color} borderColor=0,0,0 - The color of the border. Write-only. + * @property {Color} borderColor=0,0,0 - The color of the border. Write-only. * @property {number} borderAlpha=1.0 - The opacity of the border, 0.0 - 1.0. * Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index fd33cd6c5d..b424424369 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -131,7 +131,7 @@ void Shape3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.ShapeProperties * * @property {string} type=shape - Has the value "shape". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 6cc9aad9e7..97294ae871 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -32,7 +32,7 @@ Sphere3DOverlay::Sphere3DOverlay(const Sphere3DOverlay* Sphere3DOverlay) : * @typedef {object} Overlays.SphereProperties * * @property {string} type=sphere - Has the value "sphere". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index ec3f9eba34..1418c94ae8 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -198,7 +198,7 @@ void Text3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Text3DProperties * * @property {string} type=text3d - Has the value "text3d". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. @@ -241,7 +241,7 @@ void Text3DOverlay::setProperties(const QVariantMap& properties) { * * @property {string} text="" - The text to display. Text does not automatically wrap; use \n for a line break. * @property {number} textAlpha=1 - The text alpha value. - * @property {Vec3Color} backgroundColor=0,0,0 - The background color. + * @property {Color} backgroundColor=0,0,0 - The background color. * @property {number} backgroundAlpha=0.7 - The background alpha value. * @property {number} lineHeight=1 - The height of a line of text in meters. * @property {number} leftMargin=0.1 - The left margin, in meters. diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 5e7f648320..e7641ab2c2 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -48,9 +48,9 @@ QUrl const TextOverlay::URL(QString("hifi/overlays/TextOverlay.qml")); * is clipped to the bounds. Write-only. * @property {number} font.size=18 - The size of the text, in pixels. Write-only. * @property {number} lineHeight=18 - The height of a line of text, in pixels. Write-only. - * @property {Vec3Color} color=255,255,255 - The color of the text. Synonym: textColor. Write-only. + * @property {Color} color=255,255,255 - The color of the text. Synonym: textColor. Write-only. * @property {number} alpha=1.0 - The opacity of the overlay, 0.0 - 1.0. Write-only. - * @property {Vec3Color} backgroundColor=0,0,0 - The color of the background rectangle. Write-only. + * @property {Color} backgroundColor=0,0,0 - The color of the background rectangle. Write-only. * @property {number} backgroundAlpha=0.7 - The opacity of the background rectangle. Write-only. * @property {boolean} visible=true - If true, the overlay is rendered, otherwise it is not rendered. * Write-only. diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 3df26735f0..c16b4c016d 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -517,7 +517,7 @@ void Web3DOverlay::setProperties(const QVariantMap& properties) { * @typedef {object} Overlays.Web3DProperties * * @property {string} type=web3d - Has the value "web3d". Read-only. - * @property {Vec3Color} color=255,255,255 - The color of the overlay. + * @property {Color} color=255,255,255 - The color of the overlay. * @property {number} alpha=0.7 - The opacity of the overlay, 0.0 - 1.0. * @property {number} pulseMax=0 - The maximum value of the pulse multiplier. * @property {number} pulseMin=0 - The minimum value of the pulse multiplier. diff --git a/libraries/animation/src/AnimVariant.cpp b/libraries/animation/src/AnimVariant.cpp index 4c0d15f06b..a9294aa00f 100644 --- a/libraries/animation/src/AnimVariant.cpp +++ b/libraries/animation/src/AnimVariant.cpp @@ -40,7 +40,7 @@ QScriptValue AnimVariantMap::animVariantMapToScriptValue(QScriptEngine* engine, target.setProperty(name, value.getString()); break; case AnimVariant::Type::Vec3: - target.setProperty(name, vec3FloatToScriptValue(engine, value.getVec3())); + target.setProperty(name, vec3ToScriptValue(engine, value.getVec3())); break; case AnimVariant::Type::Quat: target.setProperty(name, quatToScriptValue(engine, value.getQuat())); diff --git a/libraries/audio/src/AudioInjectorOptions.cpp b/libraries/audio/src/AudioInjectorOptions.cpp index 296b7b7f8f..295da1506e 100644 --- a/libraries/audio/src/AudioInjectorOptions.cpp +++ b/libraries/audio/src/AudioInjectorOptions.cpp @@ -34,7 +34,7 @@ AudioInjectorOptions::AudioInjectorOptions() : QScriptValue injectorOptionsToScriptValue(QScriptEngine* engine, const AudioInjectorOptions& injectorOptions) { QScriptValue obj = engine->newObject(); - obj.setProperty("position", vec3FloatToScriptValue(engine, injectorOptions.position)); + obj.setProperty("position", vec3ToScriptValue(engine, injectorOptions.position)); obj.setProperty("volume", injectorOptions.volume); obj.setProperty("loop", injectorOptions.loop); obj.setProperty("orientation", quatToScriptValue(engine, injectorOptions.orientation)); @@ -73,7 +73,7 @@ void injectorOptionsFromScriptValue(const QScriptValue& object, AudioInjectorOpt it.next(); if (it.name() == "position") { - vec3FloatFromScriptValue(object.property("position"), injectorOptions.position); + vec3FromScriptValue(object.property("position"), injectorOptions.position); } else if (it.name() == "orientation") { quatFromScriptValue(object.property("orientation"), injectorOptions.orientation); } else if (it.name() == "volume") { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 90a735fe17..c326284fc6 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2825,10 +2825,10 @@ QScriptValue RayToAvatarIntersectionResultToScriptValue(QScriptEngine* engine, c obj.setProperty("avatarID", avatarIDValue); obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -2843,11 +2843,11 @@ void RayToAvatarIntersectionResultFromScriptValue(const QScriptValue& object, Ra QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FloatFromScriptValue(intersection, value.intersection); + vec3FromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } diff --git a/libraries/controllers/src/controllers/Pose.cpp b/libraries/controllers/src/controllers/Pose.cpp index abe76ea38e..6df4b4af81 100644 --- a/libraries/controllers/src/controllers/Pose.cpp +++ b/libraries/controllers/src/controllers/Pose.cpp @@ -41,10 +41,10 @@ namespace controller { */ QScriptValue Pose::toScriptValue(QScriptEngine* engine, const Pose& pose) { QScriptValue obj = engine->newObject(); - obj.setProperty("translation", vec3FloatToScriptValue(engine, pose.translation)); + obj.setProperty("translation", vec3ToScriptValue(engine, pose.translation)); obj.setProperty("rotation", quatToScriptValue(engine, pose.rotation)); - obj.setProperty("velocity", vec3FloatToScriptValue(engine, pose.velocity)); - obj.setProperty("angularVelocity", vec3FloatToScriptValue(engine, pose.angularVelocity)); + obj.setProperty("velocity", vec3ToScriptValue(engine, pose.velocity)); + obj.setProperty("angularVelocity", vec3ToScriptValue(engine, pose.angularVelocity)); obj.setProperty("valid", pose.valid); return obj; } @@ -58,10 +58,10 @@ namespace controller { rotation.isValid() && velocity.isValid() && angularVelocity.isValid()) { - vec3FloatFromScriptValue(translation, pose.translation); + vec3FromScriptValue(translation, pose.translation); quatFromScriptValue(rotation, pose.rotation); - vec3FloatFromScriptValue(velocity, pose.velocity); - vec3FloatFromScriptValue(angularVelocity, pose.angularVelocity); + vec3FromScriptValue(velocity, pose.velocity); + vec3FromScriptValue(angularVelocity, pose.angularVelocity); pose.valid = true; } else { pose.valid = false; diff --git a/libraries/entities/src/EntityEditFilters.cpp b/libraries/entities/src/EntityEditFilters.cpp index 3396e91452..6f7e012bc4 100644 --- a/libraries/entities/src/EntityEditFilters.cpp +++ b/libraries/entities/src/EntityEditFilters.cpp @@ -104,10 +104,10 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper AABox aaBox = zoneEntity->getAABox(success); if (success) { QScriptValue boundingBox = filterData.engine->newObject(); - QScriptValue bottomRightNear = vec3FloatToScriptValue(filterData.engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3FloatToScriptValue(filterData.engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3FloatToScriptValue(filterData.engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3FloatToScriptValue(filterData.engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3ToScriptValue(filterData.engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3ToScriptValue(filterData.engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3ToScriptValue(filterData.engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3ToScriptValue(filterData.engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 66b2963add..feaf4a9a81 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -675,7 +675,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-Light * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Entity surface outside these dimensions are not lit * by the light. - * @property {Vec3Color} color=255,255,255 - The color of the light emitted. + * @property {Color} color=255,255,255 - The color of the light emitted. * @property {number} intensity=1 - The brightness of the light. * @property {number} falloffRadius=0.1 - The distance from the light's center at which intensity is reduced by 25%. * @property {boolean} isSpotlight=false - If true then the light is directional, emitting along the entity's @@ -708,7 +708,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * position. A maximum of 70 points can be specified. The property's value is set only if all the linePoints * lie within the entity's dimensions. * @property {number} lineWidth=2 - Currently not used. - * @property {Vec3Color} color=255,255,255 - The color of the line. + * @property {Color} color=255,255,255 - The color of the line. * @example Draw lines in a "V". * var entity = Entities.addEntity({ * type: "Line", @@ -789,7 +789,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. When adding an entity, if no dimensions * value is specified then the model is automatically sized to its * {@link Entities.EntityProperties|naturalDimensions}. - * @property {Vec3Color} color=255,255,255 - Currently not used. + * @property {Color} color=255,255,255 - Currently not used. * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx".
* Note: If the name ends with "default-image-model.fbx" then the entity is considered to be an "Image" * entity, in which case the textures property should be set per the example. @@ -915,12 +915,12 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {number} radiusSpread=0 - The spread in radius that each particle is given. If particleRadius == 0.5 * and radiusSpread == 0.25, each particle will have a radius in the range 0.25 – * 0.75. - * @property {Vec3Color} color=255,255,255 - The color of each particle at the middle of its life. - * @property {Vec3Color} colorStart={} - The color of each particle at the start of its life. If any of the component values are + * @property {Color} color=255,255,255 - The color of each particle at the middle of its life. + * @property {ColorFloat} colorStart={} - The color of each particle at the start of its life. If any of the component values are * undefined, the color value is used. - * @property {Vec3Color} colorFinish={} - The color of each particle at the end of its life. If any of the component values are + * @property {ColorFloat} colorFinish={} - The color of each particle at the end of its life. If any of the component values are * undefined, the color value is used. - * @property {Vec3Color} colorSpread=0,0,0 - The spread in color that each particle is given. If + * @property {Color} colorSpread=0,0,0 - The spread in color that each particle is given. If * color == {red: 100, green: 100, blue: 100} and colorSpread == * {red: 10, green: 25, blue: 50}, each particle will have a color in the range * {red: 90, green: 75, blue: 50}{red: 110, green: 125, blue: 150}. @@ -977,7 +977,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * order for the entity to render. * @property {number} lineWidth=2 - Currently not used. * @property {Vec3[]} strokeColors=[]] - Currently not used. - * @property {Vec3Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for + * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for * rendering. * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG * format. @@ -1066,7 +1066,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-Shape * @property {Entities.Shape} shape="Sphere" - The shape of the entity. * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. - * @property {Vec3Color} color=255,255,255 - The color of the entity. + * @property {Color} color=255,255,255 - The color of the entity. * @example Create a cylinder. * var shape = Entities.addEntity({ * type: "Shape", @@ -1094,8 +1094,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {string} text="" - The text to display on the face of the entity. Text wraps if necessary to fit. New lines can be * created using \n. Overflowing lines are not displayed. * @property {number} lineHeight=0.1 - The height of each line of text (thus determining the font size). - * @property {Vec3Color} textColor=255,255,255 - The color of the text. - * @property {Vec3Color} backgroundColor=0,0,0 - The color of the background rectangle. + * @property {Color} textColor=255,255,255 - The color of the text. + * @property {Color} backgroundColor=0,0,0 - The color of the background rectangle. * @property {boolean} faceCamera=false - If true, the entity is oriented to face each user's camera (i.e., it * differs for each user present). * @example Create a text entity. @@ -1320,10 +1320,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_SPREAD, radiusSpread); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_START, radiusStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_FINISH, radiusFinish); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_SPREAD, colorSpread); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_START, colorStart); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR_FINISH, colorFinish); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_SPREAD, colorSpread, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_START, colorStart, vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_FINISH, colorFinish, vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_SPREAD, alphaSpread); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_START, alphaStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_FINISH, alphaFinish); @@ -1344,7 +1344,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS, jointTranslations); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RELAY_PARENT_JOINTS, relayParentJoints); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); } if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) { @@ -1361,7 +1361,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (_type == EntityTypes::Box || _type == EntityTypes::Sphere || _type == EntityTypes::Shape) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); } // FIXME - it seems like ParticleEffect should also support this @@ -1376,7 +1376,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Lights only if (_type == EntityTypes::Light) { - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_INTENSITY, intensity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FALLOFF_RADIUS, falloffRadius); @@ -1388,8 +1388,8 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (_type == EntityTypes::Text) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXT, text); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_HEIGHT, lineHeight); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_TEXT_COLOR, textColor, getTextColor()); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_BACKGROUND_COLOR, backgroundColor, getBackgroundColor()); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_TYPED(PROP_TEXT_COLOR, textColor, getTextColor(), u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_TYPED(PROP_BACKGROUND_COLOR, backgroundColor, getBackgroundColor(), u8vec3Color); } // Zones only @@ -1440,11 +1440,11 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Lines & PolyLines if (_type == EntityTypes::Line || _type == EntityTypes::PolyLine) { - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals); // Polyline only. - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_COLORS, strokeColors); // Polyline only. + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color); // Polyline only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths); // Polyline only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); // Polyline only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); // Polyline only. @@ -1473,10 +1473,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (!skipDefaults && !strictSemantics) { AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); - QScriptValue bottomRightNear = vec3FloatToScriptValue(engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3FloatToScriptValue(engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3FloatToScriptValue(engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3FloatToScriptValue(engine, aaBox.getDimensions()); + QScriptValue bottomRightNear = vec3ToScriptValue(engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3ToScriptValue(engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3ToScriptValue(engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3ToScriptValue(engine, aaBox.getDimensions()); boundingBox.setProperty("brn", bottomRightNear); boundingBox.setProperty("tfl", topFarLeft); boundingBox.setProperty("center", center); @@ -1572,10 +1572,10 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); - COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3, setColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3, setColorSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3, setColorStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3, setColorFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3Color, setColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3Color, setColorSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3Color, setColorStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3Color, setColorFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart); @@ -1600,8 +1600,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData); COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); - COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3, setTextColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3, setBackgroundColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3Color, setTextColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3Color, setBackgroundColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, quint32, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); @@ -1962,10 +1962,10 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3); - ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3); - ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3); - ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3); + ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3Color); ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); @@ -1993,8 +1993,8 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); - ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3); + ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color); ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float); @@ -2046,7 +2046,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, u8vec3); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, u8vec3Color); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, vec3); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); @@ -2696,8 +2696,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Text) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3, setTextColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3, setBackgroundColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3Color, setTextColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3Color, setBackgroundColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FACE_CAMERA, bool, setFaceCamera); } @@ -2706,7 +2706,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); @@ -2719,7 +2719,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Light) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); @@ -2747,10 +2747,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_SPREAD, float, setRadiusSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, u8vec3, setColorSpread); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3, setColorStart); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3, setColorFinish); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3Color, setColorStart); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3Color, setColorFinish); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_START, float, setAlphaStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_FINISH, float, setAlphaFinish); @@ -2801,14 +2801,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Line) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } if (properties.getType() == EntityTypes::PolyLine) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals); @@ -2824,7 +2824,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); } // Materials diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index abe0cf6e51..d503ee2e2d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -57,6 +57,9 @@ const std::array COMPONENT_MODES = { { ComponentPair { COMPONENT_MODE_ENABLED, { "enabled" } } } }; +using vec3Color = glm::vec3; +using u8vec3Color = glm::u8vec3; + /// A collection of properties of an entity item used in the scripting API. Translates between the actual properties of an /// entity and a JavaScript style hash/QScriptValue storing a set of properties. Used in scripting to set/get the complete /// set of entity item properties via JavaScript hashes/QScriptValues @@ -135,8 +138,8 @@ public: DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString, ENTITY_ITEM_DEFAULT_SCRIPT); DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP); DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL); - DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, glm::u8vec3, particle::DEFAULT_COLOR); - DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, glm::u8vec3, particle::DEFAULT_COLOR_SPREAD); + DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, particle::DEFAULT_COLOR); + DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color, particle::DEFAULT_COLOR_SPREAD); DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); @@ -162,8 +165,8 @@ public: DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner()); DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString, TextEntityItem::DEFAULT_TEXT); DEFINE_PROPERTY(PROP_LINE_HEIGHT, LineHeight, lineHeight, float, TextEntityItem::DEFAULT_LINE_HEIGHT); - DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, glm::u8vec3, TextEntityItem::DEFAULT_TEXT_COLOR); - DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, glm::u8vec3, TextEntityItem::DEFAULT_BACKGROUND_COLOR); + DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color, TextEntityItem::DEFAULT_TEXT_COLOR); + DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color, TextEntityItem::DEFAULT_BACKGROUND_COLOR); DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES); DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 6becd133e6..30ed4ad4c2 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -101,9 +101,11 @@ changedProperties += P; \ } -inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec2& v) { return vec2FloatToScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3FloatToScriptValue(e, v); } -inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::u8vec3& v) { return vec3UCharToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec2& v) { return vec2ToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3ToScriptValue(e, v); } +inline QScriptValue vec3Color_convertScriptValue(QScriptEngine* e, const glm::vec3& v) { return vec3ColorToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::u8vec3& v) { return u8vec3ToScriptValue(e, v); } +inline QScriptValue u8vec3Color_convertScriptValue(QScriptEngine* e, const glm::u8vec3& v) { return u8vec3ColorToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, float v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, int v) { return QScriptValue(v); } inline QScriptValue convertScriptValue(QScriptEngine* e, bool v) { return QScriptValue(v); } @@ -114,7 +116,8 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QString& v) { ret inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::quat& v) { return quatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) { return v; } -inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3FloatToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } +inline QScriptValue qVectorVec3Color_convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ColorToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorQuatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorBoolToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) { return qVectorFloatToScriptValue(e, v); } @@ -128,8 +131,6 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const EntityItemID& v) inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { return aaCubeToScriptValue(e, v); } - - #define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(X,G,g,P,p) \ if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ @@ -142,6 +143,18 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { retu properties.setProperty(#g, groupProperties); \ } +#define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_TYPED(X,G,g,P,p,T) \ + if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ + (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ + QScriptValue groupProperties = properties.property(#g); \ + if (!groupProperties.isValid()) { \ + groupProperties = engine->newObject(); \ + } \ + QScriptValue V = T##_convertScriptValue(engine, get##P()); \ + groupProperties.setProperty(#p, V); \ + properties.setProperty(#g, groupProperties); \ + } + #define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(X,G,g,P,p,M) \ if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ @@ -161,6 +174,13 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { retu properties.setProperty(#P, V); \ } +#define COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(p,P,T) \ + if ((_desiredProperties.isEmpty() || _desiredProperties.getHasProperty(p)) && \ + (!skipDefaults || defaultEntityProperties._##P != _##P)) { \ + QScriptValue V = T##_convertScriptValue(engine, _##P); \ + properties.setProperty(#P, V); \ + } + #define COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(P, G) \ properties.setProperty(#P, G); @@ -171,6 +191,13 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const AACube& v) { retu properties.setProperty(#P, V); \ } +#define COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_TYPED(p, P, G, T) \ + if ((_desiredProperties.isEmpty() || _desiredProperties.getHasProperty(p)) && \ + (!skipDefaults || defaultEntityProperties._##P != _##P)) { \ + QScriptValue V = T##_convertScriptValue(engine, G); \ + properties.setProperty(#P, V); \ + } + // same as COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER but uses #X instead of #P in the setProperty() step #define COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(p, P, X, G) \ if ((_desiredProperties.isEmpty() || _desiredProperties.getHasProperty(p)) && \ @@ -205,7 +232,6 @@ inline QUuid QUuid_convertFromScriptValue(const QScriptValue& v, bool& isValid) inline EntityItemID EntityItemID_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; return v.toVariant().toUuid(); } - inline QDateTime QDateTime_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; auto result = QDateTime::fromString(v.toVariant().toString().trimmed(), Qt::ISODate); @@ -213,8 +239,6 @@ inline QDateTime QDateTime_convertFromScriptValue(const QScriptValue& v, bool& i return result; } - - inline QByteArray QByteArray_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; QString b64 = v.toVariant().toString().trimmed(); @@ -224,21 +248,28 @@ inline QByteArray QByteArray_convertFromScriptValue(const QScriptValue& v, bool& inline glm::vec2 vec2_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; glm::vec2 vec2; - vec2FloatFromScriptValue(v, vec2); + vec2FromScriptValue(v, vec2); return vec2; } inline glm::vec3 vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; glm::vec3 vec3; - vec3FloatFromScriptValue(v, vec3); + vec3FromScriptValue(v, vec3); return vec3; } -inline glm::u8vec3 u8vec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { +inline glm::vec3 vec3Color_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = true; + glm::vec3 vec3; + vec3FromScriptValue(v, vec3); + return vec3; +} + +inline glm::u8vec3 u8vec3Color_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; glm::u8vec3 vec3; - vec3UCharFromScriptValue(v, vec3); + u8vec3FromScriptValue(v, vec3); return vec3; } @@ -256,7 +287,7 @@ inline qVectorFloat qVectorFloat_convertFromScriptValue(const QScriptValue& v, b inline qVectorVec3 qVectorVec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; - return qVectorVec3FloatFromScriptValue(v); + return qVectorVec3FromScriptValue(v); } inline qVectorQuat qVectorQuat_convertFromScriptValue(const QScriptValue& v, bool& isValid) { diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 7d9ac1d591..c3e1b74626 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1066,9 +1066,9 @@ QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, c obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); - QScriptValue intersection = vec3FloatToScriptValue(engine, value.intersection); + QScriptValue intersection = vec3ToScriptValue(engine, value.intersection); obj.setProperty("intersection", intersection); - QScriptValue surfaceNormal = vec3FloatToScriptValue(engine, value.surfaceNormal); + QScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -1084,11 +1084,11 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra QScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { - vec3FloatFromScriptValue(intersection, value.intersection); + vec3FromScriptValue(intersection, value.intersection); } QScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FloatFromScriptValue(surfaceNormal, value.surfaceNormal); + vec3FromScriptValue(surfaceNormal, value.surfaceNormal); } value.extraInfo = object.property("extraInfo").toVariant().toMap(); } diff --git a/libraries/entities/src/HazePropertyGroup.cpp b/libraries/entities/src/HazePropertyGroup.cpp index 9f9830e7d9..632f73ced6 100644 --- a/libraries/entities/src/HazePropertyGroup.cpp +++ b/libraries/entities/src/HazePropertyGroup.cpp @@ -18,8 +18,8 @@ void HazePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor, u8vec3Color); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor, u8vec3Color); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle); @@ -36,8 +36,8 @@ void HazePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProp void HazePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeRange, float, setHazeRange); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, u8vec3, setHazeColor); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, u8vec3, setHazeGlareColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeColor, u8vec3Color, setHazeColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareColor, u8vec3Color, setHazeGlareColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeEnableGlare, bool, setHazeEnableGlare); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(haze, hazeGlareAngle, float, setHazeGlareAngle); @@ -167,8 +167,8 @@ bool HazePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, glm::u8vec3, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, glm::u8vec3, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, u8vec3Color, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, u8vec3Color, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); @@ -343,8 +343,8 @@ int HazePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* dat const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_HAZE_RANGE, float, setHazeRange); - READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, glm::u8vec3, setHazeColor); - READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, glm::u8vec3, setHazeGlareColor); + READ_ENTITY_PROPERTY(PROP_HAZE_COLOR, u8vec3Color, setHazeColor); + READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_COLOR, u8vec3Color, setHazeGlareColor); READ_ENTITY_PROPERTY(PROP_HAZE_ENABLE_GLARE, bool, setHazeEnableGlare); READ_ENTITY_PROPERTY(PROP_HAZE_GLARE_ANGLE, float, setHazeGlareAngle); diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index ab54e8483b..595dbeaf51 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -48,10 +48,10 @@ static const float INITIAL_KEY_LIGHT_ALTITUDE{ 200.0f }; * * @property {number} hazeRange=1000 - The horizontal distance at which visibility is reduced to 95%; i.e., 95% of each pixel's * color is haze. - * @property {Vec3Color} hazeColor=128,154,179 - The color of the haze when looking away from the key light. + * @property {Color} hazeColor=128,154,179 - The color of the haze when looking away from the key light. * @property {boolean} hazeEnableGlare=false - If true then the haze is colored with glare from the key light; * hazeGlareColor and hazeGlareAngle are used. - * @property {Vec3Color} hazeGlareColor=255,299,179 - The color of the haze when looking towards the key light. + * @property {Color} hazeGlareColor=255,299,179 - The color of the haze when looking towards the key light. * @property {number} hazeGlareAngle=20 - The angle in degrees across the circle around the key light that the glare color and * haze color are blended 50/50. * diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index ac744948f0..f0ad2965ce 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -26,20 +26,20 @@ const bool KeyLightPropertyGroup::DEFAULT_KEYLIGHT_CAST_SHADOWS { false }; void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_COLOR, KeyLight, keyLight, Color, color); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_KEYLIGHT_COLOR, KeyLight, keyLight, Color, color, u8vec3Color); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_INTENSITY, KeyLight, keyLight, Intensity, intensity); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_DIRECTION, KeyLight, keyLight, Direction, direction); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_CAST_SHADOW, KeyLight, keyLight, CastShadows, castShadows); } void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, u8vec3, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, u8vec3Color, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, intensity, float, setIntensity); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, vec3, setDirection); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, castShadows, bool, setCastShadows); // legacy property support - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, u8vec3, setColor, getColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, u8vec3Color, setColor, getColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightIntensity, float, setIntensity, getIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, vec3, setDirection, getDirection); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightCastShadows, bool, setCastShadows, getCastShadows); @@ -99,7 +99,7 @@ bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFl bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); @@ -187,7 +187,7 @@ int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index 8144bf2a6e..d7fa75a32e 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -30,7 +30,7 @@ class ReadBitstreamToTreeParams; /**jsdoc * A key light is defined by the following properties. * @typedef {object} Entities.KeyLight - * @property {Vec3Color} color=255,255,255 - The color of the light. + * @property {Color} color=255,255,255 - The color of the light. * @property {number} intensity=1 - The intensity of the light. * @property {Vec3} direction=0,-1,0 - The direction the light is shining. * @property {boolean} castShadows=false - If true then shadows are cast. Shadows are cast by avatars, plus diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index d9e8ef0414..9b32c7d487 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -512,7 +512,7 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, bool, setIsEmitting); READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles); @@ -528,9 +528,9 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, glm::u8vec3, setColorSpread); - READ_ENTITY_PROPERTY(PROP_COLOR_START, glm::vec3, setColorStart); - READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, glm::vec3, setColorFinish); + READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread); + READ_ENTITY_PROPERTY(PROP_COLOR_START, vec3Color, setColorStart); + READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, vec3Color, setColorFinish); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); READ_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY(PROP_ALPHA_START, float, setAlphaStart); diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index 16bb5c1ccd..89ffa95dbe 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -19,12 +19,12 @@ const glm::u8vec3 SkyboxPropertyGroup::DEFAULT_COLOR = { 0, 0, 0 }; void SkyboxPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color, u8vec3Color); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_SKYBOX_URL, Skybox, skybox, URL, url); } void SkyboxPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, u8vec3, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, u8vec3Color, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, url, QString, setURL); } @@ -71,7 +71,7 @@ bool SkyboxPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlag bool overwriteLocalData = true; bool somethingChanged = false; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_SKYBOX_COLOR, Color); @@ -143,7 +143,7 @@ int SkyboxPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* d int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); return bytesRead; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 6370dacba2..c3f9b421f4 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -32,7 +32,7 @@ class ReadBitstreamToTreeParams; /**jsdoc * A skybox is defined by the following properties. * @typedef {object} Entities.Skybox - * @property {Vec3Color} color=0,0,0 - Sets the color of the sky if url is "", otherwise modifies the + * @property {Color} color=0,0,0 - Sets the color of the sky if url is "", otherwise modifies the * color of the cube map image. * @property {string} url="" - A cube map image that is used to render the sky. */ diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp index 2a84d8c9d6..c859842a79 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp @@ -367,8 +367,8 @@ namespace scriptable { obj.setProperty("metallic", material.metallic); obj.setProperty("scattering", material.scattering); obj.setProperty("unlit", material.unlit); - obj.setProperty("emissive", vec3FloatToScriptValue(engine, material.emissive)); - obj.setProperty("albedo", vec3FloatToScriptValue(engine, material.albedo)); + obj.setProperty("emissive", vec3ColorToScriptValue(engine, material.emissive)); + obj.setProperty("albedo", vec3ColorToScriptValue(engine, material.albedo)); obj.setProperty("emissiveMap", material.emissiveMap); obj.setProperty("albedoMap", material.albedoMap); obj.setProperty("opacityMap", material.opacityMap); diff --git a/libraries/model-networking/src/model-networking/MaterialCache.cpp b/libraries/model-networking/src/model-networking/MaterialCache.cpp index 823602d939..e6e3b0e812 100644 --- a/libraries/model-networking/src/model-networking/MaterialCache.cpp +++ b/libraries/model-networking/src/model-networking/MaterialCache.cpp @@ -113,11 +113,11 @@ NetworkMaterialResource::ParsedMaterials NetworkMaterialResource::parseJSONMater * @typedef {object} Material * @property {string} name="" - A name for the material. * @property {string} model="hifi_pbr" - Currently not used. - * @property {Vec3Color|RGBS} emissive - The emissive color, i.e., the color that the material emits. A {@link Vec3Color} value + * @property {Color|RGBS} emissive - The emissive color, i.e., the color that the material emits. A {@link Color} value * is treated as sRGB. A {@link RGBS} value can be either RGB or sRGB. * @property {number} opacity=1.0 - The opacity, 0.01.0. * @property {boolean} unlit=false - If true, the material is not lit. - * @property {Vec3Color|RGBS} albedo - The albedo color. A {@link Vec3Color} value is treated as sRGB. A {@link RGBS} value can + * @property {Color|RGBS} albedo - The albedo color. A {@link Color} value is treated as sRGB. A {@link RGBS} value can * be either RGB or sRGB. * @property {number} roughness - The roughness, 0.01.0. * @property {number} metallic - The metallicness, 0.01.0. diff --git a/libraries/script-engine/src/ModelScriptingInterface.cpp b/libraries/script-engine/src/ModelScriptingInterface.cpp index ff0328367a..1716ea72ff 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.cpp +++ b/libraries/script-engine/src/ModelScriptingInterface.cpp @@ -192,7 +192,7 @@ QScriptValue ModelScriptingInterface::getVertex(MeshProxy* meshProxy, int vertex } glm::vec3 pos = vertexBufferView.get(vertexIndex); - return vec3FloatToScriptValue(_modelScriptEngine, pos); + return vec3ToScriptValue(_modelScriptEngine, pos); } diff --git a/libraries/script-engine/src/SpatialEvent.cpp b/libraries/script-engine/src/SpatialEvent.cpp index 33a261c087..8520c0c485 100644 --- a/libraries/script-engine/src/SpatialEvent.cpp +++ b/libraries/script-engine/src/SpatialEvent.cpp @@ -33,9 +33,9 @@ SpatialEvent::SpatialEvent(const SpatialEvent& event) { QScriptValue SpatialEvent::toScriptValue(QScriptEngine* engine, const SpatialEvent& event) { QScriptValue obj = engine->newObject(); - obj.setProperty("locTranslation", vec3FloatToScriptValue(engine, event.locTranslation) ); + obj.setProperty("locTranslation", vec3ToScriptValue(engine, event.locTranslation) ); obj.setProperty("locRotation", quatToScriptValue(engine, event.locRotation) ); - obj.setProperty("absTranslation", vec3FloatToScriptValue(engine, event.absTranslation) ); + obj.setProperty("absTranslation", vec3ToScriptValue(engine, event.absTranslation) ); obj.setProperty("absRotation", quatToScriptValue(engine, event.absRotation) ); return obj; diff --git a/libraries/script-engine/src/TouchEvent.cpp b/libraries/script-engine/src/TouchEvent.cpp index 82b584c3ca..58ac9ec8c1 100644 --- a/libraries/script-engine/src/TouchEvent.cpp +++ b/libraries/script-engine/src/TouchEvent.cpp @@ -221,7 +221,7 @@ QScriptValue TouchEvent::toScriptValue(QScriptEngine* engine, const TouchEvent& QScriptValue pointsObj = engine->newArray(); int index = 0; foreach (glm::vec2 point, event.points) { - QScriptValue thisPoint = vec2FloatToScriptValue(engine, point); + QScriptValue thisPoint = vec2ToScriptValue(engine, point); pointsObj.setProperty(index, thisPoint); index++; } diff --git a/libraries/shared/src/PointerEvent.cpp b/libraries/shared/src/PointerEvent.cpp index d406c0f92a..fb855922c2 100644 --- a/libraries/shared/src/PointerEvent.cpp +++ b/libraries/shared/src/PointerEvent.cpp @@ -230,16 +230,16 @@ void PointerEvent::fromScriptValue(const QScriptValue& object, PointerEvent& eve event._id = id.isNumber() ? (uint32_t)id.toNumber() : 0; glm::vec2 pos2D; - vec2FloatFromScriptValue(object.property("pos2D"), event._pos2D); + vec2FromScriptValue(object.property("pos2D"), event._pos2D); glm::vec3 pos3D; - vec3FloatFromScriptValue(object.property("pos3D"), event._pos3D); + vec3FromScriptValue(object.property("pos3D"), event._pos3D); glm::vec3 normal; - vec3FloatFromScriptValue(object.property("normal"), event._normal); + vec3FromScriptValue(object.property("normal"), event._normal); glm::vec3 direction; - vec3FloatFromScriptValue(object.property("direction"), event._direction); + vec3FromScriptValue(object.property("direction"), event._direction); QScriptValue button = object.property("button"); QString buttonStr = type.isString() ? button.toString() : "NoButtons"; diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 5894671171..e47d14adef 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -25,9 +25,9 @@ #include #include -int vec2FloatMetaTypeId = qRegisterMetaType(); -int vec3FloatMetaTypeId = qRegisterMetaType(); -int vec3UintMetaTypeId = qRegisterMetaType(); +int vec2MetaTypeId = qRegisterMetaType(); +int u8vec3MetaTypeId = qRegisterMetaType(); +int vec3MetaTypeId = qRegisterMetaType(); int vec4MetaTypeId = qRegisterMetaType(); int qVectorVec3MetaTypeId = qRegisterMetaType>(); int qVectorQuatMetaTypeId = qRegisterMetaType>(); @@ -41,14 +41,14 @@ int voidLambdaType = qRegisterMetaType>(); int variantLambdaType = qRegisterMetaType>(); void registerMetaTypes(QScriptEngine* engine) { - qScriptRegisterMetaType(engine, vec2FloatToScriptValue, vec2FloatFromScriptValue); - qScriptRegisterMetaType(engine, vec3FloatToScriptValue, vec3FloatFromScriptValue); - qScriptRegisterMetaType(engine, vec3UCharToScriptValue, vec3UCharFromScriptValue); + qScriptRegisterMetaType(engine, vec2ToScriptValue, vec2FromScriptValue); + qScriptRegisterMetaType(engine, vec3ToScriptValue, vec3FromScriptValue); + qScriptRegisterMetaType(engine, u8vec3ToScriptValue, u8vec3FromScriptValue); qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, mat4toScriptValue, mat4FromScriptValue); - qScriptRegisterMetaType(engine, qVectorVec3FloatToScriptValue, qVectorVec3FloatFromScriptValue); + qScriptRegisterMetaType(engine, qVectorVec3ToScriptValue, qVectorVec3FromScriptValue); qScriptRegisterMetaType(engine, qVectorQuatToScriptValue, qVectorQuatFromScriptValue); qScriptRegisterMetaType(engine, qVectorBoolToScriptValue, qVectorBoolFromScriptValue); qScriptRegisterMetaType(engine, qVectorFloatToScriptValue, qVectorFloatFromScriptValue); @@ -65,11 +65,11 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, aaCubeToScriptValue, aaCubeFromScriptValue); } -QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { - auto prototype = engine->globalObject().property("__hifi_vec2_float__"); +QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { + auto prototype = engine->globalObject().property("__hifi_vec2__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( - "__hifi_vec2_float__ = Object.defineProperties({}, { " + "__hifi_vec2__ = Object.defineProperties({}, { " "defined: { value: true }," "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," @@ -87,25 +87,33 @@ QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const glm::vec2& vec2 return value; } -void vec2FloatFromScriptValue(const QScriptValue& object, glm::vec2& vec2) { - QScriptValue x = object.property("x"); - if (!x.isValid()) { - x = object.property("u"); - } - if (!x.isValid()) { - x = object.property("width"); - } +void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { + if (object.isArray()) { + QVariantList list = object.toVariant().toList(); + if (list.length() == 2) { + vec2.x = list[0].toFloat(); + vec2.y = list[1].toFloat(); + } + } else { + QScriptValue x = object.property("x"); + if (!x.isValid()) { + x = object.property("u"); + } + if (!x.isValid()) { + x = object.property("width"); + } - QScriptValue y = object.property("y"); - if (!y.isValid()) { - y = object.property("v"); - } - if (!y.isValid()) { - y = object.property("height"); - } + QScriptValue y = object.property("y"); + if (!y.isValid()) { + y = object.property("v"); + } + if (!y.isValid()) { + y = object.property("height"); + } - vec2.x = x.toVariant().toFloat(); - vec2.y = y.toVariant().toFloat(); + vec2.x = x.toVariant().toFloat(); + vec2.y = y.toVariant().toFloat(); + } } QVariant vec2ToVariant(const glm::vec2 &vec2) { @@ -161,11 +169,11 @@ glm::vec2 vec2FromVariant(const QVariant &object) { return vec2FromVariant(object, valid); } -QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const glm::vec3& vec3) { - auto prototype = engine->globalObject().property("__hifi_vec3_float__"); +QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3& vec3) { + auto prototype = engine->globalObject().property("__hifi_vec3__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( - "__hifi_vec3_float__ = Object.defineProperties({}, { " + "__hifi_vec3__ = Object.defineProperties({}, { " "defined: { value: true }," "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," @@ -190,14 +198,49 @@ QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const glm::vec3& vec3 return value; } -void vec3FloatFromScriptValue(const QScriptValue& object, glm::vec3& vec3) { +QScriptValue vec3ColorToScriptValue(QScriptEngine* engine, const glm::vec3& vec3) { + auto prototype = engine->globalObject().property("__hifi_vec3_color__"); + if (!prototype.property("defined").toBool()) { + prototype = engine->evaluate( + "__hifi_vec3_color__ = Object.defineProperties({}, { " + "defined: { value: true }," + "0: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "1: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "2: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "r: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "g: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "b: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "x: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "y: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "z: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "width: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "height: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "depth: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }" + "})" + ); + } + QScriptValue value = engine->newObject(); + value.setProperty("red", vec3.x); + value.setProperty("green", vec3.y); + value.setProperty("blue", vec3.z); + value.setPrototype(prototype); + return value; +} + +void vec3FromScriptValue(const QScriptValue& object, glm::vec3& vec3) { if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = qColor.red(); vec3.y = qColor.green(); vec3.z = qColor.blue(); - return; + } + } else if (object.isArray()) { + QVariantList list = object.toVariant().toList(); + if (list.length() == 3) { + vec3.x = list[0].toFloat(); + vec3.y = list[1].toFloat(); + vec3.z = list[2].toFloat(); } } else { QScriptValue x = object.property("x"); @@ -236,15 +279,14 @@ void vec3FloatFromScriptValue(const QScriptValue& object, glm::vec3& vec3) { vec3.x = x.toVariant().toFloat(); vec3.y = y.toVariant().toFloat(); vec3.z = z.toVariant().toFloat(); - return; } } -QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3) { - auto prototype = engine->globalObject().property("__hifi_vec3_uchar__"); +QScriptValue u8vec3ToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3) { + auto prototype = engine->globalObject().property("__hifi_u8vec3__"); if (!prototype.property("defined").toBool()) { prototype = engine->evaluate( - "__hifi_vec3_uchar__ = Object.defineProperties({}, { " + "__hifi_u8vec3__ = Object.defineProperties({}, { " "defined: { value: true }," "0: { set: function(nv) { return this.x = nv; }, get: function() { return this.x; } }," "1: { set: function(nv) { return this.y = nv; }, get: function() { return this.y; } }," @@ -269,14 +311,49 @@ QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const glm::u8vec3& ve return value; } -void vec3UCharFromScriptValue(const QScriptValue& object, glm::u8vec3& vec3) { +QScriptValue u8vec3ColorToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3) { + auto prototype = engine->globalObject().property("__hifi_u8vec3_color__"); + if (!prototype.property("defined").toBool()) { + prototype = engine->evaluate( + "__hifi_u8vec3_color__ = Object.defineProperties({}, { " + "defined: { value: true }," + "0: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "1: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "2: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "r: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "g: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "b: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "x: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "y: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "z: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }," + "width: { set: function(nv) { return this.red = nv; }, get: function() { return this.red; } }," + "height: { set: function(nv) { return this.green = nv; }, get: function() { return this.green; } }," + "depth: { set: function(nv) { return this.blue = nv; }, get: function() { return this.blue; } }" + "})" + ); + } + QScriptValue value = engine->newObject(); + value.setProperty("red", vec3.x); + value.setProperty("green", vec3.y); + value.setProperty("blue", vec3.z); + value.setPrototype(prototype); + return value; +} + +void u8vec3FromScriptValue(const QScriptValue& object, glm::u8vec3& vec3) { if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = (uint8_t)qColor.red(); vec3.y = (uint8_t)qColor.green(); vec3.z = (uint8_t)qColor.blue(); - return; + } + } else if (object.isArray()) { + QVariantList list = object.toVariant().toList(); + if (list.length() == 3) { + vec3.x = list[0].toUInt(); + vec3.y = list[1].toUInt(); + vec3.z = list[2].toUInt(); } } else { QScriptValue x = object.property("x"); @@ -315,7 +392,6 @@ void vec3UCharFromScriptValue(const QScriptValue& object, glm::u8vec3& vec3) { vec3.x = x.toVariant().toUInt(); vec3.y = y.toVariant().toUInt(); vec3.z = z.toVariant().toUInt(); - return; } } @@ -515,32 +591,40 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { mat4[3][3] = object.property("r3c3").toVariant().toFloat(); } -QScriptValue qVectorVec3FloatToScriptValue(QScriptEngine* engine, const QVector& vector) { +QScriptValue qVectorVec3ColorToScriptValue(QScriptEngine* engine, const QVector& vector) { QScriptValue array = engine->newArray(); for (int i = 0; i < vector.size(); i++) { - array.setProperty(i, vec3FloatToScriptValue(engine, vector.at(i))); + array.setProperty(i, vec3ColorToScriptValue(engine, vector.at(i))); } return array; } -QVector qVectorVec3FloatFromScriptValue(const QScriptValue& array) { +QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector) { + QScriptValue array = engine->newArray(); + for (int i = 0; i < vector.size(); i++) { + array.setProperty(i, vec3ToScriptValue(engine, vector.at(i))); + } + return array; +} + +QVector qVectorVec3FromScriptValue(const QScriptValue& array) { QVector newVector; int length = array.property("length").toInteger(); for (int i = 0; i < length; i++) { glm::vec3 newVec3 = glm::vec3(); - vec3FloatFromScriptValue(array.property(i), newVec3); + vec3FromScriptValue(array.property(i), newVec3); newVector << newVec3; } return newVector; } -void qVectorVec3FloatFromScriptValue(const QScriptValue& array, QVector& vector) { +void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector) { int length = array.property("length").toInteger(); for (int i = 0; i < length; i++) { glm::vec3 newVec3 = glm::vec3(); - vec3FloatFromScriptValue(array.property(i), newVec3); + vec3FromScriptValue(array.property(i), newVec3); vector << newVec3; } } @@ -868,9 +952,9 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url) { QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) { QScriptValue obj = engine->newObject(); - QScriptValue origin = vec3FloatToScriptValue(engine, pickRay.origin); + QScriptValue origin = vec3ToScriptValue(engine, pickRay.origin); obj.setProperty("origin", origin); - QScriptValue direction = vec3FloatToScriptValue(engine, pickRay.direction); + QScriptValue direction = vec3ToScriptValue(engine, pickRay.direction); obj.setProperty("direction", direction); return obj; } @@ -914,9 +998,9 @@ QScriptValue collisionToScriptValue(QScriptEngine* engine, const Collision& coll obj.setProperty("type", collision.type); obj.setProperty("idA", quuidToScriptValue(engine, collision.idA)); obj.setProperty("idB", quuidToScriptValue(engine, collision.idB)); - obj.setProperty("penetration", vec3FloatToScriptValue(engine, collision.penetration)); - obj.setProperty("contactPoint", vec3FloatToScriptValue(engine, collision.contactPoint)); - obj.setProperty("velocityChange", vec3FloatToScriptValue(engine, collision.velocityChange)); + obj.setProperty("penetration", vec3ToScriptValue(engine, collision.penetration)); + obj.setProperty("contactPoint", vec3ToScriptValue(engine, collision.contactPoint)); + obj.setProperty("velocityChange", vec3ToScriptValue(engine, collision.velocityChange)); return obj; } diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 413624aa34..1576bcaf6d 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -52,8 +52,8 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * @property {number} x - X-coordinate of the vector. Synonyms: u and width. * @property {number} y - Y-coordinate of the vector. Synonyms: v and height. */ -QScriptValue vec2FloatToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); -void vec2FloatFromScriptValue(const QScriptValue& object, glm::vec2& vec2); +QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); +void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); QVariant vec2ToVariant(const glm::vec2& vec2); glm::vec2 vec2FromVariant(const QVariant& object, bool& valid); @@ -67,19 +67,29 @@ glm::vec2 vec2FromVariant(const QVariant& object); * @property {number} y - Y-coordinate of the vector. Synonyms: g, green, and height. * @property {number} z - Z-coordinate of the vector. Synonyms: b, blue, and depth. */ -QScriptValue vec3FloatToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); -void vec3FloatFromScriptValue(const QScriptValue& object, glm::vec3& vec3); +QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); +QScriptValue vec3ColorToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); +void vec3FromScriptValue(const QScriptValue& object, glm::vec3& vec3); /**jsdoc * A color vector. See also the {@link Vec3(0)|Vec3} object. * -* @typedef {object} Vec3Color -* @property {number} x - Red component value. Integer in the range 0 - 255. Synonyms: r, red, and width. -* @property {number} y - Green component value. Integer in the range 0 - 255. Synonyms: g, green, and height. -* @property {number} z - Blue component value. Integer in the range 0 - 255. Synonyms: b, blue, and depth. +* @typedef {object} Color +* @property {number} red - Red component value. Integer in the range 0 - 255. Synonyms: r, x, and width. +* @property {number} green - Green component value. Integer in the range 0 - 255. Synonyms: g, y, and height. +* @property {number} blue - Blue component value. Integer in the range 0 - 255. Synonyms: b, z, and depth. */ -QScriptValue vec3UCharToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); -void vec3UCharFromScriptValue(const QScriptValue& object, glm::u8vec3& vec3); +/**jsdoc +* A color vector. See also the {@link Vec3(0)|Vec3} object. +* +* @typedef {object} ColorFloat +* @property {number} red - Red component value. Float in the range 0 - 255. Synonyms: r, x, and width. +* @property {number} green - Green component value. Float in the range 0 - 255. Synonyms: g, y, and height. +* @property {number} blue - Blue component value. Float in the range 0 - 255. Synonyms: b, z, and depth. +*/ +QScriptValue u8vec3ToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); +QScriptValue u8vec3ColorToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); +void u8vec3FromScriptValue(const QScriptValue& object, glm::u8vec3& vec3); QVariant vec3toVariant(const glm::vec3& vec3); glm::vec3 vec3FromVariant(const QVariant &object, bool& valid); @@ -124,9 +134,10 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url); // vector Q_DECLARE_METATYPE(QVector) -QScriptValue qVectorVec3FloatToScriptValue(QScriptEngine* engine, const QVector& vector); -void qVectorVec3FloatFromScriptValue(const QScriptValue& array, QVector& vector); -QVector qVectorVec3FloatFromScriptValue(const QScriptValue& array); +QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); +QScriptValue qVectorVec3ColorToScriptValue(QScriptEngine* engine, const QVector& vector); +void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector); +QVector qVectorVec3FromScriptValue(const QScriptValue& array); // vector Q_DECLARE_METATYPE(QVector) From f941026a62b9af2affb9bac16130a8c87cb974e1 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Sep 2018 19:11:09 -0700 Subject: [PATCH 071/434] new entity list view wip --- .../qml/hifi/tablet/EditEntityListNew.qml | 15 + scripts/system/edit.js | 17 +- scripts/system/html/entityListNew.html | 71 +++ scripts/system/html/js/entityList.js | 1 - scripts/system/html/js/entityListNew.js | 411 ++++++++++++++++++ scripts/system/html/js/listView.js | 198 +++++++++ scripts/system/libraries/entityList.js | 61 ++- 7 files changed, 748 insertions(+), 26 deletions(-) create mode 100644 interface/resources/qml/hifi/tablet/EditEntityListNew.qml create mode 100644 scripts/system/html/entityListNew.html create mode 100644 scripts/system/html/js/entityListNew.js create mode 100644 scripts/system/html/js/listView.js diff --git a/interface/resources/qml/hifi/tablet/EditEntityListNew.qml b/interface/resources/qml/hifi/tablet/EditEntityListNew.qml new file mode 100644 index 0000000000..7ed6d25ae8 --- /dev/null +++ b/interface/resources/qml/hifi/tablet/EditEntityListNew.qml @@ -0,0 +1,15 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtWebChannel 1.0 +import "../../controls" +import "../toolbars" +import QtGraphicalEffects 1.0 +import "../../controls-uit" as HifiControls +import "../../styles-uit" + + +WebView { + id: entityListToolWebView + url: Paths.defaultScripts + "/system/html/entityListNew.html" + enabled: true +} diff --git a/scripts/system/edit.js b/scripts/system/edit.js index e340c75a8b..6582130062 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -156,6 +156,7 @@ var MENU_AUTO_FOCUS_ON_SELECT = "Auto Focus on Select"; var MENU_EASE_ON_FOCUS = "Ease Orientation on Focus"; var MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE = "Show Lights and Particle Systems in Create Mode"; var MENU_SHOW_ZONES_IN_EDIT_MODE = "Show Zones in Create Mode"; +var MENU_USE_NEW_ENTITY_LIST = "Use New Entity List"; var MENU_CREATE_ENTITIES_GRABBABLE = "Create Entities As Grabbable (except Zones, Particles, and Lights)"; var MENU_ALLOW_SELECTION_LARGE = "Allow Selecting of Large Models"; @@ -166,6 +167,7 @@ var SETTING_AUTO_FOCUS_ON_SELECT = "autoFocusOnSelect"; var SETTING_EASE_ON_FOCUS = "cameraEaseOnFocus"; var SETTING_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE = "showLightsAndParticlesInEditMode"; var SETTING_SHOW_ZONES_IN_EDIT_MODE = "showZonesInEditMode"; +var SETTING_USE_NEW_ENTITY_LIST = "useNewEntityList"; var SETTING_EDIT_PREFIX = "Edit/"; @@ -813,7 +815,7 @@ var toolBar = (function () { }; entityListTool.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); createToolsWindow.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); - + that.setActive(false); } @@ -871,8 +873,11 @@ var toolBar = (function () { tablet.gotoHomeScreen(); } UserActivityLogger.enabledEdit(); + entityListTool.setUseNewEntityList(Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)); entityListTool.setVisible(true); - entityListTool.sendUpdate(); + if (!Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)) { + entityListTool.sendUpdate(); + } gridTool.setVisible(true); grid.setEnabled(true); propertiesTool.setVisible(true); @@ -1349,6 +1354,13 @@ function setupModelMenus() { isCheckable: true, isChecked: Settings.getValue(SETTING_SHOW_ZONES_IN_EDIT_MODE) !== "false" }); + Menu.addMenuItem({ + menuName: "Edit", + menuItemName: MENU_USE_NEW_ENTITY_LIST, + afterItem: MENU_SHOW_ZONES_IN_EDIT_MODE, + isCheckable: true, + isChecked: Settings.getValue(SETTING_USE_NEW_ENTITY_LIST, false) + }); Entities.setLightsArePickable(false); } @@ -1387,6 +1399,7 @@ Script.scriptEnding.connect(function () { Settings.setValue(SETTING_EASE_ON_FOCUS, Menu.isOptionChecked(MENU_EASE_ON_FOCUS)); Settings.setValue(SETTING_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE, Menu.isOptionChecked(MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE)); Settings.setValue(SETTING_SHOW_ZONES_IN_EDIT_MODE, Menu.isOptionChecked(MENU_SHOW_ZONES_IN_EDIT_MODE)); + Settings.setValue(SETTING_USE_NEW_ENTITY_LIST, Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)); Settings.setValue(SETTING_EDIT_PREFIX + MENU_CREATE_ENTITIES_GRABBABLE, Menu.isOptionChecked(MENU_CREATE_ENTITIES_GRABBABLE)); Settings.setValue(SETTING_EDIT_PREFIX + MENU_ALLOW_SELECTION_LARGE, Menu.isOptionChecked(MENU_ALLOW_SELECTION_LARGE)); diff --git a/scripts/system/html/entityListNew.html b/scripts/system/html/entityListNew.html new file mode 100644 index 0000000000..1411286414 --- /dev/null +++ b/scripts/system/html/entityListNew.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + +
+ +
+ + +
+ + + +
+
+
+ Y + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
TypeDName
+ +
+ No entities found in view within a 100 meter radius. Try moving to a different location and refreshing. +
+
+
+ + diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index 5cd5f6d610..ea38fbb359 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -42,7 +42,6 @@ function loaded() { elRadius = document.getElementById("radius"); elExport = document.getElementById("export"); elPal = document.getElementById("pal"); - elEntityTable = document.getElementById("entity-table"); elInfoToggle = document.getElementById("info-toggle"); elInfoToggleGlyph = elInfoToggle.firstChild; elFooter = document.getElementById("footer-text"); diff --git a/scripts/system/html/js/entityListNew.js b/scripts/system/html/js/entityListNew.js new file mode 100644 index 0000000000..01b9785444 --- /dev/null +++ b/scripts/system/html/js/entityListNew.js @@ -0,0 +1,411 @@ +// entityListNew.js +// +// Created by David Back on 27 Aug 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 + +var entities = {}; +var selectedEntities = []; +var currentSortColumn = 'type'; +var currentSortOrder = 'des'; +var entityList = null; +var refreshEntityListTimer = null; + +debugPrint = function (message) { + console.log(message); +}; + +function loaded() { + openEventBridge(function() { + elEntityTable = document.getElementById("entity-table"); + elEntityTableBody = document.getElementById("entity-table-body"); + elEntityTableScroll = document.getElementById("entity-table-scroll"); + elEntityTableHeader = document.getElementById("entity-table-header"); + elEntityTableFooter = document.getElementById("entity-table-footer"); + elRefresh = document.getElementById("refresh"); + elToggleLocked = document.getElementById("locked"); + elToggleVisible = document.getElementById("visible"); + elDelete = document.getElementById("delete"); + elFilter = document.getElementById("filter"); + elInView = document.getElementById("in-view") + elRadius = document.getElementById("radius"); + elExport = document.getElementById("export"); + elPal = document.getElementById("pal"); + elInfoToggle = document.getElementById("info-toggle"); + //elInfoToggleGlyph = elInfoToggle.firstChild; + elFooter = document.getElementById("footer-text"); + elNoEntitiesMessage = document.getElementById("no-entities"); + elNoEntitiesInView = document.getElementById("no-entities-in-view"); + elNoEntitiesRadius = document.getElementById("no-entities-radius"); + + entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); + + function createRowFunction(elBottomBuffer) { + var row = document.createElement("tr"); + var typeCell = document.createElement("td"); + var typeCellText = document.createTextNode(""); + var nameCell = document.createElement("td"); + var nameCellText = document.createTextNode(""); + typeCell.appendChild(typeCellText); + nameCell.appendChild(nameCellText); + row.appendChild(typeCell); + row.appendChild(nameCell); + row.onclick = onRowClicked; + row.ondblclick = onRowDoubleClicked; + elEntityTableBody.insertBefore(row, elBottomBuffer); + return row; + } + + function updateRowFunction(elRow, itemData) { + var typeCell = elRow.childNodes[0]; + var nameCell = elRow.childNodes[1]; + typeCell.innerHTML = itemData.type; + nameCell.innerHTML = itemData.name; + + var id = elRow.getAttribute("id"); + entities[id].el = elRow; + } + + function clearRowFunction(elRow) { + var typeCell = elRow.childNodes[0]; + var nameCell = elRow.childNodes[1]; + typeCell.innerHTML = ""; + nameCell.innerHTML = ""; + + var id = elRow.getAttribute("id"); + if (id && entities[id]) { + entities[id].el = null; + } + } + + function onRowClicked(clickEvent) { + var id = this.getAttribute("id"); + var selection = [id]; + + /* + if (clickEvent.ctrlKey) { + var selectedIndex = selectedEntities.indexOf(id); + if (selectedIndex >= 0) { + selection = selectedEntities; + selection.splice(selectedIndex, 1) + } else { + selection = selection.concat(selectedEntities); + } + } else if (clickEvent.shiftKey && selectedEntities.length > 0) { + var previousItemFound = -1; + var clickedItemFound = -1; + for (var entity in entityList.visibleItems) { + if (clickedItemFound === -1 && this.dataset.entityId == entityList.visibleItems[entity].values().id) { + clickedItemFound = entity; + } else if(previousItemFound === -1 && selectedEntities[0] == entityList.visibleItems[entity].values().id) { + previousItemFound = entity; + } + } + if (previousItemFound !== -1 && clickedItemFound !== -1) { + var betweenItems = []; + var toItem = Math.max(previousItemFound, clickedItemFound); + // skip first and last item in this loop, we add them to selection after the loop + for (var i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { + entityList.visibleItems[i].elm.className = 'selected'; + betweenItems.push(entityList.visibleItems[i].values().id); + } + if (previousItemFound > clickedItemFound) { + // always make sure that we add the items in the right order + betweenItems.reverse(); + } + selection = selection.concat(betweenItems, selectedEntities); + } + } + */ + + selectedEntities = selection; + + this.className = 'selected'; + + EventBridge.emitWebEvent(JSON.stringify({ + type: "selectionUpdate", + focus: false, + entityIds: selection, + })); + + refreshFooter(); + } + + function onRowDoubleClicked() { + var id = this.getAttribute("id"); + EventBridge.emitWebEvent(JSON.stringify({ + type: "selectionUpdate", + focus: true, + entityIds: [id], + })); + } + + function addEntity(id, name, type) { + //var urlParts = url.split('/'); + //var filename = urlParts[urlParts.length - 1]; + + var IMAGE_MODEL_NAME = 'default-image-model.fbx'; + + //if (filename === IMAGE_MODEL_NAME) { + // type = "Image"; + //} + + if (entities[id] === undefined) { + var entityData = {name: name, type: type}; + entityList.addItem(id, entityData); + entityData.el = null; + entities[id] = entityData; + } + } + + function removeEntities(deletedIDs) { + for (var i = 0, length = deletedIDs.length; i < length; i++) { + var deleteID = deletedIDs[i]; + delete entities[deleteID]; + entityList.removeItem(deleteID); + } + } + + function scheduleRefreshEntityList() { + var REFRESH_DELAY = 50; + if (refreshEntityListTimer) { + clearTimeout(refreshEntityListTimer); + } + refreshEntityListTimer = setTimeout(refreshEntityListObject, REFRESH_DELAY); + } + + function clearEntities() { + entities = {}; + entityList.clear(); + refreshFooter(); + } + + var elSortOrder = { + name: document.querySelector('#entity-name .sort-order'), + type: document.querySelector('#entity-type .sort-order'), + } + function setSortColumn(column) { + if (currentSortColumn == column) { + currentSortOrder = currentSortOrder == "asc" ? "desc" : "asc"; + } else { + elSortOrder[currentSortColumn].innerHTML = ""; + currentSortColumn = column; + currentSortOrder = "asc"; + } + elSortOrder[column].innerHTML = currentSortOrder == "asc" ? ASCENDING_STRING : DESCENDING_STRING; + //entityList.sort(currentSortColumn, { order: currentSortOrder }); + } + + function refreshEntities() { + clearEntities(); + EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); + } + + function refreshFooter() { + if (selectedEntities.length > 1) { + elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; + } else if (selectedEntities.length === 1) { + elFooter.firstChild.nodeValue = "1 entity selected"; + } /* else if (entityList.visibleItems.length === 1) { + elFooter.firstChild.nodeValue = "1 entity found"; + } else { + elFooter.firstChild.nodeValue = entityList.visibleItems.length + " entities found"; + } */ + } + + function refreshEntityListObject() { + refreshEntityListTimer = null; + //entityList.sort(currentSortColumn, { order: currentSortOrder }); + //entityList.search(elFilter.value); + entityList.refresh(); + refreshFooter(); + } + + function updateSelectedEntities(selectedIDs) { + var notFound = false; + for (var id in entities) { + if (entities[id].el) { + entities[id].el.className = ''; + } + } + + selectedEntities = []; + for (var i = 0; i < selectedIDs.length; i++) { + var id = selectedIDs[i]; + selectedEntities.push(id); + if (id in entities) { + var entity = entities[id]; + entity.el.className = 'selected'; + } else { + notFound = true; + } + } + + refreshFooter(); + + return notFound; + } + + function resize() { + // Take up available window space + elEntityTableScroll.style.height = window.innerHeight - 207; + + var SCROLLABAR_WIDTH = 21; + var tds = document.querySelectorAll("#entity-table-body tr:first-child td"); + var ths = document.querySelectorAll("#entity-table thead th"); + if (tds.length >= ths.length) { + // Update the widths of the header cells to match the body + for (var i = 0; i < ths.length; i++) { + ths[i].width = tds[i].offsetWidth; + } + } else { + // Reasonable widths if nothing is displayed + var tableWidth = document.getElementById("entity-table").offsetWidth - SCROLLABAR_WIDTH; + if (showExtraInfo) { + ths[0].width = 0.10 * tableWidth; + ths[1].width = 0.20 * tableWidth; + ths[2].width = 0.20 * tableWidth; + ths[3].width = 0.04 * tableWidth; + ths[4].width = 0.04 * tableWidth; + ths[5].width = 0.08 * tableWidth; + ths[6].width = 0.08 * tableWidth; + ths[7].width = 0.10 * tableWidth; + ths[8].width = 0.04 * tableWidth; + ths[9].width = 0.08 * tableWidth; + ths[10].width = 0.04 * tableWidth + SCROLLABAR_WIDTH; + } else { + ths[0].width = 0.16 * tableWidth; + ths[1].width = 0.34 * tableWidth; + //ths[2].width = 0.34 * tableWidth; + //ths[3].width = 0.08 * tableWidth; + //ths[4].width = 0.08 * tableWidth; + } + } + }; + + var showExtraInfo = false; + var COLLAPSE_EXTRA_INFO = "E"; + var EXPAND_EXTRA_INFO = "D"; + + function toggleInfo(event) { + showExtraInfo = !showExtraInfo; + if (showExtraInfo) { + elEntityTable.className = "showExtraInfo"; + elInfoToggleGlyph.innerHTML = COLLAPSE_EXTRA_INFO; + } else { + elEntityTable.className = ""; + elInfoToggleGlyph.innerHTML = EXPAND_EXTRA_INFO; + } + resize(); + event.stopPropagation(); + } + elInfoToggle.addEventListener("click", toggleInfo, true); + + elRefresh.onclick = function() { + refreshEntities(); + } + elToggleLocked.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); + } + elToggleVisible.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); + } + elExport.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); + } + elPal.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); + } + elDelete.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); + } + + document.addEventListener("keydown", function (keyDownEvent) { + if (keyDownEvent.target.nodeName === "INPUT") { + return; + } + var keyCode = keyDownEvent.keyCode; + if (keyCode === DELETE) { + EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); + refreshEntities(); + } + if (keyDownEvent.keyCode === KEY_P && keyDownEvent.ctrlKey) { + if (keyDownEvent.shiftKey) { + EventBridge.emitWebEvent(JSON.stringify({ type: 'unparent' })); + } else { + EventBridge.emitWebEvent(JSON.stringify({ type: 'parent' })); + } + } + }, false); + + var isFilterInView = false; + var FILTER_IN_VIEW_ATTRIBUTE = "pressed"; + elNoEntitiesInView.style.display = "none"; + elInView.onclick = function () { + isFilterInView = !isFilterInView; + if (isFilterInView) { + elInView.setAttribute(FILTER_IN_VIEW_ATTRIBUTE, FILTER_IN_VIEW_ATTRIBUTE); + elNoEntitiesInView.style.display = "inline"; + } else { + elInView.removeAttribute(FILTER_IN_VIEW_ATTRIBUTE); + elNoEntitiesInView.style.display = "none"; + } + EventBridge.emitWebEvent(JSON.stringify({ type: "filterInView", filterInView: isFilterInView })); + refreshEntities(); + } + + elRadius.onchange = function () { + elRadius.value = Math.max(elRadius.value, 0); + EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elRadius.value })); + refreshEntities(); + elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; + } + + if (window.EventBridge !== undefined) { + EventBridge.scriptEventReceived.connect(function(data) { + data = JSON.parse(data); + if (data.type === "clearEntityList") { + clearEntities(); + } else if (data.type == "selectionUpdate") { + var notFound = updateSelectedEntities(data.selectedIDs); + if (notFound) { + refreshEntities(); + } + } else if (data.type === "update" && data.selectedIDs !== undefined) { + var newEntities = data.entities; + if (newEntities && newEntities.length == 0) { + elNoEntitiesMessage.style.display = "block"; + elFooter.firstChild.nodeValue = "0 entities found"; + } else if (newEntities) { + elNoEntitiesMessage.style.display = "none"; + for (var i = 0; i < newEntities.length; i++) { + addEntity(newEntities[i].id, newEntities[i].name, newEntities[i].type); + } + updateSelectedEntities(data.selectedIDs); + entityList.refresh(); + //scheduleRefreshEntityList(); + resize(); + } + } else if (data.type === "removeEntities" && data.deletedIDs !== undefined && data.selectedIDs !== undefined) { + removeEntities(data.deletedIDs); + updateSelectedEntities(data.selectedIDs); + //scheduleRefreshEntityList(); + } else if (data.type === "deleted" && data.ids) { + removeEntities(data.ids); + refreshFooter(); + } + }); + } + + resize(); + entityList.initialize(572); + refreshEntities(); + }); + + // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked + document.addEventListener("contextmenu", function (event) { + event.preventDefault(); + }, false); +} diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js new file mode 100644 index 0000000000..59de16997b --- /dev/null +++ b/scripts/system/html/js/listView.js @@ -0,0 +1,198 @@ +// listView.js +// +// Created by David Back on 27 Aug 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 + +debugPrint = function (message) { + console.log(message); +}; + +ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, updateRowFunction, clearRowFunction) { + var that = {}; + + var SCROLL_ROWS = 2; + var FIRST_ROW_INDEX = 3; + + var elTable = document.getElementById(tableId); + var elTableBody = document.getElementById(tableBodyId); + var elTableScroll = document.getElementById(tableScrollId); + + var elTopBuffer = null; + var elBottomBuffer = null; + + var itemData = {}; + + var rowOffset = 0; + var numRows = 0; + var rowHeight = 0; + var lastRowChangeScrollTop = 0; + + that.addItem = function(id, data) { + if (itemData[id] === undefined) { + itemData[id] = data; + } + }; + + that.updateItem = function(id, data) { + if (itemData[id] !== undefined) { + + } + }; + + that.removeItem = function(id) { + if (itemData[id] !== undefined) { + delete itemData[id]; + } + }; + + that.clear = function() { + for (var i = 0; i < numRows; i++) { + var elRow = elTableBody.childNodes[i + FIRST_ROW_INDEX]; + clearRowFunction(elRow); + } + }; + + that.setSortKey = function(key) { + + }; + + that.setFilter = function(filter) { + + }; + + that.scrollDown = function() { + var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); + var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); + + for (var i = 0; i < SCROLL_ROWS; i++) { + var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; + elTableBody.removeChild(topRow); + elTableBody.insertBefore(topRow, elBottomBuffer); + var rowIndex = 0; + for (var id in itemData) { + if (rowIndex === numRows + rowOffset) { + topRow.setAttribute("id", id); + updateRowFunction(topRow, itemData[id]); + break; + } + rowIndex++; + } + rowOffset++; + } + + var newTopHeight = prevTopHeight + (rowHeight * SCROLL_ROWS); + var newBottomHeight = prevBottomHeight - (rowHeight * SCROLL_ROWS); + elTopBuffer.setAttribute("height", newTopHeight); + elBottomBuffer.setAttribute("height", newBottomHeight); + lastRowChangeScrollTop += rowHeight * SCROLL_ROWS; + }; + + that.scrollUp = function() { + var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); + var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); + + for (var i = 0; i < SCROLL_ROWS; i++) { + var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; + var bottomRow = elTableBody.childNodes[FIRST_ROW_INDEX + numRows - 1]; + elTableBody.removeChild(bottomRow); + elTableBody.insertBefore(bottomRow, topRow); + var rowIndex = 0; + for (var id in itemData) { + if (rowIndex === rowOffset - 1) { + bottomRow.setAttribute("id", id); + updateRowFunction(bottomRow, itemData[id]); + break; + } + rowIndex++; + } + rowOffset--; + } + + var newTopHeight = prevTopHeight - (rowHeight * SCROLL_ROWS); + var newBottomHeight = prevBottomHeight + (rowHeight * SCROLL_ROWS); + elTopBuffer.setAttribute("height", newTopHeight); + elBottomBuffer.setAttribute("height", newBottomHeight); + lastRowChangeScrollTop -= rowHeight * SCROLL_ROWS; + }; + + that.onScroll = function() { + var scrollTop = elTableScroll.scrollTop; + var nextRowChangeScrollTop = lastRowChangeScrollTop + (rowHeight * SCROLL_ROWS); + var totalItems = Object.keys(itemData).length; + + if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { + that.scrollDown(); + } else if (scrollTop < lastRowChangeScrollTop && rowOffset >= SCROLL_ROWS) { + that.scrollUp(); + } + }; + + that.refresh = function() { + var rowIndex = 0; + for (var id in itemData) { + if (rowIndex >= rowOffset) { + var rowElementIndex = rowIndex + FIRST_ROW_INDEX; + var elRow = elTableBody.childNodes[rowElementIndex]; + var data = itemData[id]; + elRow.setAttribute("id", id); + updateRowFunction(elRow, data); + } + + rowIndex++; + + if (rowIndex - rowOffset === numRows) { + break; + } + } + + var totalItems = Object.keys(itemData).length; + var bottomHiddenRows = totalItems - numRows - rowOffset; + var bottomBufferHeight = rowHeight * bottomHiddenRows; + if (bottomHiddenRows < 0) { + bottomBufferHeight = 0; + } + elBottomBuffer.setAttribute("height", bottomBufferHeight); + }; + + that.initialize = function(viewableHeight) { + if (!elTable || !elTableBody) { + debugPrint("ListView - no valid table/body element"); + return; + } + + elTableScroll.onscroll = that.onScroll; + + // clear out any existing rows + while(elTableBody.rows.length > 0) { + elTableBody.deleteRow(0); + } + + elTopBuffer = document.createElement("tr"); + elTopBuffer.setAttribute("height", 0); + elTableBody.appendChild(elTopBuffer); + + elBottomBuffer = document.createElement("tr"); + elBottomBuffer.setAttribute("height", 0); + elTableBody.appendChild(elBottomBuffer); + + var maxHeight = viewableHeight; + var usedHeight = 0; + while(usedHeight < maxHeight) { + var newRow = createRowFunction(elBottomBuffer); + rowHeight = elTableBody.offsetHeight - usedHeight; + usedHeight = elTableBody.offsetHeight; + numRows++; + } + + // extra rows for scrolling purposes + for (var i = 0; i < SCROLL_ROWS; i++) { + var scrollRow = createRowFunction(elBottomBuffer); + numRows++; + } + } + + return that; +} \ No newline at end of file diff --git a/scripts/system/libraries/entityList.js b/scripts/system/libraries/entityList.js index 678b2eeb0b..cd19fe5e08 100644 --- a/scripts/system/libraries/entityList.js +++ b/scripts/system/libraries/entityList.js @@ -19,28 +19,12 @@ EntityListTool = function(shouldUseEditTabletApp) { var TITLE_OFFSET = 60; var ENTITY_LIST_WIDTH = 495; var MAX_DEFAULT_CREATE_TOOLS_HEIGHT = 778; - var entityListWindow = new CreateWindow( - Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", - 'Entity List', - 'com.highfidelity.create.entityListWindow', - function () { - var windowHeight = Window.innerHeight - TITLE_OFFSET; - if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { - windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; - } - return { - size: { - x: ENTITY_LIST_WIDTH, - y: windowHeight - }, - position: { - x: Window.x, - y: Window.y + TITLE_OFFSET - } - }; - }, - false - ); + + var defaultEntityListWindow = createEntityListWindow(Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", + 'Entity List'); + var newEntityListWindow = createEntityListWindow(Script.resourcesPath() + "qml/hifi/tablet/EditEntityListNew.qml", + 'Entity List (New)'); + var entityListWindow = defaultEntityListWindow; var webView = null; webView = Tablet.getTablet("com.highfidelity.interface.tablet.system"); @@ -52,6 +36,36 @@ EntityListTool = function(shouldUseEditTabletApp) { var visible = false; that.webView = webView; + + function createEntityListWindow(entityListPath, windowName) { + var listWindow = new CreateWindow( + entityListPath, + windowName, + 'com.highfidelity.create.entityListWindow', + function () { + var windowHeight = Window.innerHeight - TITLE_OFFSET; + if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { + windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; + } + return { + size: { + x: ENTITY_LIST_WIDTH, + y: windowHeight + }, + position: { + x: Window.x, + y: Window.y + TITLE_OFFSET + } + }; + }, + false + ); + return listWindow; + } + + that.setUseNewEntityList = function(useNewEntityList) { + entityListWindow = useNewEntityList ? newEntityListWindow : defaultEntityListWindow; + }; that.setVisible = function(newVisible) { visible = newVisible; @@ -247,7 +261,8 @@ EntityListTool = function(shouldUseEditTabletApp) { }; webView.webEventReceived.connect(onWebEventReceived); - entityListWindow.webEventReceived.addListener(onWebEventReceived); + defaultEntityListWindow.webEventReceived.addListener(onWebEventReceived); + newEntityListWindow.webEventReceived.addListener(onWebEventReceived); that.interactiveWindowHidden = entityListWindow.interactiveWindowHidden; return that; From 40d4f581f5a219e85e03dd7cca2093faa9903744 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 5 Sep 2018 13:16:23 -0700 Subject: [PATCH 072/434] working scrolling --- scripts/system/html/js/listView.js | 37 +++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index 59de16997b..729114bfdf 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -63,11 +63,11 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda }; - that.scrollDown = function() { + that.scrollDown = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); - for (var i = 0; i < SCROLL_ROWS; i++) { + for (var i = 0; i < numScrollRows; i++) { var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; elTableBody.removeChild(topRow); elTableBody.insertBefore(topRow, elBottomBuffer); @@ -83,18 +83,18 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda rowOffset++; } - var newTopHeight = prevTopHeight + (rowHeight * SCROLL_ROWS); - var newBottomHeight = prevBottomHeight - (rowHeight * SCROLL_ROWS); + var newTopHeight = prevTopHeight + (rowHeight * numScrollRows); + var newBottomHeight = prevBottomHeight - (rowHeight * numScrollRows); elTopBuffer.setAttribute("height", newTopHeight); elBottomBuffer.setAttribute("height", newBottomHeight); - lastRowChangeScrollTop += rowHeight * SCROLL_ROWS; + lastRowChangeScrollTop += rowHeight * numScrollRows; }; - that.scrollUp = function() { + that.scrollUp = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); - for (var i = 0; i < SCROLL_ROWS; i++) { + for (var i = 0; i < numScrollRows; i++) { var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; var bottomRow = elTableBody.childNodes[FIRST_ROW_INDEX + numRows - 1]; elTableBody.removeChild(bottomRow); @@ -111,22 +111,33 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda rowOffset--; } - var newTopHeight = prevTopHeight - (rowHeight * SCROLL_ROWS); - var newBottomHeight = prevBottomHeight + (rowHeight * SCROLL_ROWS); + var newTopHeight = prevTopHeight - (rowHeight * numScrollRows); + var newBottomHeight = prevBottomHeight + (rowHeight * numScrollRows); elTopBuffer.setAttribute("height", newTopHeight); elBottomBuffer.setAttribute("height", newBottomHeight); - lastRowChangeScrollTop -= rowHeight * SCROLL_ROWS; + lastRowChangeScrollTop -= rowHeight * numScrollRows; }; that.onScroll = function() { var scrollTop = elTableScroll.scrollTop; var nextRowChangeScrollTop = lastRowChangeScrollTop + (rowHeight * SCROLL_ROWS); var totalItems = Object.keys(itemData).length; + var scrollHeight = rowHeight * SCROLL_ROWS; - if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { - that.scrollDown(); + if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { + var numScrolls = Math.ceil((scrollTop - nextRowChangeScrollTop) / scrollHeight); + var numScrollRows = numScrolls * SCROLL_ROWS; + if (numScrollRows + rowOffset > totalItems) { + numScrollRows = totalItems - rowOffset; + } + that.scrollDown(numScrollRows); } else if (scrollTop < lastRowChangeScrollTop && rowOffset >= SCROLL_ROWS) { - that.scrollUp(); + var numScrolls = Math.ceil((lastRowChangeScrollTop - scrollTop) / scrollHeight); + var numScrollRows = numScrolls * SCROLL_ROWS; + if (rowOffset - numScrollRows < 0) { + numScrollRows = rowOffset; + } + that.scrollUp(numScrollRows); } }; From 82ed57e41f789cda3984e75d6b8853d1ad855c1e Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 5 Sep 2018 17:59:03 -0700 Subject: [PATCH 073/434] triple list structure, added columns, sorting --- scripts/system/html/entityListNew.html | 37 +- scripts/system/html/js/entityListNew.js | 438 ++++++++++++++++-------- scripts/system/html/js/listView.js | 100 ++---- 3 files changed, 368 insertions(+), 207 deletions(-) diff --git a/scripts/system/html/entityListNew.html b/scripts/system/html/entityListNew.html index 1411286414..50488db6c7 100644 --- a/scripts/system/html/entityListNew.html +++ b/scripts/system/html/entityListNew.html @@ -40,19 +40,50 @@
- + + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + + + diff --git a/scripts/system/html/js/entityListNew.js b/scripts/system/html/js/entityListNew.js index 01b9785444..cda6907266 100644 --- a/scripts/system/html/js/entityListNew.js +++ b/scripts/system/html/js/entityListNew.js @@ -6,12 +6,56 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -var entities = {}; +const ASCENDING_SORT = 1; +const DESCENDING_SORT = -1; +const ASCENDING_STRING = '▴'; +const DESCENDING_STRING = '▾'; +const COMPARE_ASCENDING = function(a, b) { + let va = a[currentSortColumn]; + let vb = b[currentSortColumn]; + + if (va < vb) { + return -1; + } else if (va > vb) { + return 1; + } + return 0; +} +const COMPARE_DESCENDING = function(a, b) { + return COMPARE_ASCENDING(b, a); +} +const LOCKED_GLYPH = ""; +const VISIBLE_GLYPH = ""; +const TRANSPARENCY_GLYPH = ""; +const BAKED_GLYPH = "" +const SCRIPT_GLYPH = "k"; +const BYTES_PER_MEGABYTE = 1024 * 1024; +const IMAGE_MODEL_NAME = 'default-image-model.fbx'; +const NUM_COLUMNS = 12; + +var entities = []; +var entitiesByID = {}; +var visibleEntities = []; + var selectedEntities = []; + var currentSortColumn = 'type'; var currentSortOrder = 'des'; + var entityList = null; -var refreshEntityListTimer = null; + +const ENABLE_PROFILING = true; +var profileIndent = ''; +const PROFILE = !ENABLE_PROFILING ? function() { } : function(name, fn, args) { + console.log("PROFILE-Web " + profileIndent + "(" + name + ") Begin"); + var previousIndent = profileIndent; + profileIndent += ' '; + var before = Date.now(); + fn.apply(this, args); + var delta = Date.now() - before; + profileIndent = previousIndent; + console.log("PROFILE-Web " + profileIndent + "(" + name + ") End " + delta + "ms"); +}; debugPrint = function (message) { console.log(message); @@ -34,24 +78,80 @@ function loaded() { elExport = document.getElementById("export"); elPal = document.getElementById("pal"); elInfoToggle = document.getElementById("info-toggle"); - //elInfoToggleGlyph = elInfoToggle.firstChild; + elInfoToggleGlyph = elInfoToggle.firstChild; elFooter = document.getElementById("footer-text"); elNoEntitiesMessage = document.getElementById("no-entities"); elNoEntitiesInView = document.getElementById("no-entities-in-view"); elNoEntitiesRadius = document.getElementById("no-entities-radius"); entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); + + document.getElementById("entity-name").onclick = function() { + setSortColumn('name'); + }; + document.getElementById("entity-type").onclick = function() { + setSortColumn('type'); + }; + document.getElementById("entity-url").onclick = function() { + setSortColumn('url'); + }; + document.getElementById("entity-locked").onclick = function () { + setSortColumn('locked'); + }; + document.getElementById("entity-visible").onclick = function () { + setSortColumn('visible'); + }; + document.getElementById("entity-verticesCount").onclick = function () { + setSortColumn('verticesCount'); + }; + document.getElementById("entity-texturesCount").onclick = function () { + setSortColumn('texturesCount'); + }; + document.getElementById("entity-texturesSize").onclick = function () { + setSortColumn('texturesSize'); + }; + document.getElementById("entity-hasTransparent").onclick = function () { + setSortColumn('hasTransparent'); + }; + document.getElementById("entity-isBaked").onclick = function () { + setSortColumn('isBaked'); + }; + document.getElementById("entity-drawCalls").onclick = function () { + setSortColumn('drawCalls'); + }; + document.getElementById("entity-hasScript").onclick = function () { + setSortColumn('hasScript'); + }; + + elRefresh.onclick = function() { + refreshEntities(); + } + elToggleLocked.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); + } + elToggleVisible.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); + } + elExport.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); + } + elPal.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); + } + elDelete.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); + } function createRowFunction(elBottomBuffer) { var row = document.createElement("tr"); - var typeCell = document.createElement("td"); - var typeCellText = document.createTextNode(""); - var nameCell = document.createElement("td"); - var nameCellText = document.createTextNode(""); - typeCell.appendChild(typeCellText); - nameCell.appendChild(nameCellText); - row.appendChild(typeCell); - row.appendChild(nameCell); + for (var i = 0; i < NUM_COLUMNS; i++) { + var column = document.createElement("td"); + // locked, visible, hasTransparent, isBaked glyph columns + if (i === 3 || i === 4 || i === 8 || i === 9) { + column.className = 'glyph'; + } + row.appendChild(column); + } row.onclick = onRowClicked; row.ondblclick = onRowDoubleClicked; elEntityTableBody.insertBefore(row, elBottomBuffer); @@ -60,33 +160,59 @@ function loaded() { function updateRowFunction(elRow, itemData) { var typeCell = elRow.childNodes[0]; + typeCell.innerText = itemData.type; var nameCell = elRow.childNodes[1]; - typeCell.innerHTML = itemData.type; - nameCell.innerHTML = itemData.name; + nameCell.innerText = itemData.name; + var urlCell = elRow.childNodes[2]; + urlCell.innerText = itemData.url; + var lockedCell = elRow.childNodes[3]; + lockedCell.innerHTML = itemData.locked; + var visibleCell = elRow.childNodes[4]; + visibleCell.innerHTML = itemData.visible; + var verticesCountCell = elRow.childNodes[5]; + verticesCountCell.innerText = itemData.verticesCount; + var texturesCountCell = elRow.childNodes[6]; + texturesCountCell.innerText = itemData.texturesCount; + var texturesSizeCell = elRow.childNodes[7]; + texturesSizeCell.innerText = itemData.texturesSize; + var hasTransparentCell = elRow.childNodes[8]; + hasTransparentCell.innerHTML = itemData.hasTransparent; + var isBakedCell = elRow.childNodes[9]; + isBakedCell.innerHTML = itemData.isBaked; + var drawCallsCell = elRow.childNodes[10]; + drawCallsCell.innerText = itemData.drawCalls; + var hasScriptCell = elRow.childNodes[11]; + hasScriptCell.innerText = itemData.hasScript; - var id = elRow.getAttribute("id"); - entities[id].el = elRow; + var prevItemId = elRow.getAttribute("id"); + var newItemId = itemData.id; + if (prevItemId && prevItemId !== newItemId) { + entitiesByID[prevItemId].elRow = null; + } + if (!prevItemId || prevItemId !== newItemId) { + elRow.setAttribute("id", newItemId); + entitiesByID[newItemId].elRow = elRow; + } } function clearRowFunction(elRow) { - var typeCell = elRow.childNodes[0]; - var nameCell = elRow.childNodes[1]; - typeCell.innerHTML = ""; - nameCell.innerHTML = ""; - + for (var i = 0; i < NUM_COLUMNS; i++) { + var cell = elRow.childNodes[i]; + cell.innerHTML = ""; + } + var id = elRow.getAttribute("id"); - if (id && entities[id]) { - entities[id].el = null; + if (id && entitiesByID[id]) { + entitiesByID[id].elRow = null; } } function onRowClicked(clickEvent) { - var id = this.getAttribute("id"); - var selection = [id]; + var entityID = this.getAttribute("id"); + var selection = [entityID]; - /* if (clickEvent.ctrlKey) { - var selectedIndex = selectedEntities.indexOf(id); + var selectedIndex = selectedEntities.indexOf(entityID); if (selectedIndex >= 0) { selection = selectedEntities; selection.splice(selectedIndex, 1) @@ -96,11 +222,12 @@ function loaded() { } else if (clickEvent.shiftKey && selectedEntities.length > 0) { var previousItemFound = -1; var clickedItemFound = -1; - for (var entity in entityList.visibleItems) { - if (clickedItemFound === -1 && this.dataset.entityId == entityList.visibleItems[entity].values().id) { - clickedItemFound = entity; - } else if(previousItemFound === -1 && selectedEntities[0] == entityList.visibleItems[entity].values().id) { - previousItemFound = entity; + for (var i = 0; i < visibleEntities.length; i++) { + var entity = visibleEntities[i]; + if (clickedItemFound === -1 && entityID == entity.id) { + clickedItemFound = i; + } else if(previousItemFound === -1 && selectedEntities[0] == entity.id) { + previousItemFound = i; } } if (previousItemFound !== -1 && clickedItemFound !== -1) { @@ -108,8 +235,8 @@ function loaded() { var toItem = Math.max(previousItemFound, clickedItemFound); // skip first and last item in this loop, we add them to selection after the loop for (var i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { - entityList.visibleItems[i].elm.className = 'selected'; - betweenItems.push(entityList.visibleItems[i].values().id); + visibleEntities[i].elRow.className = 'selected'; + betweenItems.push(visibleEntities[i].id); } if (previousItemFound > clickedItemFound) { // always make sure that we add the items in the right order @@ -118,7 +245,6 @@ function loaded() { selection = selection.concat(betweenItems, selectedEntities); } } - */ selectedEntities = selection; @@ -134,73 +260,45 @@ function loaded() { } function onRowDoubleClicked() { - var id = this.getAttribute("id"); + var entityID = this.getAttribute("id"); EventBridge.emitWebEvent(JSON.stringify({ type: "selectionUpdate", focus: true, - entityIds: [id], + entityIds: [entityID], })); } - function addEntity(id, name, type) { - //var urlParts = url.split('/'); - //var filename = urlParts[urlParts.length - 1]; - - var IMAGE_MODEL_NAME = 'default-image-model.fbx'; - - //if (filename === IMAGE_MODEL_NAME) { - // type = "Image"; - //} - - if (entities[id] === undefined) { - var entityData = {name: name, type: type}; - entityList.addItem(id, entityData); - entityData.el = null; - entities[id] = entityData; - } - } - - function removeEntities(deletedIDs) { - for (var i = 0, length = deletedIDs.length; i < length; i++) { - var deleteID = deletedIDs[i]; - delete entities[deleteID]; - entityList.removeItem(deleteID); - } - } - - function scheduleRefreshEntityList() { - var REFRESH_DELAY = 50; - if (refreshEntityListTimer) { - clearTimeout(refreshEntityListTimer); - } - refreshEntityListTimer = setTimeout(refreshEntityListObject, REFRESH_DELAY); - } - - function clearEntities() { - entities = {}; - entityList.clear(); - refreshFooter(); - } - var elSortOrder = { name: document.querySelector('#entity-name .sort-order'), type: document.querySelector('#entity-type .sort-order'), + url: document.querySelector('#entity-url .sort-order'), + locked: document.querySelector('#entity-locked .sort-order'), + visible: document.querySelector('#entity-visible .sort-order'), + verticesCount: document.querySelector('#entity-verticesCount .sort-order'), + texturesCount: document.querySelector('#entity-texturesCount .sort-order'), + texturesSize: document.querySelector('#entity-texturesSize .sort-order'), + hasTransparent: document.querySelector('#entity-hasTransparent .sort-order'), + isBaked: document.querySelector('#entity-isBaked .sort-order'), + drawCalls: document.querySelector('#entity-drawCalls .sort-order'), + hasScript: document.querySelector('#entity-hasScript .sort-order'), } function setSortColumn(column) { - if (currentSortColumn == column) { - currentSortOrder = currentSortOrder == "asc" ? "desc" : "asc"; - } else { - elSortOrder[currentSortColumn].innerHTML = ""; - currentSortColumn = column; - currentSortOrder = "asc"; - } - elSortOrder[column].innerHTML = currentSortOrder == "asc" ? ASCENDING_STRING : DESCENDING_STRING; - //entityList.sort(currentSortColumn, { order: currentSortOrder }); + PROFILE("set-sort-column", function() { + if (currentSortColumn === column) { + currentSortOrder *= -1; + } else { + elSortOrder[currentSortColumn].innerHTML = ""; + currentSortColumn = column; + currentSortOrder = ASCENDING_SORT; + } + elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; + refreshEntityList(); + }); } - - function refreshEntities() { - clearEntities(); - EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); + + function clearEntities() { + entities = {}; + refreshFooter(); } function refreshFooter() { @@ -208,26 +306,102 @@ function loaded() { elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; } else if (selectedEntities.length === 1) { elFooter.firstChild.nodeValue = "1 entity selected"; - } /* else if (entityList.visibleItems.length === 1) { + } else if (visibleEntities.length === 1) { elFooter.firstChild.nodeValue = "1 entity found"; } else { - elFooter.firstChild.nodeValue = entityList.visibleItems.length + " entities found"; - } */ + elFooter.firstChild.nodeValue = visibleEntities.length + " entities found"; + } + } + + function refreshEntities() { + clearEntities(); + EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); } - function refreshEntityListObject() { - refreshEntityListTimer = null; - //entityList.sort(currentSortColumn, { order: currentSortOrder }); - //entityList.search(elFilter.value); - entityList.refresh(); - refreshFooter(); + function refreshEntityList() { + PROFILE("refresh-entity-list", function() { + PROFILE("filter", function() { + var searchTerm = elFilter.value; + if (searchTerm === '') { + visibleEntities = entities.slice(0); + } else { + visibleEntities = entities.filter(function(e) { + return e.name.indexOf(searchTerm) > -1 + || e.type.indexOf(searchTerm) > -1 + || e.fullUrl.indexOf(searchTerm) > -1; + }); + } + }); + + PROFILE("sort", function() { + var cmp = currentSortOrder === ASCENDING_SORT ? COMPARE_ASCENDING : COMPARE_DESCENDING; + visibleEntities.sort(cmp); + }); + + PROFILE("update-dom", function() { + entityList.setVisibleItemData(visibleEntities); + entityList.refresh(); + }); + + refreshFooter(); + }); + } + + function decimalMegabytes(number) { + return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; + } + + function displayIfNonZero(number) { + return number ? number : ""; + } + + function getFilename(url) { + var urlParts = url.split('/'); + return urlParts[urlParts.length - 1]; + } + + function updateEntityData(entityData) { + entities = []; + entitiesByID = {}; + visibleEntities = []; + + PROFILE("map-data", function() { + entityData.forEach(function(entity) { + var type = entity.type + var filename = getFilename(entity.url); + if (filename === IMAGE_MODEL_NAME) { + type = "Image"; + } + + var entityData = { + id: entity.id, + name: entity.name, + type: type, + url: filename, + fullUrl: entity.url, + locked: entity.locked ? LOCKED_GLYPH : null, + visible: entity.visible ? VISIBLE_GLYPH : null, + verticesCount: displayIfNonZero(entity.verticesCount), + texturesCount: displayIfNonZero(entity.texturesCount), + texturesSize: decimalMegabytes(entity.texturesSize), + hasTransparent: entity.hasTransparent ? TRANSPARENCY_GLYPH : null, + isBaked: entity.isBaked ? BAKED_GLYPH : null, + drawCalls: displayIfNonZero(entity.drawCalls), + hasScript: entity.hasScript ? SCRIPT_GLYPH : null, + elRow : null + } + + entities.push(entityData); + entitiesByID[entityData.id] = entityData; + }); + }); } function updateSelectedEntities(selectedIDs) { var notFound = false; - for (var id in entities) { - if (entities[id].el) { - entities[id].el.className = ''; + for (var id in entitiesByID) { + if (entitiesByID[id].elRow) { + entitiesByID[id].elRow.className = ''; } } @@ -236,8 +410,8 @@ function loaded() { var id = selectedIDs[i]; selectedEntities.push(id); if (id in entities) { - var entity = entities[id]; - entity.el.className = 'selected'; + var entity = entitiesByID[id]; + entity.elRow.className = 'selected'; } else { notFound = true; } @@ -247,6 +421,13 @@ function loaded() { return notFound; } + + function removeEntities(deletedIDs) { + for (var i = 0, length = deletedIDs.length; i < length; i++) { + var deleteID = deletedIDs[i]; + delete entitiesByID[deleteID]; + } + } function resize() { // Take up available window space @@ -278,9 +459,9 @@ function loaded() { } else { ths[0].width = 0.16 * tableWidth; ths[1].width = 0.34 * tableWidth; - //ths[2].width = 0.34 * tableWidth; - //ths[3].width = 0.08 * tableWidth; - //ths[4].width = 0.08 * tableWidth; + ths[2].width = 0.34 * tableWidth; + ths[3].width = 0.08 * tableWidth; + ths[4].width = 0.08 * tableWidth; } } }; @@ -302,25 +483,6 @@ function loaded() { event.stopPropagation(); } elInfoToggle.addEventListener("click", toggleInfo, true); - - elRefresh.onclick = function() { - refreshEntities(); - } - elToggleLocked.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); - } - elToggleVisible.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); - } - elExport.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); - } - elPal.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); - } - elDelete.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); - } document.addEventListener("keydown", function (keyDownEvent) { if (keyDownEvent.target.nodeName === "INPUT") { @@ -374,24 +536,21 @@ function loaded() { refreshEntities(); } } else if (data.type === "update" && data.selectedIDs !== undefined) { - var newEntities = data.entities; - if (newEntities && newEntities.length == 0) { - elNoEntitiesMessage.style.display = "block"; - elFooter.firstChild.nodeValue = "0 entities found"; - } else if (newEntities) { - elNoEntitiesMessage.style.display = "none"; - for (var i = 0; i < newEntities.length; i++) { - addEntity(newEntities[i].id, newEntities[i].name, newEntities[i].type); + PROFILE("update", function() { + var newEntities = data.entities; + if (newEntities && newEntities.length == 0) { + elNoEntitiesMessage.style.display = "block"; + elFooter.firstChild.nodeValue = "0 entities found"; + } else if (newEntities) { + elNoEntitiesMessage.style.display = "none"; + updateEntityData(newEntities); + refreshEntityList(); + updateSelectedEntities(data.selectedIDs); } - updateSelectedEntities(data.selectedIDs); - entityList.refresh(); - //scheduleRefreshEntityList(); - resize(); - } + }); } else if (data.type === "removeEntities" && data.deletedIDs !== undefined && data.selectedIDs !== undefined) { removeEntities(data.deletedIDs); updateSelectedEntities(data.selectedIDs); - //scheduleRefreshEntityList(); } else if (data.type === "deleted" && data.ids) { removeEntities(data.ids); refreshFooter(); @@ -399,6 +558,7 @@ function loaded() { }); } + setSortColumn('type'); resize(); entityList.initialize(572); refreshEntities(); diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index 729114bfdf..e0a9e4c0c0 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -22,30 +22,16 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var elTopBuffer = null; var elBottomBuffer = null; - - var itemData = {}; + + var visibleItemData = []; var rowOffset = 0; var numRows = 0; var rowHeight = 0; var lastRowChangeScrollTop = 0; - that.addItem = function(id, data) { - if (itemData[id] === undefined) { - itemData[id] = data; - } - }; - - that.updateItem = function(id, data) { - if (itemData[id] !== undefined) { - - } - }; - - that.removeItem = function(id) { - if (itemData[id] !== undefined) { - delete itemData[id]; - } + that.setVisibleItemData = function(itemData) { + visibleItemData = itemData; }; that.clear = function() { @@ -63,23 +49,16 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda }; - that.scrollDown = function(numScrollRows) { + that.scrollDown = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); for (var i = 0; i < numScrollRows; i++) { - var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; - elTableBody.removeChild(topRow); - elTableBody.insertBefore(topRow, elBottomBuffer); - var rowIndex = 0; - for (var id in itemData) { - if (rowIndex === numRows + rowOffset) { - topRow.setAttribute("id", id); - updateRowFunction(topRow, itemData[id]); - break; - } - rowIndex++; - } + var rowMovedTopToBottom = elTableBody.childNodes[FIRST_ROW_INDEX]; + var rowIndex = numRows + rowOffset; + elTableBody.removeChild(rowMovedTopToBottom); + elTableBody.insertBefore(rowMovedTopToBottom, elBottomBuffer); + updateRowFunction(rowMovedTopToBottom, visibleItemData[rowIndex]); rowOffset++; } @@ -90,24 +69,17 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda lastRowChangeScrollTop += rowHeight * numScrollRows; }; - that.scrollUp = function(numScrollRows) { + that.scrollUp = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); - + for (var i = 0; i < numScrollRows; i++) { var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; - var bottomRow = elTableBody.childNodes[FIRST_ROW_INDEX + numRows - 1]; - elTableBody.removeChild(bottomRow); - elTableBody.insertBefore(bottomRow, topRow); - var rowIndex = 0; - for (var id in itemData) { - if (rowIndex === rowOffset - 1) { - bottomRow.setAttribute("id", id); - updateRowFunction(bottomRow, itemData[id]); - break; - } - rowIndex++; - } + var rowMovedBottomToTop = elTableBody.childNodes[FIRST_ROW_INDEX + numRows - 1]; + var rowIndex = rowOffset - 1; + elTableBody.removeChild(rowMovedBottomToTop); + elTableBody.insertBefore(rowMovedBottomToTop, topRow); + updateRowFunction(rowMovedBottomToTop, visibleItemData[rowIndex]); rowOffset--; } @@ -121,14 +93,14 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda that.onScroll = function() { var scrollTop = elTableScroll.scrollTop; var nextRowChangeScrollTop = lastRowChangeScrollTop + (rowHeight * SCROLL_ROWS); - var totalItems = Object.keys(itemData).length; var scrollHeight = rowHeight * SCROLL_ROWS; + var totalItems = visibleItemData.length; if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { var numScrolls = Math.ceil((scrollTop - nextRowChangeScrollTop) / scrollHeight); var numScrollRows = numScrolls * SCROLL_ROWS; - if (numScrollRows + rowOffset > totalItems) { - numScrollRows = totalItems - rowOffset; + if (numScrollRows + rowOffset + numRows > totalItems) { + numScrollRows = totalItems - rowOffset - numRows; } that.scrollDown(numScrollRows); } else if (scrollTop < lastRowChangeScrollTop && rowOffset >= SCROLL_ROWS) { @@ -142,25 +114,23 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda }; that.refresh = function() { - var rowIndex = 0; - for (var id in itemData) { - if (rowIndex >= rowOffset) { - var rowElementIndex = rowIndex + FIRST_ROW_INDEX; - var elRow = elTableBody.childNodes[rowElementIndex]; - var data = itemData[id]; - elRow.setAttribute("id", id); - updateRowFunction(elRow, data); - } - - rowIndex++; - - if (rowIndex - rowOffset === numRows) { - break; - } + // block refreshing before rows are initialized + if (numRows === 0) { + return; } - var totalItems = Object.keys(itemData).length; - var bottomHiddenRows = totalItems - numRows - rowOffset; + for (var i = 0; i < numRows; i++) { + var rowIndex = i + rowOffset; + if (rowIndex >= visibleItemData.length) { + break; + } + var rowElementIndex = i + FIRST_ROW_INDEX; + var elRow = elTableBody.childNodes[rowElementIndex]; + var itemData = visibleItemData[rowIndex]; + updateRowFunction(elRow, itemData); + } + + var bottomHiddenRows = visibleItemData.length - numRows - rowOffset; var bottomBufferHeight = rowHeight * bottomHiddenRows; if (bottomHiddenRows < 0) { bottomBufferHeight = 0; From 0a67c49ef9e769d06dedb51ca312fd1b13abdef9 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 6 Sep 2018 16:50:36 -0700 Subject: [PATCH 074/434] remove separate new entity list with option, fix row clicking --- .../qml/hifi/tablet/EditEntityListNew.qml | 15 - scripts/system/edit.js | 15 +- scripts/system/html/entityList.html | 1 + scripts/system/html/entityListNew.html | 102 ---- scripts/system/html/js/entityList.js | 559 ++++++++++------- scripts/system/html/js/entityListNew.js | 571 ------------------ scripts/system/libraries/entityList.js | 60 +- 7 files changed, 356 insertions(+), 967 deletions(-) delete mode 100644 interface/resources/qml/hifi/tablet/EditEntityListNew.qml delete mode 100644 scripts/system/html/entityListNew.html delete mode 100644 scripts/system/html/js/entityListNew.js diff --git a/interface/resources/qml/hifi/tablet/EditEntityListNew.qml b/interface/resources/qml/hifi/tablet/EditEntityListNew.qml deleted file mode 100644 index 7ed6d25ae8..0000000000 --- a/interface/resources/qml/hifi/tablet/EditEntityListNew.qml +++ /dev/null @@ -1,15 +0,0 @@ -import QtQuick 2.7 -import QtQuick.Controls 2.2 -import QtWebChannel 1.0 -import "../../controls" -import "../toolbars" -import QtGraphicalEffects 1.0 -import "../../controls-uit" as HifiControls -import "../../styles-uit" - - -WebView { - id: entityListToolWebView - url: Paths.defaultScripts + "/system/html/entityListNew.html" - enabled: true -} diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 6582130062..4c29df92f6 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -156,7 +156,6 @@ var MENU_AUTO_FOCUS_ON_SELECT = "Auto Focus on Select"; var MENU_EASE_ON_FOCUS = "Ease Orientation on Focus"; var MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE = "Show Lights and Particle Systems in Create Mode"; var MENU_SHOW_ZONES_IN_EDIT_MODE = "Show Zones in Create Mode"; -var MENU_USE_NEW_ENTITY_LIST = "Use New Entity List"; var MENU_CREATE_ENTITIES_GRABBABLE = "Create Entities As Grabbable (except Zones, Particles, and Lights)"; var MENU_ALLOW_SELECTION_LARGE = "Allow Selecting of Large Models"; @@ -167,7 +166,6 @@ var SETTING_AUTO_FOCUS_ON_SELECT = "autoFocusOnSelect"; var SETTING_EASE_ON_FOCUS = "cameraEaseOnFocus"; var SETTING_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE = "showLightsAndParticlesInEditMode"; var SETTING_SHOW_ZONES_IN_EDIT_MODE = "showZonesInEditMode"; -var SETTING_USE_NEW_ENTITY_LIST = "useNewEntityList"; var SETTING_EDIT_PREFIX = "Edit/"; @@ -873,11 +871,8 @@ var toolBar = (function () { tablet.gotoHomeScreen(); } UserActivityLogger.enabledEdit(); - entityListTool.setUseNewEntityList(Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)); entityListTool.setVisible(true); - if (!Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)) { - entityListTool.sendUpdate(); - } + entityListTool.sendUpdate(); gridTool.setVisible(true); grid.setEnabled(true); propertiesTool.setVisible(true); @@ -1354,13 +1349,6 @@ function setupModelMenus() { isCheckable: true, isChecked: Settings.getValue(SETTING_SHOW_ZONES_IN_EDIT_MODE) !== "false" }); - Menu.addMenuItem({ - menuName: "Edit", - menuItemName: MENU_USE_NEW_ENTITY_LIST, - afterItem: MENU_SHOW_ZONES_IN_EDIT_MODE, - isCheckable: true, - isChecked: Settings.getValue(SETTING_USE_NEW_ENTITY_LIST, false) - }); Entities.setLightsArePickable(false); } @@ -1399,7 +1387,6 @@ Script.scriptEnding.connect(function () { Settings.setValue(SETTING_EASE_ON_FOCUS, Menu.isOptionChecked(MENU_EASE_ON_FOCUS)); Settings.setValue(SETTING_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE, Menu.isOptionChecked(MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE)); Settings.setValue(SETTING_SHOW_ZONES_IN_EDIT_MODE, Menu.isOptionChecked(MENU_SHOW_ZONES_IN_EDIT_MODE)); - Settings.setValue(SETTING_USE_NEW_ENTITY_LIST, Menu.isOptionChecked(MENU_USE_NEW_ENTITY_LIST)); Settings.setValue(SETTING_EDIT_PREFIX + MENU_CREATE_ENTITIES_GRABBABLE, Menu.isOptionChecked(MENU_CREATE_ENTITIES_GRABBABLE)); Settings.setValue(SETTING_EDIT_PREFIX + MENU_ALLOW_SELECTION_LARGE, Menu.isOptionChecked(MENU_ALLOW_SELECTION_LARGE)); diff --git a/scripts/system/html/entityList.html b/scripts/system/html/entityList.html index 7906a3c97f..6fece921bc 100644 --- a/scripts/system/html/entityList.html +++ b/scripts/system/html/entityList.html @@ -14,6 +14,7 @@ + diff --git a/scripts/system/html/entityListNew.html b/scripts/system/html/entityListNew.html deleted file mode 100644 index 50488db6c7..0000000000 --- a/scripts/system/html/entityListNew.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - -
- -
- - -
- - - -
-
-
- Y - -
- - -
-
-
-
TypeDTypeD NameFileVertsTextsText MBBakedDrawsk
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDNameFileVertsTextsText MBBakedDrawsk
- -
- No entities found in view within a 100 meter radius. Try moving to a different location and refreshing. -
-
- - - diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index ea38fbb359..48c74b4fc9 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -1,27 +1,61 @@ -// entityList.js +// entityListNew.js // -// Created by Ryan Huffman on 19 Nov 2014 -// Copyright 2014 High Fidelity, Inc. +// Created by David Back on 27 Aug 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 -var entities = {}; -var selectedEntities = []; -var currentSortColumn = 'type'; -var currentSortOrder = 'des'; -var entityList = null; -var refreshEntityListTimer = null; +const ASCENDING_SORT = 1; +const DESCENDING_SORT = -1; const ASCENDING_STRING = '▴'; const DESCENDING_STRING = '▾'; +const COMPARE_ASCENDING = function(a, b) { + let va = a[currentSortColumn]; + let vb = b[currentSortColumn]; + + if (va < vb) { + return -1; + } else if (va > vb) { + return 1; + } + return 0; +} +const COMPARE_DESCENDING = function(a, b) { + return COMPARE_ASCENDING(b, a); +} const LOCKED_GLYPH = ""; const VISIBLE_GLYPH = ""; const TRANSPARENCY_GLYPH = ""; const BAKED_GLYPH = "" const SCRIPT_GLYPH = "k"; -const DELETE = 46; // Key code for the delete key. -const KEY_P = 80; // Key code for letter p used for Parenting hotkey. -const MAX_ITEMS = Number.MAX_VALUE; // Used to set the max length of the list of discovered entities. +const BYTES_PER_MEGABYTE = 1024 * 1024; +const IMAGE_MODEL_NAME = 'default-image-model.fbx'; +const NUM_COLUMNS = 12; + +var entities = []; +var entitiesByID = {}; +var visibleEntities = []; + +var selectedEntities = []; + +var currentSortColumn = 'type'; +var currentSortOrder = 'des'; + +var entityList = null; + +const ENABLE_PROFILING = true; +var profileIndent = ''; +const PROFILE = !ENABLE_PROFILING ? function() { } : function(name, fn, args) { + console.log("PROFILE-Web " + profileIndent + "(" + name + ") Begin"); + var previousIndent = profileIndent; + profileIndent += ' '; + var before = Date.now(); + fn.apply(this, args); + var delta = Date.now() - before; + profileIndent = previousIndent; + console.log("PROFILE-Web " + profileIndent + "(" + name + ") End " + delta + "ms"); +}; debugPrint = function (message) { console.log(message); @@ -29,10 +63,11 @@ debugPrint = function (message) { function loaded() { openEventBridge(function() { - entityList = new List('entity-list', { valueNames: ['name', 'type', 'url', 'locked', 'visible'], page: MAX_ITEMS}); - entityList.clear(); elEntityTable = document.getElementById("entity-table"); elEntityTableBody = document.getElementById("entity-table-body"); + elEntityTableScroll = document.getElementById("entity-table-scroll"); + elEntityTableHeader = document.getElementById("entity-table-header"); + elEntityTableFooter = document.getElementById("entity-table-footer"); elRefresh = document.getElementById("refresh"); elToggleLocked = document.getElementById("locked"); elToggleVisible = document.getElementById("visible"); @@ -48,8 +83,9 @@ function loaded() { elNoEntitiesMessage = document.getElementById("no-entities"); elNoEntitiesInView = document.getElementById("no-entities-in-view"); elNoEntitiesRadius = document.getElementById("no-entities-radius"); - elEntityTableScroll = document.getElementById("entity-table-scroll"); + entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); + document.getElementById("entity-name").onclick = function() { setSortColumn('name'); }; @@ -86,12 +122,97 @@ function loaded() { document.getElementById("entity-hasScript").onclick = function () { setSortColumn('hasScript'); }; + + elRefresh.onclick = function() { + refreshEntities(); + } + elToggleLocked.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); + } + elToggleVisible.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); + } + elExport.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); + } + elPal.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); + } + elDelete.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); + } + + function createRowFunction(elBottomBuffer) { + var row = document.createElement("tr"); + for (var i = 0; i < NUM_COLUMNS; i++) { + var column = document.createElement("td"); + // locked, visible, hasTransparent, isBaked glyph columns + if (i === 3 || i === 4 || i === 8 || i === 9) { + column.className = 'glyph'; + } + row.appendChild(column); + } + row.onclick = onRowClicked; + row.ondblclick = onRowDoubleClicked; + elEntityTableBody.insertBefore(row, elBottomBuffer); + return row; + } + + function updateRowFunction(elRow, itemData) { + var typeCell = elRow.childNodes[0]; + typeCell.innerText = itemData.type; + var nameCell = elRow.childNodes[1]; + nameCell.innerText = itemData.name; + var urlCell = elRow.childNodes[2]; + urlCell.innerText = itemData.url; + var lockedCell = elRow.childNodes[3]; + lockedCell.innerHTML = itemData.locked; + var visibleCell = elRow.childNodes[4]; + visibleCell.innerHTML = itemData.visible; + var verticesCountCell = elRow.childNodes[5]; + verticesCountCell.innerText = itemData.verticesCount; + var texturesCountCell = elRow.childNodes[6]; + texturesCountCell.innerText = itemData.texturesCount; + var texturesSizeCell = elRow.childNodes[7]; + texturesSizeCell.innerText = itemData.texturesSize; + var hasTransparentCell = elRow.childNodes[8]; + hasTransparentCell.innerHTML = itemData.hasTransparent; + var isBakedCell = elRow.childNodes[9]; + isBakedCell.innerHTML = itemData.isBaked; + var drawCallsCell = elRow.childNodes[10]; + drawCallsCell.innerText = itemData.drawCalls; + var hasScriptCell = elRow.childNodes[11]; + hasScriptCell.innerText = itemData.hasScript; + + var prevItemId = elRow.getAttribute("id"); + var newItemId = itemData.id; + if (prevItemId && prevItemId !== newItemId) { + entitiesByID[prevItemId].elRow = null; + } + if (!prevItemId || prevItemId !== newItemId) { + elRow.setAttribute("id", newItemId); + entitiesByID[newItemId].elRow = elRow; + } + } + + function clearRowFunction(elRow) { + for (var i = 0; i < NUM_COLUMNS; i++) { + var cell = elRow.childNodes[i]; + cell.innerHTML = ""; + } + + var id = elRow.getAttribute("id"); + if (id && entitiesByID[id]) { + entitiesByID[id].elRow = null; + } + } function onRowClicked(clickEvent) { - var id = this.dataset.entityId; - var selection = [this.dataset.entityId]; + var entityID = this.getAttribute("id"); + var selection = [entityID]; + if (clickEvent.ctrlKey) { - var selectedIndex = selectedEntities.indexOf(id); + var selectedIndex = selectedEntities.indexOf(entityID); if (selectedIndex >= 0) { selection = selectedEntities; selection.splice(selectedIndex, 1) @@ -101,11 +222,12 @@ function loaded() { } else if (clickEvent.shiftKey && selectedEntities.length > 0) { var previousItemFound = -1; var clickedItemFound = -1; - for (var entity in entityList.visibleItems) { - if (clickedItemFound === -1 && this.dataset.entityId == entityList.visibleItems[entity].values().id) { - clickedItemFound = entity; - } else if(previousItemFound === -1 && selectedEntities[0] == entityList.visibleItems[entity].values().id) { - previousItemFound = entity; + for (var i = 0; i < visibleEntities.length; i++) { + var entity = visibleEntities[i]; + if (clickedItemFound === -1 && entityID == entity.id) { + clickedItemFound = i; + } else if(previousItemFound === -1 && selectedEntities[0] == entity.id) { + previousItemFound = i; } } if (previousItemFound !== -1 && clickedItemFound !== -1) { @@ -113,8 +235,8 @@ function loaded() { var toItem = Math.max(previousItemFound, clickedItemFound); // skip first and last item in this loop, we add them to selection after the loop for (var i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { - entityList.visibleItems[i].elm.className = 'selected'; - betweenItems.push(entityList.visibleItems[i].values().id); + visibleEntities[i].elRow.className = 'selected'; + betweenItems.push(visibleEntities[i].id); } if (previousItemFound > clickedItemFound) { // always make sure that we add the items in the right order @@ -138,84 +260,14 @@ function loaded() { } function onRowDoubleClicked() { + var entityID = this.getAttribute("id"); EventBridge.emitWebEvent(JSON.stringify({ type: "selectionUpdate", focus: true, - entityIds: [this.dataset.entityId], + entityIds: [entityID], })); } - const BYTES_PER_MEGABYTE = 1024 * 1024; - - function decimalMegabytes(number) { - return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; - } - - function displayIfNonZero(number) { - return number ? number : ""; - } - - function addEntity(id, name, type, url, locked, visible, verticesCount, texturesCount, texturesSize, hasTransparent, - isBaked, drawCalls, hasScript) { - - var urlParts = url.split('/'); - var filename = urlParts[urlParts.length - 1]; - - var IMAGE_MODEL_NAME = 'default-image-model.fbx'; - - if (filename === IMAGE_MODEL_NAME) { - type = "Image"; - } - - if (entities[id] === undefined) { - entityList.add([{ - id: id, name: name, type: type, url: filename, locked: locked, visible: visible, - verticesCount: displayIfNonZero(verticesCount), texturesCount: displayIfNonZero(texturesCount), - texturesSize: decimalMegabytes(texturesSize), hasTransparent: hasTransparent, - isBaked: isBaked, drawCalls: displayIfNonZero(drawCalls), hasScript: hasScript - }], - function (items) { - var currentElement = items[0].elm; - var id = items[0]._values.id; - entities[id] = { - id: id, - name: name, - el: currentElement, - item: items[0] - }; - currentElement.setAttribute('id', 'entity_' + id); - currentElement.setAttribute('title', url); - currentElement.dataset.entityId = id; - currentElement.onclick = onRowClicked; - currentElement.ondblclick = onRowDoubleClicked; - }); - } else { - var item = entities[id].item; - item.values({ name: name, url: filename, locked: locked, visible: visible }); - } - } - - function removeEntities(deletedIDs) { - for (i = 0, length = deletedIDs.length; i < length; i++) { - delete entities[deletedIDs[i]]; - entityList.remove("id", deletedIDs[i]); - } - } - - function scheduleRefreshEntityList() { - var REFRESH_DELAY = 50; - if (refreshEntityListTimer) { - clearTimeout(refreshEntityListTimer); - } - refreshEntityListTimer = setTimeout(refreshEntityListObject, REFRESH_DELAY); - } - - function clearEntities() { - entities = {}; - entityList.clear(); - refreshFooter(); - } - var elSortOrder = { name: document.querySelector('#entity-name .sort-order'), type: document.querySelector('#entity-type .sort-order'), @@ -231,21 +283,22 @@ function loaded() { hasScript: document.querySelector('#entity-hasScript .sort-order'), } function setSortColumn(column) { - if (currentSortColumn == column) { - currentSortOrder = currentSortOrder == "asc" ? "desc" : "asc"; - } else { - elSortOrder[currentSortColumn].innerHTML = ""; - currentSortColumn = column; - currentSortOrder = "asc"; - } - elSortOrder[column].innerHTML = currentSortOrder == "asc" ? ASCENDING_STRING : DESCENDING_STRING; - entityList.sort(currentSortColumn, { order: currentSortOrder }); + PROFILE("set-sort-column", function() { + if (currentSortColumn === column) { + currentSortOrder *= -1; + } else { + elSortOrder[currentSortColumn].innerHTML = ""; + currentSortColumn = column; + currentSortOrder = ASCENDING_SORT; + } + elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; + refreshEntityList(); + }); } - setSortColumn('type'); - - function refreshEntities() { - clearEntities(); - EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); + + function clearEntities() { + entities = {}; + refreshFooter(); } function refreshFooter() { @@ -253,33 +306,112 @@ function loaded() { elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; } else if (selectedEntities.length === 1) { elFooter.firstChild.nodeValue = "1 entity selected"; - } else if (entityList.visibleItems.length === 1) { + } else if (visibleEntities.length === 1) { elFooter.firstChild.nodeValue = "1 entity found"; } else { - elFooter.firstChild.nodeValue = entityList.visibleItems.length + " entities found"; + elFooter.firstChild.nodeValue = visibleEntities.length + " entities found"; } } + + function refreshEntities() { + clearEntities(); + EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); + } - function refreshEntityListObject() { - refreshEntityListTimer = null; - entityList.sort(currentSortColumn, { order: currentSortOrder }); - entityList.search(elFilter.value); - refreshFooter(); + function refreshEntityList() { + PROFILE("refresh-entity-list", function() { + PROFILE("filter", function() { + var searchTerm = elFilter.value; + if (searchTerm === '') { + visibleEntities = entities.slice(0); + } else { + visibleEntities = entities.filter(function(e) { + return e.name.indexOf(searchTerm) > -1 + || e.type.indexOf(searchTerm) > -1 + || e.fullUrl.indexOf(searchTerm) > -1; + }); + } + }); + + PROFILE("sort", function() { + var cmp = currentSortOrder === ASCENDING_SORT ? COMPARE_ASCENDING : COMPARE_DESCENDING; + visibleEntities.sort(cmp); + }); + + PROFILE("update-dom", function() { + entityList.setVisibleItemData(visibleEntities); + entityList.refresh(); + }); + + refreshFooter(); + }); + } + + function decimalMegabytes(number) { + return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; + } + + function displayIfNonZero(number) { + return number ? number : ""; + } + + function getFilename(url) { + var urlParts = url.split('/'); + return urlParts[urlParts.length - 1]; + } + + function updateEntityData(entityData) { + entities = []; + entitiesByID = {}; + visibleEntities = []; + + PROFILE("map-data", function() { + entityData.forEach(function(entity) { + var type = entity.type + var filename = getFilename(entity.url); + if (filename === IMAGE_MODEL_NAME) { + type = "Image"; + } + + var entityData = { + id: entity.id, + name: entity.name, + type: type, + url: filename, + fullUrl: entity.url, + locked: entity.locked ? LOCKED_GLYPH : null, + visible: entity.visible ? VISIBLE_GLYPH : null, + verticesCount: displayIfNonZero(entity.verticesCount), + texturesCount: displayIfNonZero(entity.texturesCount), + texturesSize: decimalMegabytes(entity.texturesSize), + hasTransparent: entity.hasTransparent ? TRANSPARENCY_GLYPH : null, + isBaked: entity.isBaked ? BAKED_GLYPH : null, + drawCalls: displayIfNonZero(entity.drawCalls), + hasScript: entity.hasScript ? SCRIPT_GLYPH : null, + elRow : null + } + + entities.push(entityData); + entitiesByID[entityData.id] = entityData; + }); + }); } function updateSelectedEntities(selectedIDs) { var notFound = false; - for (var id in entities) { - entities[id].el.className = ''; + for (var id in entitiesByID) { + if (entitiesByID[id].elRow) { + entitiesByID[id].elRow.className = ''; + } } selectedEntities = []; for (var i = 0; i < selectedIDs.length; i++) { var id = selectedIDs[i]; selectedEntities.push(id); - if (id in entities) { - var entity = entities[id]; - entity.el.className = 'selected'; + if (id in entitiesByID) { + var entity = entitiesByID[id]; + entity.elRow.className = 'selected'; } else { notFound = true; } @@ -289,25 +421,68 @@ function loaded() { return notFound; } + + function removeEntities(deletedIDs) { + for (var i = 0, length = deletedIDs.length; i < length; i++) { + var deleteID = deletedIDs[i]; + delete entitiesByID[deleteID]; + } + } - elRefresh.onclick = function() { - refreshEntities(); - } - elToggleLocked.onclick = function () { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); - } - elToggleVisible.onclick = function () { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); - } - elExport.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); - } - elPal.onclick = function () { - EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); - } - elDelete.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); + function resize() { + // Take up available window space + elEntityTableScroll.style.height = window.innerHeight - 207; + + var SCROLLABAR_WIDTH = 21; + var tds = document.querySelectorAll("#entity-table-body tr:first-child td"); + var ths = document.querySelectorAll("#entity-table thead th"); + if (tds.length >= ths.length) { + // Update the widths of the header cells to match the body + for (var i = 0; i < ths.length; i++) { + ths[i].width = tds[i].offsetWidth; + } + } else { + // Reasonable widths if nothing is displayed + var tableWidth = document.getElementById("entity-table").offsetWidth - SCROLLABAR_WIDTH; + if (showExtraInfo) { + ths[0].width = 0.10 * tableWidth; + ths[1].width = 0.20 * tableWidth; + ths[2].width = 0.20 * tableWidth; + ths[3].width = 0.04 * tableWidth; + ths[4].width = 0.04 * tableWidth; + ths[5].width = 0.08 * tableWidth; + ths[6].width = 0.08 * tableWidth; + ths[7].width = 0.10 * tableWidth; + ths[8].width = 0.04 * tableWidth; + ths[9].width = 0.08 * tableWidth; + ths[10].width = 0.04 * tableWidth + SCROLLABAR_WIDTH; + } else { + ths[0].width = 0.16 * tableWidth; + ths[1].width = 0.34 * tableWidth; + ths[2].width = 0.34 * tableWidth; + ths[3].width = 0.08 * tableWidth; + ths[4].width = 0.08 * tableWidth; + } + } + }; + + var showExtraInfo = false; + var COLLAPSE_EXTRA_INFO = "E"; + var EXPAND_EXTRA_INFO = "D"; + + function toggleInfo(event) { + showExtraInfo = !showExtraInfo; + if (showExtraInfo) { + elEntityTable.className = "showExtraInfo"; + elInfoToggleGlyph.innerHTML = COLLAPSE_EXTRA_INFO; + } else { + elEntityTable.className = ""; + elInfoToggleGlyph.innerHTML = EXPAND_EXTRA_INFO; + } + resize(); + event.stopPropagation(); } + elInfoToggle.addEventListener("click", toggleInfo, true); document.addEventListener("keydown", function (keyDownEvent) { if (keyDownEvent.target.nodeName === "INPUT") { @@ -349,11 +524,10 @@ function loaded() { refreshEntities(); elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; } - + if (window.EventBridge !== undefined) { EventBridge.scriptEventReceived.connect(function(data) { data = JSON.parse(data); - if (data.type === "clearEntityList") { clearEntities(); } else if (data.type == "selectionUpdate") { @@ -362,105 +536,34 @@ function loaded() { refreshEntities(); } } else if (data.type === "update" && data.selectedIDs !== undefined) { - var newEntities = data.entities; - if (newEntities && newEntities.length == 0) { - elNoEntitiesMessage.style.display = "block"; - elFooter.firstChild.nodeValue = "0 entities found"; - } else if (newEntities) { - elNoEntitiesMessage.style.display = "none"; - for (var i = 0; i < newEntities.length; i++) { - var id = newEntities[i].id; - addEntity(id, newEntities[i].name, newEntities[i].type, newEntities[i].url, - newEntities[i].locked ? LOCKED_GLYPH : null, - newEntities[i].visible ? VISIBLE_GLYPH : null, - newEntities[i].verticesCount, newEntities[i].texturesCount, newEntities[i].texturesSize, - newEntities[i].hasTransparent ? TRANSPARENCY_GLYPH : null, - newEntities[i].isBaked ? BAKED_GLYPH : null, - newEntities[i].drawCalls, - newEntities[i].hasScript ? SCRIPT_GLYPH : null); + PROFILE("update", function() { + var newEntities = data.entities; + if (newEntities && newEntities.length == 0) { + elNoEntitiesMessage.style.display = "block"; + elFooter.firstChild.nodeValue = "0 entities found"; + } else if (newEntities) { + elNoEntitiesMessage.style.display = "none"; + updateEntityData(newEntities); + refreshEntityList(); + updateSelectedEntities(data.selectedIDs); } - updateSelectedEntities(data.selectedIDs); - scheduleRefreshEntityList(); - resize(); - } + }); } else if (data.type === "removeEntities" && data.deletedIDs !== undefined && data.selectedIDs !== undefined) { removeEntities(data.deletedIDs); updateSelectedEntities(data.selectedIDs); - scheduleRefreshEntityList(); } else if (data.type === "deleted" && data.ids) { removeEntities(data.ids); refreshFooter(); } }); - setTimeout(refreshEntities, 1000); } - - function resize() { - // Take up available window space - elEntityTableScroll.style.height = window.innerHeight - 207; - - var SCROLLABAR_WIDTH = 21; - var tds = document.querySelectorAll("#entity-table-body tr:first-child td"); - var ths = document.querySelectorAll("#entity-table thead th"); - if (tds.length >= ths.length) { - // Update the widths of the header cells to match the body - for (var i = 0; i < ths.length; i++) { - ths[i].width = tds[i].offsetWidth; - } - } else { - // Reasonable widths if nothing is displayed - var tableWidth = document.getElementById("entity-table").offsetWidth - SCROLLABAR_WIDTH; - if (showExtraInfo) { - ths[0].width = 0.10 * tableWidth; - ths[1].width = 0.20 * tableWidth; - ths[2].width = 0.20 * tableWidth; - ths[3].width = 0.04 * tableWidth; - ths[4].width = 0.04 * tableWidth; - ths[5].width = 0.08 * tableWidth; - ths[6].width = 0.08 * tableWidth; - ths[7].width = 0.10 * tableWidth; - ths[8].width = 0.04 * tableWidth; - ths[9].width = 0.08 * tableWidth; - ths[10].width = 0.04 * tableWidth + SCROLLABAR_WIDTH; - } else { - ths[0].width = 0.16 * tableWidth; - ths[1].width = 0.34 * tableWidth; - ths[2].width = 0.34 * tableWidth; - ths[3].width = 0.08 * tableWidth; - ths[4].width = 0.08 * tableWidth; - } - } - }; - - window.onresize = resize; - elFilter.onchange = resize; - elFilter.onblur = refreshFooter; - - - var showExtraInfo = false; - var COLLAPSE_EXTRA_INFO = "E"; - var EXPAND_EXTRA_INFO = "D"; - - function toggleInfo(event) { - showExtraInfo = !showExtraInfo; - if (showExtraInfo) { - elEntityTable.className = "showExtraInfo"; - elInfoToggleGlyph.innerHTML = COLLAPSE_EXTRA_INFO; - } else { - elEntityTable.className = ""; - elInfoToggleGlyph.innerHTML = EXPAND_EXTRA_INFO; - } - resize(); - event.stopPropagation(); - } - elInfoToggle.addEventListener("click", toggleInfo, true); - - + + setSortColumn('type'); resize(); + entityList.initialize(572); + refreshEntities(); }); - augmentSpinButtons(); - // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked document.addEventListener("contextmenu", function (event) { event.preventDefault(); diff --git a/scripts/system/html/js/entityListNew.js b/scripts/system/html/js/entityListNew.js deleted file mode 100644 index cda6907266..0000000000 --- a/scripts/system/html/js/entityListNew.js +++ /dev/null @@ -1,571 +0,0 @@ -// entityListNew.js -// -// Created by David Back on 27 Aug 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 - -const ASCENDING_SORT = 1; -const DESCENDING_SORT = -1; -const ASCENDING_STRING = '▴'; -const DESCENDING_STRING = '▾'; -const COMPARE_ASCENDING = function(a, b) { - let va = a[currentSortColumn]; - let vb = b[currentSortColumn]; - - if (va < vb) { - return -1; - } else if (va > vb) { - return 1; - } - return 0; -} -const COMPARE_DESCENDING = function(a, b) { - return COMPARE_ASCENDING(b, a); -} -const LOCKED_GLYPH = ""; -const VISIBLE_GLYPH = ""; -const TRANSPARENCY_GLYPH = ""; -const BAKED_GLYPH = "" -const SCRIPT_GLYPH = "k"; -const BYTES_PER_MEGABYTE = 1024 * 1024; -const IMAGE_MODEL_NAME = 'default-image-model.fbx'; -const NUM_COLUMNS = 12; - -var entities = []; -var entitiesByID = {}; -var visibleEntities = []; - -var selectedEntities = []; - -var currentSortColumn = 'type'; -var currentSortOrder = 'des'; - -var entityList = null; - -const ENABLE_PROFILING = true; -var profileIndent = ''; -const PROFILE = !ENABLE_PROFILING ? function() { } : function(name, fn, args) { - console.log("PROFILE-Web " + profileIndent + "(" + name + ") Begin"); - var previousIndent = profileIndent; - profileIndent += ' '; - var before = Date.now(); - fn.apply(this, args); - var delta = Date.now() - before; - profileIndent = previousIndent; - console.log("PROFILE-Web " + profileIndent + "(" + name + ") End " + delta + "ms"); -}; - -debugPrint = function (message) { - console.log(message); -}; - -function loaded() { - openEventBridge(function() { - elEntityTable = document.getElementById("entity-table"); - elEntityTableBody = document.getElementById("entity-table-body"); - elEntityTableScroll = document.getElementById("entity-table-scroll"); - elEntityTableHeader = document.getElementById("entity-table-header"); - elEntityTableFooter = document.getElementById("entity-table-footer"); - elRefresh = document.getElementById("refresh"); - elToggleLocked = document.getElementById("locked"); - elToggleVisible = document.getElementById("visible"); - elDelete = document.getElementById("delete"); - elFilter = document.getElementById("filter"); - elInView = document.getElementById("in-view") - elRadius = document.getElementById("radius"); - elExport = document.getElementById("export"); - elPal = document.getElementById("pal"); - elInfoToggle = document.getElementById("info-toggle"); - elInfoToggleGlyph = elInfoToggle.firstChild; - elFooter = document.getElementById("footer-text"); - elNoEntitiesMessage = document.getElementById("no-entities"); - elNoEntitiesInView = document.getElementById("no-entities-in-view"); - elNoEntitiesRadius = document.getElementById("no-entities-radius"); - - entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); - - document.getElementById("entity-name").onclick = function() { - setSortColumn('name'); - }; - document.getElementById("entity-type").onclick = function() { - setSortColumn('type'); - }; - document.getElementById("entity-url").onclick = function() { - setSortColumn('url'); - }; - document.getElementById("entity-locked").onclick = function () { - setSortColumn('locked'); - }; - document.getElementById("entity-visible").onclick = function () { - setSortColumn('visible'); - }; - document.getElementById("entity-verticesCount").onclick = function () { - setSortColumn('verticesCount'); - }; - document.getElementById("entity-texturesCount").onclick = function () { - setSortColumn('texturesCount'); - }; - document.getElementById("entity-texturesSize").onclick = function () { - setSortColumn('texturesSize'); - }; - document.getElementById("entity-hasTransparent").onclick = function () { - setSortColumn('hasTransparent'); - }; - document.getElementById("entity-isBaked").onclick = function () { - setSortColumn('isBaked'); - }; - document.getElementById("entity-drawCalls").onclick = function () { - setSortColumn('drawCalls'); - }; - document.getElementById("entity-hasScript").onclick = function () { - setSortColumn('hasScript'); - }; - - elRefresh.onclick = function() { - refreshEntities(); - } - elToggleLocked.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' })); - } - elToggleVisible.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' })); - } - elExport.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); - } - elPal.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); - } - elDelete.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); - } - - function createRowFunction(elBottomBuffer) { - var row = document.createElement("tr"); - for (var i = 0; i < NUM_COLUMNS; i++) { - var column = document.createElement("td"); - // locked, visible, hasTransparent, isBaked glyph columns - if (i === 3 || i === 4 || i === 8 || i === 9) { - column.className = 'glyph'; - } - row.appendChild(column); - } - row.onclick = onRowClicked; - row.ondblclick = onRowDoubleClicked; - elEntityTableBody.insertBefore(row, elBottomBuffer); - return row; - } - - function updateRowFunction(elRow, itemData) { - var typeCell = elRow.childNodes[0]; - typeCell.innerText = itemData.type; - var nameCell = elRow.childNodes[1]; - nameCell.innerText = itemData.name; - var urlCell = elRow.childNodes[2]; - urlCell.innerText = itemData.url; - var lockedCell = elRow.childNodes[3]; - lockedCell.innerHTML = itemData.locked; - var visibleCell = elRow.childNodes[4]; - visibleCell.innerHTML = itemData.visible; - var verticesCountCell = elRow.childNodes[5]; - verticesCountCell.innerText = itemData.verticesCount; - var texturesCountCell = elRow.childNodes[6]; - texturesCountCell.innerText = itemData.texturesCount; - var texturesSizeCell = elRow.childNodes[7]; - texturesSizeCell.innerText = itemData.texturesSize; - var hasTransparentCell = elRow.childNodes[8]; - hasTransparentCell.innerHTML = itemData.hasTransparent; - var isBakedCell = elRow.childNodes[9]; - isBakedCell.innerHTML = itemData.isBaked; - var drawCallsCell = elRow.childNodes[10]; - drawCallsCell.innerText = itemData.drawCalls; - var hasScriptCell = elRow.childNodes[11]; - hasScriptCell.innerText = itemData.hasScript; - - var prevItemId = elRow.getAttribute("id"); - var newItemId = itemData.id; - if (prevItemId && prevItemId !== newItemId) { - entitiesByID[prevItemId].elRow = null; - } - if (!prevItemId || prevItemId !== newItemId) { - elRow.setAttribute("id", newItemId); - entitiesByID[newItemId].elRow = elRow; - } - } - - function clearRowFunction(elRow) { - for (var i = 0; i < NUM_COLUMNS; i++) { - var cell = elRow.childNodes[i]; - cell.innerHTML = ""; - } - - var id = elRow.getAttribute("id"); - if (id && entitiesByID[id]) { - entitiesByID[id].elRow = null; - } - } - - function onRowClicked(clickEvent) { - var entityID = this.getAttribute("id"); - var selection = [entityID]; - - if (clickEvent.ctrlKey) { - var selectedIndex = selectedEntities.indexOf(entityID); - if (selectedIndex >= 0) { - selection = selectedEntities; - selection.splice(selectedIndex, 1) - } else { - selection = selection.concat(selectedEntities); - } - } else if (clickEvent.shiftKey && selectedEntities.length > 0) { - var previousItemFound = -1; - var clickedItemFound = -1; - for (var i = 0; i < visibleEntities.length; i++) { - var entity = visibleEntities[i]; - if (clickedItemFound === -1 && entityID == entity.id) { - clickedItemFound = i; - } else if(previousItemFound === -1 && selectedEntities[0] == entity.id) { - previousItemFound = i; - } - } - if (previousItemFound !== -1 && clickedItemFound !== -1) { - var betweenItems = []; - var toItem = Math.max(previousItemFound, clickedItemFound); - // skip first and last item in this loop, we add them to selection after the loop - for (var i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { - visibleEntities[i].elRow.className = 'selected'; - betweenItems.push(visibleEntities[i].id); - } - if (previousItemFound > clickedItemFound) { - // always make sure that we add the items in the right order - betweenItems.reverse(); - } - selection = selection.concat(betweenItems, selectedEntities); - } - } - - selectedEntities = selection; - - this.className = 'selected'; - - EventBridge.emitWebEvent(JSON.stringify({ - type: "selectionUpdate", - focus: false, - entityIds: selection, - })); - - refreshFooter(); - } - - function onRowDoubleClicked() { - var entityID = this.getAttribute("id"); - EventBridge.emitWebEvent(JSON.stringify({ - type: "selectionUpdate", - focus: true, - entityIds: [entityID], - })); - } - - var elSortOrder = { - name: document.querySelector('#entity-name .sort-order'), - type: document.querySelector('#entity-type .sort-order'), - url: document.querySelector('#entity-url .sort-order'), - locked: document.querySelector('#entity-locked .sort-order'), - visible: document.querySelector('#entity-visible .sort-order'), - verticesCount: document.querySelector('#entity-verticesCount .sort-order'), - texturesCount: document.querySelector('#entity-texturesCount .sort-order'), - texturesSize: document.querySelector('#entity-texturesSize .sort-order'), - hasTransparent: document.querySelector('#entity-hasTransparent .sort-order'), - isBaked: document.querySelector('#entity-isBaked .sort-order'), - drawCalls: document.querySelector('#entity-drawCalls .sort-order'), - hasScript: document.querySelector('#entity-hasScript .sort-order'), - } - function setSortColumn(column) { - PROFILE("set-sort-column", function() { - if (currentSortColumn === column) { - currentSortOrder *= -1; - } else { - elSortOrder[currentSortColumn].innerHTML = ""; - currentSortColumn = column; - currentSortOrder = ASCENDING_SORT; - } - elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; - refreshEntityList(); - }); - } - - function clearEntities() { - entities = {}; - refreshFooter(); - } - - function refreshFooter() { - if (selectedEntities.length > 1) { - elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; - } else if (selectedEntities.length === 1) { - elFooter.firstChild.nodeValue = "1 entity selected"; - } else if (visibleEntities.length === 1) { - elFooter.firstChild.nodeValue = "1 entity found"; - } else { - elFooter.firstChild.nodeValue = visibleEntities.length + " entities found"; - } - } - - function refreshEntities() { - clearEntities(); - EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); - } - - function refreshEntityList() { - PROFILE("refresh-entity-list", function() { - PROFILE("filter", function() { - var searchTerm = elFilter.value; - if (searchTerm === '') { - visibleEntities = entities.slice(0); - } else { - visibleEntities = entities.filter(function(e) { - return e.name.indexOf(searchTerm) > -1 - || e.type.indexOf(searchTerm) > -1 - || e.fullUrl.indexOf(searchTerm) > -1; - }); - } - }); - - PROFILE("sort", function() { - var cmp = currentSortOrder === ASCENDING_SORT ? COMPARE_ASCENDING : COMPARE_DESCENDING; - visibleEntities.sort(cmp); - }); - - PROFILE("update-dom", function() { - entityList.setVisibleItemData(visibleEntities); - entityList.refresh(); - }); - - refreshFooter(); - }); - } - - function decimalMegabytes(number) { - return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; - } - - function displayIfNonZero(number) { - return number ? number : ""; - } - - function getFilename(url) { - var urlParts = url.split('/'); - return urlParts[urlParts.length - 1]; - } - - function updateEntityData(entityData) { - entities = []; - entitiesByID = {}; - visibleEntities = []; - - PROFILE("map-data", function() { - entityData.forEach(function(entity) { - var type = entity.type - var filename = getFilename(entity.url); - if (filename === IMAGE_MODEL_NAME) { - type = "Image"; - } - - var entityData = { - id: entity.id, - name: entity.name, - type: type, - url: filename, - fullUrl: entity.url, - locked: entity.locked ? LOCKED_GLYPH : null, - visible: entity.visible ? VISIBLE_GLYPH : null, - verticesCount: displayIfNonZero(entity.verticesCount), - texturesCount: displayIfNonZero(entity.texturesCount), - texturesSize: decimalMegabytes(entity.texturesSize), - hasTransparent: entity.hasTransparent ? TRANSPARENCY_GLYPH : null, - isBaked: entity.isBaked ? BAKED_GLYPH : null, - drawCalls: displayIfNonZero(entity.drawCalls), - hasScript: entity.hasScript ? SCRIPT_GLYPH : null, - elRow : null - } - - entities.push(entityData); - entitiesByID[entityData.id] = entityData; - }); - }); - } - - function updateSelectedEntities(selectedIDs) { - var notFound = false; - for (var id in entitiesByID) { - if (entitiesByID[id].elRow) { - entitiesByID[id].elRow.className = ''; - } - } - - selectedEntities = []; - for (var i = 0; i < selectedIDs.length; i++) { - var id = selectedIDs[i]; - selectedEntities.push(id); - if (id in entities) { - var entity = entitiesByID[id]; - entity.elRow.className = 'selected'; - } else { - notFound = true; - } - } - - refreshFooter(); - - return notFound; - } - - function removeEntities(deletedIDs) { - for (var i = 0, length = deletedIDs.length; i < length; i++) { - var deleteID = deletedIDs[i]; - delete entitiesByID[deleteID]; - } - } - - function resize() { - // Take up available window space - elEntityTableScroll.style.height = window.innerHeight - 207; - - var SCROLLABAR_WIDTH = 21; - var tds = document.querySelectorAll("#entity-table-body tr:first-child td"); - var ths = document.querySelectorAll("#entity-table thead th"); - if (tds.length >= ths.length) { - // Update the widths of the header cells to match the body - for (var i = 0; i < ths.length; i++) { - ths[i].width = tds[i].offsetWidth; - } - } else { - // Reasonable widths if nothing is displayed - var tableWidth = document.getElementById("entity-table").offsetWidth - SCROLLABAR_WIDTH; - if (showExtraInfo) { - ths[0].width = 0.10 * tableWidth; - ths[1].width = 0.20 * tableWidth; - ths[2].width = 0.20 * tableWidth; - ths[3].width = 0.04 * tableWidth; - ths[4].width = 0.04 * tableWidth; - ths[5].width = 0.08 * tableWidth; - ths[6].width = 0.08 * tableWidth; - ths[7].width = 0.10 * tableWidth; - ths[8].width = 0.04 * tableWidth; - ths[9].width = 0.08 * tableWidth; - ths[10].width = 0.04 * tableWidth + SCROLLABAR_WIDTH; - } else { - ths[0].width = 0.16 * tableWidth; - ths[1].width = 0.34 * tableWidth; - ths[2].width = 0.34 * tableWidth; - ths[3].width = 0.08 * tableWidth; - ths[4].width = 0.08 * tableWidth; - } - } - }; - - var showExtraInfo = false; - var COLLAPSE_EXTRA_INFO = "E"; - var EXPAND_EXTRA_INFO = "D"; - - function toggleInfo(event) { - showExtraInfo = !showExtraInfo; - if (showExtraInfo) { - elEntityTable.className = "showExtraInfo"; - elInfoToggleGlyph.innerHTML = COLLAPSE_EXTRA_INFO; - } else { - elEntityTable.className = ""; - elInfoToggleGlyph.innerHTML = EXPAND_EXTRA_INFO; - } - resize(); - event.stopPropagation(); - } - elInfoToggle.addEventListener("click", toggleInfo, true); - - document.addEventListener("keydown", function (keyDownEvent) { - if (keyDownEvent.target.nodeName === "INPUT") { - return; - } - var keyCode = keyDownEvent.keyCode; - if (keyCode === DELETE) { - EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); - refreshEntities(); - } - if (keyDownEvent.keyCode === KEY_P && keyDownEvent.ctrlKey) { - if (keyDownEvent.shiftKey) { - EventBridge.emitWebEvent(JSON.stringify({ type: 'unparent' })); - } else { - EventBridge.emitWebEvent(JSON.stringify({ type: 'parent' })); - } - } - }, false); - - var isFilterInView = false; - var FILTER_IN_VIEW_ATTRIBUTE = "pressed"; - elNoEntitiesInView.style.display = "none"; - elInView.onclick = function () { - isFilterInView = !isFilterInView; - if (isFilterInView) { - elInView.setAttribute(FILTER_IN_VIEW_ATTRIBUTE, FILTER_IN_VIEW_ATTRIBUTE); - elNoEntitiesInView.style.display = "inline"; - } else { - elInView.removeAttribute(FILTER_IN_VIEW_ATTRIBUTE); - elNoEntitiesInView.style.display = "none"; - } - EventBridge.emitWebEvent(JSON.stringify({ type: "filterInView", filterInView: isFilterInView })); - refreshEntities(); - } - - elRadius.onchange = function () { - elRadius.value = Math.max(elRadius.value, 0); - EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elRadius.value })); - refreshEntities(); - elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; - } - - if (window.EventBridge !== undefined) { - EventBridge.scriptEventReceived.connect(function(data) { - data = JSON.parse(data); - if (data.type === "clearEntityList") { - clearEntities(); - } else if (data.type == "selectionUpdate") { - var notFound = updateSelectedEntities(data.selectedIDs); - if (notFound) { - refreshEntities(); - } - } else if (data.type === "update" && data.selectedIDs !== undefined) { - PROFILE("update", function() { - var newEntities = data.entities; - if (newEntities && newEntities.length == 0) { - elNoEntitiesMessage.style.display = "block"; - elFooter.firstChild.nodeValue = "0 entities found"; - } else if (newEntities) { - elNoEntitiesMessage.style.display = "none"; - updateEntityData(newEntities); - refreshEntityList(); - updateSelectedEntities(data.selectedIDs); - } - }); - } else if (data.type === "removeEntities" && data.deletedIDs !== undefined && data.selectedIDs !== undefined) { - removeEntities(data.deletedIDs); - updateSelectedEntities(data.selectedIDs); - } else if (data.type === "deleted" && data.ids) { - removeEntities(data.ids); - refreshFooter(); - } - }); - } - - setSortColumn('type'); - resize(); - entityList.initialize(572); - refreshEntities(); - }); - - // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked - document.addEventListener("contextmenu", function (event) { - event.preventDefault(); - }, false); -} diff --git a/scripts/system/libraries/entityList.js b/scripts/system/libraries/entityList.js index cd19fe5e08..c2f31ba45c 100644 --- a/scripts/system/libraries/entityList.js +++ b/scripts/system/libraries/entityList.js @@ -20,11 +20,28 @@ EntityListTool = function(shouldUseEditTabletApp) { var ENTITY_LIST_WIDTH = 495; var MAX_DEFAULT_CREATE_TOOLS_HEIGHT = 778; - var defaultEntityListWindow = createEntityListWindow(Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", - 'Entity List'); - var newEntityListWindow = createEntityListWindow(Script.resourcesPath() + "qml/hifi/tablet/EditEntityListNew.qml", - 'Entity List (New)'); - var entityListWindow = defaultEntityListWindow; + var entityListWindow = new CreateWindow( + Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", + 'Entity List', + 'com.highfidelity.create.entityListWindow', + function () { + var windowHeight = Window.innerHeight - TITLE_OFFSET; + if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { + windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; + } + return { + size: { + x: ENTITY_LIST_WIDTH, + y: windowHeight + }, + position: { + x: Window.x, + y: Window.y + TITLE_OFFSET + } + }; + }, + false + ); var webView = null; webView = Tablet.getTablet("com.highfidelity.interface.tablet.system"); @@ -36,36 +53,6 @@ EntityListTool = function(shouldUseEditTabletApp) { var visible = false; that.webView = webView; - - function createEntityListWindow(entityListPath, windowName) { - var listWindow = new CreateWindow( - entityListPath, - windowName, - 'com.highfidelity.create.entityListWindow', - function () { - var windowHeight = Window.innerHeight - TITLE_OFFSET; - if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { - windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; - } - return { - size: { - x: ENTITY_LIST_WIDTH, - y: windowHeight - }, - position: { - x: Window.x, - y: Window.y + TITLE_OFFSET - } - }; - }, - false - ); - return listWindow; - } - - that.setUseNewEntityList = function(useNewEntityList) { - entityListWindow = useNewEntityList ? newEntityListWindow : defaultEntityListWindow; - }; that.setVisible = function(newVisible) { visible = newVisible; @@ -261,8 +248,7 @@ EntityListTool = function(shouldUseEditTabletApp) { }; webView.webEventReceived.connect(onWebEventReceived); - defaultEntityListWindow.webEventReceived.addListener(onWebEventReceived); - newEntityListWindow.webEventReceived.addListener(onWebEventReceived); + entityListWindow.webEventReceived.addListener(onWebEventReceived); that.interactiveWindowHidden = entityListWindow.interactiveWindowHidden; return that; From 14a3eb4c97e1590535f1d2dbb4d6f0aa1360528f Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 6 Sep 2018 16:52:58 -0700 Subject: [PATCH 075/434] lines/spacing --- scripts/system/edit.js | 3 +-- scripts/system/libraries/entityList.js | 33 +++++++++++++------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 4c29df92f6..8b47eb040e 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -812,8 +812,7 @@ var toolBar = (function () { } }; entityListTool.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); - createToolsWindow.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); - + createToolsWindow.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); that.setActive(false); } diff --git a/scripts/system/libraries/entityList.js b/scripts/system/libraries/entityList.js index c2f31ba45c..e59c17043c 100644 --- a/scripts/system/libraries/entityList.js +++ b/scripts/system/libraries/entityList.js @@ -19,28 +19,27 @@ EntityListTool = function(shouldUseEditTabletApp) { var TITLE_OFFSET = 60; var ENTITY_LIST_WIDTH = 495; var MAX_DEFAULT_CREATE_TOOLS_HEIGHT = 778; - var entityListWindow = new CreateWindow( Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", 'Entity List', - 'com.highfidelity.create.entityListWindow', + 'com.highfidelity.create.entityListWindow', function () { var windowHeight = Window.innerHeight - TITLE_OFFSET; - if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { - windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; - } - return { - size: { - x: ENTITY_LIST_WIDTH, - y: windowHeight - }, - position: { - x: Window.x, - y: Window.y + TITLE_OFFSET - } - }; - }, - false + if (windowHeight > MAX_DEFAULT_CREATE_TOOLS_HEIGHT) { + windowHeight = MAX_DEFAULT_CREATE_TOOLS_HEIGHT; + } + return { + size: { + x: ENTITY_LIST_WIDTH, + y: windowHeight + }, + position: { + x: Window.x, + y: Window.y + TITLE_OFFSET + } + }; + }, + false ); var webView = null; From b82f6d0baddda19e5661229416779d2e52904101 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 6 Sep 2018 16:54:58 -0700 Subject: [PATCH 076/434] lines/spacing --- scripts/system/edit.js | 3 ++- scripts/system/html/js/listView.js | 2 +- scripts/system/libraries/entityList.js | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 8b47eb040e..e340c75a8b 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -812,7 +812,8 @@ var toolBar = (function () { } }; entityListTool.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); - createToolsWindow.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); + createToolsWindow.interactiveWindowHidden.addListener(this, deactivateCreateIfDesktopWindowsHidden); + that.setActive(false); } diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index e0a9e4c0c0..95e71bb2dc 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -176,4 +176,4 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda } return that; -} \ No newline at end of file +} diff --git a/scripts/system/libraries/entityList.js b/scripts/system/libraries/entityList.js index e59c17043c..678b2eeb0b 100644 --- a/scripts/system/libraries/entityList.js +++ b/scripts/system/libraries/entityList.js @@ -19,7 +19,7 @@ EntityListTool = function(shouldUseEditTabletApp) { var TITLE_OFFSET = 60; var ENTITY_LIST_WIDTH = 495; var MAX_DEFAULT_CREATE_TOOLS_HEIGHT = 778; - var entityListWindow = new CreateWindow( + var entityListWindow = new CreateWindow( Script.resourcesPath() + "qml/hifi/tablet/EditEntityList.qml", 'Entity List', 'com.highfidelity.create.entityListWindow', @@ -34,7 +34,7 @@ EntityListTool = function(shouldUseEditTabletApp) { y: windowHeight }, position: { - x: Window.x, + x: Window.x, y: Window.y + TITLE_OFFSET } }; From d0e73b00f783bb66a5083a146c8ec427378630a5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Sep 2018 15:41:30 +1200 Subject: [PATCH 077/434] Restructure mini tablet code --- scripts/system/miniTablet.js | 1272 +++++++++++++++++++--------------- 1 file changed, 696 insertions(+), 576 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 52ca5c947a..c53fab88a5 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -16,118 +16,20 @@ Script.include("./libraries/utils.js"); - var // Base overlay - proxyOverlay = null, - PROXY_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), - PROXY_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. - PROXY_POSITIONS = [ - { - x: -0.03, // Distance across hand. - y: 0.08, // Distance from joint. - z: 0.06 // Distance above palm. - }, - { - x: 0.03, // Distance across hand. - y: 0.08, // Distance from joint. - z: 0.06 // Distance above palm. - } - ], - PROXY_ROTATIONS = [ - Quat.fromVec3Degrees({ x: 0, y: 180 - 40, z: 90 }), - Quat.fromVec3Degrees({ x: 0, y: 180 + 40, z: -90 }), - ], + var UI, + ui = null, + State, + miniState = null, - // UI overlay. - proxyUIOverlay = null, - PROXY_UI_HTML = Script.resolvePath("./html/miniTablet.html"), - PROXY_UI_DIMENSIONS = { x: 0.059, y: 0.0865 }, - PROXY_UI_WIDTH_PIXELS = 150, - METERS_TO_INCHES = 39.3701, - PROXY_UI_DPI = PROXY_UI_WIDTH_PIXELS / (PROXY_UI_DIMENSIONS.x * METERS_TO_INCHES), - PROXY_UI_OFFSET = 0.001, // Above model surface. - PROXY_UI_LOCAL_POSITION = { x: 0.0002, y: 0.0024, z: -(PROXY_DIMENSIONS.z / 2 + PROXY_UI_OFFSET) }, - PROXY_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), - proxyUIOverlayEnabled = false, - PROXY_UI_OVERLAY_ENABLED_DELAY = 500, - proxyOverlayObject = null, - - MUTE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-mute-a.svg", - MUTE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-unmute-i.svg", - BUBBLE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-a.svg", - BUBBLE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-i.svg", - - // State machine - PROXY_DISABLED = 0, - PROXY_HIDDEN = 1, - PROXY_HIDING = 2, - PROXY_SHOWING = 3, - PROXY_VISIBLE = 4, - PROXY_GRABBED = 5, - PROXY_EXPANDING = 6, - TABLET_OPEN = 7, - STATE_STRINGS = ["PROXY_DISABLED", "PROXY_HIDDEN", "PROXY_HIDING", "PROXY_SHOWING", "PROXY_VISIBLE", "PROXY_GRABBED", - "PROXY_EXPANDING", "TABLET_OPEN"], - STATE_MACHINE, - rezzerState = PROXY_DISABLED, - proxyHand, - PROXY_SCALE_DURATION = 150, - PROXY_SCALE_TIMEOUT = 20, - proxyScaleTimer = null, - proxyScaleStart, - PROXY_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. - { x: 0.5, y: -0.65, z: 0 }, - { x: -0.5, y: -0.65, z: 0 } - ], - PROXY_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -5, y: 0, z: 0 }), - PROXY_EXPAND_HANDLES_OTHER = [ // Different handles when expanding after being grabbed by other hand, - { x: 0.5, y: -0.4, z: 0 }, - { x: -0.5, y: -0.4, z: 0 } - ], - PROXY_EXPAND_DELTA_ROTATION_OTHER = Quat.IDENTITY, - proxyExpandHand, - proxyExpandHandles = PROXY_EXPAND_HANDLES, - proxyExpandDeltaRotation = PROXY_EXPAND_HANDLES_OTHER, - proxyExpandLocalPosition, - proxyExpandLocalRotation = Quat.IDENTITY, - PROXY_EXPAND_DURATION = 250, - PROXY_EXPAND_TIMEOUT = 20, - proxyExpandTimer = null, - proxyExpandStart, - proxyInitialWidth, - proxyTargetWidth, - proxyTargetLocalRotation, - - // EventBridge - READY_MESSAGE = "ready", // Engine <== Dialog - HOVER_MESSAGE = "hover", // Engine <== Dialog - MUTE_MESSAGE = "mute", // Engine <=> Dialog - BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog - EXPAND_MESSAGE = "expand", // Engine <== Dialog - - // Events - MIN_HAND_CAMERA_ANGLE = 30, - DEGREES_180 = 180, - MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), - updateTimer = null, - UPDATE_INTERVAL = 300, - HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", - avatarScale = 1, - - // Sounds - HOVER_SOUND = "./assets/sounds/button-hover.wav", - HOVER_VOLUME = 0.5, - CLICK_SOUND = "./assets/sounds/button-click.wav", - CLICK_VOLUME = 0.8, - hoverSound = SoundCache.getSound(Script.resolvePath(HOVER_SOUND)), - clickSound = SoundCache.getSound(Script.resolvePath(CLICK_SOUND)), - - // Hands + // Hands. LEFT_HAND = 0, RIGHT_HAND = 1, HAND_NAMES = ["LeftHand", "RightHand"], // Miscellaneous. + HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), + avatarScale = 1, // Sanitized MyAvatar.scale. DEBUG = false; // #region Utilities ======================================================================================================= @@ -173,498 +75,713 @@ return hand === LEFT_HAND ? RIGHT_HAND : LEFT_HAND; } - function playSound(sound, volume) { - Audio.playSound(sound, { - position: proxyHand === LEFT_HAND ? MyAvatar.getLeftPalmPosition() : MyAvatar.getRightPalmPosition(), - volume: volume, - localOnly: true - }); - } - - // #endregion - - // #region Communications ================================================================================================== - - function updateMiniTabletID() { - // Send mini-tablet overlay ID to controllerDispatcher so that it can use a smaller near grab distance. - Messages.sendLocalMessage("Hifi-MiniTablet-ID", proxyOverlay); - // Send mini-tablet UI overlay ID to stylusInput so that it styluses can be used on it. - Messages.sendLocalMessage("Hifi-MiniTablet-UI-ID", proxyUIOverlay); - } - - function updateMutedStatus() { - var isMuted = Audio.muted; - proxyOverlayObject.emitScriptEvent(JSON.stringify({ - type: MUTE_MESSAGE, - on: isMuted, - icon: isMuted ? MUTE_ON_ICON : MUTE_OFF_ICON - })); - } - - function updateBubbleStatus() { - var isBubbleOn = Users.getIgnoreRadiusEnabled(); - proxyOverlayObject.emitScriptEvent(JSON.stringify({ - type: BUBBLE_MESSAGE, - on: isBubbleOn, - icon: isBubbleOn ? BUBBLE_ON_ICON : BUBBLE_OFF_ICON - })); - } - - function onWebEventReceived(data) { - var message; - - try { - message = JSON.parse(data); - } catch (e) { - console.error("EventBridge message error"); - return; - } - - switch (message.type) { - case READY_MESSAGE: - // Send initial button statuses. - updateMutedStatus(); - updateBubbleStatus(); - break; - case HOVER_MESSAGE: - // Audio feedback. - playSound(hoverSound, HOVER_VOLUME); - break; - case MUTE_MESSAGE: - // Toggle mute. - playSound(clickSound, CLICK_VOLUME); - Audio.muted = !Audio.muted; - break; - case BUBBLE_MESSAGE: - // Toggle bubble. - playSound(clickSound, CLICK_VOLUME); - Users.toggleIgnoreRadius(); - break; - case EXPAND_MESSAGE: - // Expand tablet; - playSound(clickSound, CLICK_VOLUME); - setState(PROXY_EXPANDING, proxyHand); - break; - } - } - // #endregion // #region UI ============================================================================================================== - function createUI() { - proxyOverlay = Overlays.addOverlay("model", { - url: PROXY_MODEL, - dimensions: Vec3.multiply(avatarScale, PROXY_DIMENSIONS), - solid: true, - grabbable: true, - showKeyboardFocusHighlight: false, - displayInFront: true, - visible: false - }); - proxyUIOverlay = Overlays.addOverlay("web3d", { - url: PROXY_UI_HTML, - parentID: proxyOverlay, - localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), - localRotation: PROXY_UI_LOCAL_ROTATION, - dimensions: Vec3.multiply(avatarScale, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / avatarScale, - alpha: 0, // Hide overlay while its content is being created. - grabbable: false, - showKeyboardFocusHighlight: false, - displayInFront: true, - visible: false - }); + UI = function () { - proxyUIOverlayEnabled = false; // This and alpha = 0 hides overlay while its content is being created. - - proxyOverlayObject = Overlays.getOverlayObject(proxyUIOverlay); - proxyOverlayObject.webEventReceived.connect(onWebEventReceived); - - // updateMiniTabletID(); Other scripts relying on this may not be ready yet so do this in showUI(). - } - - function showUI() { - var initialScale = 0.01; // Start very small. - - Overlays.editOverlay(proxyOverlay, { - parentID: MyAvatar.SELF_ID, - parentJointIndex: handJointIndex(proxyHand), - localPosition: Vec3.multiply(avatarScale, PROXY_POSITIONS[proxyHand]), - localRotation: PROXY_ROTATIONS[proxyHand], - dimensions: Vec3.multiply(initialScale, PROXY_DIMENSIONS), - visible: true - }); - Overlays.editOverlay(proxyUIOverlay, { - localPosition: Vec3.multiply(avatarScale, PROXY_UI_LOCAL_POSITION), - localRotation: PROXY_UI_LOCAL_ROTATION, - dimensions: Vec3.multiply(initialScale, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / initialScale, - visible: true - }); - - updateMiniTabletID(); - - if (!proxyUIOverlayEnabled) { - // Overlay content is created the first time it is visible to the user. The initial creation displays artefacts. - // Delay showing UI overlay until after giving it time for its content to be created. - Script.setTimeout(function () { - Overlays.editOverlay(proxyUIOverlay, { alpha: 1.0 }); - }, PROXY_UI_OVERLAY_ENABLED_DELAY); + if (!(this instanceof UI)) { + return new UI(); } - } - function sizeUI(scaleFactor) { - // Scale UI in place. - Overlays.editOverlay(proxyOverlay, { - dimensions: Vec3.multiply(scaleFactor, PROXY_DIMENSIONS) - }); - Overlays.editOverlay(proxyUIOverlay, { - localPosition: Vec3.multiply(scaleFactor, PROXY_UI_LOCAL_POSITION), - dimensions: Vec3.multiply(scaleFactor, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / scaleFactor - }); - } + var // Base overlay + miniOverlay = null, + MINI_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), + MINI_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. + MINI_POSITIONS = [ + { + x: -0.03, // Distance across hand. + y: 0.08, // Distance from joint. + z: 0.06 // Distance above palm. + }, + { + x: 0.03, // Distance across hand. + y: 0.08, // Distance from joint. + z: 0.06 // Distance above palm. + } + ], + DEGREES_180 = 180, + MINI_PICTH = 40, + MINI_ROTATIONS = [ + Quat.fromVec3Degrees({ x: 0, y: DEGREES_180 - MINI_PICTH, z: 90 }), + Quat.fromVec3Degrees({ x: 0, y: DEGREES_180 + MINI_PICTH, z: -90 }) + ], - function sizeUIAboutHandles(scaleFactor) { - // Scale UI and move per handles. - var tabletScaleFactor = avatarScale * (1 + scaleFactor * (proxyTargetWidth - proxyInitialWidth) / proxyInitialWidth); - var dimensions = Vec3.multiply(tabletScaleFactor, PROXY_DIMENSIONS); - var localRotation = Quat.mix(proxyExpandLocalRotation, proxyTargetLocalRotation, scaleFactor); - var localPosition = - Vec3.sum(proxyExpandLocalPosition, - Vec3.multiplyQbyV(proxyExpandLocalRotation, - Vec3.multiply(-tabletScaleFactor, - Vec3.multiplyVbyV(proxyExpandHandles[proxyExpandHand], PROXY_DIMENSIONS))) - ); - localPosition = Vec3.sum(localPosition, - Vec3.multiplyQbyV(proxyExpandLocalRotation, { x: 0, y: 0.5 * -dimensions.y, z: 0 })); - localPosition = Vec3.sum(localPosition, - Vec3.multiplyQbyV(localRotation, { x: 0, y: 0.5 * dimensions.y, z: 0 })); - Overlays.editOverlay(proxyOverlay, { - localPosition: localPosition, - localRotation: localRotation, - dimensions: dimensions - }); - Overlays.editOverlay(proxyUIOverlay, { - localPosition: Vec3.multiply(tabletScaleFactor, PROXY_UI_LOCAL_POSITION), - dimensions: Vec3.multiply(tabletScaleFactor, PROXY_UI_DIMENSIONS), - dpi: PROXY_UI_DPI / tabletScaleFactor - }); - } + // UI overlay. + uiHand = LEFT_HAND, + miniUIOverlay = null, + MINI_UI_HTML = Script.resolvePath("./html/miniTablet.html"), + MINI_UI_DIMENSIONS = { x: 0.059, y: 0.0865 }, + MINI_UI_WIDTH_PIXELS = 150, + METERS_TO_INCHES = 39.3701, + MINI_UI_DPI = MINI_UI_WIDTH_PIXELS / (MINI_UI_DIMENSIONS.x * METERS_TO_INCHES), + MINI_UI_OFFSET = 0.001, // Above model surface. + MINI_UI_LOCAL_POSITION = { x: 0.0002, y: 0.0024, z: -(MINI_DIMENSIONS.z / 2 + MINI_UI_OFFSET) }, + MINI_UI_LOCAL_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }), + miniUIOverlayEnabled = false, + MINI_UI_OVERLAY_ENABLED_DELAY = 500, + miniOverlayObject = null, - function hideUI() { - Overlays.editOverlay(proxyOverlay, { - parentID: Uuid.NULL, // Release hold so that hand can grab tablet proper. - visible: false - }); - Overlays.editOverlay(proxyUIOverlay, { - visible: false - }); - } + // Button icons. + MUTE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-mute-a.svg", + MUTE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-unmute-i.svg", + BUBBLE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-a.svg", + BUBBLE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-i.svg", + + // Expansion to tablet. + MINI_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. + { x: 0.5, y: -0.65, z: 0 }, + { x: -0.5, y: -0.65, z: 0 } + ], + MINI_EXPAND_DELTA_ROTATION = Quat.fromVec3Degrees({ x: -5, y: 0, z: 0 }), + MINI_EXPAND_HANDLES_OTHER = [ // Different handles when expanding after being grabbed by other hand, + { x: 0.5, y: -0.4, z: 0 }, + { x: -0.5, y: -0.4, z: 0 } + ], + MINI_EXPAND_DELTA_ROTATION_OTHER = Quat.IDENTITY, + miniExpandHand, + miniExpandHandles = MINI_EXPAND_HANDLES, + miniExpandDeltaRotation = MINI_EXPAND_HANDLES_OTHER, + miniExpandLocalPosition, + miniExpandLocalRotation = Quat.IDENTITY, + miniInitialWidth, + miniTargetWidth, + miniTargetLocalRotation, + + // EventBridge + READY_MESSAGE = "ready", // Engine <== Dialog + HOVER_MESSAGE = "hover", // Engine <== Dialog + MUTE_MESSAGE = "mute", // Engine <=> Dialog + BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + EXPAND_MESSAGE = "expand", // Engine <== Dialog + + // Sounds + HOVER_SOUND = "./assets/sounds/button-hover.wav", + HOVER_VOLUME = 0.5, + CLICK_SOUND = "./assets/sounds/button-click.wav", + CLICK_VOLUME = 0.8, + hoverSound = SoundCache.getSound(Script.resolvePath(HOVER_SOUND)), + clickSound = SoundCache.getSound(Script.resolvePath(CLICK_SOUND)); + + + function updateMutedStatus() { + var isMuted = Audio.muted; + miniOverlayObject.emitScriptEvent(JSON.stringify({ + type: MUTE_MESSAGE, + on: isMuted, + icon: isMuted ? MUTE_ON_ICON : MUTE_OFF_ICON + })); + } + + function updateBubbleStatus() { + var isBubbleOn = Users.getIgnoreRadiusEnabled(); + miniOverlayObject.emitScriptEvent(JSON.stringify({ + type: BUBBLE_MESSAGE, + on: isBubbleOn, + icon: isBubbleOn ? BUBBLE_ON_ICON : BUBBLE_OFF_ICON + })); + } + + function onWebEventReceived(data) { + var message; + + try { + message = JSON.parse(data); + } catch (e) { + console.error("EventBridge message error"); + return; + } + + switch (message.type) { + case READY_MESSAGE: + // Send initial button statuses. + updateMutedStatus(); + updateBubbleStatus(); + break; + case HOVER_MESSAGE: + // Audio feedback. + playSound(hoverSound, HOVER_VOLUME); + break; + case MUTE_MESSAGE: + // Toggle mute. + playSound(clickSound, CLICK_VOLUME); + Audio.muted = !Audio.muted; + break; + case BUBBLE_MESSAGE: + // Toggle bubble. + playSound(clickSound, CLICK_VOLUME); + Users.toggleIgnoreRadius(); + break; + case EXPAND_MESSAGE: + // Expand tablet; + playSound(clickSound, CLICK_VOLUME); + miniState.setState(miniState.MINI_EXPANDING, uiHand); + break; + } + } + + + function updateMiniTabletID() { + // Send mini-tablet overlay ID to controllerDispatcher so that it can use a smaller near grab distance. + Messages.sendLocalMessage("Hifi-MiniTablet-ID", miniOverlay); + // Send mini-tablet UI overlay ID to stylusInput so that it styluses can be used on it. + Messages.sendLocalMessage("Hifi-MiniTablet-UI-ID", miniUIOverlay); + } + + function playSound(sound, volume) { + Audio.playSound(sound, { + position: uiHand === LEFT_HAND ? MyAvatar.getLeftPalmPosition() : MyAvatar.getRightPalmPosition(), + volume: volume, + localOnly: true + }); + } + + + function getUIPositionAndRotation(hand) { + return { + position: MINI_POSITIONS[hand], + rotation: MINI_ROTATIONS[hand] + }; + } + + function getMiniTabletID() { + return miniOverlay; + } + + function getMiniTabletProperties() { + var properties = Overlays.getProperties(miniOverlay, ["position", "orientation"]); + return { + position: properties.position, + orientation: properties.orientation + }; + } + + + function show(hand) { + var initialScale = 0.01; // Start very small. + + uiHand = hand; + + Overlays.editOverlay(miniOverlay, { + parentID: MyAvatar.SELF_ID, + parentJointIndex: handJointIndex(hand), + localPosition: Vec3.multiply(avatarScale, MINI_POSITIONS[hand]), + localRotation: MINI_ROTATIONS[hand], + dimensions: Vec3.multiply(initialScale, MINI_DIMENSIONS), + visible: true + }); + Overlays.editOverlay(miniUIOverlay, { + localPosition: Vec3.multiply(avatarScale, MINI_UI_LOCAL_POSITION), + localRotation: MINI_UI_LOCAL_ROTATION, + dimensions: Vec3.multiply(initialScale, MINI_UI_DIMENSIONS), + dpi: MINI_UI_DPI / initialScale, + visible: true + }); - function destroyUI() { - if (proxyOverlayObject) { - proxyOverlayObject.webEventReceived.disconnect(onWebEventReceived); - Overlays.deleteOverlay(proxyUIOverlay); - Overlays.deleteOverlay(proxyOverlay); - proxyOverlayObject = null; - proxyUIOverlay = null; - proxyOverlay = null; updateMiniTabletID(); + + if (!miniUIOverlayEnabled) { + // Overlay content is created the first time it is visible to the user. The initial creation displays artefacts. + // Delay showing UI overlay until after giving it time for its content to be created. + Script.setTimeout(function () { + Overlays.editOverlay(miniUIOverlay, { alpha: 1.0 }); + }, MINI_UI_OVERLAY_ENABLED_DELAY); + } } - } + + function size(scaleFactor) { + // Scale UI in place. + Overlays.editOverlay(miniOverlay, { + dimensions: Vec3.multiply(scaleFactor, MINI_DIMENSIONS) + }); + Overlays.editOverlay(miniUIOverlay, { + localPosition: Vec3.multiply(scaleFactor, MINI_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(scaleFactor, MINI_UI_DIMENSIONS), + dpi: MINI_UI_DPI / scaleFactor + }); + } + + function startExpandingTablet(hand) { + // Expansion details. + if (hand === uiHand) { + miniExpandHandles = MINI_EXPAND_HANDLES; + miniExpandDeltaRotation = MINI_EXPAND_DELTA_ROTATION; + } else { + miniExpandHandles = MINI_EXPAND_HANDLES_OTHER; + miniExpandDeltaRotation = MINI_EXPAND_DELTA_ROTATION_OTHER; + } + + // Grab details. + var properties = Overlays.getProperties(miniOverlay, ["localPosition", "localRotation"]); + miniExpandHand = hand; + miniExpandLocalRotation = properties.localRotation; + miniExpandLocalPosition = Vec3.sum(properties.localPosition, + Vec3.multiplyQbyV(miniExpandLocalRotation, + Vec3.multiplyVbyV(miniExpandHandles[miniExpandHand], MINI_DIMENSIONS))); + + // Start expanding. + miniInitialWidth = MINI_DIMENSIONS.x; + miniTargetWidth = getTabletWidthFromSettings(); + miniTargetLocalRotation = Quat.multiply(miniExpandLocalRotation, miniExpandDeltaRotation); + } + + function sizeAboutHandles(scaleFactor) { + // Scale UI and move per handles. + var tabletScaleFactor, + dimensions, + localRotation, + localPosition; + + tabletScaleFactor = avatarScale * (1 + scaleFactor * (miniTargetWidth - miniInitialWidth) / miniInitialWidth); + dimensions = Vec3.multiply(tabletScaleFactor, MINI_DIMENSIONS); + localRotation = Quat.mix(miniExpandLocalRotation, miniTargetLocalRotation, scaleFactor); + localPosition = + Vec3.sum(miniExpandLocalPosition, + Vec3.multiplyQbyV(miniExpandLocalRotation, + Vec3.multiply(-tabletScaleFactor, + Vec3.multiplyVbyV(miniExpandHandles[miniExpandHand], MINI_DIMENSIONS))) + ); + localPosition = Vec3.sum(localPosition, + Vec3.multiplyQbyV(miniExpandLocalRotation, { x: 0, y: 0.5 * -dimensions.y, z: 0 })); + localPosition = Vec3.sum(localPosition, + Vec3.multiplyQbyV(localRotation, { x: 0, y: 0.5 * dimensions.y, z: 0 })); + Overlays.editOverlay(miniOverlay, { + localPosition: localPosition, + localRotation: localRotation, + dimensions: dimensions + }); + Overlays.editOverlay(miniUIOverlay, { + localPosition: Vec3.multiply(tabletScaleFactor, MINI_UI_LOCAL_POSITION), + dimensions: Vec3.multiply(tabletScaleFactor, MINI_UI_DIMENSIONS), + dpi: MINI_UI_DPI / tabletScaleFactor + }); + } + + function hide() { + Overlays.editOverlay(miniOverlay, { + parentID: Uuid.NULL, // Release hold so that hand can grab tablet proper. + visible: false + }); + Overlays.editOverlay(miniUIOverlay, { + visible: false + }); + } + + function create() { + miniOverlay = Overlays.addOverlay("model", { + url: MINI_MODEL, + dimensions: Vec3.multiply(avatarScale, MINI_DIMENSIONS), + solid: true, + grabbable: true, + showKeyboardFocusHighlight: false, + displayInFront: true, + visible: false + }); + miniUIOverlay = Overlays.addOverlay("web3d", { + url: MINI_UI_HTML, + parentID: miniOverlay, + localPosition: Vec3.multiply(avatarScale, MINI_UI_LOCAL_POSITION), + localRotation: MINI_UI_LOCAL_ROTATION, + dimensions: Vec3.multiply(avatarScale, MINI_UI_DIMENSIONS), + dpi: MINI_UI_DPI / avatarScale, + alpha: 0, // Hide overlay while its content is being created. + grabbable: false, + showKeyboardFocusHighlight: false, + displayInFront: true, + visible: false + }); + + miniUIOverlayEnabled = false; // This and alpha = 0 hides overlay while its content is being created. + + miniOverlayObject = Overlays.getOverlayObject(miniUIOverlay); + miniOverlayObject.webEventReceived.connect(onWebEventReceived); + + // updateMiniTabletID(); Other scripts relying on this may not be ready yet so do this in showUI(). + } + + function destroy() { + if (miniOverlayObject) { + miniOverlayObject.webEventReceived.disconnect(onWebEventReceived); + Overlays.deleteOverlay(miniUIOverlay); + Overlays.deleteOverlay(miniOverlay); + miniOverlayObject = null; + miniUIOverlay = null; + miniOverlay = null; + updateMiniTabletID(); + } + } + + create(); + + return { + getUIPositionAndRotation: getUIPositionAndRotation, + getMiniTabletID: getMiniTabletID, + getMiniTabletProperties: getMiniTabletProperties, + updateMutedStatus: updateMutedStatus, + updateBubbleStatus: updateBubbleStatus, + show: show, + size: size, + startExpandingTablet: startExpandingTablet, + sizeAboutHandles: sizeAboutHandles, + hide: hide, + destroy: destroy + }; + + }; // #endregion // #region State Machine =================================================================================================== - function enterProxyDisabled() { - // Stop updates. - if (updateTimer !== null) { - Script.clearTimeout(updateTimer); - updateTimer = null; + State = function () { + + if (!(this instanceof State)) { + return new State(); } - // Stop monitoring mute and bubble changes. - Audio.mutedChanged.disconnect(updateMutedStatus); - Users.ignoreRadiusEnabledChanged.disconnect(updateBubbleStatus); + var + // States. + MINI_DISABLED = 0, + MINI_HIDDEN = 1, + MINI_HIDING = 2, + MINI_SHOWING = 3, + MINI_VISIBLE = 4, + MINI_GRABBED = 5, + MINI_EXPANDING = 6, + TABLET_OPEN = 7, + STATE_STRINGS = ["MINI_DISABLED", "MINI_HIDDEN", "MINI_HIDING", "MINI_SHOWING", "MINI_VISIBLE", "MINI_GRABBED", + "MINI_EXPANDING", "TABLET_OPEN"], + STATE_MACHINE, + miniState = MINI_DISABLED, + miniHand, + updateTimer = null, + UPDATE_INTERVAL = 300, - // Don't keep overlays prepared if in desktop mode. - destroyUI(); - } + // Mini tablet scaling. + MINI_SCALE_DURATION = 150, + MINI_SCALE_TIMEOUT = 20, + miniScaleTimer = null, + miniScaleStart, - function exitProxyDisabled() { - // Create UI so that it's ready to be displayed without seeing artefacts from creating the UI. - createUI(); + // Expansion to tablet. + MINI_EXPAND_DURATION = 250, + MINI_EXPAND_TIMEOUT = 20, + miniExpandTimer = null, + miniExpandStart, - // Start monitoring mute and bubble changes. - Audio.mutedChanged.connect(updateMutedStatus); - Users.ignoreRadiusEnabledChanged.connect(updateBubbleStatus); + // Visibility. + MIN_HAND_CAMERA_ANGLE = 30, + DEGREES_180 = 180, + MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180); - // Start updates. - updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); - } - function shouldShowProxy(hand) { - // Should show proxy if it would be oriented toward the camera. - var pose, - jointIndex, - handPosition, - handOrientation, - proxyPosition, - proxyOrientation, - proxyToCameraDirection; + function enterMiniDisabled() { + // Stop updates. + if (updateTimer !== null) { + Script.clearTimeout(updateTimer); + updateTimer = null; + } - pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); - if (!pose.valid) { - return false; + // Stop monitoring mute and bubble changes. + Audio.mutedChanged.disconnect(ui.updateMutedStatus); + Users.ignoreRadiusEnabledChanged.disconnect(ui.updateBubbleStatus); + + // Don't keep overlays prepared if in desktop mode. + ui.destroy(); + ui = null; } - jointIndex = handJointIndex(hand); - handPosition = Vec3.sum(MyAvatar.position, - Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); - handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); - proxyPosition = Vec3.sum(handPosition, Vec3.multiply(avatarScale, - Vec3.multiplyQbyV(handOrientation, PROXY_POSITIONS[hand]))); - proxyOrientation = Quat.multiply(handOrientation, PROXY_ROTATIONS[hand]); - proxyToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, proxyPosition)); - return Vec3.dot(proxyToCameraDirection, Quat.getForward(proxyOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; - } + function exitMiniDisabled() { + // Create UI so that it's ready to be displayed without seeing artefacts from creating the UI. + ui = new UI(); - function enterProxyHidden() { - hideUI(); - } + // Start monitoring mute and bubble changes. + Audio.mutedChanged.connect(ui.updateMutedStatus); + Users.ignoreRadiusEnabledChanged.connect(ui.updateBubbleStatus); - function updateProxyHidden() { - // Don't show proxy if tablet is already displayed or in toolbar mode. - if (HMD.showTablet || tablet.toolbarMode) { - return; - } - // Compare palm directions of hands with vectors from palms to camera. - if (shouldShowProxy(LEFT_HAND)) { - setState(PROXY_SHOWING, LEFT_HAND); - } else if (shouldShowProxy(RIGHT_HAND)) { - setState(PROXY_SHOWING, RIGHT_HAND); - } - } - - function scaleProxyDown() { - var scaleFactor = (Date.now() - proxyScaleStart) / PROXY_SCALE_DURATION; - if (scaleFactor < 1) { - sizeUI((1 - scaleFactor) * avatarScale); - proxyScaleTimer = Script.setTimeout(scaleProxyDown, PROXY_SCALE_TIMEOUT); - return; - } - proxyScaleTimer = null; - setState(PROXY_HIDDEN); - } - - function enterProxyHiding() { - proxyScaleStart = Date.now(); - proxyScaleTimer = Script.setTimeout(scaleProxyDown, PROXY_SCALE_TIMEOUT); - } - - function updateProxyHiding() { - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - } - } - - function exitProxyHiding() { - if (proxyScaleTimer) { - Script.clearTimeout(proxyScaleTimer); - proxyScaleTimer = null; - } - } - - function scaleProxyUp() { - var scaleFactor = (Date.now() - proxyScaleStart) / PROXY_SCALE_DURATION; - if (scaleFactor < 1) { - sizeUI(scaleFactor * avatarScale); - proxyScaleTimer = Script.setTimeout(scaleProxyUp, PROXY_SCALE_TIMEOUT); - return; - } - proxyScaleTimer = null; - sizeUI(avatarScale); - setState(PROXY_VISIBLE); - } - - function enterProxyShowing(hand) { - proxyHand = hand; - showUI(); - proxyScaleStart = Date.now(); - proxyScaleTimer = Script.setTimeout(scaleProxyUp, PROXY_SCALE_TIMEOUT); - } - - function updateProxyShowing() { - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - } - } - - function exitProxyShowing() { - if (proxyScaleTimer) { - Script.clearTimeout(proxyScaleTimer); - proxyScaleTimer = null; - } - } - - function updateProxyVisible() { - // Hide proxy if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - return; - } - // Check that palm direction of proxy hand still less than maximum angle. - if (!shouldShowProxy(proxyHand)) { - setState(PROXY_HIDING); - } - } - - function updateProxyGrabbed() { - // Hide proxy if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); - } - } - - function expandProxy() { - var scaleFactor = (Date.now() - proxyExpandStart) / PROXY_EXPAND_DURATION; - if (scaleFactor < 1) { - sizeUIAboutHandles(scaleFactor); - proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); - return; - } - proxyExpandTimer = null; - setState(TABLET_OPEN); - } - - function enterProxyExpanding(hand) { - // Expansion details. - if (hand === proxyHand) { - proxyExpandHandles = PROXY_EXPAND_HANDLES; - proxyExpandDeltaRotation = PROXY_EXPAND_DELTA_ROTATION; - } else { - proxyExpandHandles = PROXY_EXPAND_HANDLES_OTHER; - proxyExpandDeltaRotation = PROXY_EXPAND_DELTA_ROTATION_OTHER; + // Start updates. + updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); } - // Grab details. - var properties = Overlays.getProperties(proxyOverlay, ["localPosition", "localRotation"]); - proxyExpandHand = hand; - proxyExpandLocalRotation = properties.localRotation; - proxyExpandLocalPosition = Vec3.sum(properties.localPosition, - Vec3.multiplyQbyV(proxyExpandLocalRotation, - Vec3.multiplyVbyV(proxyExpandHandles[proxyExpandHand], PROXY_DIMENSIONS))); + function shouldShowMini(hand) { + // Should show mini tablet if it would be oriented toward the camera. + var pose, + jointIndex, + handPosition, + handOrientation, + uiPositionAndOrientation, + miniPosition, + miniOrientation, + miniToCameraDirection; - // Start expanding. - proxyInitialWidth = PROXY_DIMENSIONS.x; - proxyTargetWidth = getTabletWidthFromSettings(); - proxyTargetLocalRotation = Quat.multiply(proxyExpandLocalRotation, proxyExpandDeltaRotation); - proxyExpandStart = Date.now(); - proxyExpandTimer = Script.setTimeout(expandProxy, PROXY_EXPAND_TIMEOUT); - } + pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); + if (!pose.valid) { + return false; + } - function updateProxyExanding() { - // Hide proxy immediately if tablet has been displayed by other means. - if (HMD.showTablet) { - setState(PROXY_HIDDEN); + jointIndex = handJointIndex(hand); + handPosition = Vec3.sum(MyAvatar.position, + Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); + handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); + uiPositionAndOrientation = ui.getUIPositionAndRotation(hand); + miniPosition = Vec3.sum(handPosition, Vec3.multiply(avatarScale, + Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position))); + miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); + miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); + return Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; } - } - function exitProxyExpanding() { - if (proxyExpandTimer !== null) { - Script.clearTimeout(proxyExpandTimer); - proxyExpandTimer = null; + function enterMiniHidden() { + ui.hide(); } - } - function enterTabletOpen() { - var proxyOverlayProperties = Overlays.getProperties(proxyOverlay, ["position", "orientation"]); - - hideUI(); - - Overlays.editOverlay(HMD.tabletID, { - position: proxyOverlayProperties.position, - orientation: proxyOverlayProperties.orientation - }); - HMD.openTablet(true); - } - - function updateTabletOpen() { - // Immediately transition back to PROXY_HIDDEN. - setState(PROXY_HIDDEN); - } - - STATE_MACHINE = { - PROXY_DISABLED: { // Tablet proxy cannot be shown because in desktop mode. - enter: enterProxyDisabled, - update: null, - exit: exitProxyDisabled - }, - PROXY_HIDDEN: { // Tablet proxy could be shown but isn't because hand is oriented to show it or aren't in HMD mode. - enter: enterProxyHidden, - update: updateProxyHidden, - exit: null - }, - PROXY_HIDING: { // Tablet proxy is reducing from PROXY_VISIBLE to PROXY_HIDDEN. - enter: enterProxyHiding, - update: updateProxyHiding, - exit: exitProxyHiding - }, - PROXY_SHOWING: { // Tablet proxy is expanding from PROXY_HIDDN to PROXY_VISIBLE. - enter: enterProxyShowing, - update: updateProxyShowing, - exit: exitProxyShowing - }, - PROXY_VISIBLE: { // Tablet proxy is visible and attached to hand. - enter: null, - update: updateProxyVisible, - exit: null - }, - PROXY_GRABBED: { // Tablet proxy is grabbed by other hand. - enter: null, - update: updateProxyGrabbed, - exit: null - }, - PROXY_EXPANDING: { // Tablet proxy is expanding before showing tablet proper. - enter: enterProxyExpanding, - update: updateProxyExanding, - exit: exitProxyExpanding - }, - TABLET_OPEN: { // Tablet proper is being displayed. - enter: enterTabletOpen, - update: updateTabletOpen, - exit: null + function updateMiniHidden() { + // Don't show mini tablet if tablet proper is already displayed or in toolbar mode. + if (HMD.showTablet || tablet.toolbarMode) { + return; + } + // Compare palm directions of hands with vectors from palms to camera. + if (shouldShowMini(LEFT_HAND)) { + setState(MINI_SHOWING, LEFT_HAND); + } else if (shouldShowMini(RIGHT_HAND)) { + setState(MINI_SHOWING, RIGHT_HAND); + } } + + function scaleMiniDown() { + var scaleFactor = (Date.now() - miniScaleStart) / MINI_SCALE_DURATION; + if (scaleFactor < 1) { + ui.size((1 - scaleFactor) * avatarScale); + miniScaleTimer = Script.setTimeout(scaleMiniDown, MINI_SCALE_TIMEOUT); + return; + } + miniScaleTimer = null; + setState(MINI_HIDDEN); + } + + function enterMiniHiding() { + miniScaleStart = Date.now(); + miniScaleTimer = Script.setTimeout(scaleMiniDown, MINI_SCALE_TIMEOUT); + } + + function updateMiniHiding() { + if (HMD.showTablet) { + setState(MINI_HIDDEN); + } + } + + function exitMiniHiding() { + if (miniScaleTimer) { + Script.clearTimeout(miniScaleTimer); + miniScaleTimer = null; + } + } + + function scaleMiniUp() { + var scaleFactor = (Date.now() - miniScaleStart) / MINI_SCALE_DURATION; + if (scaleFactor < 1) { + ui.size(scaleFactor * avatarScale); + miniScaleTimer = Script.setTimeout(scaleMiniUp, MINI_SCALE_TIMEOUT); + return; + } + miniScaleTimer = null; + ui.size(avatarScale); + setState(MINI_VISIBLE); + } + + function enterMiniShowing(hand) { + miniHand = hand; + ui.show(miniHand); + miniScaleStart = Date.now(); + miniScaleTimer = Script.setTimeout(scaleMiniUp, MINI_SCALE_TIMEOUT); + } + + function updateMiniShowing() { + if (HMD.showTablet) { + setState(MINI_HIDDEN); + } + } + + function exitMiniShowing() { + if (miniScaleTimer) { + Script.clearTimeout(miniScaleTimer); + miniScaleTimer = null; + } + } + + function updateMiniVisible() { + // Hide mini tablet if tablet proper has been displayed by other means. + if (HMD.showTablet) { + setState(MINI_HIDDEN); + return; + } + // Check that palm direction of mini tablet hand still less than maximum angle. + if (!shouldShowMini(miniHand)) { + setState(MINI_HIDING); + } + } + + function updateMiniGrabbed() { + // Hide mini tablet if tablet proper has been displayed by other means. + if (HMD.showTablet) { + setState(MINI_HIDDEN); + } + } + + function expandMini() { + var scaleFactor = (Date.now() - miniExpandStart) / MINI_EXPAND_DURATION; + if (scaleFactor < 1) { + ui.sizeAboutHandles(scaleFactor); + miniExpandTimer = Script.setTimeout(expandMini, MINI_EXPAND_TIMEOUT); + return; + } + miniExpandTimer = null; + setState(TABLET_OPEN); + } + + function enterMiniExpanding(hand) { + ui.startExpandingTablet(hand); + miniExpandStart = Date.now(); + miniExpandTimer = Script.setTimeout(expandMini, MINI_EXPAND_TIMEOUT); + } + + function updateMiniExanding() { + // Hide mini tablet immediately if tablet proper has been displayed by other means. + if (HMD.showTablet) { + setState(MINI_HIDDEN); + } + } + + function exitMiniExpanding() { + if (miniExpandTimer !== null) { + Script.clearTimeout(miniExpandTimer); + miniExpandTimer = null; + } + } + + function enterTabletOpen() { + var miniTabletProperties = ui.getMiniTabletProperties(); + + ui.hide(); + + Overlays.editOverlay(HMD.tabletID, { + position: miniTabletProperties.position, + orientation: miniTabletProperties.orientation + }); + HMD.openTablet(true); + } + + function updateTabletOpen() { + // Immediately transition back to MINI_HIDDEN. + setState(MINI_HIDDEN); + } + + STATE_MACHINE = { + MINI_DISABLED: { // Mini tablet cannot be shown because in desktop mode. + enter: enterMiniDisabled, + update: null, + exit: exitMiniDisabled + }, + MINI_HIDDEN: { // Mini tablet could be shown but isn't because hand is oriented to show it or aren't in HMD mode. + enter: enterMiniHidden, + update: updateMiniHidden, + exit: null + }, + MINI_HIDING: { // Mini tablet is reducing from MINI_VISIBLE to MINI_HIDDEN. + enter: enterMiniHiding, + update: updateMiniHiding, + exit: exitMiniHiding + }, + MINI_SHOWING: { // Mini tablet is expanding from MINI_HIDDN to MINI_VISIBLE. + enter: enterMiniShowing, + update: updateMiniShowing, + exit: exitMiniShowing + }, + MINI_VISIBLE: { // Mini tablet is visible and attached to hand. + enter: null, + update: updateMiniVisible, + exit: null + }, + MINI_GRABBED: { // Mini tablet is grabbed by other hand. + enter: null, + update: updateMiniGrabbed, + exit: null + }, + MINI_EXPANDING: { // Mini tablet is expanding before showing tablet proper. + enter: enterMiniExpanding, + update: updateMiniExanding, + exit: exitMiniExpanding + }, + TABLET_OPEN: { // Tablet proper is being displayed. + enter: enterTabletOpen, + update: updateTabletOpen, + exit: null + } + }; + + function setState(state, data) { + if (state !== miniState) { + debug("State transition from " + STATE_STRINGS[miniState] + " to " + STATE_STRINGS[state]); + if (STATE_MACHINE[STATE_STRINGS[miniState]].exit) { + STATE_MACHINE[STATE_STRINGS[miniState]].exit(data); + } + if (STATE_MACHINE[STATE_STRINGS[state]].enter) { + STATE_MACHINE[STATE_STRINGS[state]].enter(data); + } + miniState = state; + } else { + error("Null state transition: " + state + "!"); + } + } + + function getState() { + return miniState; + } + + function getHand() { + return miniHand; + } + + function updateState() { + if (STATE_MACHINE[STATE_STRINGS[miniState]].update) { + STATE_MACHINE[STATE_STRINGS[miniState]].update(); + } + updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); + } + + function create() { + // Nothing to do. + } + + function destroy() { + if (miniState !== MINI_DISABLED) { + setState(MINI_DISABLED); + } + } + + create(); + + return { + MINI_DISABLED: MINI_DISABLED, + MINI_HIDDEN: MINI_HIDDEN, + MINI_HIDING: MINI_HIDING, + MINI_SHOWING: MINI_SHOWING, + MINI_VISIBLE: MINI_VISIBLE, + MINI_GRABBED: MINI_GRABBED, + MINI_EXPANDING: MINI_EXPANDING, + TABLET_OPEN: TABLET_OPEN, + updateState: updateState, + setState: setState, + getState: getState, + getHand: getHand, + destroy: destroy + }; }; - function setState(state, data) { - if (state !== rezzerState) { - debug("State transition from " + STATE_STRINGS[rezzerState] + " to " + STATE_STRINGS[state]); - if (STATE_MACHINE[STATE_STRINGS[rezzerState]].exit) { - STATE_MACHINE[STATE_STRINGS[rezzerState]].exit(data); - } - if (STATE_MACHINE[STATE_STRINGS[state]].enter) { - STATE_MACHINE[STATE_STRINGS[state]].enter(data); - } - rezzerState = state; - } else { - error("Null state transition: " + state + "!"); - } - } - - function updateState() { - if (STATE_MACHINE[STATE_STRINGS[rezzerState]].update) { - STATE_MACHINE[STATE_STRINGS[rezzerState]].update(); - } - updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); - } - // #endregion - // #region Events ========================================================================================================== + // #region External Events ================================================================================================= function onScaleChanged() { avatarScale = MyAvatar.scale; @@ -673,44 +790,49 @@ } function onMessageReceived(channel, data, senderID, localOnly) { - var message, hand; + var message, + miniHand, + hand; if (channel !== HIFI_OBJECT_MANIPULATION_CHANNEL) { return; } message = JSON.parse(data); - if (message.grabbedEntity !== proxyOverlay) { + if (message.grabbedEntity !== ui.getMiniTabletID()) { return; } - if (message.action === "grab" && rezzerState === PROXY_VISIBLE) { - hand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); - if (hand === proxyHand) { - setState(PROXY_EXPANDING, hand); + miniHand = miniState.getHand(); + if (message.action === "grab" && miniState.getState() === miniState.MINI_VISIBLE) { + hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); + if (hand === miniHand) { + miniState.setState(miniState.MINI_EXPANDING, hand); } else { - setState(PROXY_GRABBED); + miniState.setState(miniState.MINI_GRABBED); } - } else if (message.action === "release" && rezzerState === PROXY_GRABBED) { - hand = message.joint === HAND_NAMES[proxyHand] ? proxyHand : otherHand(proxyHand); - setState(PROXY_EXPANDING, hand); + } else if (message.action === "release" && miniState.getState() === miniState.MINI_GRABBED) { + hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); + miniState.setState(miniState.MINI_EXPANDING, hand); } } function onDisplayModeChanged() { - // Tablet proxy only available when HMD is active. + // Mini tablet only available when HMD is active. if (HMD.active) { - setState(PROXY_HIDDEN); + miniState.setState(miniState.MINI_HIDDEN); } else { - setState(PROXY_DISABLED); + miniState.setState(miniState.MINI_DISABLED); } } // #endregion - // #region Start-up and tear-down ========================================================================================== + // #region Set-up and tear-down ============================================================================================ function setUp() { + miniState = new State(); + MyAvatar.scaleChanged.connect(onScaleChanged); Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); @@ -718,17 +840,12 @@ HMD.displayModeChanged.connect(onDisplayModeChanged); if (HMD.active) { - setState(PROXY_HIDDEN); + miniState.setState(miniState.MINI_HIDDEN); } } function tearDown() { - if (updateTimer !== null) { - Script.clearTimeout(updateTimer); - updateTimer = null; - } - - setState(PROXY_DISABLED); + miniState.setState(miniState.MINI_DISABLED); HMD.displayModeChanged.disconnect(onDisplayModeChanged); @@ -736,6 +853,9 @@ Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); MyAvatar.scaleChanged.disconnect(onScaleChanged); + + miniState.destroy(); + miniState = null; } setUp(); From f3cbca6cee95ebb24de5309ff73bc8a2d3687c5a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Sep 2018 16:43:21 +1200 Subject: [PATCH 078/434] Change "bubble" button to "goto" --- .../system/html/css/img/mt-bubble-a-hover.svg | 5 -- .../html/css/img/mt-bubble-a-normal.svg | 5 -- ...t-bubble-i-hover.svg => mt-goto-hover.svg} | 0 ...bubble-i-normal.svg => mt-goto-normal.svg} | 0 scripts/system/html/css/miniTablet.css | 18 ++----- scripts/system/html/js/miniTablet.js | 24 ++++----- scripts/system/html/miniTablet.html | 4 +- scripts/system/miniTablet.js | 54 ++++++++++--------- 8 files changed, 48 insertions(+), 62 deletions(-) delete mode 100644 scripts/system/html/css/img/mt-bubble-a-hover.svg delete mode 100644 scripts/system/html/css/img/mt-bubble-a-normal.svg rename scripts/system/html/css/img/{mt-bubble-i-hover.svg => mt-goto-hover.svg} (100%) rename scripts/system/html/css/img/{mt-bubble-i-normal.svg => mt-goto-normal.svg} (100%) diff --git a/scripts/system/html/css/img/mt-bubble-a-hover.svg b/scripts/system/html/css/img/mt-bubble-a-hover.svg deleted file mode 100644 index 88ddfff808..0000000000 --- a/scripts/system/html/css/img/mt-bubble-a-hover.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/scripts/system/html/css/img/mt-bubble-a-normal.svg b/scripts/system/html/css/img/mt-bubble-a-normal.svg deleted file mode 100644 index 3d9d0a1286..0000000000 --- a/scripts/system/html/css/img/mt-bubble-a-normal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/scripts/system/html/css/img/mt-bubble-i-hover.svg b/scripts/system/html/css/img/mt-goto-hover.svg similarity index 100% rename from scripts/system/html/css/img/mt-bubble-i-hover.svg rename to scripts/system/html/css/img/mt-goto-hover.svg diff --git a/scripts/system/html/css/img/mt-bubble-i-normal.svg b/scripts/system/html/css/img/mt-goto-normal.svg similarity index 100% rename from scripts/system/html/css/img/mt-bubble-i-normal.svg rename to scripts/system/html/css/img/mt-goto-normal.svg diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index 3b01a45613..d5a12aae9c 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -57,25 +57,17 @@ img { background-image: url("./img/mt-mute-hover.svg"); } -#bubble { +#goto { padding-top: 19px; background-size: 100% 100%; } - #bubble.off { - background-image: url("./img/mt-bubble-i-normal.svg"); + #goto.off { + background-image: url("./img/mt-goto-normal.svg"); } - #bubble.off:hover { - background-image: url("./img/mt-bubble-i-hover.svg"); - } - - #bubble.on { - background-image: url("./img/mt-bubble-a-normal.svg"); - } - - #bubble.on:hover { - background-image: url("./img/mt-bubble-a-hover.svg"); + #goto.off:hover { + background-image: url("./img/mt-goto-hover.svg"); } #expand { diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js index ab1790cf00..f21dc7a6e6 100644 --- a/scripts/system/html/js/miniTablet.js +++ b/scripts/system/html/js/miniTablet.js @@ -19,13 +19,13 @@ READY_MESSAGE = "ready", // Engine <== Dialog HOVER_MESSAGE = "hover", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog - BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + GOTO_MESSAGE = "goto", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog muteButton, muteImage, - bubbleButton, - bubbleImage, + gotoButton, + gotoImage, expandButton; // #region Communications ================================================================================================== @@ -44,10 +44,8 @@ case MUTE_MESSAGE: muteImage.src = message.icon; break; - case BUBBLE_MESSAGE: - bubbleButton.classList.remove(message.on ? "off" : "on"); - bubbleButton.classList.add(message.on ? "on" : "off"); - bubbleImage.src = message.icon; + case GOTO_MESSAGE: + gotoImage.src = message.icon; break; } } @@ -64,9 +62,9 @@ })); } - function onBubbleButtonClick() { + function onGotoButtonClick() { EventBridge.emitWebEvent(JSON.stringify({ - type: BUBBLE_MESSAGE + type: GOTO_MESSAGE })); } @@ -98,17 +96,17 @@ function onLoad() { muteButton = document.getElementById("mute"); muteImage = document.getElementById("mute-img"); - bubbleButton = document.getElementById("bubble"); - bubbleImage = document.getElementById("bubble-img"); + gotoButton = document.getElementById("goto"); + gotoImage = document.getElementById("goto-img"); expandButton = document.getElementById("expand"); connectEventBridge(); muteButton.addEventListener("mouseenter", onButtonHover, false); - bubbleButton.addEventListener("mouseenter", onButtonHover, false); + gotoButton.addEventListener("mouseenter", onButtonHover, false); expandButton.addEventListener("mouseenter", onButtonHover, false); muteButton.addEventListener("click", onMuteButtonClick, true); - bubbleButton.addEventListener("click", onBubbleButtonClick, true); + gotoButton.addEventListener("click", onGotoButtonClick, true); expandButton.addEventListener("click", onExpandButtonClick, true); document.body.onunload = function () { diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html index 4b3129fca9..eca21c0d68 100644 --- a/scripts/system/html/miniTablet.html +++ b/scripts/system/html/miniTablet.html @@ -20,8 +20,8 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.
-
- +
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 8436e36087..0893108109 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -32,7 +32,6 @@ tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), DEBUG = false; - // #region Utilities ======================================================================================================= function debug(message) { if (!DEBUG) { @@ -75,9 +74,6 @@ return hand === LEFT_HAND ? RIGHT_HAND : LEFT_HAND; } - // #endregion - - // #region UI ============================================================================================================== UI = function () { @@ -511,9 +507,6 @@ }; - // #endregion - - // #region State Machine =================================================================================================== State = function () { @@ -535,8 +528,6 @@ STATE_MACHINE, miniState = MINI_DISABLED, miniHand, - updateTimer = null, - UPDATE_INTERVAL = 25, // Mini tablet scaling. MINI_SCALE_DURATION = 250, @@ -572,10 +563,7 @@ function enterMiniDisabled() { // Stop updates. - if (updateTimer !== null) { - Script.clearTimeout(updateTimer); - updateTimer = null; - } + Script.update.disconnect(updateState); // Stop monitoring mute changes. Audio.mutedChanged.disconnect(ui.updateMutedStatus); @@ -593,7 +581,7 @@ Audio.mutedChanged.connect(ui.updateMutedStatus); // Start updates. - updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); + Script.update.connect(updateState); } function shouldShowMini(hand) { @@ -943,7 +931,6 @@ if (STATE_MACHINE[STATE_STRINGS[miniState]].update) { STATE_MACHINE[STATE_STRINGS[miniState]].update(); } - updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); } function create() { @@ -966,7 +953,6 @@ MINI_VISIBLE: MINI_VISIBLE, MINI_EXPANDING: MINI_EXPANDING, TABLET_OPEN: TABLET_OPEN, - updateState: updateState, setState: setState, getState: getState, getHand: getHand, @@ -974,9 +960,6 @@ }; }; - // #endregion - - // #region External Events ================================================================================================= function onMessageReceived(channel, data, senderID, localOnly) { var message, @@ -1021,9 +1004,6 @@ } } - // #endregion - - // #region Set-up and tear-down ============================================================================================ function setUp() { miniState = new State(); @@ -1054,6 +1034,4 @@ setUp(); Script.scriptEnding.connect(tearDown); - // #endregion - }()); From 1088a0f9ae26437af880b702b0b14a93b2985fa5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 28 Sep 2018 10:19:17 +1200 Subject: [PATCH 242/434] Fix invalid state transition in desktop mode --- scripts/system/miniTablet.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 0893108109..395b2cb71f 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -980,7 +980,7 @@ return; } - if (message.action === "grab" && message.grabbedEntity === HMD.tabletID) { + if (message.action === "grab" && message.grabbedEntity === HMD.tabletID && HMD.active) { // Tablet may have been grabbed after it replaced expanded mini tablet. miniState.setState(miniState.MINI_HIDDEN); } else if (message.action === "grab" && miniState.getState() === miniState.MINI_VISIBLE) { @@ -992,7 +992,9 @@ function onWentAway() { // Mini tablet only available when user is not away. - miniState.setState(miniState.MINI_HIDDEN); + if (HMD.active) { + miniState.setState(miniState.MINI_HIDDEN); + } } function onDisplayModeChanged() { From 5fc24b258765dc83ae4fe73916c333cfa8c7c70c Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 27 Sep 2018 19:20:38 -0300 Subject: [PATCH 243/434] UI fixes in login and signup for S8 and S9 aspect ratio --- android/app/src/main/res/layout/fragment_login.xml | 9 ++++----- android/app/src/main/res/layout/fragment_signup.xml | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/android/app/src/main/res/layout/fragment_login.xml b/android/app/src/main/res/layout/fragment_login.xml index e5a16b453f..e9b2577ee7 100644 --- a/android/app/src/main/res/layout/fragment_login.xml +++ b/android/app/src/main/res/layout/fragment_login.xml @@ -97,8 +97,6 @@ android:background="@drawable/rounded_button" android:fontFamily="@font/raleway_semibold" android:paddingBottom="0dp" - android:paddingLeft="25dp" - android:paddingRight="25dp" android:paddingTop="0dp" android:text="@string/login" android:textColor="@color/white_opaque" @@ -123,20 +121,21 @@
- +
+
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index c53fab88a5..3e88c2fd20 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -126,8 +126,7 @@ // Button icons. MUTE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-mute-a.svg", MUTE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/mic-unmute-i.svg", - BUBBLE_ON_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-a.svg", - BUBBLE_OFF_ICON = Script.resourcesPath() + "icons/tablet-icons/bubble-i.svg", + GOTO_ICON = Script.resourcesPath() + "icons/tablet-icons/goto-i.svg", // Expansion to tablet. MINI_EXPAND_HANDLES = [ // Normalized coordinates in range [-0.5, 0.5] about center of mini tablet. @@ -149,14 +148,14 @@ miniTargetWidth, miniTargetLocalRotation, - // EventBridge + // EventBridge. READY_MESSAGE = "ready", // Engine <== Dialog HOVER_MESSAGE = "hover", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog - BUBBLE_MESSAGE = "bubble", // Engine <=> Dialog + GOTO_MESSAGE = "goto", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog - // Sounds + // Sounds. HOVER_SOUND = "./assets/sounds/button-hover.wav", HOVER_VOLUME = 0.5, CLICK_SOUND = "./assets/sounds/button-click.wav", @@ -174,12 +173,10 @@ })); } - function updateBubbleStatus() { - var isBubbleOn = Users.getIgnoreRadiusEnabled(); + function setGotoIcon() { miniOverlayObject.emitScriptEvent(JSON.stringify({ - type: BUBBLE_MESSAGE, - on: isBubbleOn, - icon: isBubbleOn ? BUBBLE_ON_ICON : BUBBLE_OFF_ICON + type: GOTO_MESSAGE, + icon: GOTO_ICON })); } @@ -197,7 +194,7 @@ case READY_MESSAGE: // Send initial button statuses. updateMutedStatus(); - updateBubbleStatus(); + setGotoIcon(); break; case HOVER_MESSAGE: // Audio feedback. @@ -208,15 +205,15 @@ playSound(clickSound, CLICK_VOLUME); Audio.muted = !Audio.muted; break; - case BUBBLE_MESSAGE: - // Toggle bubble. + case GOTO_MESSAGE: + // Goto. playSound(clickSound, CLICK_VOLUME); - Users.toggleIgnoreRadius(); + miniState.setState(miniState.MINI_EXPANDING, { hand: uiHand, goto: true }); break; case EXPAND_MESSAGE: // Expand tablet; playSound(clickSound, CLICK_VOLUME); - miniState.setState(miniState.MINI_EXPANDING, uiHand); + miniState.setState(miniState.MINI_EXPANDING, { hand: uiHand, goto: false }); break; } } @@ -419,7 +416,6 @@ getMiniTabletID: getMiniTabletID, getMiniTabletProperties: getMiniTabletProperties, updateMutedStatus: updateMutedStatus, - updateBubbleStatus: updateBubbleStatus, show: show, size: size, startExpandingTablet: startExpandingTablet, @@ -470,6 +466,10 @@ miniExpandTimer = null, miniExpandStart, + // Tablet targets. + isGoto = false, + TABLET_ADDRESS_DIALOG = "hifi/tablet/TabletAddressDialog.qml", + // Visibility. MIN_HAND_CAMERA_ANGLE = 30, DEGREES_180 = 180, @@ -483,9 +483,8 @@ updateTimer = null; } - // Stop monitoring mute and bubble changes. + // Stop monitoring mute changes. Audio.mutedChanged.disconnect(ui.updateMutedStatus); - Users.ignoreRadiusEnabledChanged.disconnect(ui.updateBubbleStatus); // Don't keep overlays prepared if in desktop mode. ui.destroy(); @@ -496,9 +495,8 @@ // Create UI so that it's ready to be displayed without seeing artefacts from creating the UI. ui = new UI(); - // Start monitoring mute and bubble changes. + // Start monitoring mute changes. Audio.mutedChanged.connect(ui.updateMutedStatus); - Users.ignoreRadiusEnabledChanged.connect(ui.updateBubbleStatus); // Start updates. updateTimer = Script.setTimeout(updateState, UPDATE_INTERVAL); @@ -640,8 +638,9 @@ setState(TABLET_OPEN); } - function enterMiniExpanding(hand) { - ui.startExpandingTablet(hand); + function enterMiniExpanding(data) { + isGoto = data.goto; + ui.startExpandingTablet(data.hand); miniExpandStart = Date.now(); miniExpandTimer = Script.setTimeout(expandMini, MINI_EXPAND_TIMEOUT); } @@ -665,10 +664,17 @@ ui.hide(); + if (isGoto) { + tablet.loadQMLSource(TABLET_ADDRESS_DIALOG); + } else { + tablet.gotoHomeScreen(); + } + Overlays.editOverlay(HMD.tabletID, { position: miniTabletProperties.position, orientation: miniTabletProperties.orientation }); + HMD.openTablet(true); } @@ -807,13 +813,13 @@ if (message.action === "grab" && miniState.getState() === miniState.MINI_VISIBLE) { hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); if (hand === miniHand) { - miniState.setState(miniState.MINI_EXPANDING, hand); + miniState.setState(miniState.MINI_EXPANDING, { hand: hand, goto: false }); } else { miniState.setState(miniState.MINI_GRABBED); } } else if (message.action === "release" && miniState.getState() === miniState.MINI_GRABBED) { hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); - miniState.setState(miniState.MINI_EXPANDING, hand); + miniState.setState(miniState.MINI_EXPANDING, { hand: hand, goto: false }); } } From 12454d7ec74d4489c69d34ffedf5a57cc78a39b2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Sep 2018 16:48:36 +1200 Subject: [PATCH 079/434] Increase mini tablet grow/shrink time --- scripts/system/miniTablet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 3e88c2fd20..226dbc7d9a 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -455,7 +455,7 @@ UPDATE_INTERVAL = 300, // Mini tablet scaling. - MINI_SCALE_DURATION = 150, + MINI_SCALE_DURATION = 250, MINI_SCALE_TIMEOUT = 20, miniScaleTimer = null, miniScaleStart, From f206a8f158e1a938a435326aaf0df5d5702d6ba0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Sep 2018 19:43:51 +1200 Subject: [PATCH 080/434] Display mini tablet on hand being gazed at if there is a choice --- scripts/system/miniTablet.js | 56 +++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 226dbc7d9a..fa3047c92e 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -527,7 +527,10 @@ Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position))); miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); - return Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; + return { + show: Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS, + cameraToHand: -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)) + }; } function enterMiniHidden() { @@ -535,14 +538,27 @@ } function updateMiniHidden() { + var showLeft, + showRight; + // Don't show mini tablet if tablet proper is already displayed or in toolbar mode. if (HMD.showTablet || tablet.toolbarMode) { return; } - // Compare palm directions of hands with vectors from palms to camera. - if (shouldShowMini(LEFT_HAND)) { + + // Show mini tablet if it would be pointing at the camera. + showLeft = shouldShowMini(LEFT_HAND); + showRight = shouldShowMini(RIGHT_HAND); + if (showLeft.show && showRight.show) { + // Both hands would be pointing at camera; show the one the camera is gazing at. + if (showLeft.cameraToHand > showRight.cameraToHand) { + setState(MINI_SHOWING, LEFT_HAND); + } else { + setState(MINI_SHOWING, RIGHT_HAND); + } + } else if (showLeft.show) { setState(MINI_SHOWING, LEFT_HAND); - } else if (shouldShowMini(RIGHT_HAND)) { + } else if (showRight.show) { setState(MINI_SHOWING, RIGHT_HAND); } } @@ -609,13 +625,38 @@ } function updateMiniVisible() { + var showLeft, + showRight; + // Hide mini tablet if tablet proper has been displayed by other means. if (HMD.showTablet) { setState(MINI_HIDDEN); return; } - // Check that palm direction of mini tablet hand still less than maximum angle. - if (!shouldShowMini(miniHand)) { + + // Check that the mini tablet should still be visible and if so then ensure it's on the hand that the camera is + // gazing at. + showLeft = shouldShowMini(LEFT_HAND); + showRight = shouldShowMini(RIGHT_HAND); + if (showLeft.show && showRight.show) { + if (showLeft.cameraToHand > showRight.cameraToHand) { + if (miniHand !== LEFT_HAND) { + setState(MINI_HIDING); + } + } else { + if (miniHand !== RIGHT_HAND) { + setState(MINI_HIDING); + } + } + } else if (showLeft.show) { + if (miniHand !== LEFT_HAND) { + setState(MINI_HIDING); + } + } else if (showRight.show) { + if (miniHand !== RIGHT_HAND) { + setState(MINI_HIDING); + } + } else { setState(MINI_HIDING); } } @@ -728,7 +769,8 @@ function setState(state, data) { if (state !== miniState) { - debug("State transition from " + STATE_STRINGS[miniState] + " to " + STATE_STRINGS[state]); + debug("State transition from " + STATE_STRINGS[miniState] + " to " + STATE_STRINGS[state] + + ( data ? " " + JSON.stringify(data) : "")); if (STATE_MACHINE[STATE_STRINGS[miniState]].exit) { STATE_MACHINE[STATE_STRINGS[miniState]].exit(data); } From b3bdddb3f4c4da3d3e98511e05b41247ea2d9f29 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 5 Sep 2018 11:25:27 -0700 Subject: [PATCH 081/434] set vec with one number --- libraries/shared/src/RegisteredMetaTypes.cpp | 12 +++-- libraries/shared/src/RegisteredMetaTypes.h | 50 ++++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index e47d14adef..4604690e62 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -88,7 +88,9 @@ QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2) { } void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2) { - if (object.isArray()) { + if (object.isNumber()) { + vec2 = glm::vec2(object.toVariant().toFloat()); + } else if (object.isArray()) { QVariantList list = object.toVariant().toList(); if (list.length() == 2) { vec2.x = list[0].toFloat(); @@ -228,7 +230,9 @@ QScriptValue vec3ColorToScriptValue(QScriptEngine* engine, const glm::vec3& vec3 } void vec3FromScriptValue(const QScriptValue& object, glm::vec3& vec3) { - if (object.isString()) { + if (object.isNumber()) { + vec3 = glm::vec3(object.toVariant().toFloat()); + } else if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = qColor.red(); @@ -341,7 +345,9 @@ QScriptValue u8vec3ColorToScriptValue(QScriptEngine* engine, const glm::u8vec3& } void u8vec3FromScriptValue(const QScriptValue& object, glm::u8vec3& vec3) { - if (object.isString()) { + if (object.isNumber()) { + vec3 = glm::vec3(object.toVariant().toUInt()); + } else if (object.isString()) { QColor qColor(object.toString()); if (qColor.isValid()) { vec3.x = (uint8_t)qColor.red(); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 768425e932..4dcc7486ad 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -51,6 +51,14 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4); * @typedef {object} Vec2 * @property {number} x - X-coordinate of the vector. Synonyms: u and width. * @property {number} y - Y-coordinate of the vector. Synonyms: v and height. +* @example Vec2s can be set in multiple ways and modified with their aliases, but still stringify in the same way +* Entities.editEntity(, { materialMappingPos: { x: 0.1, y: 0.2 }}); // { x: 0.1, y: 0.2 } +* Entities.editEntity(, { materialMappingPos: { u: 0.3, v: 0.4 }}); // { x: 0.3, y: 0.4 } +* Entities.editEntity(, { materialMappingPos: { width: 0.5, height: 0.6 }}); // { x: 0.5, y: 0.6 } +* Entities.editEntity(, { materialMappingPos: [0.7, 0.8]}); // { x: 0.7, y: 0.8 } +* Entities.editEntity(, { materialMappingPos: 0.9}); // { x: 0.9, y: 0.9 } +* var color = Entities.getEntityProperties().materialMappingPos; // { x: 0.9, y: 0.9 } +* color.v = 1.0; // { x: 0.9, y: 1.0 } */ QScriptValue vec2ToScriptValue(QScriptEngine* engine, const glm::vec2& vec2); void vec2FromScriptValue(const QScriptValue& object, glm::vec2& vec2); @@ -66,6 +74,18 @@ glm::vec2 vec2FromVariant(const QVariant& object); * @property {number} x - X-coordinate of the vector. Synonyms: r, red, and width. * @property {number} y - Y-coordinate of the vector. Synonyms: g, green, and height. * @property {number} z - Z-coordinate of the vector. Synonyms: b, blue, and depth. +* @example Vec3s can be set in multiple ways and modified with their aliases, but still stringify in the same way +* Entities.editEntity(, { position: { x: 1, y: 2, z: 3 }}); // { x: 1, y: 2, z: 3 } +* Entities.editEntity(, { position: { r: 4, g: 5, b: 6 }}); // { x: 4, y: 5, z: 6 } +* Entities.editEntity(, { position: { red: 7, green: 8, blue: 9 }}); // { x: 7, y: 8, z: 9 } +* Entities.editEntity(, { position: { width: 10, height: 11, depth: 12 }}); // { x: 10, y: 11, z: 12 } +* Entities.editEntity(, { position: [13, 14, 15]}); // { x: 13, y: 14, z: 15 } +* Entities.editEntity(, { position: 16}); // { x: 16, y: 16, z: 16 } +* var position = Entities.getEntityProperties().position; // { x: 16, y: 16, z: 16 } +* position.g = 17; // { x: 16, y: 17, z: 16 } +* position.blue = 18; // { x: 16, y: 17, z: 18 } +* Entities.editEntity(, { position: "red"}); // { x: 255, y: 0, z: 0 } +* Entities.editEntity(, { position: "#00FF00"}); // { x: 0, y: 255, z: 0 } */ QScriptValue vec3ToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); QScriptValue vec3ColorToScriptValue(QScriptEngine* engine, const glm::vec3& vec3); @@ -78,14 +98,38 @@ void vec3FromScriptValue(const QScriptValue& object, glm::vec3& vec3); * @property {number} red - Red component value. Integer in the range 0 - 255. Synonyms: r, x, and width. * @property {number} green - Green component value. Integer in the range 0 - 255. Synonyms: g, y, and height. * @property {number} blue - Blue component value. Integer in the range 0 - 255. Synonyms: b, z, and depth. +* @example Colors can be set in multiple ways and modified with their aliases, but still stringify in the same way +* Entities.editEntity(, { color: { x: 1, y: 2, z: 3 }}); // { red: 1, green: 2, blue: 3 } +* Entities.editEntity(, { color: { r: 4, g: 5, b: 6 }}); // { red: 4, green: 5, blue: 6 } +* Entities.editEntity(, { color: { red: 7, green: 8, blue: 9 }}); // { red: 7, green: 8, blue: 9 } +* Entities.editEntity(, { color: { width: 10, height: 11, depth: 12 }}); // { red: 10, green: 11, blue: 12 } +* Entities.editEntity(, { color: [13, 14, 15]}); // { red: 13, green: 14, blue: 15 } +* Entities.editEntity(, { color: 16}); // { red: 16, green: 16, blue: 16 } +* var color = Entities.getEntityProperties().color; // { red: 16, green: 16, blue: 16 } +* color.g = 17; // { red: 16, green: 17, blue: 16 } +* color.blue = 18; // { red: 16, green: 17, blue: 18 } +* Entities.editEntity(, { color: "red"}); // { red: 255, green: 0, blue: 0 } +* Entities.editEntity(, { color: "#00FF00"}); // { red: 0, green: 255, blue: 0 } */ /**jsdoc * A color vector. See also the {@link Vec3(0)|Vec3} object. * * @typedef {object} ColorFloat -* @property {number} red - Red component value. Float in the range 0 - 255. Synonyms: r, x, and width. -* @property {number} green - Green component value. Float in the range 0 - 255. Synonyms: g, y, and height. -* @property {number} blue - Blue component value. Float in the range 0 - 255. Synonyms: b, z, and depth. +* @property {number} red - Red component value. Real in the range 0 - 255. Synonyms: r, x, and width. +* @property {number} green - Green component value. Real in the range 0 - 255. Synonyms: g, y, and height. +* @property {number} blue - Blue component value. Real in the range 0 - 255. Synonyms: b, z, and depth. +* @example ColorFloats can be set in multiple ways and modified with their aliases, but still stringify in the same way +* Entities.editEntity(, { color: { x: 1, y: 2, z: 3 }}); // { red: 1, green: 2, blue: 3 } +* Entities.editEntity(, { color: { r: 4, g: 5, b: 6 }}); // { red: 4, green: 5, blue: 6 } +* Entities.editEntity(, { color: { red: 7, green: 8, blue: 9 }}); // { red: 7, green: 8, blue: 9 } +* Entities.editEntity(, { color: { width: 10, height: 11, depth: 12 }}); // { red: 10, green: 11, blue: 12 } +* Entities.editEntity(, { color: [13, 14, 15]}); // { red: 13, green: 14, blue: 15 } +* Entities.editEntity(, { color: 16}); // { red: 16, green: 16, blue: 16 } +* var color = Entities.getEntityProperties().color; // { red: 16, green: 16, blue: 16 } +* color.g = 17; // { red: 16, green: 17, blue: 16 } +* color.blue = 18; // { red: 16, green: 17, blue: 18 } +* Entities.editEntity(, { color: "red"}); // { red: 255, green: 0, blue: 0 } +* Entities.editEntity(, { color: "#00FF00"}); // { red: 0, green: 255, blue: 0 } */ QScriptValue u8vec3ToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); QScriptValue u8vec3ColorToScriptValue(QScriptEngine* engine, const glm::u8vec3& vec3); From c0a153482a63689543821d1fbf142d207c99de8e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 8 Sep 2018 11:55:47 +1200 Subject: [PATCH 082/434] Update mini tablet model --- .../system/assets/models/miniTabletBlank.fbx | Bin 0 -> 202832 bytes scripts/system/assets/models/tinyTablet.fbx | Bin 476000 -> 0 bytes scripts/system/html/css/miniTablet.css | 2 +- scripts/system/miniTablet.js | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 scripts/system/assets/models/miniTabletBlank.fbx delete mode 100644 scripts/system/assets/models/tinyTablet.fbx diff --git a/scripts/system/assets/models/miniTabletBlank.fbx b/scripts/system/assets/models/miniTabletBlank.fbx new file mode 100644 index 0000000000000000000000000000000000000000..a2faa2a80acd99d0a3bbc8e3d0e672b4352d29ad GIT binary patch literal 202832 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
o3*Qd?75aPl?xK4N^#huZ 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

~y{jVIB$JG{1IMNo@mcB`e&CPw3 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 diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index d5a12aae9c..c134f87f49 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -16,7 +16,7 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0. } html { - background-color: #121212; + background-color: #404040; } body { diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index fa3047c92e..23610fb3a4 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -87,7 +87,7 @@ var // Base overlay miniOverlay = null, - MINI_MODEL = Script.resolvePath("./assets/models/tinyTablet.fbx"), + MINI_MODEL = Script.resolvePath("./assets/models/miniTabletBlank.fbx"), MINI_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. MINI_POSITIONS = [ { From 8eeed772eb6864fc096b920018c5bd0983f880de Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 8 Sep 2018 12:40:36 +1200 Subject: [PATCH 083/434] Update button layout --- scripts/system/assets/images/expand.svg | 85 +++++++++++++++++++ .../system/html/css/img/mt-expand-hover.svg | 30 +------ .../system/html/css/img/mt-expand-normal.svg | 30 +------ scripts/system/html/css/img/mt-goto-hover.svg | 4 +- .../system/html/css/img/mt-goto-normal.svg | 4 +- scripts/system/html/css/img/mt-mute-hover.svg | 4 +- .../system/html/css/img/mt-mute-normal.svg | 4 +- scripts/system/html/css/miniTablet.css | 23 +++-- scripts/system/html/miniTablet.html | 4 +- 9 files changed, 114 insertions(+), 74 deletions(-) create mode 100644 scripts/system/assets/images/expand.svg diff --git a/scripts/system/assets/images/expand.svg b/scripts/system/assets/images/expand.svg new file mode 100644 index 0000000000..f57e624374 --- /dev/null +++ b/scripts/system/assets/images/expand.svg @@ -0,0 +1,85 @@ + + + +image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/scripts/system/html/css/img/mt-expand-hover.svg b/scripts/system/html/css/img/mt-expand-hover.svg index 97737f42c0..a8e84c42ad 100644 --- a/scripts/system/html/css/img/mt-expand-hover.svg +++ b/scripts/system/html/css/img/mt-expand-hover.svg @@ -1,31 +1,5 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/scripts/system/html/css/img/mt-expand-normal.svg b/scripts/system/html/css/img/mt-expand-normal.svg index 8b849ecc70..aac349ebda 100644 --- a/scripts/system/html/css/img/mt-expand-normal.svg +++ b/scripts/system/html/css/img/mt-expand-normal.svg @@ -1,31 +1,5 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/scripts/system/html/css/img/mt-goto-hover.svg b/scripts/system/html/css/img/mt-goto-hover.svg index c8c407139b..4cad54331a 100644 --- a/scripts/system/html/css/img/mt-goto-hover.svg +++ b/scripts/system/html/css/img/mt-goto-hover.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-goto-normal.svg b/scripts/system/html/css/img/mt-goto-normal.svg index 6be11c464e..ead63329fb 100644 --- a/scripts/system/html/css/img/mt-goto-normal.svg +++ b/scripts/system/html/css/img/mt-goto-normal.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-mute-hover.svg b/scripts/system/html/css/img/mt-mute-hover.svg index 909ecb0272..9a18ccd933 100644 --- a/scripts/system/html/css/img/mt-mute-hover.svg +++ b/scripts/system/html/css/img/mt-mute-hover.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/img/mt-mute-normal.svg b/scripts/system/html/css/img/mt-mute-normal.svg index 506756216f..472f03f138 100644 --- a/scripts/system/html/css/img/mt-mute-normal.svg +++ b/scripts/system/html/css/img/mt-mute-normal.svg @@ -1,5 +1,5 @@  - - + + diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index c134f87f49..55abba43a6 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -26,13 +26,13 @@ body { section { background-color: #404040; position: relative; - padding: 13px 9px; + padding: 16px 16px; } .button { - width: 128px; - height: 90px; - margin-top: 10px; + width: 116px; + height: 84px; + margin-top: 16px; text-align: center; } @@ -41,7 +41,7 @@ section { } img { - width: 46px; + width: 40px; } #mute { @@ -72,10 +72,10 @@ img { #expand { position: absolute; - right: 12px; - bottom: 13px; - width: 40px; - height: 40px; + right: 1px; + bottom: -1px; + width: 50px; + height: 50px; background-size: 100% 100%; } @@ -86,3 +86,8 @@ img { #expand.off:hover { background-image: url("./img/mt-expand-hover.svg"); } + + #expand img { + width:34px; + margin-top: 7px; + } diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html index eca21c0d68..92eac02734 100644 --- a/scripts/system/html/miniTablet.html +++ b/scripts/system/html/miniTablet.html @@ -23,7 +23,9 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.

-
+
+ +
From 5fcb69c72427ff05d5b980bfd4a82218d86bf948 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 8 Sep 2018 16:13:36 +1200 Subject: [PATCH 084/434] Remove extraneous CSS --- scripts/system/html/css/miniTablet.css | 27 +++++++++----------------- scripts/system/html/miniTablet.html | 6 +++--- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index 55abba43a6..a87add36a1 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -47,29 +47,23 @@ img { #mute { padding-top: 19px; background-size: 100% 100%; + background-image: url("./img/mt-mute-normal.svg"); } - #mute.off { - background-image: url("./img/mt-mute-normal.svg"); + #mute:hover { + background-image: url("./img/mt-mute-hover.svg"); } - #mute.off:hover { - background-image: url("./img/mt-mute-hover.svg"); - } - #goto { padding-top: 19px; background-size: 100% 100%; + background-image: url("./img/mt-goto-normal.svg"); } - #goto.off { - background-image: url("./img/mt-goto-normal.svg"); + #goto:hover { + background-image: url("./img/mt-goto-hover.svg"); } - #goto.off:hover { - background-image: url("./img/mt-goto-hover.svg"); - } - #expand { position: absolute; right: 1px; @@ -77,16 +71,13 @@ img { width: 50px; height: 50px; background-size: 100% 100%; + background-image: url("./img/mt-expand-normal.svg"); } - #expand.off { - background-image: url("./img/mt-expand-normal.svg"); + #expand:hover { + background-image: url("./img/mt-expand-hover.svg"); } - #expand.off:hover { - background-image: url("./img/mt-expand-hover.svg"); - } - #expand img { width:34px; margin-top: 7px; diff --git a/scripts/system/html/miniTablet.html b/scripts/system/html/miniTablet.html index 92eac02734..f0ef7cd609 100644 --- a/scripts/system/html/miniTablet.html +++ b/scripts/system/html/miniTablet.html @@ -17,13 +17,13 @@ See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.
-
+
-
+
-
+
From 66f75e856e5f03a4ef449cbcfa06d6851953389c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 8 Sep 2018 16:41:36 +1200 Subject: [PATCH 085/434] Fix goto and expand displaying as hovered when redisplay mini tablet --- scripts/system/html/css/miniTablet.css | 8 ++++++ scripts/system/html/js/miniTablet.js | 40 +++++++++++++++++++++----- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/scripts/system/html/css/miniTablet.css b/scripts/system/html/css/miniTablet.css index a87add36a1..7598332d28 100644 --- a/scripts/system/html/css/miniTablet.css +++ b/scripts/system/html/css/miniTablet.css @@ -64,6 +64,10 @@ img { background-image: url("./img/mt-goto-hover.svg"); } + #goto:hover.unhover { + background-image: url("./img/mt-goto-normal.svg"); + } + #expand { position: absolute; right: 1px; @@ -78,6 +82,10 @@ img { background-image: url("./img/mt-expand-hover.svg"); } + #expand:hover.unhover { + background-image: url("./img/mt-expand-normal.svg"); + } + #expand img { width:34px; margin-top: 7px; diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js index f21dc7a6e6..a966cbb139 100644 --- a/scripts/system/html/js/miniTablet.js +++ b/scripts/system/html/js/miniTablet.js @@ -26,7 +26,30 @@ muteImage, gotoButton, gotoImage, - expandButton; + expandButton, + + // Work around buttons staying hovered when mini tablet is replaced by tablet proper then subsequently redisplayed. + isUnhover = true; + + // #region Utilites ======================================================================================================== + + function setUnhover() { + if (!isUnhover) { + gotoButton.classList.add("unhover"); + expandButton.classList.add("unhover"); + isUnhover = true; + } + } + + function clearUnhover() { + if (isUnhover) { + gotoButton.classList.remove("unhover"); + expandButton.classList.remove("unhover"); + isUnhover = false; + } + } + + // #endregion // #region Communications ================================================================================================== @@ -50,25 +73,28 @@ } } + function onButtonHover() { + EventBridge.emitWebEvent(JSON.stringify({ + type: HOVER_MESSAGE + })); + clearUnhover(); + } + function onMuteButtonClick() { EventBridge.emitWebEvent(JSON.stringify({ type: MUTE_MESSAGE })); } - function onButtonHover() { - EventBridge.emitWebEvent(JSON.stringify({ - type: HOVER_MESSAGE - })); - } - function onGotoButtonClick() { + setUnhover(); EventBridge.emitWebEvent(JSON.stringify({ type: GOTO_MESSAGE })); } function onExpandButtonClick() { + setUnhover(); EventBridge.emitWebEvent(JSON.stringify({ type: EXPAND_MESSAGE })); From 5fd3f563d6d6eab98696abf4e65169823a7a5fd9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 9 Sep 2018 10:55:05 +1200 Subject: [PATCH 086/434] Move mini tablet down in the palm a little. --- scripts/system/miniTablet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 23610fb3a4..1a753ee65a 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -91,12 +91,12 @@ MINI_DIMENSIONS = { x: 0.0637, y: 0.0965, z: 0.0045 }, // Proportional to tablet proper. MINI_POSITIONS = [ { - x: -0.03, // Distance across hand. + x: -0.01, // Distance across hand. y: 0.08, // Distance from joint. z: 0.06 // Distance above palm. }, { - x: 0.03, // Distance across hand. + x: 0.01, // Distance across hand. y: 0.08, // Distance from joint. z: 0.06 // Distance above palm. } From baf1e8044539752bb6b6f96cd2aa7613872e3c4b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 9 Sep 2018 11:37:05 +1200 Subject: [PATCH 087/434] Code tidying --- scripts/system/miniTablet.js | 42 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 1a753ee65a..8c35109528 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -29,7 +29,6 @@ // Miscellaneous. HIFI_OBJECT_MANIPULATION_CHANNEL = "Hifi-Object-Manipulation", tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"), - avatarScale = 1, // Sanitized MyAvatar.scale. DEBUG = false; // #region Utilities ======================================================================================================= @@ -263,13 +262,13 @@ Overlays.editOverlay(miniOverlay, { parentID: MyAvatar.SELF_ID, parentJointIndex: handJointIndex(hand), - localPosition: Vec3.multiply(avatarScale, MINI_POSITIONS[hand]), + localPosition: Vec3.multiply(MyAvatar.scale, MINI_POSITIONS[hand]), localRotation: MINI_ROTATIONS[hand], dimensions: Vec3.multiply(initialScale, MINI_DIMENSIONS), visible: true }); Overlays.editOverlay(miniUIOverlay, { - localPosition: Vec3.multiply(avatarScale, MINI_UI_LOCAL_POSITION), + localPosition: Vec3.multiply(MyAvatar.scale, MINI_UI_LOCAL_POSITION), localRotation: MINI_UI_LOCAL_ROTATION, dimensions: Vec3.multiply(initialScale, MINI_UI_DIMENSIONS), dpi: MINI_UI_DPI / initialScale, @@ -330,7 +329,7 @@ localRotation, localPosition; - tabletScaleFactor = avatarScale * (1 + scaleFactor * (miniTargetWidth - miniInitialWidth) / miniInitialWidth); + tabletScaleFactor = MyAvatar.scale * (1 + scaleFactor * (miniTargetWidth - miniInitialWidth) / miniInitialWidth); dimensions = Vec3.multiply(tabletScaleFactor, MINI_DIMENSIONS); localRotation = Quat.mix(miniExpandLocalRotation, miniTargetLocalRotation, scaleFactor); localPosition = @@ -368,7 +367,7 @@ function create() { miniOverlay = Overlays.addOverlay("model", { url: MINI_MODEL, - dimensions: Vec3.multiply(avatarScale, MINI_DIMENSIONS), + dimensions: Vec3.multiply(MyAvatar.scale, MINI_DIMENSIONS), solid: true, grabbable: true, showKeyboardFocusHighlight: false, @@ -378,10 +377,10 @@ miniUIOverlay = Overlays.addOverlay("web3d", { url: MINI_UI_HTML, parentID: miniOverlay, - localPosition: Vec3.multiply(avatarScale, MINI_UI_LOCAL_POSITION), + localPosition: Vec3.multiply(MyAvatar.scale, MINI_UI_LOCAL_POSITION), localRotation: MINI_UI_LOCAL_ROTATION, - dimensions: Vec3.multiply(avatarScale, MINI_UI_DIMENSIONS), - dpi: MINI_UI_DPI / avatarScale, + dimensions: Vec3.multiply(MyAvatar.scale, MINI_UI_DIMENSIONS), + dpi: MINI_UI_DPI / MyAvatar.scale, alpha: 0, // Hide overlay while its content is being created. grabbable: false, showKeyboardFocusHighlight: false, @@ -394,7 +393,7 @@ miniOverlayObject = Overlays.getOverlayObject(miniUIOverlay); miniOverlayObject.webEventReceived.connect(onWebEventReceived); - // updateMiniTabletID(); Other scripts relying on this may not be ready yet so do this in showUI(). + // updateMiniTabletID(); Other scripts relying on this may not be ready yet so do this in show(). } function destroy() { @@ -523,7 +522,7 @@ Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); uiPositionAndOrientation = ui.getUIPositionAndRotation(hand); - miniPosition = Vec3.sum(handPosition, Vec3.multiply(avatarScale, + miniPosition = Vec3.sum(handPosition, Vec3.multiply(MyAvatar.scale, Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position))); miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); @@ -566,7 +565,7 @@ function scaleMiniDown() { var scaleFactor = (Date.now() - miniScaleStart) / MINI_SCALE_DURATION; if (scaleFactor < 1) { - ui.size((1 - scaleFactor) * avatarScale); + ui.size((1 - scaleFactor) * MyAvatar.scale); miniScaleTimer = Script.setTimeout(scaleMiniDown, MINI_SCALE_TIMEOUT); return; } @@ -595,12 +594,12 @@ function scaleMiniUp() { var scaleFactor = (Date.now() - miniScaleStart) / MINI_SCALE_DURATION; if (scaleFactor < 1) { - ui.size(scaleFactor * avatarScale); + ui.size(scaleFactor * MyAvatar.scale); miniScaleTimer = Script.setTimeout(scaleMiniUp, MINI_SCALE_TIMEOUT); return; } miniScaleTimer = null; - ui.size(avatarScale); + ui.size(MyAvatar.scale); setState(MINI_VISIBLE); } @@ -831,12 +830,6 @@ // #region External Events ================================================================================================= - function onScaleChanged() { - avatarScale = MyAvatar.scale; - // Clamp scale in order to work around M17434. - avatarScale = Math.max(MyAvatar.getDomainMinScale(), Math.min(MyAvatar.getDomainMaxScale(), avatarScale)); - } - function onMessageReceived(channel, data, senderID, localOnly) { var message, miniHand, @@ -846,7 +839,12 @@ return; } - message = JSON.parse(data); + try { + message = JSON.parse(data); + } catch (e) { + return; + } + if (message.grabbedEntity !== ui.getMiniTabletID()) { return; } @@ -881,8 +879,6 @@ function setUp() { miniState = new State(); - MyAvatar.scaleChanged.connect(onScaleChanged); - Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); Messages.messageReceived.connect(onMessageReceived); @@ -900,8 +896,6 @@ Messages.messageReceived.disconnect(onMessageReceived); Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); - MyAvatar.scaleChanged.disconnect(onScaleChanged); - miniState.destroy(); miniState = null; } From 1faef9db8c89c0269aa303890fb5d1b21c90fa49 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 9 Sep 2018 12:07:33 +1200 Subject: [PATCH 088/434] Fix tablet ending upside down if it expands into other grabbing hand --- scripts/system/miniTablet.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 8c35109528..df428c9c52 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -265,6 +265,7 @@ localPosition: Vec3.multiply(MyAvatar.scale, MINI_POSITIONS[hand]), localRotation: MINI_ROTATIONS[hand], dimensions: Vec3.multiply(initialScale, MINI_DIMENSIONS), + grabbable: true, visible: true }); Overlays.editOverlay(miniUIOverlay, { @@ -320,6 +321,11 @@ miniInitialWidth = MINI_DIMENSIONS.x; miniTargetWidth = getTabletWidthFromSettings(); miniTargetLocalRotation = Quat.multiply(miniExpandLocalRotation, miniExpandDeltaRotation); + + // Don't let other hand grab while expanding. + Overlays.editOverlay(miniOverlay, { + grabbable: false + }); } function sizeAboutHandles(scaleFactor) { From a1c49bd2b61199de3ce6143079be9c67db434a50 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Sep 2018 11:18:26 +1200 Subject: [PATCH 089/434] Hide mini tablet if lasering or grabbing something else --- scripts/system/html/js/miniTablet.js | 21 +++++++- scripts/system/miniTablet.js | 74 +++++++++++++++++++++------- 2 files changed, 76 insertions(+), 19 deletions(-) diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js index a966cbb139..e44a454a80 100644 --- a/scripts/system/html/js/miniTablet.js +++ b/scripts/system/html/js/miniTablet.js @@ -18,6 +18,7 @@ var // EventBridge READY_MESSAGE = "ready", // Engine <== Dialog HOVER_MESSAGE = "hover", // Engine <== Dialog + UNHOVER_MESSAGE = "unhover", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog GOTO_MESSAGE = "goto", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog @@ -73,9 +74,24 @@ } } + function onBodyHover() { + EventBridge.emitWebEvent(JSON.stringify({ + type: HOVER_MESSAGE, + target: "body" + })); + } + + function onBodyUnhover() { + EventBridge.emitWebEvent(JSON.stringify({ + type: UNHOVER_MESSAGE, + target: "body" + })); + } + function onButtonHover() { EventBridge.emitWebEvent(JSON.stringify({ - type: HOVER_MESSAGE + type: HOVER_MESSAGE, + target: "button" })); clearUnhover(); } @@ -128,6 +144,9 @@ connectEventBridge(); + document.body.addEventListener("mouseenter", onBodyHover, false); + document.body.addEventListener("mouseleave", onBodyUnhover, false); + muteButton.addEventListener("mouseenter", onButtonHover, false); gotoButton.addEventListener("mouseenter", onButtonHover, false); expandButton.addEventListener("mouseenter", onButtonHover, false); diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index df428c9c52..2482efec8d 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -8,13 +8,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -/* global getTabletWidthFromSettings */ +/* global getTabletWidthFromSettings, TRIGGER_OFF_VALUE */ (function () { "use strict"; Script.include("./libraries/utils.js"); + Script.include("./libraries/controllerDispatcherUtils.js"); var UI, ui = null, @@ -147,9 +148,13 @@ miniTargetWidth, miniTargetLocalRotation, + // Laser pointing at. + isBodyHovered = false, + // EventBridge. READY_MESSAGE = "ready", // Engine <== Dialog HOVER_MESSAGE = "hover", // Engine <== Dialog + UNHOVER_MESSAGE = "unhover", // Engine <== Dialog MUTE_MESSAGE = "mute", // Engine <=> Dialog GOTO_MESSAGE = "goto", // Engine <=> Dialog EXPAND_MESSAGE = "expand", // Engine <== Dialog @@ -196,8 +201,19 @@ setGotoIcon(); break; case HOVER_MESSAGE: - // Audio feedback. - playSound(hoverSound, HOVER_VOLUME); + if (message.target === "body") { + // Laser status. + isBodyHovered = true; + } else if (message.target === "button") { + // Audio feedback. + playSound(hoverSound, HOVER_VOLUME); + } + break; + case UNHOVER_MESSAGE: + if (message.target === "body") { + // Laser status. + isBodyHovered = false; + } break; case MUTE_MESSAGE: // Toggle mute. @@ -253,6 +269,10 @@ }; } + function isLaserPointingAt() { + return isBodyHovered; + } + function show(hand) { var initialScale = 0.01; // Start very small. @@ -420,6 +440,7 @@ getUIPositionAndRotation: getUIPositionAndRotation, getMiniTabletID: getMiniTabletID, getMiniTabletProperties: getMiniTabletProperties, + isLaserPointingAt: isLaserPointingAt, updateMutedStatus: updateMutedStatus, show: show, size: size, @@ -509,32 +530,49 @@ function shouldShowMini(hand) { // Should show mini tablet if it would be oriented toward the camera. - var pose, + var show, + pose, jointIndex, handPosition, handOrientation, uiPositionAndOrientation, miniPosition, miniOrientation, - miniToCameraDirection; + miniToCameraDirection, + cameraToHand; + // Shouldn't show mini tablet if hand isn't being controlled. pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand); - if (!pose.valid) { - return false; + show = pose.valid; + + // Shouldn't show mini tablet on hand if that hand's trigger is pressed (i.e., laser is searching or grabbing + // something) or the other hand's trigger is pressed unless it is pointing at the mini tablet. + if (show) { + show = Controller.getValue(hand === LEFT_HAND ? Controller.Standard.LT : Controller.Standard.RT) < + TRIGGER_OFF_VALUE + && (Controller.getValue(hand === LEFT_HAND ? Controller.Standard.RT : Controller.Standard.LT) < + TRIGGER_OFF_VALUE || ui.isLaserPointingAt()); + } + + // Should show mini tablet if it would be oriented toward the camera. + if (show) { + jointIndex = handJointIndex(hand); + handPosition = Vec3.sum(MyAvatar.position, + Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); + handOrientation = + Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); + uiPositionAndOrientation = ui.getUIPositionAndRotation(hand); + miniPosition = Vec3.sum(handPosition, Vec3.multiply(MyAvatar.scale, + Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position))); + miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); + miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); + show = Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; + cameraToHand = -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)); } - jointIndex = handJointIndex(hand); - handPosition = Vec3.sum(MyAvatar.position, - Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); - handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex)); - uiPositionAndOrientation = ui.getUIPositionAndRotation(hand); - miniPosition = Vec3.sum(handPosition, Vec3.multiply(MyAvatar.scale, - Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position))); - miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); - miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); return { - show: Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS, - cameraToHand: -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)) + show: show, + cameraToHand: cameraToHand }; } From 7eb05a3cc8d2c9c6206eb5bbbbcc2ac35c17a350 Mon Sep 17 00:00:00 2001 From: David Back Date: Tue, 11 Sep 2018 16:34:21 -0700 Subject: [PATCH 090/434] merge changes, fix various issues --- scripts/system/html/js/entityList.js | 617 +++++++++++++++------------ scripts/system/html/js/listView.js | 109 +++-- 2 files changed, 413 insertions(+), 313 deletions(-) diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index 48c74b4fc9..ace3f6e48c 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -1,7 +1,7 @@ -// entityListNew.js +// entityList.js // -// Created by David Back on 27 Aug 2018 -// Copyright 2018 High Fidelity, Inc. +// Created by Ryan Huffman on 19 Nov 2014 +// 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 @@ -10,6 +10,21 @@ const ASCENDING_SORT = 1; const DESCENDING_SORT = -1; const ASCENDING_STRING = '▴'; const DESCENDING_STRING = '▾'; +const LOCKED_GLYPH = ""; +const VISIBLE_GLYPH = ""; +const TRANSPARENCY_GLYPH = ""; +const BAKED_GLYPH = "" +const SCRIPT_GLYPH = "k"; +const BYTES_PER_MEGABYTE = 1024 * 1024; +const IMAGE_MODEL_NAME = 'default-image-model.fbx'; +const COLLAPSE_EXTRA_INFO = "E"; +const EXPAND_EXTRA_INFO = "D"; +const FILTER_IN_VIEW_ATTRIBUTE = "pressed"; +const WINDOW_NONVARIABLE_HEIGHT = 206; +const NUM_COLUMNS = 12; +const DELETE = 46; // Key code for the delete key. +const KEY_P = 80; // Key code for letter p used for Parenting hotkey. + const COMPARE_ASCENDING = function(a, b) { let va = a[currentSortColumn]; let vb = b[currentSortColumn]; @@ -24,29 +39,27 @@ const COMPARE_ASCENDING = function(a, b) { const COMPARE_DESCENDING = function(a, b) { return COMPARE_ASCENDING(b, a); } -const LOCKED_GLYPH = ""; -const VISIBLE_GLYPH = ""; -const TRANSPARENCY_GLYPH = ""; -const BAKED_GLYPH = "" -const SCRIPT_GLYPH = "k"; -const BYTES_PER_MEGABYTE = 1024 * 1024; -const IMAGE_MODEL_NAME = 'default-image-model.fbx'; -const NUM_COLUMNS = 12; -var entities = []; +// List of all entities +let entities = [] +// List of all entities, indexed by Entity ID var entitiesByID = {}; +// The filtered and sorted list of entities var visibleEntities = []; +var entityList = null; var selectedEntities = []; - var currentSortColumn = 'type'; var currentSortOrder = 'des'; +var isFilterInView = false; +var showExtraInfo = false; -var entityList = null; - -const ENABLE_PROFILING = true; +const ENABLE_PROFILING = false; var profileIndent = ''; -const PROFILE = !ENABLE_PROFILING ? function() { } : function(name, fn, args) { +const PROFILE_NOOP = function(_name, fn, args) { + fn.apply(this, args); +} ; +const PROFILE = !ENABLE_PROFILING ? PROFILE_NOOP : function(name, fn, args) { console.log("PROFILE-Web " + profileIndent + "(" + name + ") Begin"); var previousIndent = profileIndent; profileIndent += ' '; @@ -83,6 +96,7 @@ function loaded() { elNoEntitiesMessage = document.getElementById("no-entities"); elNoEntitiesInView = document.getElementById("no-entities-in-view"); elNoEntitiesRadius = document.getElementById("no-entities-radius"); + elNoEntitiesInView.style.display = "none"; entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); @@ -122,7 +136,6 @@ function loaded() { document.getElementById("entity-hasScript").onclick = function () { setSortColumn('hasScript'); }; - elRefresh.onclick = function() { refreshEntities(); } @@ -141,8 +154,270 @@ function loaded() { elDelete.onclick = function() { EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); } + elFilter.onkeyup = refreshEntityList; + elFilter.onpaste = refreshEntityList; + elFilter.onchange = onFilterChange; + elFilter.onblur = refreshFooter; + elInView.onclick = toggleFilterInView; + elRadius.onchange = onRadiusChange; + elInfoToggle.onclick = toggleInfo; + window.onresize = resize; + + function onRowClicked(clickEvent) { + let entityID = this.getAttribute("id"); + let selection = [entityID]; - function createRowFunction(elBottomBuffer) { + if (clickEvent.ctrlKey) { + let selectedIndex = selectedEntities.indexOf(entityID); + if (selectedIndex >= 0) { + selection = selectedEntities; + selection.splice(selectedIndex, 1) + } else { + selection = selection.concat(selectedEntities); + } + } else if (clickEvent.shiftKey && selectedEntities.length > 0) { + let previousItemFound = -1; + let clickedItemFound = -1; + for (let i = 0; i < visibleEntities.length; i++) { + let entity = visibleEntities[i]; + if (clickedItemFound === -1 && entityID === entity.id) { + clickedItemFound = i; + } else if(previousItemFound === -1 && selectedEntities[0] === entity.id) { + previousItemFound = i; + } + } + if (previousItemFound !== -1 && clickedItemFound !== -1) { + let betweenItems = []; + let toItem = Math.max(previousItemFound, clickedItemFound); + // skip first and last item in this loop, we add them to selection after the loop + for (let i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { + betweenItems.push(visibleEntities[i].id); + } + if (previousItemFound > clickedItemFound) { + // always make sure that we add the items in the right order + betweenItems.reverse(); + } + selection = selection.concat(betweenItems, selectedEntities); + } + } + + updateSelectedEntities(selection); + + EventBridge.emitWebEvent(JSON.stringify({ + type: "selectionUpdate", + focus: false, + entityIds: selection, + })); + + refreshFooter(); + } + + function onRowDoubleClicked() { + var entityID = this.getAttribute("id"); + EventBridge.emitWebEvent(JSON.stringify({ + type: "selectionUpdate", + focus: true, + entityIds: [entityID], + })); + } + + function decimalMegabytes(number) { + return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; + } + + function displayIfNonZero(number) { + return number ? number : ""; + } + + function getFilename(url) { + let urlParts = url.split('/'); + return urlParts[urlParts.length - 1]; + } + + function updateEntityData(entityData) { + entities = []; + entitiesByID = {}; + visibleEntities = []; + + PROFILE("map-data", function() { + entityData.forEach(function(entity) { + let type = entity.type + let filename = getFilename(entity.url); + if (filename === IMAGE_MODEL_NAME) { + type = "Image"; + } + + let entityData = { + id: entity.id, + name: entity.name, + type: type, + url: filename, + fullUrl: entity.url, + locked: entity.locked ? LOCKED_GLYPH : null, + visible: entity.visible ? VISIBLE_GLYPH : null, + verticesCount: displayIfNonZero(entity.verticesCount), + texturesCount: displayIfNonZero(entity.texturesCount), + texturesSize: decimalMegabytes(entity.texturesSize), + hasTransparent: entity.hasTransparent ? TRANSPARENCY_GLYPH : null, + isBaked: entity.isBaked ? BAKED_GLYPH : null, + drawCalls: displayIfNonZero(entity.drawCalls), + hasScript: entity.hasScript ? SCRIPT_GLYPH : null, + elRow : null + } + + entities.push(entityData); + entitiesByID[entityData.id] = entityData; + }); + }); + } + + function refreshEntityList() { + PROFILE("refresh-entity-list", function() { + PROFILE("filter", function() { + let searchTerm = elFilter.value; + if (searchTerm === '') { + visibleEntities = entities.slice(0); + } else { + visibleEntities = entities.filter(function(e) { + return e.name.indexOf(searchTerm) > -1 + || e.type.indexOf(searchTerm) > -1 + || e.fullUrl.indexOf(searchTerm) > -1; + }); + } + }); + + PROFILE("sort", function() { + let cmp = currentSortOrder === ASCENDING_SORT ? COMPARE_ASCENDING : COMPARE_DESCENDING; + visibleEntities.sort(cmp); + }); + + PROFILE("update-dom", function() { + entityList.setVisibleItemData(visibleEntities); + entityList.refresh(); + }); + + refreshFooter(); + }); + } + + function removeEntities(deletedIDs) { + // Loop from the back so we can pop items off while iterating + for (let j = entities.length - 1; j >= 0; --j) { + let id = entities[j]; + for (let i = 0, length = deletedIDs.length; i < length; ++i) { + if (id === deletedIDs[i]) { + entities.splice(j, 1); + entitiesByID[id].el.remove(); + delete entitiesByID[id]; + break; + } + } + } + refreshEntities(); + } + + function clearEntities() { + var firstVisibleRow = entityList.getRowOffset(); + var lastVisibleRow = firstVisibleRow + entityList.getNumRows() - 1; + for (var i = firstVisibleRow; i <= lastVisibleRow && i < visibleEntities.length; i++) { + var entity = visibleEntities[i]; + entity.elRow.setAttribute("id", ""); + } + + entities = []; + entitiesByID = {}; + visibleEntities = []; + + entityList.setVisibleItemData([]); + entityList.refresh(); + + refreshFooter(); + } + + var elSortOrder = { + name: document.querySelector('#entity-name .sort-order'), + type: document.querySelector('#entity-type .sort-order'), + url: document.querySelector('#entity-url .sort-order'), + locked: document.querySelector('#entity-locked .sort-order'), + visible: document.querySelector('#entity-visible .sort-order'), + verticesCount: document.querySelector('#entity-verticesCount .sort-order'), + texturesCount: document.querySelector('#entity-texturesCount .sort-order'), + texturesSize: document.querySelector('#entity-texturesSize .sort-order'), + hasTransparent: document.querySelector('#entity-hasTransparent .sort-order'), + isBaked: document.querySelector('#entity-isBaked .sort-order'), + drawCalls: document.querySelector('#entity-drawCalls .sort-order'), + hasScript: document.querySelector('#entity-hasScript .sort-order'), + } + function setSortColumn(column) { + PROFILE("set-sort-column", function() { + if (currentSortColumn === column) { + currentSortOrder *= -1; + } else { + elSortOrder[currentSortColumn].innerHTML = ""; + currentSortColumn = column; + currentSortOrder = ASCENDING_SORT; + } + elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; + refreshEntityList(); + }); + } + + function refreshEntities(resetRowOffset) { + clearEntities(); + if (resetRowOffset) { + entityList.resetRowOffset(); + } + EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); + } + + function refreshFooter() { + if (selectedEntities.length > 1) { + elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; + } else if (selectedEntities.length === 1) { + elFooter.firstChild.nodeValue = "1 entity selected"; + } else if (visibleEntities.length === 1) { + elFooter.firstChild.nodeValue = "1 entity found"; + } else { + elFooter.firstChild.nodeValue = visibleEntities.length + " entities found"; + } + } + + function updateSelectedEntities(selectedIDs) { + let notFound = false; + + let firstVisibleRow = entityList.getRowOffset(); + let lastVisibleRow = firstVisibleRow + entityList.getNumRows() - 1; + for (let i = firstVisibleRow; i <= lastVisibleRow && i < visibleEntities.length; i++) { + let entity = visibleEntities[i]; + entity.elRow.className = ''; + } + + for (let i = 0; i < selectedEntities.length; i++) { + let id = selectedEntities[i]; + entitiesByID[id].selected = false; + } + + selectedEntities = []; + for (let i = 0; i < selectedIDs.length; i++) { + let id = selectedIDs[i]; + entitiesByID[id].selected = true; + selectedEntities.push(id); + if (id in entitiesByID) { + let entity = entitiesByID[id]; + if (entity.elRow) { + entity.elRow.className = 'selected'; + } + } else { + notFound = true; + } + } + + refreshFooter(); + + return notFound; + } + + function createRowFunction() { var row = document.createElement("tr"); for (var i = 0; i < NUM_COLUMNS; i++) { var column = document.createElement("td"); @@ -154,7 +429,6 @@ function loaded() { } row.onclick = onRowClicked; row.ondblclick = onRowDoubleClicked; - elEntityTableBody.insertBefore(row, elBottomBuffer); return row; } @@ -184,12 +458,20 @@ function loaded() { var hasScriptCell = elRow.childNodes[11]; hasScriptCell.innerText = itemData.hasScript; + if (itemData.selected) { + elRow.className = 'selected'; + } else { + elRow.className = ''; + } + var prevItemId = elRow.getAttribute("id"); var newItemId = itemData.id; - if (prevItemId && prevItemId !== newItemId) { + var validPrevItemId = prevItemId !== null && prevItemId.length > 0; + if (validPrevItemId && prevItemId !== newItemId && entitiesByID[prevItemId].elRow === elRow) { + elRow.setAttribute("id", ""); entitiesByID[prevItemId].elRow = null; } - if (!prevItemId || prevItemId !== newItemId) { + if (!validPrevItemId || prevItemId !== newItemId) { elRow.setAttribute("id", newItemId); entitiesByID[newItemId].elRow = elRow; } @@ -200,236 +482,17 @@ function loaded() { var cell = elRow.childNodes[i]; cell.innerHTML = ""; } - + var id = elRow.getAttribute("id"); if (id && entitiesByID[id]) { + elRow.setAttribute("id", ""); entitiesByID[id].elRow = null; } } - function onRowClicked(clickEvent) { - var entityID = this.getAttribute("id"); - var selection = [entityID]; - - if (clickEvent.ctrlKey) { - var selectedIndex = selectedEntities.indexOf(entityID); - if (selectedIndex >= 0) { - selection = selectedEntities; - selection.splice(selectedIndex, 1) - } else { - selection = selection.concat(selectedEntities); - } - } else if (clickEvent.shiftKey && selectedEntities.length > 0) { - var previousItemFound = -1; - var clickedItemFound = -1; - for (var i = 0; i < visibleEntities.length; i++) { - var entity = visibleEntities[i]; - if (clickedItemFound === -1 && entityID == entity.id) { - clickedItemFound = i; - } else if(previousItemFound === -1 && selectedEntities[0] == entity.id) { - previousItemFound = i; - } - } - if (previousItemFound !== -1 && clickedItemFound !== -1) { - var betweenItems = []; - var toItem = Math.max(previousItemFound, clickedItemFound); - // skip first and last item in this loop, we add them to selection after the loop - for (var i = (Math.min(previousItemFound, clickedItemFound) + 1); i < toItem; i++) { - visibleEntities[i].elRow.className = 'selected'; - betweenItems.push(visibleEntities[i].id); - } - if (previousItemFound > clickedItemFound) { - // always make sure that we add the items in the right order - betweenItems.reverse(); - } - selection = selection.concat(betweenItems, selectedEntities); - } - } - - selectedEntities = selection; - - this.className = 'selected'; - - EventBridge.emitWebEvent(JSON.stringify({ - type: "selectionUpdate", - focus: false, - entityIds: selection, - })); - - refreshFooter(); - } - - function onRowDoubleClicked() { - var entityID = this.getAttribute("id"); - EventBridge.emitWebEvent(JSON.stringify({ - type: "selectionUpdate", - focus: true, - entityIds: [entityID], - })); - } - - var elSortOrder = { - name: document.querySelector('#entity-name .sort-order'), - type: document.querySelector('#entity-type .sort-order'), - url: document.querySelector('#entity-url .sort-order'), - locked: document.querySelector('#entity-locked .sort-order'), - visible: document.querySelector('#entity-visible .sort-order'), - verticesCount: document.querySelector('#entity-verticesCount .sort-order'), - texturesCount: document.querySelector('#entity-texturesCount .sort-order'), - texturesSize: document.querySelector('#entity-texturesSize .sort-order'), - hasTransparent: document.querySelector('#entity-hasTransparent .sort-order'), - isBaked: document.querySelector('#entity-isBaked .sort-order'), - drawCalls: document.querySelector('#entity-drawCalls .sort-order'), - hasScript: document.querySelector('#entity-hasScript .sort-order'), - } - function setSortColumn(column) { - PROFILE("set-sort-column", function() { - if (currentSortColumn === column) { - currentSortOrder *= -1; - } else { - elSortOrder[currentSortColumn].innerHTML = ""; - currentSortColumn = column; - currentSortOrder = ASCENDING_SORT; - } - elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; - refreshEntityList(); - }); - } - - function clearEntities() { - entities = {}; - refreshFooter(); - } - - function refreshFooter() { - if (selectedEntities.length > 1) { - elFooter.firstChild.nodeValue = selectedEntities.length + " entities selected"; - } else if (selectedEntities.length === 1) { - elFooter.firstChild.nodeValue = "1 entity selected"; - } else if (visibleEntities.length === 1) { - elFooter.firstChild.nodeValue = "1 entity found"; - } else { - elFooter.firstChild.nodeValue = visibleEntities.length + " entities found"; - } - } - - function refreshEntities() { - clearEntities(); - EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); - } - - function refreshEntityList() { - PROFILE("refresh-entity-list", function() { - PROFILE("filter", function() { - var searchTerm = elFilter.value; - if (searchTerm === '') { - visibleEntities = entities.slice(0); - } else { - visibleEntities = entities.filter(function(e) { - return e.name.indexOf(searchTerm) > -1 - || e.type.indexOf(searchTerm) > -1 - || e.fullUrl.indexOf(searchTerm) > -1; - }); - } - }); - - PROFILE("sort", function() { - var cmp = currentSortOrder === ASCENDING_SORT ? COMPARE_ASCENDING : COMPARE_DESCENDING; - visibleEntities.sort(cmp); - }); - - PROFILE("update-dom", function() { - entityList.setVisibleItemData(visibleEntities); - entityList.refresh(); - }); - - refreshFooter(); - }); - } - - function decimalMegabytes(number) { - return number ? (number / BYTES_PER_MEGABYTE).toFixed(1) : ""; - } - - function displayIfNonZero(number) { - return number ? number : ""; - } - - function getFilename(url) { - var urlParts = url.split('/'); - return urlParts[urlParts.length - 1]; - } - - function updateEntityData(entityData) { - entities = []; - entitiesByID = {}; - visibleEntities = []; - - PROFILE("map-data", function() { - entityData.forEach(function(entity) { - var type = entity.type - var filename = getFilename(entity.url); - if (filename === IMAGE_MODEL_NAME) { - type = "Image"; - } - - var entityData = { - id: entity.id, - name: entity.name, - type: type, - url: filename, - fullUrl: entity.url, - locked: entity.locked ? LOCKED_GLYPH : null, - visible: entity.visible ? VISIBLE_GLYPH : null, - verticesCount: displayIfNonZero(entity.verticesCount), - texturesCount: displayIfNonZero(entity.texturesCount), - texturesSize: decimalMegabytes(entity.texturesSize), - hasTransparent: entity.hasTransparent ? TRANSPARENCY_GLYPH : null, - isBaked: entity.isBaked ? BAKED_GLYPH : null, - drawCalls: displayIfNonZero(entity.drawCalls), - hasScript: entity.hasScript ? SCRIPT_GLYPH : null, - elRow : null - } - - entities.push(entityData); - entitiesByID[entityData.id] = entityData; - }); - }); - } - - function updateSelectedEntities(selectedIDs) { - var notFound = false; - for (var id in entitiesByID) { - if (entitiesByID[id].elRow) { - entitiesByID[id].elRow.className = ''; - } - } - - selectedEntities = []; - for (var i = 0; i < selectedIDs.length; i++) { - var id = selectedIDs[i]; - selectedEntities.push(id); - if (id in entitiesByID) { - var entity = entitiesByID[id]; - entity.elRow.className = 'selected'; - } else { - notFound = true; - } - } - - refreshFooter(); - - return notFound; - } - - function removeEntities(deletedIDs) { - for (var i = 0, length = deletedIDs.length; i < length; i++) { - var deleteID = deletedIDs[i]; - delete entitiesByID[deleteID]; - } - } - function resize() { + var prevScrollTop = elEntityTableScroll.scrollTop; + // Take up available window space elEntityTableScroll.style.height = window.innerHeight - 207; @@ -464,11 +527,37 @@ function loaded() { ths[4].width = 0.08 * tableWidth; } } + + entityList.resetRows(window.innerHeight - WINDOW_NONVARIABLE_HEIGHT); + entityList.refresh(); + + elEntityTableScroll.scrollTop = prevScrollTop; }; - var showExtraInfo = false; - var COLLAPSE_EXTRA_INFO = "E"; - var EXPAND_EXTRA_INFO = "D"; + function toggleFilterInView() { + isFilterInView = !isFilterInView; + if (isFilterInView) { + elInView.setAttribute(FILTER_IN_VIEW_ATTRIBUTE, FILTER_IN_VIEW_ATTRIBUTE); + elNoEntitiesInView.style.display = "inline"; + } else { + elInView.removeAttribute(FILTER_IN_VIEW_ATTRIBUTE); + elNoEntitiesInView.style.display = "none"; + } + EventBridge.emitWebEvent(JSON.stringify({ type: "filterInView", filterInView: isFilterInView })); + refreshEntities(); + } + + function onFilterChange() { + refreshEntityList(); + resize(); + } + + function onRadiusChange() { + elRadius.value = Math.max(elRadius.value, 0); + EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elRadius.value })); + refreshEntities(true); + elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; + } function toggleInfo(event) { showExtraInfo = !showExtraInfo; @@ -482,7 +571,6 @@ function loaded() { resize(); event.stopPropagation(); } - elInfoToggle.addEventListener("click", toggleInfo, true); document.addEventListener("keydown", function (keyDownEvent) { if (keyDownEvent.target.nodeName === "INPUT") { @@ -501,29 +589,6 @@ function loaded() { } } }, false); - - var isFilterInView = false; - var FILTER_IN_VIEW_ATTRIBUTE = "pressed"; - elNoEntitiesInView.style.display = "none"; - elInView.onclick = function () { - isFilterInView = !isFilterInView; - if (isFilterInView) { - elInView.setAttribute(FILTER_IN_VIEW_ATTRIBUTE, FILTER_IN_VIEW_ATTRIBUTE); - elNoEntitiesInView.style.display = "inline"; - } else { - elInView.removeAttribute(FILTER_IN_VIEW_ATTRIBUTE); - elNoEntitiesInView.style.display = "none"; - } - EventBridge.emitWebEvent(JSON.stringify({ type: "filterInView", filterInView: isFilterInView })); - refreshEntities(); - } - - elRadius.onchange = function () { - elRadius.value = Math.max(elRadius.value, 0); - EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elRadius.value })); - refreshEntities(); - elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; - } if (window.EventBridge !== undefined) { EventBridge.scriptEventReceived.connect(function(data) { @@ -538,9 +603,10 @@ function loaded() { } else if (data.type === "update" && data.selectedIDs !== undefined) { PROFILE("update", function() { var newEntities = data.entities; - if (newEntities && newEntities.length == 0) { + if (newEntities && newEntities.length === 0) { elNoEntitiesMessage.style.display = "block"; elFooter.firstChild.nodeValue = "0 entities found"; + clearEntities(); } else if (newEntities) { elNoEntitiesMessage.style.display = "none"; updateEntityData(newEntities); @@ -558,11 +624,12 @@ function loaded() { }); } - setSortColumn('type'); resize(); - entityList.initialize(572); + setSortColumn('type'); refreshEntities(); }); + + augmentSpinButtons(); // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked document.addEventListener("contextmenu", function (event) { diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index 95e71bb2dc..03ebd511b1 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -24,38 +24,44 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var elBottomBuffer = null; var visibleItemData = []; + var elRows = []; var rowOffset = 0; - var numRows = 0; var rowHeight = 0; var lastRowChangeScrollTop = 0; + that.getRowOffset = function() { + return rowOffset; + }; + + that.resetRowOffset = function() { + rowOffset = 0; + lastRowChangeScrollTop = 0; + }; + + that.getNumRows = function() { + return elRows.length; + }; + that.setVisibleItemData = function(itemData) { visibleItemData = itemData; }; - + that.clear = function() { - for (var i = 0; i < numRows; i++) { + for (var i = 0; i < that.getNumRows(); i++) { var elRow = elTableBody.childNodes[i + FIRST_ROW_INDEX]; clearRowFunction(elRow); + elRow.style.display = "none"; } }; - that.setSortKey = function(key) { - - }; - - that.setFilter = function(filter) { - - }; - that.scrollDown = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); for (var i = 0; i < numScrollRows; i++) { var rowMovedTopToBottom = elTableBody.childNodes[FIRST_ROW_INDEX]; - var rowIndex = numRows + rowOffset; + var rowIndex = that.getNumRows() + rowOffset; elTableBody.removeChild(rowMovedTopToBottom); elTableBody.insertBefore(rowMovedTopToBottom, elBottomBuffer); updateRowFunction(rowMovedTopToBottom, visibleItemData[rowIndex]); @@ -75,7 +81,7 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda for (var i = 0; i < numScrollRows; i++) { var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; - var rowMovedBottomToTop = elTableBody.childNodes[FIRST_ROW_INDEX + numRows - 1]; + var rowMovedBottomToTop = elTableBody.childNodes[FIRST_ROW_INDEX + that.getNumRows() - 1]; var rowIndex = rowOffset - 1; elTableBody.removeChild(rowMovedBottomToTop); elTableBody.insertBefore(rowMovedBottomToTop, topRow); @@ -95,6 +101,7 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var nextRowChangeScrollTop = lastRowChangeScrollTop + (rowHeight * SCROLL_ROWS); var scrollHeight = rowHeight * SCROLL_ROWS; var totalItems = visibleItemData.length; + var numRows = that.getNumRows(); if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { var numScrolls = Math.ceil((scrollTop - nextRowChangeScrollTop) / scrollHeight); @@ -103,7 +110,7 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda numScrollRows = totalItems - rowOffset - numRows; } that.scrollDown(numScrollRows); - } else if (scrollTop < lastRowChangeScrollTop && rowOffset >= SCROLL_ROWS) { + } else if (scrollTop < lastRowChangeScrollTop) { var numScrolls = Math.ceil((lastRowChangeScrollTop - scrollTop) / scrollHeight); var numScrollRows = numScrolls * SCROLL_ROWS; if (rowOffset - numScrollRows < 0) { @@ -115,10 +122,13 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda that.refresh = function() { // block refreshing before rows are initialized + var numRows = that.getNumRows(); if (numRows === 0) { return; } + that.clear(); + for (var i = 0; i < numRows; i++) { var rowIndex = i + rowOffset; if (rowIndex >= visibleItemData.length) { @@ -127,9 +137,14 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var rowElementIndex = i + FIRST_ROW_INDEX; var elRow = elTableBody.childNodes[rowElementIndex]; var itemData = visibleItemData[rowIndex]; - updateRowFunction(elRow, itemData); + updateRowFunction(elRow, itemData); + elRow.style.display = ""; } + var topHiddenRows = rowOffset; + var topBufferHeight = rowHeight * topHiddenRows; + elTopBuffer.setAttribute("height", topBufferHeight); + var bottomHiddenRows = visibleItemData.length - numRows - rowOffset; var bottomBufferHeight = rowHeight * bottomHiddenRows; if (bottomHiddenRows < 0) { @@ -138,42 +153,60 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda elBottomBuffer.setAttribute("height", bottomBufferHeight); }; - that.initialize = function(viewableHeight) { - if (!elTable || !elTableBody) { - debugPrint("ListView - no valid table/body element"); + that.resetRows = function(viewableHeight) { + if (!elTableBody) { + debugPrint("ListView.resetRows - no valid table body element"); return; } - - elTableScroll.onscroll = that.onScroll; + + elTopBuffer.setAttribute("height", 0); + elBottomBuffer.setAttribute("height", 0); // clear out any existing rows - while(elTableBody.rows.length > 0) { - elTableBody.deleteRow(0); + for (var i = 0; i < that.getNumRows(); i++) { + var elRow = elRows[i]; + elTableBody.removeChild(elRow); } - - elTopBuffer = document.createElement("tr"); - elTopBuffer.setAttribute("height", 0); - elTableBody.appendChild(elTopBuffer); + elRows = []; - elBottomBuffer = document.createElement("tr"); - elBottomBuffer.setAttribute("height", 0); - elTableBody.appendChild(elBottomBuffer); - - var maxHeight = viewableHeight; var usedHeight = 0; - while(usedHeight < maxHeight) { - var newRow = createRowFunction(elBottomBuffer); + while(usedHeight < viewableHeight) { + var newRow = createRowFunction(); + elTableBody.insertBefore(newRow, elBottomBuffer); rowHeight = elTableBody.offsetHeight - usedHeight; - usedHeight = elTableBody.offsetHeight; - numRows++; + usedHeight = elTableBody.offsetHeight; + elRows.push(newRow); } // extra rows for scrolling purposes for (var i = 0; i < SCROLL_ROWS; i++) { - var scrollRow = createRowFunction(elBottomBuffer); - numRows++; + var scrollRow = createRowFunction(); + elTableBody.insertBefore(scrollRow, elBottomBuffer); + elRows.push(scrollRow); } - } + }; + + that.initialize = function() { + if (!elTableBody || !elTableScroll) { + debugPrint("ListView.initialize - no valid table body or table scroll element"); + return; + } + + // delete initial blank row + elTableBody.deleteRow(0); + + elTopBuffer = document.createElement("tr"); + elTableBody.appendChild(elTopBuffer); + elTopBuffer.setAttribute("height", 0); + + elBottomBuffer = document.createElement("tr"); + elTableBody.appendChild(elBottomBuffer); + elBottomBuffer.setAttribute("height", 0); + + elTableScroll.onscroll = that.onScroll; + }; + + that.initialize(); return that; } From 70d427f8521887a4417e0d0343a0021800b241d9 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 12 Sep 2018 09:43:14 -0700 Subject: [PATCH 091/434] more fixes for resizing, deleting, selecting etc --- scripts/system/html/js/entityList.js | 84 +++++++++++++++++----------- scripts/system/html/js/listView.js | 4 +- 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index ace3f6e48c..fae3ed33b4 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -50,7 +50,7 @@ var visibleEntities = []; var entityList = null; var selectedEntities = []; var currentSortColumn = 'type'; -var currentSortOrder = 'des'; +var currentSortOrder = ASCENDING_SORT; var isFilterInView = false; var showExtraInfo = false; @@ -96,9 +96,6 @@ function loaded() { elNoEntitiesMessage = document.getElementById("no-entities"); elNoEntitiesInView = document.getElementById("no-entities-in-view"); elNoEntitiesRadius = document.getElementById("no-entities-radius"); - elNoEntitiesInView.style.display = "none"; - - entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); document.getElementById("entity-name").onclick = function() { setSortColumn('name'); @@ -163,8 +160,12 @@ function loaded() { elInfoToggle.onclick = toggleInfo; window.onresize = resize; + elNoEntitiesInView.style.display = "none"; + + entityList = new ListView("entity-table", "entity-table-body", "entity-table-scroll", createRowFunction, updateRowFunction, clearRowFunction); + function onRowClicked(clickEvent) { - let entityID = this.getAttribute("id"); + let entityID = this.dataset.entityID; let selection = [entityID]; if (clickEvent.ctrlKey) { @@ -178,11 +179,11 @@ function loaded() { } else if (clickEvent.shiftKey && selectedEntities.length > 0) { let previousItemFound = -1; let clickedItemFound = -1; - for (let i = 0; i < visibleEntities.length; i++) { + for (let i = 0, len = visibleEntities.length; i < len; ++i) { let entity = visibleEntities[i]; if (clickedItemFound === -1 && entityID === entity.id) { clickedItemFound = i; - } else if(previousItemFound === -1 && selectedEntities[0] === entity.id) { + } else if (previousItemFound === -1 && selectedEntities[0] === entity.id) { previousItemFound = i; } } @@ -213,11 +214,10 @@ function loaded() { } function onRowDoubleClicked() { - var entityID = this.getAttribute("id"); EventBridge.emitWebEvent(JSON.stringify({ type: "selectionUpdate", focus: true, - entityIds: [entityID], + entityIds: [this.dataset.entityID], })); } @@ -241,7 +241,7 @@ function loaded() { PROFILE("map-data", function() { entityData.forEach(function(entity) { - let type = entity.type + let type = entity.type; let filename = getFilename(entity.url); if (filename === IMAGE_MODEL_NAME) { type = "Image"; @@ -262,7 +262,8 @@ function loaded() { isBaked: entity.isBaked ? BAKED_GLYPH : null, drawCalls: displayIfNonZero(entity.drawCalls), hasScript: entity.hasScript ? SCRIPT_GLYPH : null, - elRow : null + elRow: null, + selected: false } entities.push(entityData); @@ -303,25 +304,37 @@ function loaded() { function removeEntities(deletedIDs) { // Loop from the back so we can pop items off while iterating for (let j = entities.length - 1; j >= 0; --j) { - let id = entities[j]; + let id = entities[j].id; for (let i = 0, length = deletedIDs.length; i < length; ++i) { if (id === deletedIDs[i]) { entities.splice(j, 1); - entitiesByID[id].el.remove(); delete entitiesByID[id]; break; } } } - refreshEntities(); + for (let j = visibleEntities.length - 1; j >= 0; --j) { + let id = visibleEntities[j].id; + for (let i = 0, length = deletedIDs.length; i < length; ++i) { + if (id === deletedIDs[i]) { + if (visibleEntities[j].elRow) { + visibleEntities[j].elRow.dataset.entityID = 0; + } + visibleEntities.splice(j, 1); + break; + } + } + } + entityList.setVisibleItemData(visibleEntities); + entityList.refresh(); } function clearEntities() { - var firstVisibleRow = entityList.getRowOffset(); - var lastVisibleRow = firstVisibleRow + entityList.getNumRows() - 1; - for (var i = firstVisibleRow; i <= lastVisibleRow && i < visibleEntities.length; i++) { - var entity = visibleEntities[i]; - entity.elRow.setAttribute("id", ""); + let firstVisibleRow = entityList.getRowOffset(); + let lastVisibleRow = firstVisibleRow + entityList.getNumRows() - 1; + for (let i = firstVisibleRow; i <= lastVisibleRow && i < visibleEntities.length; i++) { + let entity = visibleEntities[i]; + entity.elRow.dataset.entityID = 0; } entities = []; @@ -357,7 +370,7 @@ function loaded() { currentSortColumn = column; currentSortOrder = ASCENDING_SORT; } - elSortOrder[column].innerHTML = currentSortOrder == ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; + elSortOrder[column].innerHTML = currentSortOrder === ASCENDING_SORT ? ASCENDING_STRING : DESCENDING_STRING; refreshEntityList(); }); } @@ -394,16 +407,19 @@ function loaded() { for (let i = 0; i < selectedEntities.length; i++) { let id = selectedEntities[i]; - entitiesByID[id].selected = false; + let entity = entitiesByID[id]; + if (entity) { + entitiesByID[id].selected = false; + } } selectedEntities = []; for (let i = 0; i < selectedIDs.length; i++) { let id = selectedIDs[i]; - entitiesByID[id].selected = true; selectedEntities.push(id); if (id in entitiesByID) { let entity = entitiesByID[id]; + entity.selected = true; if (entity.elRow) { entity.elRow.className = 'selected'; } @@ -464,15 +480,15 @@ function loaded() { elRow.className = ''; } - var prevItemId = elRow.getAttribute("id"); + var prevItemId = elRow.dataset.entityID; var newItemId = itemData.id; - var validPrevItemId = prevItemId !== null && prevItemId.length > 0; - if (validPrevItemId && prevItemId !== newItemId && entitiesByID[prevItemId].elRow === elRow) { - elRow.setAttribute("id", ""); + var validPrevItemID = prevItemId !== undefined && prevItemId > 0; + if (validPrevItemID && prevItemId !== newItemId && entitiesByID[prevItemId].elRow === elRow) { + elRow.dataset.entityID = 0; entitiesByID[prevItemId].elRow = null; } - if (!validPrevItemId || prevItemId !== newItemId) { - elRow.setAttribute("id", newItemId); + if (!validPrevItemID || prevItemId !== newItemId) { + elRow.dataset.entityID = newItemId; entitiesByID[newItemId].elRow = elRow; } } @@ -483,14 +499,16 @@ function loaded() { cell.innerHTML = ""; } - var id = elRow.getAttribute("id"); - if (id && entitiesByID[id]) { - elRow.setAttribute("id", ""); - entitiesByID[id].elRow = null; + var entityID = elRow.dataset.entityID; + if (entityID && entitiesByID[entityID]) { + entitiesByID[entityID].elRow = null; } + + elRow.dataset.entityID = 0; } function resize() { + // Store current scroll position var prevScrollTop = elEntityTableScroll.scrollTop; // Take up available window space @@ -528,9 +546,11 @@ function loaded() { } } + // Reinitialize rows according to new table height and refresh row data entityList.resetRows(window.innerHeight - WINDOW_NONVARIABLE_HEIGHT); entityList.refresh(); + // Restore scrolling to previous scroll position before resetting rows elEntityTableScroll.scrollTop = prevScrollTop; }; diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index 03ebd511b1..3e2f02ed2d 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -158,7 +158,9 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda debugPrint("ListView.resetRows - no valid table body element"); return; } - + + that.resetRowOffset(); + elTopBuffer.setAttribute("height", 0); elBottomBuffer.setAttribute("height", 0); From 4d381b9d04ec5d93a58842ac5dbd0a8cb817487e Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 10:01:41 -0700 Subject: [PATCH 092/434] Smooth other avatars positions --- interface/src/avatar/AvatarManager.cpp | 20 ++++++++++ interface/src/avatar/AvatarManager.h | 18 +++++++++ .../src/avatars-renderer/Avatar.cpp | 38 +++++++++++++++++++ .../src/avatars-renderer/Avatar.h | 19 ++++++++++ 4 files changed, 95 insertions(+) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e9486b9def..26b3119c2f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -78,6 +78,12 @@ AvatarManager::AvatarManager(QObject* parent) : removeAvatar(nodeID, KillAvatarReason::AvatarIgnored); } }); + + const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; + const int AVATAR_TRANSIT_FRAME_COUNT = 20; + + _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; + _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -250,6 +256,20 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { if (inView && avatar->hasNewJointData()) { numAvatarsUpdated++; } + // smooth other avatars positions + { + float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); + if (oneFrameDistance > _avatarTransitMaxDistance) { + avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramePerMeter, _avatarTransitDistanceBased); + } + if (avatar->_transit.isTransiting()) { + glm::vec3 nextPosition; + if (avatar->_transit.getNextPosition(nextPosition)) { + avatar->setWorldPosition(nextPosition); + } + } + } + avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); avatar->updateSpaceProxy(workloadTransaction); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index bcdfc064bd..dd2c431cec 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -178,6 +178,15 @@ public: */ Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); + Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } + Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } + Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } + Q_INVOKABLE void setAvatarTransitFramePerMeter(int frameCount) { _avatarTransitFramePerMeter = frameCount; } + Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } + Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } + Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } + Q_INVOKABLE int getAvatarTransitFramePerMeter() { return _avatarTransitFramePerMeter; } + float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -205,6 +214,7 @@ private: void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarsToFade; + QVector _avatarsToCopy; using SetOfOtherAvatars = std::set; SetOfOtherAvatars _avatarsToChangeInPhysics; @@ -224,6 +234,14 @@ private: mutable std::mutex _spaceLock; workload::SpacePointer _space; std::vector _spaceProxiesToDelete; + + // Other avatars smooth transit global configuration + + bool _avatarTransitDistanceBased { false }; + float _avatarTransitMaxDistance; + int _avatarTransitFrameCount; + int _avatarTransitFramePerMeter; + }; #endif // hifi_AvatarManager_h diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 4ffccefe61..f0e89fcd7c 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,6 +113,43 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } +void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { + _startPosition = startPosition; + _endPosition = endPosition; + _step = 0; + if (!isDistanceBased) { + calculateSteps(totalFrames); + } else { + float distance = glm::length(_endPosition - _startPosition); + calculateSteps(framesPerMeter * distance); + } + + _isTransiting = true; +} + +void AvatarTransit::calculateSteps(int stepCount) { + glm::vec3 startPosition = _isTransiting ? _transitSteps[_step] : _startPosition; + _transitSteps.clear(); + glm::vec3 transitLine = _endPosition - _startPosition; + glm::vec3 direction = glm::normalize(transitLine); + glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; + for (auto i = 0; i < stepCount; i++) { + glm::vec3 localStep = _transitSteps.size() > 0 ? _transitSteps[i-1] + stepVector : _startPosition + stepVector; + _transitSteps.push_back(localStep); + } +} + +bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + int lastIdx = _transitSteps.size() - 1; + _isTransiting = _step < lastIdx; + if (_isTransiting) { + _step++; + nextPosition = _transitSteps[_step]; + _currentPosition = nextPosition; + } + return _isTransiting; +} + Avatar::Avatar(QThread* thread) : _voiceSphereID(GeometryCache::UNKNOWN_ID) { @@ -480,6 +517,7 @@ void Avatar::simulate(float deltaTime, bool inView) { _skeletonModel->simulate(deltaTime, false); } _skeletonModelSimulationRate.increment(); + _lastPosition = _globalPosition; } // update animation for display name fade in/out diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 37c3d08c6c..2d940b8fd9 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -50,6 +50,22 @@ enum ScreenTintLayer { class Texture; +class AvatarTransit { +public: + AvatarTransit() {}; + void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); + bool getNextPosition(glm::vec3& nextPosition); + bool isTransiting() { return _isTransiting; }; +private: + void calculateSteps(int stepCount); + bool _isTransiting{ false }; + glm::vec3 _startPosition; + glm::vec3 _endPosition; + glm::vec3 _currentPosition; + std::vector _transitSteps; + int _step{ 0 }; +}; + class Avatar : public AvatarData, public scriptable::ModelProvider { Q_OBJECT @@ -518,6 +534,9 @@ protected: bool _isFading { false }; bool _reconstructSoftEntitiesJointMap { false }; float _modelScale { 1.0f }; + glm::vec3 _lastPosition; + AvatarTransit _transit; + static int _jointConesID; From b9fbcce40314aa882dac6096f0d23117b76d8bfb Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 10:15:00 -0700 Subject: [PATCH 093/434] init frames per meter --- interface/src/avatar/AvatarManager.cpp | 4 +++- interface/src/avatar/AvatarManager.h | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 26b3119c2f..334cdc9608 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -81,9 +81,11 @@ AvatarManager::AvatarManager(QObject* parent) : const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 20; + const int AVATAR_TRANSIT_FRAMES_PER_METER = 5; _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; + _avatarTransitFramesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -260,7 +262,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { { float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); if (oneFrameDistance > _avatarTransitMaxDistance) { - avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramePerMeter, _avatarTransitDistanceBased); + avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased); } if (avatar->_transit.isTransiting()) { glm::vec3 nextPosition; diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index dd2c431cec..867c49063f 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -181,11 +181,11 @@ public: Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } - Q_INVOKABLE void setAvatarTransitFramePerMeter(int frameCount) { _avatarTransitFramePerMeter = frameCount; } + Q_INVOKABLE void setAvatarTransitFramesPerMeter(int frameCount) { _avatarTransitFramesPerMeter = frameCount; } Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } - Q_INVOKABLE int getAvatarTransitFramePerMeter() { return _avatarTransitFramePerMeter; } + Q_INVOKABLE int getAvatarTransitFramesPerMeter() { return _avatarTransitFramesPerMeter; } float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -240,7 +240,7 @@ private: bool _avatarTransitDistanceBased { false }; float _avatarTransitMaxDistance; int _avatarTransitFrameCount; - int _avatarTransitFramePerMeter; + int _avatarTransitFramesPerMeter; }; From 889e033048819ce2cf4d7f49fcdb4a512c9377fd Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 11:20:23 -0700 Subject: [PATCH 094/434] fix warnings --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index f0e89fcd7c..3dae9171a8 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -130,7 +130,7 @@ void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPo void AvatarTransit::calculateSteps(int stepCount) { glm::vec3 startPosition = _isTransiting ? _transitSteps[_step] : _startPosition; _transitSteps.clear(); - glm::vec3 transitLine = _endPosition - _startPosition; + glm::vec3 transitLine = _endPosition - startPosition; glm::vec3 direction = glm::normalize(transitLine); glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; for (auto i = 0; i < stepCount; i++) { @@ -140,7 +140,7 @@ void AvatarTransit::calculateSteps(int stepCount) { } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { - int lastIdx = _transitSteps.size() - 1; + int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { _step++; From 54dd868b3c8ed42cc183bf4ebfc4fdc609b766d4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 13 Sep 2018 11:54:59 +1200 Subject: [PATCH 095/434] Rotate mini tablet to keep it "vertical" --- scripts/system/miniTablet.js | 54 +++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 2482efec8d..8c2c8f8dc8 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -317,6 +317,7 @@ dimensions: Vec3.multiply(scaleFactor, MINI_UI_DIMENSIONS), dpi: MINI_UI_DPI / scaleFactor }); + updateRotation(); } function startExpandingTablet(hand) { @@ -380,6 +381,51 @@ }); } + function updateRotation() { + // Update the rotation of the tablet about its face normal so that its base is horizontal. + var COS_5_DEGREES = 0.996, + RADIANS_TO_DEGREES = DEGREES_180 / Math.PI, + defaultLocalRotation, + handOrientation, + defaultOrientation, + faceNormal, + desiredOrientation, + defaultYAxis, + desiredYAxis, + cross, + dot, + deltaAngle, + deltaRotation, + localRotation; + + defaultLocalRotation = MINI_ROTATIONS[uiHand]; + handOrientation = + Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(handJointIndex(uiHand))); + defaultOrientation = Quat.multiply(handOrientation, defaultLocalRotation); + faceNormal = Vec3.multiplyQbyV(defaultOrientation, Vec3.UNIT_Z); + + if (Math.abs(Vec3.dot(faceNormal, Vec3.UNIT_Y)) > COS_5_DEGREES) { + // Don't rotate mini tablet if almost flat in the x-z plane. + return; + } else { + // Rotate the tablet so that its base is parallel with the x-z plane. + desiredOrientation = Quat.lookAt(Vec3.ZERO, Vec3.multiplyQbyV(defaultOrientation, Vec3.UNIT_Z), Vec3.UNIT_Y); + defaultYAxis = Vec3.multiplyQbyV(defaultOrientation, Vec3.UNIT_Y); + desiredYAxis = Vec3.multiplyQbyV(desiredOrientation, Vec3.UNIT_Y); + cross = Vec3.cross(defaultYAxis, desiredYAxis); + dot = Vec3.dot(defaultYAxis, desiredYAxis); + deltaAngle = Math.atan2(Vec3.length(cross), dot) * RADIANS_TO_DEGREES; + if (Vec3.dot(cross, Vec3.multiplyQbyV(desiredOrientation, Vec3.UNIT_Z)) > 0) { + deltaAngle = -deltaAngle; + } + deltaRotation = Quat.angleAxis(deltaAngle, Vec3.multiplyQbyV(defaultLocalRotation, Vec3.UNIT_Z)); + localRotation = Quat.multiply(deltaRotation, defaultLocalRotation); + } + Overlays.editOverlay(miniOverlay, { + localRotation: localRotation + }); + } + function hide() { Overlays.editOverlay(miniOverlay, { parentID: Uuid.NULL, // Release hold so that hand can grab tablet proper. @@ -446,6 +492,7 @@ size: size, startExpandingTablet: startExpandingTablet, sizeAboutHandles: sizeAboutHandles, + updateRotation: updateRotation, hide: hide, destroy: destroy }; @@ -478,7 +525,7 @@ miniState = MINI_DISABLED, miniHand, updateTimer = null, - UPDATE_INTERVAL = 300, + UPDATE_INTERVAL = 25, // Mini tablet scaling. MINI_SCALE_DURATION = 250, @@ -702,6 +749,11 @@ } else { setState(MINI_HIDING); } + + // If state hasn't changed, update mini tablet rotation. + if (miniState === MINI_VISIBLE) { + ui.updateRotation(); + } } function updateMiniGrabbed() { From 0437c50c0676c09bfcf1857f98379faa88deb448 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 13 Sep 2018 12:20:00 +1200 Subject: [PATCH 096/434] Fix mini tablet not reliably being grabbed --- scripts/system/miniTablet.js | 39 +++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 8c2c8f8dc8..3873782a19 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -543,6 +543,11 @@ isGoto = false, TABLET_ADDRESS_DIALOG = "hifi/tablet/TabletAddressDialog.qml", + // Trigger values. + leftTriggerOn = 0, + rightTriggerOn = 0, + MAX_TRIGGER_ON_TIME = 100, + // Visibility. MIN_HAND_CAMERA_ANGLE = 30, DEGREES_180 = 180, @@ -579,6 +584,10 @@ // Should show mini tablet if it would be oriented toward the camera. var show, pose, + isLeftTriggerOff, + isRightTriggerOff, + wasLeftTriggerOff = true, + wasRightTriggerOff = true, jointIndex, handPosition, handOrientation, @@ -593,12 +602,32 @@ show = pose.valid; // Shouldn't show mini tablet on hand if that hand's trigger is pressed (i.e., laser is searching or grabbing - // something) or the other hand's trigger is pressed unless it is pointing at the mini tablet. + // something) or the other hand's trigger is pressed unless it is pointing at the mini tablet. Allow the triggers + // to be pressed briefly to allow for the grabbing process. if (show) { - show = Controller.getValue(hand === LEFT_HAND ? Controller.Standard.LT : Controller.Standard.RT) < - TRIGGER_OFF_VALUE - && (Controller.getValue(hand === LEFT_HAND ? Controller.Standard.RT : Controller.Standard.LT) < - TRIGGER_OFF_VALUE || ui.isLaserPointingAt()); + isLeftTriggerOff = Controller.getValue(Controller.Standard.LT) < TRIGGER_OFF_VALUE; + if (!isLeftTriggerOff) { + if (leftTriggerOn === 0) { + leftTriggerOn = Date.now(); + } else { + wasLeftTriggerOff = Date.now() - leftTriggerOn < MAX_TRIGGER_ON_TIME; + } + } else { + leftTriggerOn = 0; + } + isRightTriggerOff = Controller.getValue(Controller.Standard.RT) < TRIGGER_OFF_VALUE; + if (!isRightTriggerOff) { + if (rightTriggerOn === 0) { + rightTriggerOn = Date.now(); + } else { + wasRightTriggerOff = Date.now() - rightTriggerOn < MAX_TRIGGER_ON_TIME; + } + } else { + rightTriggerOn = 0; + } + + show = (hand === LEFT_HAND ? wasLeftTriggerOff : wasRightTriggerOff) + && ((hand === LEFT_HAND ? wasRightTriggerOff : wasLeftTriggerOff) || ui.isLaserPointingAt()); } // Should show mini tablet if it would be oriented toward the camera. From 4978f80f43758e861944c37797cd4d8b99e9f530 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 13 Sep 2018 12:27:30 +1200 Subject: [PATCH 097/434] Don't turn on laser when mini tablet is expanding --- scripts/system/miniTablet.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 3873782a19..a35e5fc1af 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -342,11 +342,6 @@ miniInitialWidth = MINI_DIMENSIONS.x; miniTargetWidth = getTabletWidthFromSettings(); miniTargetLocalRotation = Quat.multiply(miniExpandLocalRotation, miniExpandDeltaRotation); - - // Don't let other hand grab while expanding. - Overlays.editOverlay(miniOverlay, { - grabbable: false - }); } function sizeAboutHandles(scaleFactor) { From 56ddafed26b2a3d6085681adf696358939e4abd1 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 13 Sep 2018 14:56:12 -0700 Subject: [PATCH 098/434] fix deleting scroll-away items, fix searching case sensitivity, comments --- scripts/system/html/js/entityList.js | 29 ++++++++------ scripts/system/html/js/listView.js | 59 ++++++++++++++++++++++------ 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index fae3ed33b4..3215bff129 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -79,7 +79,6 @@ function loaded() { elEntityTable = document.getElementById("entity-table"); elEntityTableBody = document.getElementById("entity-table-body"); elEntityTableScroll = document.getElementById("entity-table-scroll"); - elEntityTableHeader = document.getElementById("entity-table-header"); elEntityTableFooter = document.getElementById("entity-table-footer"); elRefresh = document.getElementById("refresh"); elToggleLocked = document.getElementById("locked"); @@ -167,7 +166,7 @@ function loaded() { function onRowClicked(clickEvent) { let entityID = this.dataset.entityID; let selection = [entityID]; - + if (clickEvent.ctrlKey) { let selectedIndex = selectedEntities.indexOf(entityID); if (selectedIndex >= 0) { @@ -280,9 +279,9 @@ function loaded() { visibleEntities = entities.slice(0); } else { visibleEntities = entities.filter(function(e) { - return e.name.indexOf(searchTerm) > -1 - || e.type.indexOf(searchTerm) > -1 - || e.fullUrl.indexOf(searchTerm) > -1; + return e.name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1 + || e.type.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1 + || e.fullUrl.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1; }); } }); @@ -308,23 +307,29 @@ function loaded() { for (let i = 0, length = deletedIDs.length; i < length; ++i) { if (id === deletedIDs[i]) { entities.splice(j, 1); + if (entitiesByID[id].elRow) { + entitiesByID[id].elRow.dataset.entityID = 0; + } delete entitiesByID[id]; break; } } } + + var rowOffset = entityList.getRowOffset(); for (let j = visibleEntities.length - 1; j >= 0; --j) { let id = visibleEntities[j].id; for (let i = 0, length = deletedIDs.length; i < length; ++i) { if (id === deletedIDs[i]) { - if (visibleEntities[j].elRow) { - visibleEntities[j].elRow.dataset.entityID = 0; + if (j < rowOffset) { + rowOffset = entityList.decrementRowOffset(); } visibleEntities.splice(j, 1); break; } } - } + } + entityList.setVisibleItemData(visibleEntities); entityList.refresh(); } @@ -342,6 +347,7 @@ function loaded() { visibleEntities = []; entityList.setVisibleItemData([]); + entityList.resetRowOffset(); entityList.refresh(); refreshFooter(); @@ -375,11 +381,8 @@ function loaded() { }); } - function refreshEntities(resetRowOffset) { + function refreshEntities() { clearEntities(); - if (resetRowOffset) { - entityList.resetRowOffset(); - } EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' })); } @@ -575,7 +578,7 @@ function loaded() { function onRadiusChange() { elRadius.value = Math.max(elRadius.value, 0); EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elRadius.value })); - refreshEntities(true); + refreshEntities(); elNoEntitiesRadius.firstChild.nodeValue = elRadius.value; } diff --git a/scripts/system/html/js/listView.js b/scripts/system/html/js/listView.js index 3e2f02ed2d..99b2e27bf7 100644 --- a/scripts/system/html/js/listView.js +++ b/scripts/system/html/js/listView.js @@ -30,6 +30,14 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var rowHeight = 0; var lastRowChangeScrollTop = 0; + that.getNumRows = function() { + return elRows.length; + }; + + that.getScrollHeight = function() { + return rowHeight * SCROLL_ROWS; + }; + that.getRowOffset = function() { return rowOffset; }; @@ -39,8 +47,17 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda lastRowChangeScrollTop = 0; }; - that.getNumRows = function() { - return elRows.length; + that.decrementRowOffset = function() { + // increase top buffer height to account for the lost row space + var topHeight = parseInt(elTopBuffer.getAttribute("height")); + var newTopHeight = topHeight + rowHeight; + elTopBuffer.setAttribute("height", newTopHeight); + + rowOffset--; + that.refresh(); + lastRowChangeScrollTop = topHeight; + + return rowOffset; }; that.setVisibleItemData = function(itemData) { @@ -59,6 +76,8 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); + // for each row to scroll down, move the top row element to the bottom of the + // table before the bottom buffer and reset it's row data to the new item for (var i = 0; i < numScrollRows; i++) { var rowMovedTopToBottom = elTableBody.childNodes[FIRST_ROW_INDEX]; var rowIndex = that.getNumRows() + rowOffset; @@ -68,17 +87,22 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda rowOffset++; } - var newTopHeight = prevTopHeight + (rowHeight * numScrollRows); - var newBottomHeight = prevBottomHeight - (rowHeight * numScrollRows); + // add the row space that was scrolled away to the top buffer height and last scroll point + // remove the row space that was scrolled away from the bottom buffer height + var scrolledSpace = rowHeight * numScrollRows; + var newTopHeight = prevTopHeight + scrolledSpace; + var newBottomHeight = prevBottomHeight - scrolledSpace; elTopBuffer.setAttribute("height", newTopHeight); elBottomBuffer.setAttribute("height", newBottomHeight); - lastRowChangeScrollTop += rowHeight * numScrollRows; + lastRowChangeScrollTop += scrolledSpace; }; that.scrollUp = function(numScrollRows) { var prevTopHeight = parseInt(elTopBuffer.getAttribute("height")); var prevBottomHeight = parseInt(elBottomBuffer.getAttribute("height")); + // for each row to scroll up, move the bottom row element to the top of + // the table before the top row and reset it's row data to the new item for (var i = 0; i < numScrollRows; i++) { var topRow = elTableBody.childNodes[FIRST_ROW_INDEX]; var rowMovedBottomToTop = elTableBody.childNodes[FIRST_ROW_INDEX + that.getNumRows() - 1]; @@ -89,20 +113,28 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda rowOffset--; } - var newTopHeight = prevTopHeight - (rowHeight * numScrollRows); - var newBottomHeight = prevBottomHeight + (rowHeight * numScrollRows); + // remove the row space that was scrolled away from the top buffer height and last scroll point + // add the row space that was scrolled away to the bottom buffer height + var scrolledSpace = rowHeight * numScrollRows; + var newTopHeight = prevTopHeight - scrolledSpace; + var newBottomHeight = prevBottomHeight + scrolledSpace; elTopBuffer.setAttribute("height", newTopHeight); elBottomBuffer.setAttribute("height", newBottomHeight); - lastRowChangeScrollTop -= rowHeight * numScrollRows; + lastRowChangeScrollTop -= scrolledSpace; }; that.onScroll = function() { var scrollTop = elTableScroll.scrollTop; - var nextRowChangeScrollTop = lastRowChangeScrollTop + (rowHeight * SCROLL_ROWS); - var scrollHeight = rowHeight * SCROLL_ROWS; + var scrollHeight = that.getScrollHeight(); + var nextRowChangeScrollTop = lastRowChangeScrollTop + scrollHeight; var totalItems = visibleItemData.length; var numRows = that.getNumRows(); + // if the top of the scroll area has past the amount of scroll row space since the last point of scrolling and there + // are still more rows to scroll to then trigger a scroll down by the min of the scroll row space or number of + // remaining rows below + // if the top of the scroll area has gone back above the last point of scrolling then trigger a scroll up by min of + // the scroll row space or number of rows above if (scrollTop >= nextRowChangeScrollTop && numRows + rowOffset < totalItems) { var numScrolls = Math.ceil((scrollTop - nextRowChangeScrollTop) / scrollHeight); var numScrollRows = numScrolls * SCROLL_ROWS; @@ -127,8 +159,10 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda return; } + // start with all row data cleared and initially set to invisible that.clear(); + // update all row data and set rows visible until max visible items reached for (var i = 0; i < numRows; i++) { var rowIndex = i + rowOffset; if (rowIndex >= visibleItemData.length) { @@ -141,10 +175,12 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda elRow.style.display = ""; } + // top buffer height is the number of hidden rows above the top row var topHiddenRows = rowOffset; var topBufferHeight = rowHeight * topHiddenRows; elTopBuffer.setAttribute("height", topBufferHeight); + // bottom buffer height is the number of hidden rows below the bottom row (last scroll buffer row) var bottomHiddenRows = visibleItemData.length - numRows - rowOffset; var bottomBufferHeight = rowHeight * bottomHiddenRows; if (bottomHiddenRows < 0) { @@ -171,6 +207,7 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda } elRows = []; + // create new row elements inserted between the top and bottom buffers that can fit into viewable scroll area var usedHeight = 0; while(usedHeight < viewableHeight) { var newRow = createRowFunction(); @@ -180,7 +217,7 @@ ListView = function(tableId, tableBodyId, tableScrollId, createRowFunction, upda elRows.push(newRow); } - // extra rows for scrolling purposes + // add extras rows for scrolling buffer purposes for (var i = 0; i < SCROLL_ROWS; i++) { var scrollRow = createRowFunction(); elTableBody.insertBefore(scrollRow, elBottomBuffer); From 34afe7a69a95292fba7050eec6bf0a601a3d05f9 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 13 Sep 2018 15:01:49 -0700 Subject: [PATCH 099/434] remove fixing search cases (for separate PR) --- scripts/system/html/js/entityList.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index 3215bff129..2eccbc2f6b 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -279,9 +279,9 @@ function loaded() { visibleEntities = entities.slice(0); } else { visibleEntities = entities.filter(function(e) { - return e.name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1 - || e.type.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1 - || e.fullUrl.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1; + return e.name.indexOf(searchTerm) > -1 + || e.type.indexOf(searchTerm) > -1 + || e.fullUrl.indexOf(searchTerm) > -1; }); } }); From c27bb0459683b5221c16361631b620359c0dcfbf Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 11:10:26 +1200 Subject: [PATCH 100/434] Display mini tablet when it or palm is facing the camera --- scripts/system/miniTablet.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index a35e5fc1af..735cae4d3b 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -638,6 +638,7 @@ miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation); miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition)); show = Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; + show = show || (-Vec3.dot(miniToCameraDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS); cameraToHand = -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)); } From fe8c237d646875c894b3a42422f634dea1c13d81 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 11:22:31 +1200 Subject: [PATCH 101/434] Don't display mini tablet in peripheral vision --- scripts/system/miniTablet.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 735cae4d3b..f8315ae3c2 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -545,8 +545,10 @@ // Visibility. MIN_HAND_CAMERA_ANGLE = 30, + MAX_CAMERA_HAND_ANGLE = 30, DEGREES_180 = 180, - MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180); + MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), + MAX_CAMERA_HAND_ANGLE_COS = Math.cos(Math.PI * MAX_CAMERA_HAND_ANGLE / DEGREES_180); function enterMiniDisabled() { @@ -640,6 +642,7 @@ show = Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS; show = show || (-Vec3.dot(miniToCameraDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS); cameraToHand = -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)); + show = show && (cameraToHand > MAX_CAMERA_HAND_ANGLE_COS); } return { From f01ebe57ea5a96776d0ed9ee7878db1cda1f6e99 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 18:55:29 +1200 Subject: [PATCH 102/434] Trial hiding the UI when it's expanding to become the tablet proper --- scripts/system/miniTablet.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index f8315ae3c2..d29b4b0318 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -369,10 +369,14 @@ localRotation: localRotation, dimensions: dimensions }); + // FIXME: Temporary code change to try not displaying UI when mini tablet is expanding to become the tablet proper. Overlays.editOverlay(miniUIOverlay, { + /* localPosition: Vec3.multiply(tabletScaleFactor, MINI_UI_LOCAL_POSITION), dimensions: Vec3.multiply(tabletScaleFactor, MINI_UI_DIMENSIONS), dpi: MINI_UI_DPI / tabletScaleFactor + */ + visible: false }); } From ba564576632e66ae32327b131cf6fcfb4c76377d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 20:14:54 +1200 Subject: [PATCH 103/434] Smooth the transition between expanded mini tablet and tablet proper --- scripts/system/miniTablet.js | 38 +++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index d29b4b0318..0df8b9505c 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -425,9 +425,15 @@ }); } - function hide() { + function release() { Overlays.editOverlay(miniOverlay, { parentID: Uuid.NULL, // Release hold so that hand can grab tablet proper. + grabbable: false + }); + } + + function hide() { + Overlays.editOverlay(miniOverlay, { visible: false }); Overlays.editOverlay(miniUIOverlay, { @@ -492,6 +498,7 @@ startExpandingTablet: startExpandingTablet, sizeAboutHandles: sizeAboutHandles, updateRotation: updateRotation, + release: release, hide: hide, destroy: destroy }; @@ -537,6 +544,7 @@ MINI_EXPAND_TIMEOUT = 20, miniExpandTimer = null, miniExpandStart, + miniExpandedStartTime, // Tablet targets. isGoto = false, @@ -656,6 +664,7 @@ } function enterMiniHidden() { + ui.release(); ui.hide(); } @@ -828,9 +837,7 @@ } function enterTabletOpen() { - var miniTabletProperties = ui.getMiniTabletProperties(); - - ui.hide(); + var miniTabletProperties; if (isGoto) { tablet.loadQMLSource(TABLET_ADDRESS_DIALOG); @@ -838,17 +845,26 @@ tablet.gotoHomeScreen(); } + ui.release(); + miniTabletProperties = ui.getMiniTabletProperties(); + Overlays.editOverlay(HMD.tabletID, { position: miniTabletProperties.position, orientation: miniTabletProperties.orientation }); HMD.openTablet(true); + + miniExpandedStartTime = Date.now(); } function updateTabletOpen() { - // Immediately transition back to MINI_HIDDEN. - setState(MINI_HIDDEN); + // Give the tablet proper time to rez before hiding expanded mini tablet. + // The mini tablet is also hidden elsewhere if the tablet proper is grabbed. + var TABLET_OPENING_DELAY = 500; + if (Date.now() >= miniExpandedStartTime + TABLET_OPENING_DELAY) { + setState(MINI_HIDDEN); + } } STATE_MACHINE = { @@ -973,12 +989,15 @@ return; } - if (message.grabbedEntity !== ui.getMiniTabletID()) { + if (message.grabbedEntity !== HMD.tabletID && message.grabbedEntity !== ui.getMiniTabletID()) { return; } - miniHand = miniState.getHand(); - if (message.action === "grab" && miniState.getState() === miniState.MINI_VISIBLE) { + if (message.action === "grab" && message.grabbedEntity === HMD.tabletID) { + // Tablet may have been grabbed after it replaced expanded mini tablet. + miniState.setState(miniState.MINI_HIDDEN); + } else if (message.action === "grab" && miniState.getState() === miniState.MINI_VISIBLE) { + miniHand = miniState.getHand(); hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); if (hand === miniHand) { miniState.setState(miniState.MINI_EXPANDING, { hand: hand, goto: false }); @@ -986,6 +1005,7 @@ miniState.setState(miniState.MINI_GRABBED); } } else if (message.action === "release" && miniState.getState() === miniState.MINI_GRABBED) { + miniHand = miniState.getHand(); hand = message.joint === HAND_NAMES[miniHand] ? miniHand : otherHand(miniHand); miniState.setState(miniState.MINI_EXPANDING, { hand: hand, goto: false }); } From 80aa74600f19cc639b1b2af3e5b5ecc4bf7d70e7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 20:15:08 +1200 Subject: [PATCH 104/434] Fix mini tablet sometimes remaining parented when it shouldn't be --- scripts/system/miniTablet.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 0df8b9505c..c894f92ed3 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -804,6 +804,11 @@ } } + function exitMiniGrabbed() { + // Explicitly unparent mini tablet in case controller grabbing code has reparented it. + ui.release(); + } + function expandMini() { var scaleFactor = (Date.now() - miniExpandStart) / MINI_EXPAND_DURATION; if (scaleFactor < 1) { @@ -896,7 +901,7 @@ MINI_GRABBED: { // Mini tablet is grabbed by other hand. enter: null, update: updateMiniGrabbed, - exit: null + exit: exitMiniGrabbed }, MINI_EXPANDING: { // Mini tablet is expanding before showing tablet proper. enter: enterMiniExpanding, From 45281960aff9194447a7fc6cf51243f1cb82e0ff Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 14 Sep 2018 20:30:17 +1200 Subject: [PATCH 105/434] Don't display mini tablet if user is away --- scripts/system/miniTablet.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index c894f92ed3..6a12edefaf 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -672,8 +672,8 @@ var showLeft, showRight; - // Don't show mini tablet if tablet proper is already displayed or in toolbar mode. - if (HMD.showTablet || tablet.toolbarMode) { + // Don't show mini tablet if tablet proper is already displayed, in toolbar mode, or away. + if (HMD.showTablet || tablet.toolbarMode || MyAvatar.isAway) { return; } @@ -1016,6 +1016,11 @@ } } + function onWentAway() { + // Mini tablet only available when user is not away. + miniState.setState(miniState.MINI_HIDDEN); + } + function onDisplayModeChanged() { // Mini tablet only available when HMD is active. if (HMD.active) { @@ -1035,6 +1040,7 @@ Messages.subscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); Messages.messageReceived.connect(onMessageReceived); + MyAvatar.wentAway.connect(onWentAway); HMD.displayModeChanged.connect(onDisplayModeChanged); if (HMD.active) { miniState.setState(miniState.MINI_HIDDEN); @@ -1045,6 +1051,7 @@ miniState.setState(miniState.MINI_DISABLED); HMD.displayModeChanged.disconnect(onDisplayModeChanged); + MyAvatar.wentAway.disconnect(onWentAway); Messages.messageReceived.disconnect(onMessageReceived); Messages.unsubscribe(HIFI_OBJECT_MANIPULATION_CHANNEL); From cb496356272b2077821516ef780b68cb92e21d73 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 14 Sep 2018 13:34:04 -0300 Subject: [PATCH 106/434] Fix switch from Top View to My View --- scripts/system/+android/clickWeb.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/system/+android/clickWeb.js b/scripts/system/+android/clickWeb.js index dc75a58327..229b2b8b82 100644 --- a/scripts/system/+android/clickWeb.js +++ b/scripts/system/+android/clickWeb.js @@ -103,4 +103,6 @@ module.exports = { ending: ending } +init(); + }()); // END LOCAL_SCOPE From 237022d3042438ec462452039a187bf72fcbeb51 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 12 Sep 2018 10:56:19 -0700 Subject: [PATCH 107/434] Refactor new pick parenting system for use with RayPick, ParabolaPick --- interface/src/Application.cpp | 12 +- interface/src/raypick/CollisionPick.cpp | 2 +- interface/src/raypick/CollisionPick.h | 1 - interface/src/raypick/JointParabolaPick.cpp | 43 ----- interface/src/raypick/JointParabolaPick.h | 32 ---- interface/src/raypick/JointRayPick.cpp | 45 ----- interface/src/raypick/JointRayPick.h | 33 ---- interface/src/raypick/MouseParabolaPick.cpp | 28 --- interface/src/raypick/MouseParabolaPick.h | 24 --- interface/src/raypick/MouseRayPick.cpp | 29 --- interface/src/raypick/MouseRayPick.h | 26 --- interface/src/raypick/ParabolaPick.cpp | 49 +++-- interface/src/raypick/ParabolaPick.h | 14 +- .../src/raypick/PickScriptingInterface.cpp | 177 ++++++++++-------- .../src/raypick/PickScriptingInterface.h | 1 + interface/src/raypick/RayPick.cpp | 11 ++ interface/src/raypick/RayPick.h | 7 +- .../src/raypick/RayPickScriptingInterface.cpp | 4 - interface/src/raypick/StaticParabolaPick.cpp | 19 -- interface/src/raypick/StaticParabolaPick.h | 26 --- interface/src/raypick/StaticRayPick.cpp | 18 -- interface/src/raypick/StaticRayPick.h | 25 --- interface/src/raypick/StylusPick.h | 1 + libraries/pointers/src/Pick.h | 20 +- libraries/shared/src/RegisteredMetaTypes.h | 2 + 25 files changed, 185 insertions(+), 464 deletions(-) delete mode 100644 interface/src/raypick/JointParabolaPick.cpp delete mode 100644 interface/src/raypick/JointParabolaPick.h delete mode 100644 interface/src/raypick/JointRayPick.cpp delete mode 100644 interface/src/raypick/JointRayPick.h delete mode 100644 interface/src/raypick/MouseParabolaPick.cpp delete mode 100644 interface/src/raypick/MouseParabolaPick.h delete mode 100644 interface/src/raypick/MouseRayPick.cpp delete mode 100644 interface/src/raypick/MouseRayPick.h delete mode 100644 interface/src/raypick/StaticParabolaPick.cpp delete mode 100644 interface/src/raypick/StaticParabolaPick.h delete mode 100644 interface/src/raypick/StaticRayPick.cpp delete mode 100644 interface/src/raypick/StaticRayPick.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e290531471..7f43c3d773 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -214,7 +214,8 @@ #include #include #include -#include +#include +#include #include @@ -2235,8 +2236,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo }); // Setup the mouse ray pick and related operators - DependencyManager::get()->setMouseRayPickID(DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared( - PickFilter(PickScriptingInterface::PICK_ENTITIES() | PickScriptingInterface::PICK_INCLUDE_NONCOLLIDABLE()), 0.0f, true))); + { + auto mouseRayPick = std::make_shared(glm::vec3(), Vectors::UP, + PickFilter(PickScriptingInterface::PICK_ENTITIES() | PickScriptingInterface::PICK_INCLUDE_NONCOLLIDABLE()), 0.0f, true); + mouseRayPick->parentTransform = std::make_shared(); + auto mouseRayPickID = DependencyManager::get()->addPick(PickQuery::Ray, mouseRayPick); + DependencyManager::get()->setMouseRayPickID(mouseRayPickID); + } DependencyManager::get()->setMouseRayPickResultOperator([](unsigned int rayPickID) { RayToEntityIntersectionResult entityResult; entityResult.intersects = false; diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 9aee76a3da..f79879bf93 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -347,8 +347,8 @@ void CollisionPick::computeShapeInfo(const CollisionRegion& pick, ShapeInfo& sha CollisionPick::CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine) : Pick(filter, maxDistance, enabled), - _mathPick(collisionRegion), _physicsEngine(physicsEngine) { + _mathPick = collisionRegion; if (collisionRegion.shouldComputeShapeInfo()) { _cachedResource = DependencyManager::get()->getCollisionGeometryResource(collisionRegion.modelURL); } diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index 0662ab6c19..79238b37fc 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -67,7 +67,6 @@ protected: void computeShapeInfoDimensionsOnly(const CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); void filterIntersections(std::vector& intersections) const; - CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; QSharedPointer _cachedResource; diff --git a/interface/src/raypick/JointParabolaPick.cpp b/interface/src/raypick/JointParabolaPick.cpp deleted file mode 100644 index 11a2e90819..0000000000 --- a/interface/src/raypick/JointParabolaPick.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#include "JointParabolaPick.h" - -#include "avatar/AvatarManager.h" - -JointParabolaPick::JointParabolaPick(const std::string& jointName, const glm::vec3& posOffset, const glm::vec3& dirOffset, - float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, bool scaleWithAvatar, PickFilter& filter, float maxDistance, bool enabled) : - ParabolaPick(speed, accelerationAxis, rotateAccelerationWithAvatar, scaleWithAvatar, filter, maxDistance, enabled), - _jointName(jointName), - _posOffset(posOffset), - _dirOffset(dirOffset) -{ -} - -PickParabola JointParabolaPick::getMathematicalPick() const { - auto myAvatar = DependencyManager::get()->getMyAvatar(); - int jointIndex = myAvatar->getJointIndex(QString::fromStdString(_jointName)); - bool useAvatarHead = _jointName == "Avatar"; - const int INVALID_JOINT = -1; - if (jointIndex != INVALID_JOINT || useAvatarHead) { - glm::vec3 jointPos = useAvatarHead ? myAvatar->getHeadPosition() : myAvatar->getAbsoluteJointTranslationInObjectFrame(jointIndex); - glm::quat jointRot = useAvatarHead ? myAvatar->getHeadOrientation() : myAvatar->getAbsoluteJointRotationInObjectFrame(jointIndex); - glm::vec3 avatarPos = myAvatar->getWorldPosition(); - glm::quat avatarRot = myAvatar->getWorldOrientation(); - - glm::vec3 pos = useAvatarHead ? jointPos : avatarPos + (avatarRot * jointPos); - glm::quat rot = useAvatarHead ? jointRot * glm::angleAxis(-PI / 2.0f, Vectors::RIGHT) : avatarRot * jointRot; - - // Apply offset - pos = pos + (rot * (myAvatar->getSensorToWorldScale() * _posOffset)); - glm::vec3 dir = glm::normalize(rot * glm::normalize(_dirOffset)); - - return PickParabola(pos, getSpeed() * dir, getAcceleration()); - } - - return PickParabola(); -} diff --git a/interface/src/raypick/JointParabolaPick.h b/interface/src/raypick/JointParabolaPick.h deleted file mode 100644 index aff6bd34d8..0000000000 --- a/interface/src/raypick/JointParabolaPick.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#ifndef hifi_JointParabolaPick_h -#define hifi_JointParabolaPick_h - -#include "ParabolaPick.h" - -class JointParabolaPick : public ParabolaPick { - -public: - JointParabolaPick(const std::string& jointName, const glm::vec3& posOffset, const glm::vec3& dirOffset, - float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, bool scaleWithAvatar, - PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickParabola getMathematicalPick() const override; - - bool isLeftHand() const override { return (_jointName == "_CONTROLLER_LEFTHAND") || (_jointName == "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"); } - bool isRightHand() const override { return (_jointName == "_CONTROLLER_RIGHTHAND") || (_jointName == "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"); } - -private: - std::string _jointName; - glm::vec3 _posOffset; - glm::vec3 _dirOffset; - -}; - -#endif // hifi_JointParabolaPick_h diff --git a/interface/src/raypick/JointRayPick.cpp b/interface/src/raypick/JointRayPick.cpp deleted file mode 100644 index 340014e7d2..0000000000 --- a/interface/src/raypick/JointRayPick.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// JointRayPick.cpp -// interface/src/raypick -// -// Created by Sam Gondelman 7/11/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 -// -#include "JointRayPick.h" - -#include "avatar/AvatarManager.h" - -JointRayPick::JointRayPick(const std::string& jointName, const glm::vec3& posOffset, const glm::vec3& dirOffset, const PickFilter& filter, float maxDistance, bool enabled) : - RayPick(filter, maxDistance, enabled), - _jointName(jointName), - _posOffset(posOffset), - _dirOffset(dirOffset) -{ -} - -PickRay JointRayPick::getMathematicalPick() const { - auto myAvatar = DependencyManager::get()->getMyAvatar(); - int jointIndex = myAvatar->getJointIndex(QString::fromStdString(_jointName)); - bool useAvatarHead = _jointName == "Avatar"; - const int INVALID_JOINT = -1; - if (jointIndex != INVALID_JOINT || useAvatarHead) { - glm::vec3 jointPos = useAvatarHead ? myAvatar->getHeadPosition() : myAvatar->getAbsoluteJointTranslationInObjectFrame(jointIndex); - glm::quat jointRot = useAvatarHead ? myAvatar->getHeadOrientation() : myAvatar->getAbsoluteJointRotationInObjectFrame(jointIndex); - glm::vec3 avatarPos = myAvatar->getWorldPosition(); - glm::quat avatarRot = myAvatar->getWorldOrientation(); - - glm::vec3 pos = useAvatarHead ? jointPos : avatarPos + (avatarRot * jointPos); - glm::quat rot = useAvatarHead ? jointRot * glm::angleAxis(-PI / 2.0f, Vectors::RIGHT) : avatarRot * jointRot; - - // Apply offset - pos = pos + (rot * (myAvatar->getSensorToWorldScale() * _posOffset)); - glm::vec3 dir = glm::normalize(rot * glm::normalize(_dirOffset)); - - return PickRay(pos, dir); - } - - return PickRay(); -} diff --git a/interface/src/raypick/JointRayPick.h b/interface/src/raypick/JointRayPick.h deleted file mode 100644 index c0031d87ff..0000000000 --- a/interface/src/raypick/JointRayPick.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// JointRayPick.h -// interface/src/raypick -// -// Created by Sam Gondelman 7/11/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 -// -#ifndef hifi_JointRayPick_h -#define hifi_JointRayPick_h - -#include "RayPick.h" - -class JointRayPick : public RayPick { - -public: - JointRayPick(const std::string& jointName, const glm::vec3& posOffset, const glm::vec3& dirOffset, const PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickRay getMathematicalPick() const override; - - bool isLeftHand() const override { return (_jointName == "_CONTROLLER_LEFTHAND") || (_jointName == "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"); } - bool isRightHand() const override { return (_jointName == "_CONTROLLER_RIGHTHAND") || (_jointName == "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"); } - -private: - std::string _jointName; - glm::vec3 _posOffset; - glm::vec3 _dirOffset; - -}; - -#endif // hifi_JointRayPick_h diff --git a/interface/src/raypick/MouseParabolaPick.cpp b/interface/src/raypick/MouseParabolaPick.cpp deleted file mode 100644 index 66351f4520..0000000000 --- a/interface/src/raypick/MouseParabolaPick.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#include "MouseParabolaPick.h" - -#include "Application.h" -#include "display-plugins/CompositorHelper.h" - -MouseParabolaPick::MouseParabolaPick(float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, - bool scaleWithAvatar, const PickFilter& filter, float maxDistance, bool enabled) : - ParabolaPick(speed, accelerationAxis, rotateAccelerationWithAvatar, scaleWithAvatar, filter, maxDistance, enabled) -{ -} - -PickParabola MouseParabolaPick::getMathematicalPick() const { - QVariant position = qApp->getApplicationCompositor().getReticleInterface()->getPosition(); - if (position.isValid()) { - QVariantMap posMap = position.toMap(); - PickRay pickRay = qApp->getCamera().computePickRay(posMap["x"].toFloat(), posMap["y"].toFloat()); - return PickParabola(pickRay.origin, getSpeed() * pickRay.direction, getAcceleration()); - } - - return PickParabola(); -} diff --git a/interface/src/raypick/MouseParabolaPick.h b/interface/src/raypick/MouseParabolaPick.h deleted file mode 100644 index cb67c3b361..0000000000 --- a/interface/src/raypick/MouseParabolaPick.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#ifndef hifi_MouseParabolaPick_h -#define hifi_MouseParabolaPick_h - -#include "ParabolaPick.h" - -class MouseParabolaPick : public ParabolaPick { - -public: - MouseParabolaPick(float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, bool scaleWithAvatar, - const PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickParabola getMathematicalPick() const override; - - bool isMouse() const override { return true; } -}; - -#endif // hifi_MouseParabolaPick_h diff --git a/interface/src/raypick/MouseRayPick.cpp b/interface/src/raypick/MouseRayPick.cpp deleted file mode 100644 index 2b55c44460..0000000000 --- a/interface/src/raypick/MouseRayPick.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// MouseRayPick.cpp -// interface/src/raypick -// -// Created by Sam Gondelman 7/19/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 -// -#include "MouseRayPick.h" - -#include "Application.h" -#include "display-plugins/CompositorHelper.h" - -MouseRayPick::MouseRayPick(const PickFilter& filter, float maxDistance, bool enabled) : - RayPick(filter, maxDistance, enabled) -{ -} - -PickRay MouseRayPick::getMathematicalPick() const { - QVariant position = qApp->getApplicationCompositor().getReticleInterface()->getPosition(); - if (position.isValid()) { - QVariantMap posMap = position.toMap(); - return qApp->getCamera().computePickRay(posMap["x"].toFloat(), posMap["y"].toFloat()); - } - - return PickRay(); -} diff --git a/interface/src/raypick/MouseRayPick.h b/interface/src/raypick/MouseRayPick.h deleted file mode 100644 index a9070e8b92..0000000000 --- a/interface/src/raypick/MouseRayPick.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// MouseRayPick.h -// interface/src/raypick -// -// Created by Sam Gondelman 7/19/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 -// -#ifndef hifi_MouseRayPick_h -#define hifi_MouseRayPick_h - -#include "RayPick.h" - -class MouseRayPick : public RayPick { - -public: - MouseRayPick(const PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickRay getMathematicalPick() const override; - - bool isMouse() const override { return true; } -}; - -#endif // hifi_MouseRayPick_h diff --git a/interface/src/raypick/ParabolaPick.cpp b/interface/src/raypick/ParabolaPick.cpp index 1b37eee096..a2a9211b88 100644 --- a/interface/src/raypick/ParabolaPick.cpp +++ b/interface/src/raypick/ParabolaPick.cpp @@ -14,6 +14,43 @@ #include "scripting/HMDScriptingInterface.h" #include "DependencyManager.h" +ParabolaPick::ParabolaPick(const glm::vec3& position, const glm::vec3& direction, float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, bool rotateAccelerationWithParent, bool scaleWithParent, const PickFilter& filter, float maxDistance, bool enabled) : + Pick(filter, maxDistance, enabled), + _rotateAccelerationWithAvatar(rotateAccelerationWithAvatar), + _rotateAccelerationWithParent(rotateAccelerationWithParent), + _scaleWithParent(scaleWithParent) { + _mathPick = PickParabola(position, speed*direction, accelerationAxis); +} + +PickParabola ParabolaPick::getMathematicalPick() const { + if (!parentTransform) { + PickParabola mathPick = _mathPick; + if (_rotateAccelerationWithAvatar) { + mathPick.acceleration = DependencyManager::get()->getMyAvatar()->getWorldOrientation() * mathPick.acceleration; + } + return mathPick; + } + + Transform currentParentTransform = parentTransform->getTransform(); + + glm::vec3 position = currentParentTransform.transform(_mathPick.origin); + glm::vec3 velocity = _mathPick.velocity; + if (_scaleWithParent) { + velocity = currentParentTransform.transformDirection(velocity); + } + glm::vec3 acceleration = _mathPick.acceleration; + if (_rotateAccelerationWithAvatar) { + acceleration = DependencyManager::get()->getMyAvatar()->getWorldOrientation() * acceleration; + } else if (_rotateAccelerationWithParent) { + acceleration = currentParentTransform.getRotation() * acceleration; + } + if (_scaleWithParent) { + acceleration *= currentParentTransform.getScale(); + } + + return PickParabola(position, velocity, acceleration); +} + PickResultPointer ParabolaPick::getEntityIntersection(const PickParabola& pick) { if (glm::length2(pick.acceleration) > EPSILON && glm::length2(pick.velocity) > EPSILON) { ParabolaToEntityIntersectionResult entityRes = @@ -57,18 +94,6 @@ PickResultPointer ParabolaPick::getHUDIntersection(const PickParabola& pick) { return std::make_shared(pick.toVariantMap()); } -float ParabolaPick::getSpeed() const { - return (_scaleWithAvatar ? DependencyManager::get()->getMyAvatar()->getSensorToWorldScale() * _speed : _speed); -} - -glm::vec3 ParabolaPick::getAcceleration() const { - float scale = (_scaleWithAvatar ? DependencyManager::get()->getMyAvatar()->getSensorToWorldScale() : 1.0f); - if (_rotateAccelerationWithAvatar) { - return scale * (DependencyManager::get()->getMyAvatar()->getWorldOrientation() * _accelerationAxis); - } - return scale * _accelerationAxis; -} - Transform ParabolaPick::getResultTransform() const { PickResultPointer result = getPrevPickResult(); if (!result) { diff --git a/interface/src/raypick/ParabolaPick.h b/interface/src/raypick/ParabolaPick.h index 01454390f9..7089228d21 100644 --- a/interface/src/raypick/ParabolaPick.h +++ b/interface/src/raypick/ParabolaPick.h @@ -74,9 +74,9 @@ public: class ParabolaPick : public Pick { public: - ParabolaPick(float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, bool scaleWithAvatar, const PickFilter& filter, float maxDistance, bool enabled) : - Pick(filter, maxDistance, enabled), _speed(speed), _accelerationAxis(accelerationAxis), _rotateAccelerationWithAvatar(rotateAccelerationWithAvatar), - _scaleWithAvatar(scaleWithAvatar) {} + ParabolaPick(const glm::vec3& position, const glm::vec3& direction, float speed, const glm::vec3& acceleration, bool rotateAccelerationWithAvatar, bool rotateAccelerationWithParent, bool scaleWithParent, const PickFilter& filter, float maxDistance, bool enabled); + + PickParabola getMathematicalPick() const override; PickResultPointer getDefaultResult(const QVariantMap& pickVariant) const override { return std::make_shared(pickVariant); } PickResultPointer getEntityIntersection(const PickParabola& pick) override; @@ -86,13 +86,9 @@ public: Transform getResultTransform() const override; protected: - float _speed; - glm::vec3 _accelerationAxis; bool _rotateAccelerationWithAvatar; - bool _scaleWithAvatar; - - float getSpeed() const; - glm::vec3 getAcceleration() const; + bool _rotateAccelerationWithParent; + bool _scaleWithParent; }; #endif // hifi_ParabolaPick_h diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index b9693f6782..600be743fe 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -14,13 +14,9 @@ #include "Application.h" #include -#include "StaticRayPick.h" -#include "JointRayPick.h" -#include "MouseRayPick.h" +#include "RayPick.h" #include "StylusPick.h" -#include "StaticParabolaPick.h" -#include "JointParabolaPick.h" -#include "MouseParabolaPick.h" +#include "ParabolaPick.h" #include "CollisionPick.h" #include "SpatialParentFinder.h" @@ -56,9 +52,9 @@ unsigned int PickScriptingInterface::createPick(const PickQuery::PickType type, * @property {boolean} [enabled=false] If this Pick should start enabled or not. Disabled Picks do not updated their pick results. * @property {number} [filter=Picks.PICK_NOTHING] The filter for this Pick to use, constructed using filter flags combined using bitwise OR. * @property {number} [maxDistance=0.0] The max distance at which this Pick will intersect. 0.0 = no max. < 0.0 is invalid. - * @property {string} [joint] Only for Joint or Mouse Ray Picks. If "Mouse", it will create a Ray Pick that follows the system mouse, in desktop or HMD. - * If "Avatar", it will create a Joint Ray Pick that follows your avatar's head. Otherwise, it will create a Joint Ray Pick that follows the given joint, if it - * exists on your current avatar. + * @property {Uuid} parentID - The ID of the parent, either an avatar, an entity, or an overlay. + * @property {number} parentJointIndex - The joint of the parent to parent to, for example, the joints on the model of an avatar. (default = 0, no joint) + * @property {string} joint - If "Mouse," parents the pick to the mouse. If "Avatar," parents the pick to MyAvatar's head. Otherwise, parents to the joint of the given name on MyAvatar. * @property {Vec3} [posOffset=Vec3.ZERO] Only for Joint Ray Picks. A local joint position offset, in meters. x = upward, y = forward, z = lateral * @property {Vec3} [dirOffset=Vec3.UP] Only for Joint Ray Picks. A local joint direction offset. x = upward, y = forward, z = lateral * @property {Vec3} [position] Only for Static Ray Picks. The world-space origin of the ray. @@ -82,38 +78,30 @@ unsigned int PickScriptingInterface::createRayPick(const QVariant& properties) { maxDistance = propMap["maxDistance"].toFloat(); } - if (propMap["joint"].isValid()) { - std::string jointName = propMap["joint"].toString().toStdString(); - - if (jointName != "Mouse") { - // x = upward, y = forward, z = lateral - glm::vec3 posOffset = Vectors::ZERO; - if (propMap["posOffset"].isValid()) { - posOffset = vec3FromVariant(propMap["posOffset"]); - } - - glm::vec3 dirOffset = Vectors::UP; - if (propMap["dirOffset"].isValid()) { - dirOffset = vec3FromVariant(propMap["dirOffset"]); - } - - return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(jointName, posOffset, dirOffset, filter, maxDistance, enabled)); - - } else { - return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(filter, maxDistance, enabled)); - } - } else if (propMap["position"].isValid()) { - glm::vec3 position = vec3FromVariant(propMap["position"]); - - glm::vec3 direction = -Vectors::UP; - if (propMap["direction"].isValid()) { - direction = vec3FromVariant(propMap["direction"]); - } - - return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(position, direction, filter, maxDistance, enabled)); + glm::vec3 position = Vectors::ZERO; + if (propMap["position"].isValid()) { + position = vec3FromVariant(propMap["position"]); + } else if (propMap["posOffset"].isValid()) { + position = vec3FromVariant(propMap["posOffset"]); } - return PickManager::INVALID_PICK_ID; + // direction has two defaults to ensure compatibility with older scripts + // Joint ray picks had default direction = Vec3.UP + // Static ray picks had default direction = -Vec3.UP + glm::vec3 direction = propMap["joint"].isValid() ? Vectors::UP : -Vectors::UP; + if (propMap["orientation"].isValid()) { + direction = quatFromVariant(propMap["orientation"]) * Vectors::UP; + } else if (propMap["direction"].isValid()) { + direction = vec3FromVariant(propMap["direction"]); + } else if (propMap["dirOffset"].isValid()) { + direction = vec3FromVariant(propMap["dirOffset"]); + } + + auto rayPick = std::make_shared(position, direction, filter, maxDistance, enabled); + rayPick->parentTransform = createTransformNode(propMap); + rayPick->setJointState(getPickJointState(propMap)); + + return DependencyManager::get()->addPick(PickQuery::Ray, rayPick); } /**jsdoc @@ -153,23 +141,26 @@ unsigned int PickScriptingInterface::createStylusPick(const QVariant& properties return DependencyManager::get()->addPick(PickQuery::Stylus, std::make_shared(side, filter, maxDistance, enabled)); } +// NOTE: Laser pointer still uses scaleWithAvatar. Until scaleWithAvatar is also deprecated for pointers, scaleWithAvatar should not be removed from the pick API. /**jsdoc * A set of properties that can be passed to {@link Picks.createPick} to create a new Parabola Pick. * @typedef {object} Picks.ParabolaPickProperties * @property {boolean} [enabled=false] If this Pick should start enabled or not. Disabled Picks do not updated their pick results. * @property {number} [filter=Picks.PICK_NOTHING] The filter for this Pick to use, constructed using filter flags combined using bitwise OR. * @property {number} [maxDistance=0.0] The max distance at which this Pick will intersect. 0.0 = no max. < 0.0 is invalid. - * @property {string} [joint] Only for Joint or Mouse Parabola Picks. If "Mouse", it will create a Parabola Pick that follows the system mouse, in desktop or HMD. - * If "Avatar", it will create a Joint Parabola Pick that follows your avatar's head. Otherwise, it will create a Joint Parabola Pick that follows the given joint, if it - * exists on your current avatar. + * @property {Uuid} parentID - The ID of the parent, either an avatar, an entity, or an overlay. + * @property {number} parentJointIndex - The joint of the parent to parent to, for example, the joints on the model of an avatar. (default = 0, no joint) + * @property {string} joint - If "Mouse," parents the pick to the mouse. If "Avatar," parents the pick to MyAvatar's head. Otherwise, parents to the joint of the given name on MyAvatar. * @property {Vec3} [posOffset=Vec3.ZERO] Only for Joint Parabola Picks. A local joint position offset, in meters. x = upward, y = forward, z = lateral * @property {Vec3} [dirOffset=Vec3.UP] Only for Joint Parabola Picks. A local joint direction offset. x = upward, y = forward, z = lateral * @property {Vec3} [position] Only for Static Parabola Picks. The world-space origin of the parabola segment. * @property {Vec3} [direction=-Vec3.FRONT] Only for Static Parabola Picks. The world-space direction of the parabola segment. * @property {number} [speed=1] The initial speed of the parabola, i.e. the initial speed of the projectile whose trajectory defines the parabola. * @property {Vec3} [accelerationAxis=-Vec3.UP] The acceleration of the parabola, i.e. the acceleration of the projectile whose trajectory defines the parabola, both magnitude and direction. - * @property {boolean} [rotateAccelerationWithAvatar=true] Whether or not the acceleration axis should rotate with your avatar's local Y axis. - * @property {boolean} [scaleWithAvatar=false] If true, the velocity and acceleration of the Pick will scale linearly with your avatar. + * @property {boolean} [rotateAccelerationWithAvatar=true] Whether or not the acceleration axis should rotate with the avatar's local Y axis. + * @property {boolean} [rotateAccelerationWithParent=false] Whether or not the acceleration axis should rotate with the parent's local Y axis, if available. + * @property {boolean} [scaleWithParent=false] If true, the velocity and acceleration of the Pick will scale linearly with the parent, if available. + * @property {boolean} [scaleWithAvatar] Alias for scaleWithParent. Deprecated. */ unsigned int PickScriptingInterface::createParabolaPick(const QVariant& properties) { QVariantMap propMap = properties.toMap(); @@ -204,48 +195,38 @@ unsigned int PickScriptingInterface::createParabolaPick(const QVariant& properti rotateAccelerationWithAvatar = propMap["rotateAccelerationWithAvatar"].toBool(); } - bool scaleWithAvatar = false; - if (propMap["scaleWithAvatar"].isValid()) { - scaleWithAvatar = propMap["scaleWithAvatar"].toBool(); + bool rotateAccelerationWithParent = false; + if (propMap["rotateAccelerationWithParent"].isValid()) { + rotateAccelerationWithParent = propMap["rotateAccelerationWithParent"].toBool(); } - if (propMap["joint"].isValid()) { - std::string jointName = propMap["joint"].toString().toStdString(); - - if (jointName != "Mouse") { - // x = upward, y = forward, z = lateral - glm::vec3 posOffset = Vectors::ZERO; - if (propMap["posOffset"].isValid()) { - posOffset = vec3FromVariant(propMap["posOffset"]); - } - - glm::vec3 dirOffset = Vectors::UP; - if (propMap["dirOffset"].isValid()) { - dirOffset = vec3FromVariant(propMap["dirOffset"]); - } - - return DependencyManager::get()->addPick(PickQuery::Parabola, std::make_shared(jointName, posOffset, dirOffset, - speed, accelerationAxis, rotateAccelerationWithAvatar, - scaleWithAvatar, filter, maxDistance, enabled)); - - } else { - return DependencyManager::get()->addPick(PickQuery::Parabola, std::make_shared(speed, accelerationAxis, rotateAccelerationWithAvatar, - scaleWithAvatar, filter, maxDistance, enabled)); - } - } else if (propMap["position"].isValid()) { - glm::vec3 position = vec3FromVariant(propMap["position"]); - - glm::vec3 direction = -Vectors::FRONT; - if (propMap["direction"].isValid()) { - direction = vec3FromVariant(propMap["direction"]); - } - - return DependencyManager::get()->addPick(PickQuery::Parabola, std::make_shared(position, direction, speed, accelerationAxis, - rotateAccelerationWithAvatar, scaleWithAvatar, - filter, maxDistance, enabled)); + bool scaleWithParent = false; + if (propMap["scaleWithParent"].isValid()) { + scaleWithParent = propMap["scaleWithParent"].toBool(); + } else if (propMap["scaleWithAvatar"].isValid()) { + scaleWithParent = propMap["scaleWithAvatar"].toBool(); } - return PickManager::INVALID_PICK_ID; + glm::vec3 position = glm::vec3(); + glm::vec3 direction = -Vectors::FRONT; + if (propMap["position"].isValid()) { + position = vec3FromVariant(propMap["position"]); + } else if (propMap["posOffset"].isValid()) { + position = vec3FromVariant(propMap["posOffset"]); + } + if (propMap["orientation"].isValid()) { + direction = quatFromVariant(propMap["orientation"]) * Vectors::UP; + } else if (propMap["direction"].isValid()) { + direction = vec3FromVariant(propMap["direction"]); + } else if (propMap["dirOffset"].isValid()) { + direction = vec3FromVariant(propMap["dirOffset"]); + } + + auto parabolaPick = std::make_shared(position, direction, speed, accelerationAxis, + rotateAccelerationWithAvatar, rotateAccelerationWithParent, scaleWithParent, filter, maxDistance, enabled); + parabolaPick->parentTransform = createTransformNode(propMap); + parabolaPick->setJointState(getPickJointState(propMap)); + return DependencyManager::get()->addPick(PickQuery::Parabola, parabolaPick); } /**jsdoc @@ -297,6 +278,7 @@ unsigned int PickScriptingInterface::createCollisionPick(const QVariant& propert CollisionRegion collisionRegion(propMap); auto collisionPick = std::make_shared(filter, maxDistance, enabled, collisionRegion, qApp->getPhysicsEngine()); collisionPick->parentTransform = createTransformNode(propMap); + collisionPick->setJointState(getPickJointState(propMap)); return DependencyManager::get()->addPick(PickQuery::Collision, collisionPick); } @@ -373,6 +355,37 @@ void PickScriptingInterface::setPerFrameTimeBudget(unsigned int numUsecs) { DependencyManager::get()->setPerFrameTimeBudget(numUsecs); } +PickQuery::JointState PickScriptingInterface::getPickJointState(const QVariantMap& propMap) { + if (propMap["parentID"].isValid()) { + QUuid parentUuid = propMap["parentID"].toUuid(); + if (propMap["parentJointIndex"].isValid() && parentUuid == DependencyManager::get()->getMyAvatar()->getSessionUUID()) { + int jointIndex = propMap["parentJointIndes"].toInt(); + if (jointIndex == CONTROLLER_LEFTHAND_INDEX || jointIndex == CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX) { + return PickQuery::JOINT_STATE_LEFT_HAND; + } else if (jointIndex == CONTROLLER_RIGHTHAND_INDEX || jointIndex == CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX) { + return PickQuery::JOINT_STATE_RIGHT_HAND; + } else { + return PickQuery::JOINT_STATE_NONE; + } + } else { + return PickQuery::JOINT_STATE_NONE; + } + } else if (propMap["joint"].isValid()) { + QString joint = propMap["joint"].toString(); + if (joint == "Mouse") { + return PickQuery::JOINT_STATE_MOUSE; + } else if (joint == "_CONTROLLER_LEFTHAND" || joint == "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND") { + return PickQuery::JOINT_STATE_LEFT_HAND; + } else if (joint== "_CONTROLLER_RIGHTHAND" || joint == "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND") { + return PickQuery::JOINT_STATE_RIGHT_HAND; + } else { + return PickQuery::JOINT_STATE_NONE; + } + } else { + return PickQuery::JOINT_STATE_NONE; + } +} + std::shared_ptr PickScriptingInterface::createTransformNode(const QVariantMap& propMap) { if (propMap["parentID"].isValid()) { QUuid parentUuid = propMap["parentID"].toUuid(); diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h index 36079cec2b..224f7a547e 100644 --- a/interface/src/raypick/PickScriptingInterface.h +++ b/interface/src/raypick/PickScriptingInterface.h @@ -320,6 +320,7 @@ public slots: static constexpr unsigned int INTERSECTED_HUD() { return IntersectionType::HUD; } protected: + static PickQuery::JointState getPickJointState(const QVariantMap& propMap); static std::shared_ptr createTransformNode(const QVariantMap& propMap); }; diff --git a/interface/src/raypick/RayPick.cpp b/interface/src/raypick/RayPick.cpp index 736d3c1760..d16e10a3f4 100644 --- a/interface/src/raypick/RayPick.cpp +++ b/interface/src/raypick/RayPick.cpp @@ -14,6 +14,17 @@ #include "scripting/HMDScriptingInterface.h" #include "DependencyManager.h" +PickRay RayPick::getMathematicalPick() const { + if (!parentTransform) { + return _mathPick; + } + + Transform currentParentTransform = parentTransform->getTransform(); + Transform relativeTransform(rotationBetween(Vectors::UP, _mathPick.direction), glm::vec3(1.0f), _mathPick.origin); + Transform pickTransform = currentParentTransform.worldTransform(relativeTransform); + return PickRay(pickTransform.getTranslation(), pickTransform.getRotation() * Vectors::UP); +} + PickResultPointer RayPick::getEntityIntersection(const PickRay& pick) { RayToEntityIntersectionResult entityRes = DependencyManager::get()->findRayIntersectionVector(pick, !getFilter().doesPickCoarse(), diff --git a/interface/src/raypick/RayPick.h b/interface/src/raypick/RayPick.h index 11f985cec2..7c7ea5758a 100644 --- a/interface/src/raypick/RayPick.h +++ b/interface/src/raypick/RayPick.h @@ -70,7 +70,12 @@ public: class RayPick : public Pick { public: - RayPick(const PickFilter& filter, float maxDistance, bool enabled) : Pick(filter, maxDistance, enabled) {} + RayPick(glm::vec3 position, glm::vec3 direction, const PickFilter& filter, float maxDistance, bool enabled) : + Pick(filter, maxDistance, enabled) { + _mathPick = PickRay(position, direction); + } + + PickRay getMathematicalPick() const override; PickResultPointer getDefaultResult(const QVariantMap& pickVariant) const override { return std::make_shared(pickVariant); } PickResultPointer getEntityIntersection(const PickRay& pick) override; diff --git a/interface/src/raypick/RayPickScriptingInterface.cpp b/interface/src/raypick/RayPickScriptingInterface.cpp index c90f5d6c6c..247368df51 100644 --- a/interface/src/raypick/RayPickScriptingInterface.cpp +++ b/interface/src/raypick/RayPickScriptingInterface.cpp @@ -16,10 +16,6 @@ #include -#include "StaticRayPick.h" -#include "JointRayPick.h" -#include "MouseRayPick.h" - unsigned int RayPickScriptingInterface::createRayPick(const QVariant& properties) { return DependencyManager::get()->createRayPick(properties); } diff --git a/interface/src/raypick/StaticParabolaPick.cpp b/interface/src/raypick/StaticParabolaPick.cpp deleted file mode 100644 index a4e3ccb97f..0000000000 --- a/interface/src/raypick/StaticParabolaPick.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#include "StaticParabolaPick.h" - -StaticParabolaPick::StaticParabolaPick(const glm::vec3& position, const glm::vec3& direction, float speed, const glm::vec3& accelerationAxis, - bool scaleWithAvatar, bool rotateAccelerationWithAvatar, const PickFilter& filter, float maxDistance, bool enabled) : - ParabolaPick(speed, accelerationAxis, rotateAccelerationWithAvatar, scaleWithAvatar, filter, maxDistance, enabled), - _position(position), _velocity(direction) -{ -} - -PickParabola StaticParabolaPick::getMathematicalPick() const { - return PickParabola(_position, getSpeed() * _velocity, getAcceleration()); -} \ No newline at end of file diff --git a/interface/src/raypick/StaticParabolaPick.h b/interface/src/raypick/StaticParabolaPick.h deleted file mode 100644 index df2057a6f0..0000000000 --- a/interface/src/raypick/StaticParabolaPick.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by Sam Gondelman 7/2/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 -// -#ifndef hifi_StaticParabolaPick_h -#define hifi_StaticParabolaPick_h - -#include "ParabolaPick.h" - -class StaticParabolaPick : public ParabolaPick { - -public: - StaticParabolaPick(const glm::vec3& position, const glm::vec3& direction, float speed, const glm::vec3& accelerationAxis, bool rotateAccelerationWithAvatar, - bool scaleWithAvatar, const PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickParabola getMathematicalPick() const override; - -private: - glm::vec3 _position; - glm::vec3 _velocity; -}; - -#endif // hifi_StaticParabolaPick_h diff --git a/interface/src/raypick/StaticRayPick.cpp b/interface/src/raypick/StaticRayPick.cpp deleted file mode 100644 index b74afd6b5d..0000000000 --- a/interface/src/raypick/StaticRayPick.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// -// Created by Sam Gondelman 7/11/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 -// -#include "StaticRayPick.h" - -StaticRayPick::StaticRayPick(const glm::vec3& position, const glm::vec3& direction, const PickFilter& filter, float maxDistance, bool enabled) : - RayPick(filter, maxDistance, enabled), - _pickRay(position, direction) -{ -} - -PickRay StaticRayPick::getMathematicalPick() const { - return _pickRay; -} \ No newline at end of file diff --git a/interface/src/raypick/StaticRayPick.h b/interface/src/raypick/StaticRayPick.h deleted file mode 100644 index e4da2dbd55..0000000000 --- a/interface/src/raypick/StaticRayPick.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Created by Sam Gondelman 7/11/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 -// -#ifndef hifi_StaticRayPick_h -#define hifi_StaticRayPick_h - -#include "RayPick.h" - -class StaticRayPick : public RayPick { - -public: - StaticRayPick(const glm::vec3& position, const glm::vec3& direction, const PickFilter& filter, float maxDistance = 0.0f, bool enabled = false); - - PickRay getMathematicalPick() const override; - -private: - PickRay _pickRay; - -}; - -#endif // hifi_StaticRayPick_h diff --git a/interface/src/raypick/StylusPick.h b/interface/src/raypick/StylusPick.h index ca80e9fbea..e6b1da9914 100644 --- a/interface/src/raypick/StylusPick.h +++ b/interface/src/raypick/StylusPick.h @@ -70,6 +70,7 @@ public: bool isLeftHand() const override { return _side == Side::Left; } bool isRightHand() const override { return _side == Side::Right; } + bool isMouse() const override { return false; } private: const Side _side; diff --git a/libraries/pointers/src/Pick.h b/libraries/pointers/src/Pick.h index 099a791407..42a9354122 100644 --- a/libraries/pointers/src/Pick.h +++ b/libraries/pointers/src/Pick.h @@ -170,6 +170,13 @@ public: }; Q_ENUM(PickType) + enum JointState { + JOINT_STATE_NONE = 0, + JOINT_STATE_LEFT_HAND, + JOINT_STATE_RIGHT_HAND, + JOINT_STATE_MOUSE + }; + void enable(bool enabled = true); void disable() { enable(false); } @@ -210,9 +217,11 @@ public: void setIgnoreItems(const QVector& items); void setIncludeItems(const QVector& items); - virtual bool isLeftHand() const { return false; } - virtual bool isRightHand() const { return false; } - virtual bool isMouse() const { return false; } + virtual bool isLeftHand() const { return _jointState == JOINT_STATE_LEFT_HAND; } + virtual bool isRightHand() const { return _jointState == JOINT_STATE_RIGHT_HAND; } + virtual bool isMouse() const { return _jointState == JOINT_STATE_MOUSE; } + + void setJointState(JointState jointState) { _jointState = jointState; } virtual Transform getResultTransform() const = 0; @@ -226,6 +235,8 @@ private: QVector _ignoreItems; QVector _includeItems; + + JointState _jointState = JOINT_STATE_NONE; }; Q_DECLARE_METATYPE(PickQuery::PickType) @@ -240,6 +251,9 @@ public: virtual PickResultPointer getOverlayIntersection(const T& pick) = 0; virtual PickResultPointer getAvatarIntersection(const T& pick) = 0; virtual PickResultPointer getHUDIntersection(const T& pick) = 0; + +protected: + T _mathPick; }; namespace std { diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 6ecf9faca7..46f112f5c6 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -178,7 +178,9 @@ public: QVariantMap toVariantMap() const override { QVariantMap pickRay; pickRay["origin"] = vec3toVariant(origin); + pickRay["position"] = vec3toVariant(origin); pickRay["direction"] = vec3toVariant(direction); + pickRay["orientation"] = quatToVariant(rotationBetween(Vectors::UP, direction)); return pickRay; } }; From 9d051b71bb59ef79a654bef67baef276462333f7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 15 Sep 2018 10:14:22 +1200 Subject: [PATCH 108/434] Fix mini tablet sometimes flipping when grabbed by other hand --- scripts/system/miniTablet.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index 6a12edefaf..bda5909491 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -397,6 +397,11 @@ deltaRotation, localRotation; + if (Overlays.getProperty(miniOverlay, "parentJointIndex") !== handJointIndex(uiHand)) { + // Overlay has been grabbed by other hand but this script hasn't received notification yet. + return; + } + defaultLocalRotation = MINI_ROTATIONS[uiHand]; handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(handJointIndex(uiHand))); From 68e6142f8bdce15960da98370373ed5b5a1b1ae2 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 14 Sep 2018 15:34:00 -0700 Subject: [PATCH 109/434] Follow wallet setup referrer when autogenerating new wallet --- interface/resources/qml/hifi/commerce/wallet/Wallet.qml | 1 + interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index 65d98af234..2cfa5094b9 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -831,6 +831,7 @@ Rectangle { Commerce.getWalletAuthenticatedStatus(); // before writing security image, ensures that salt/account password is set. Commerce.chooseSecurityImage(securityImagePath); Commerce.generateKeyPair(); + followReferrer({ referrer: walletSetup.referrer }); } function addLeadingZero(n) { diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml b/interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml index eeecff9ad0..dc6ce45a74 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml @@ -28,7 +28,7 @@ Item { property string activeView: "step_1"; property string lastPage; property bool hasShownSecurityImageTip: false; - property string referrer; + property string referrer: ''; property string keyFilePath; property date startingTimestamp; property string setupAttemptID; From 986dece4ec20dec669e9e84550a95392d7a0f94e Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 14 Sep 2018 20:24:22 -0700 Subject: [PATCH 110/434] Add name of the batch during tracing and introduce detailed tracing if needed and one error message in the case the materialMap is detected in an fst file but not understood --- libraries/fbx/src/FBXReader_Material.cpp | 6 +- .../gpu-gl-common/src/gpu/gl/GLBackend.cpp | 95 +++++++++++++++++++ libraries/gpu/src/gpu/Batch.h | 1 + 3 files changed, 101 insertions(+), 1 deletion(-) diff --git a/libraries/fbx/src/FBXReader_Material.cpp b/libraries/fbx/src/FBXReader_Material.cpp index 4aa3044934..d5902962e5 100644 --- a/libraries/fbx/src/FBXReader_Material.cpp +++ b/libraries/fbx/src/FBXReader_Material.cpp @@ -128,7 +128,11 @@ void FBXReader::consolidateFBXMaterials(const QVariantHash& mapping) { QString materialMapString = mapping.value("materialMap").toString(); QJsonDocument materialMapDocument = QJsonDocument::fromJson(materialMapString.toUtf8()); QJsonObject materialMap = materialMapDocument.object(); - + if (!materialMapString.isEmpty()) { + if (materialMapDocument.isEmpty() || materialMap.isEmpty()) { + qCDebug(modelformat) << "fbx Material Map found but did not produce valid JSON:" << materialMapString; + } + } for (QHash::iterator it = _fbxMaterials.begin(); it != _fbxMaterials.end(); it++) { FBXMaterial& material = (*it); diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp index 4fea4f2dc5..68fe38fc72 100644 --- a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp @@ -20,6 +20,9 @@ #include "nvToolsExt.h" #endif +// Define the GPU_BATCH_DETAILED_TRACING to get detailed tracing of the commands during the batch executions +// #define GPU_BATCH_DETAILED_TRACING + #include #include "GLTexture.h" @@ -271,6 +274,8 @@ void GLBackend::renderPassDraw(const Batch& batch) { case Batch::COMMAND_drawIndexedInstanced: case Batch::COMMAND_multiDrawIndirect: case Batch::COMMAND_multiDrawIndexedIndirect: { + PROFILE_RANGE(render_gpu_gl_detail, "drawcall"); + // updates for draw calls ++_currentDraw; updateInput(); @@ -281,6 +286,94 @@ void GLBackend::renderPassDraw(const Batch& batch) { (this->*(call))(batch, *offset); break; } +#ifdef GPU_BATCH_DETAILED_TRACING + //case Batch::COMMAND_setModelTransform: + //case Batch::COMMAND_setViewTransform: + //case Batch::COMMAND_setProjectionTransform: + case Batch::COMMAND_setProjectionJitter: + case Batch::COMMAND_setViewportTransform: + case Batch::COMMAND_setDepthRangeTransform: + { + PROFILE_RANGE(render_gpu_gl_detail, "transform"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_clearFramebuffer: + { + PROFILE_RANGE(render_gpu_gl_detail, "clear"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_blit: + { + PROFILE_RANGE(render_gpu_gl_detail, "blit"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_setInputFormat: + case Batch::COMMAND_setInputBuffer: + case Batch::COMMAND_setIndexBuffer: + case Batch::COMMAND_setIndirectBuffer: { + PROFILE_RANGE(render_gpu_gl_detail, "input"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_setStateBlendFactor: + case Batch::COMMAND_setStateScissorRect: + case Batch::COMMAND_setPipeline: { + PROFILE_RANGE(render_gpu_gl_detail, "pipeline"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_setUniformBuffer: + { + PROFILE_RANGE(render_gpu_gl_detail, "ubo"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_setResourceBuffer: + case Batch::COMMAND_setResourceTexture: + case Batch::COMMAND_setResourceTextureTable: + { + PROFILE_RANGE(render_gpu_gl_detail, "resource"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + + case Batch::COMMAND_setResourceFramebufferSwapChainTexture: + case Batch::COMMAND_setFramebuffer: + case Batch::COMMAND_setFramebufferSwapChain: + { + PROFILE_RANGE(render_gpu_gl_detail, "framebuffer"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_generateTextureMips: + { + PROFILE_RANGE(render_gpu_gl_detail, "genMipMaps"); + + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } + case Batch::COMMAND_beginQuery: + case Batch::COMMAND_endQuery: + case Batch::COMMAND_getQuery: + { + PROFILE_RANGE(render_gpu_gl_detail, "query"); + CommandCall call = _commandCalls[(*command)]; + (this->*(call))(batch, *offset); + break; + } +#endif default: { CommandCall call = _commandCalls[(*command)]; (this->*(call))(batch, *offset); @@ -294,6 +387,8 @@ void GLBackend::renderPassDraw(const Batch& batch) { } void GLBackend::render(const Batch& batch) { + PROFILE_RANGE(render_gpu_gl, batch.getName()); + _transform._skybox = _stereo._skybox = batch.isSkyboxEnabled(); // Allow the batch to override the rendering stereo settings // for things like full framebuffer copy operations (deferred lighting passes) diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 8e607a189e..c68a04fa62 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -95,6 +95,7 @@ public: ~Batch(); void setName(const char* name); + const char* getName() const { return _name; } void clear(); // Batches may need to override the context level stereo settings From 5b3d92e8167e7bcab5a3ed697993288eef8b5938 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 16 Sep 2018 08:09:26 +1200 Subject: [PATCH 111/434] Persist showing mini tablet for a while after it would otherwise hide --- scripts/system/miniTablet.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js index bda5909491..2e5a5d86a2 100644 --- a/scripts/system/miniTablet.js +++ b/scripts/system/miniTablet.js @@ -565,7 +565,9 @@ MAX_CAMERA_HAND_ANGLE = 30, DEGREES_180 = 180, MIN_HAND_CAMERA_ANGLE_COS = Math.cos(Math.PI * MIN_HAND_CAMERA_ANGLE / DEGREES_180), - MAX_CAMERA_HAND_ANGLE_COS = Math.cos(Math.PI * MAX_CAMERA_HAND_ANGLE / DEGREES_180); + MAX_CAMERA_HAND_ANGLE_COS = Math.cos(Math.PI * MAX_CAMERA_HAND_ANGLE / DEGREES_180), + HIDING_DELAY = 1000, // ms + lastVisible = [0, 0]; function enterMiniDisabled() { @@ -646,6 +648,7 @@ // Should show mini tablet if it would be oriented toward the camera. if (show) { + // Calculate current visibility of mini tablet. jointIndex = handJointIndex(hand); handPosition = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex))); @@ -660,6 +663,13 @@ show = show || (-Vec3.dot(miniToCameraDirection, Quat.getForward(handOrientation)) > MIN_HAND_CAMERA_ANGLE_COS); cameraToHand = -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation)); show = show && (cameraToHand > MAX_CAMERA_HAND_ANGLE_COS); + + // Persist showing for a while after it would otherwise be hidden. + if (show) { + lastVisible[hand] = Date.now(); + } else { + show = Date.now() - lastVisible[hand] <= HIDING_DELAY; + } } return { From ff319ebd950778c85b60078e13130e155ff675d9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 09:47:22 -0700 Subject: [PATCH 112/434] Bypass position updates from mixer --- interface/src/avatar/AvatarManager.cpp | 33 +++++++++++-------- interface/src/avatar/AvatarManager.h | 2 +- interface/src/avatar/MyAvatar.cpp | 11 +++---- .../src/avatars-renderer/Avatar.cpp | 26 +++++++++++++-- .../src/avatars-renderer/Avatar.h | 11 +++++-- libraries/avatars/src/AvatarHashMap.cpp | 3 +- 6 files changed, 61 insertions(+), 25 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 334cdc9608..aa651e9e11 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -81,7 +81,7 @@ AvatarManager::AvatarManager(QObject* parent) : const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 20; - const int AVATAR_TRANSIT_FRAMES_PER_METER = 5; + const int AVATAR_TRANSIT_FRAMES_PER_METER = 15; _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; @@ -136,7 +136,23 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - + /* + std::shared_ptr transit = _myAvatar->getTransit(); + bool initTransit = false; + if (!transit->isTransiting()) { + initTransit = transit->update(_myAvatar->getWorldPosition(), _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); + if (initTransit) { + _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); + _myAvatar->getSkeletonModel()->getRig().overrideAnimation("https://hifi-content.s3.amazonaws.com/luis/test_scripts/transit_app/animations/teleport01_warp.fbx", 30, false, 0, 49); + } + } + if (transit->isTransiting()){ + glm::vec3 nextPosition; + if (!transit->getNextPosition(nextPosition)) { + _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); + } + } + */ _myAvatar->update(deltaTime); render::Transaction transaction; _myAvatar->updateRenderItem(transaction); @@ -259,17 +275,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { numAvatarsUpdated++; } // smooth other avatars positions - { - float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); - if (oneFrameDistance > _avatarTransitMaxDistance) { - avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased); - } - if (avatar->_transit.isTransiting()) { - glm::vec3 nextPosition; - if (avatar->_transit.getNextPosition(nextPosition)) { - avatar->setWorldPosition(nextPosition); - } - } + { + avatar->_transit.update(avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); } avatar->simulate(deltaTime, inView); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 867c49063f..3fc675f9b8 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -237,7 +237,7 @@ private: // Other avatars smooth transit global configuration - bool _avatarTransitDistanceBased { false }; + bool _avatarTransitDistanceBased { true }; float _avatarTransitMaxDistance; int _avatarTransitFrameCount; int _avatarTransitFramesPerMeter; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c8af792d8f..a6e77f76e9 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -610,7 +610,6 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); - animateScaleChanges(deltaTime); setFlyingEnabled(getFlyingEnabled()); @@ -1012,7 +1011,7 @@ glm::vec3 MyAvatar::worldToJointPoint(const glm::vec3& position, const int joint if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } } glm::vec3 modelOffset = position - jointPos; @@ -1034,7 +1033,7 @@ glm::vec3 MyAvatar::worldToJointDirection(const glm::vec3& worldDir, const int j glm::quat MyAvatar::worldToJointRotation(const glm::quat& worldRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat jointSpaceRot = glm::inverse(jointRot) * worldRot; return jointSpaceRot; @@ -1048,7 +1047,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } } @@ -1061,7 +1060,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::vec3 worldDir = jointRot * jointSpaceDir; return worldDir; @@ -1070,7 +1069,7 @@ glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const glm::quat MyAvatar::jointToWorldRotation(const glm::quat& jointSpaceRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat worldRot = jointRot * jointSpaceRot; return worldRot; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 3dae9171a8..9feb9a5983 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,6 +113,16 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } +bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { + glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; + float oneFrameDistance = glm::length(currentPosition - _lastPosition); + if (oneFrameDistance > maxDistance && !_isTransiting) { + start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); + return true; + } + return false; +} + void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { _startPosition = startPosition; _endPosition = endPosition; @@ -140,6 +150,7 @@ void AvatarTransit::calculateSteps(int stepCount) { } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + _lastPosition = _currentPosition; int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { @@ -482,6 +493,18 @@ void Avatar::relayJointDataToChildren() { void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "simulate"); + if (_transit.isTransiting()) { + glm::vec3 nextPosition; + if (_transit.getNextPosition(nextPosition)) { + // setWorldPosition(nextPosition); + _globalPosition = nextPosition; + _globalPositionChanged = usecTimestampNow(); + if (!hasParent()) { + setLocalPosition(nextPosition); + } + } + } + _simulationRate.increment(); if (inView) { _simulationInViewRate.increment(); @@ -492,7 +515,7 @@ void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "updateJoints"); if (inView) { Head* head = getHead(); - if (_hasNewJointData) { + if (true) { _skeletonModel->getRig().copyJointsFromJointData(_jointData); glm::mat4 rootTransform = glm::scale(_skeletonModel->getScale()) * glm::translate(_skeletonModel->getOffset()); _skeletonModel->getRig().computeExternalPoses(rootTransform); @@ -517,7 +540,6 @@ void Avatar::simulate(float deltaTime, bool inView) { _skeletonModel->simulate(deltaTime, false); } _skeletonModelSimulationRate.increment(); - _lastPosition = _globalPosition; } // update animation for display name fade in/out diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 2d940b8fd9..20cac1fcc4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -53,9 +53,13 @@ class Texture; class AvatarTransit { public: AvatarTransit() {}; + bool update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance); void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); bool getNextPosition(glm::vec3& nextPosition); bool isTransiting() { return _isTransiting; }; + glm::vec3 getCurrentPosition() { return _currentPosition; }; + int getCurrentStep() { return _step; }; + private: void calculateSteps(int stepCount); bool _isTransiting{ false }; @@ -63,7 +67,8 @@ private: glm::vec3 _endPosition; glm::vec3 _currentPosition; std::vector _transitSteps; - int _step{ 0 }; + glm::vec3 _lastPosition; + int _step { 0 }; }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -377,6 +382,8 @@ public: virtual scriptable::ScriptableModelBase getScriptableModel() override; + std::shared_ptr getTransit() { return std::make_shared(_transit); }; + signals: void targetScaleChanged(float targetScale); @@ -534,7 +541,7 @@ protected: bool _isFading { false }; bool _reconstructSoftEntitiesJointMap { false }; float _modelScale { 1.0f }; - glm::vec3 _lastPosition; + AvatarTransit _transit; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 1383939b8b..424fef0168 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -247,6 +247,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointerparseDataFromBuffer(byteArray); message->seek(positionBeforeRead + bytesRead); @@ -297,7 +298,6 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer // In this case, the "sendingNode" is the Avatar Mixer. avatar->processAvatarIdentity(message->getMessage(), identityChanged, displayNameChanged); _replicas.processAvatarIdentity(identityUUID, message->getMessage(), identityChanged, displayNameChanged); - } } @@ -310,6 +310,7 @@ void AvatarHashMap::processBulkAvatarTraits(QSharedPointer mess // grab the avatar so we can ask it to process trait data bool isNewAvatar; auto avatar = newOrExistingAvatar(avatarID, sendingNode, isNewAvatar); + // read the first trait type for this avatar AvatarTraits::TraitType traitType; message->readPrimitive(&traitType); From f339bbdd7f5343a4571296ff147a4830476df156 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 13:29:04 -0700 Subject: [PATCH 113/434] Fix bug while walking --- interface/src/avatar/AvatarManager.cpp | 4 ++-- .../src/avatars-renderer/Avatar.cpp | 22 ++++++++++++------- .../src/avatars-renderer/Avatar.h | 1 + 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index aa651e9e11..cea0ff0f4d 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -80,8 +80,8 @@ AvatarManager::AvatarManager(QObject* parent) : }); const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; - const int AVATAR_TRANSIT_FRAME_COUNT = 20; - const int AVATAR_TRANSIT_FRAMES_PER_METER = 15; + const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing + const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 9feb9a5983..0fc04febaa 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -119,7 +119,8 @@ bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int if (oneFrameDistance > maxDistance && !_isTransiting) { start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); return true; - } + } + updatePosition(avatarPosition); return false; } @@ -149,15 +150,20 @@ void AvatarTransit::calculateSteps(int stepCount) { } } -bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { - _lastPosition = _currentPosition; - int lastIdx = (int)_transitSteps.size() - 1; - _isTransiting = _step < lastIdx; +void AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { + _lastPosition = _isTransiting ? _currentPosition : avatarPosition; if (_isTransiting) { - _step++; - nextPosition = _transitSteps[_step]; - _currentPosition = nextPosition; + int lastIdx = (int)_transitSteps.size() - 1; + _isTransiting = _step < lastIdx; + if (_isTransiting) { + _step++; + _currentPosition = _transitSteps[_step]; + } } +} + +bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + nextPosition = _currentPosition; return _isTransiting; } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 20cac1fcc4..22163635ff 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -62,6 +62,7 @@ public: private: void calculateSteps(int stepCount); + void updatePosition(const glm::vec3& avatarPosition); bool _isTransiting{ false }; glm::vec3 _startPosition; glm::vec3 _endPosition; From b39391ca7a5a248394c2955eafd424115d6b6fd8 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 13:53:57 -0700 Subject: [PATCH 114/434] From first frame --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 0fc04febaa..05d49a9ec0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -114,14 +114,15 @@ void Avatar::setShowNamesAboveHeads(bool show) { } bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { + bool starting = false; glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); if (oneFrameDistance > maxDistance && !_isTransiting) { start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); - return true; + starting = true; } updatePosition(avatarPosition); - return false; + return starting; } void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { From 78b41390394b378bf11ef8d65922cde3824bf2b9 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 17 Sep 2018 19:16:04 -0300 Subject: [PATCH 115/434] Fix android login infinite loading (case 18459) --- android/app/src/main/cpp/native.cpp | 22 +++++++++++++--- .../hifiinterface/fragment/LoginFragment.java | 26 ++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index ce5af01f29..ba956ba322 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -255,6 +255,16 @@ JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_fragment_HomeFragme return env->NewStringUTF(lastLocation.toString().toLatin1().data()); } +JNIEXPORT void JNICALL +Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeCancelLogin(JNIEnv *env, jobject instance) { + + auto accountManager = DependencyManager::get(); + + QObject::disconnect(accountManager.data(), &AccountManager::loginComplete, nullptr, nullptr); + QObject::disconnect(accountManager.data(), &AccountManager::loginFailed, nullptr, nullptr); + +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *env, jobject instance, jstring username_, jstring password_, @@ -273,17 +283,23 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en QObject::connect(accountManager.data(), &AccountManager::loginComplete, [](const QUrl& authURL) { jboolean jSuccess = (jboolean) true; - __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } }); QObject::connect(accountManager.data(), &AccountManager::loginFailed, []() { jboolean jSuccess = (jboolean) false; - __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } }); QObject::connect(accountManager.data(), &AccountManager::usernameChanged, [](const QString& username) { QAndroidJniObject string = QAndroidJniObject::fromString(username); - __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); + if (__usernameChangedListener.isValid()) { + __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); + } }); QMetaObject::invokeMethod(accountManager.data(), "requestAccessToken", diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java index f29c237ed7..1a030baabf 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -19,8 +20,13 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; +import org.qtproject.qt5.android.QtNative; + import io.highfidelity.hifiinterface.R; +import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationActive; +import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationInactive; + public class LoginFragment extends Fragment { private EditText mUsername; @@ -32,6 +38,7 @@ public class LoginFragment extends Fragment { private ProgressDialog mDialog; public native void nativeLogin(String username, String password, Activity usernameChangedListener); + public native void nativeCancelLogin(); private LoginFragment.OnLoginInteractionListener mListener; @@ -125,10 +132,19 @@ public class LoginFragment extends Fragment { mListener = null; } + @Override + public void onResume() { + super.onResume(); + // This hack intends to keep Qt threads running even after the app comes from background + QtNative.setApplicationState(ApplicationActive); + } + @Override public void onStop() { super.onStop(); cancelActivityIndicator(); + // Leave the Qt app paused + QtNative.setApplicationState(ApplicationInactive); hideKeyboard(); } @@ -164,7 +180,15 @@ public class LoginFragment extends Fragment { mDialog = new ProgressDialog(getContext()); } mDialog.setMessage(getString(R.string.logging_in)); - mDialog.setCancelable(false); + mDialog.setCancelable(true); + mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + nativeCancelLogin(); + cancelActivityIndicator(); + mLoginButton.setEnabled(true); + } + }); mDialog.show(); } From 4807b5af7b49b722807a730e83714c21dd985484 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 18 Sep 2018 09:57:26 -0700 Subject: [PATCH 116/434] fixing display of user/pw incorrect --- interface/resources/qml/LoginDialog/LinkAccountBody.qml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/LoginDialog/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/LinkAccountBody.qml index 57293cb5e3..a6f962a677 100644 --- a/interface/resources/qml/LoginDialog/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/LinkAccountBody.qml @@ -43,7 +43,7 @@ Item { function resize() { var targetWidth = Math.max(titleWidth, form.contentWidth); - var targetHeight = hifi.dimensions.contentSpacing.y + mainTextContainer.height + + var targetHeight = hifi.dimensions.contentSpacing.y + flavorText.height + mainTextContainer.height + 4 * hifi.dimensions.contentSpacing.y + form.height; if (additionalInformation.visible) { @@ -106,14 +106,15 @@ Item { ShortcutText { id: mainTextContainer anchors { - top: parent.top + top: flavorText.bottom left: parent.left margins: 0 - topMargin: hifi.dimensions.contentSpacing.y + topMargin: 1.5 * hifi.dimensions.contentSpacing.y } visible: false text: qsTr("Username or password incorrect.") + height: flavorText.height - 20 wrapMode: Text.WordWrap color: hifi.colors.redAccent lineHeight: 1 @@ -128,7 +129,7 @@ Item { anchors { top: mainTextContainer.bottom - topMargin: 2 * hifi.dimensions.contentSpacing.y + topMargin: 1.5 * hifi.dimensions.contentSpacing.y } spacing: 2 * hifi.dimensions.contentSpacing.y From 96e8b060eb60d55de2f79ae79e89ae878b59f0cb Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 18 Sep 2018 12:42:37 -0700 Subject: [PATCH 117/434] Enable transit animations --- interface/src/avatar/AvatarManager.cpp | 88 ++++++++++++++----- interface/src/avatar/AvatarManager.h | 17 +--- .../src/avatars-renderer/Avatar.cpp | 57 ++++++++---- .../src/avatars-renderer/Avatar.h | 46 ++++++++-- 4 files changed, 152 insertions(+), 56 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index cea0ff0f4d..edf9469670 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -79,13 +79,21 @@ AvatarManager::AvatarManager(QObject* parent) : } }); - const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; + const float AVATAR_TRANSIT_TRIGGER_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing - _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; - _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; - _avatarTransitFramesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; + const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + const QString END_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + + _transitConfig._totalFrames = AVATAR_TRANSIT_FRAME_COUNT; + _transitConfig._triggerDistance = AVATAR_TRANSIT_TRIGGER_DISTANCE; + _transitConfig._framesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; + _transitConfig._isDistanceBased = true; + _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 30, 0, 10); + _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 30, 11, 0); + _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 30, 12, 38); } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -133,26 +141,37 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { _space = space; } +void AvatarManager::playTransitAnimations(AvatarTransit::Status status) { + auto startAnimation = _transitConfig._startTransitAnimation; + auto middleAnimation = _transitConfig._middleTransitAnimation; + auto endAnimation = _transitConfig._endTransitAnimation; + + switch (status) { + case AvatarTransit::Status::START_FRAME: + _myAvatar->overrideAnimation(startAnimation._animationUrl, startAnimation._fps, false, startAnimation._firstFrame, startAnimation._firstFrame + startAnimation._frameCount); + break; + case AvatarTransit::Status::START_TRANSIT: + _myAvatar->overrideAnimation(middleAnimation._animationUrl, middleAnimation._fps, false, middleAnimation._firstFrame, middleAnimation._firstFrame + middleAnimation._frameCount); + break; + case AvatarTransit::Status::END_TRANSIT: + _myAvatar->overrideAnimation(endAnimation._animationUrl, endAnimation._fps, false, endAnimation._firstFrame, endAnimation._firstFrame + endAnimation._frameCount); + break; + case AvatarTransit::Status::END_FRAME: + _myAvatar->restoreAnimation(); + break; + } +} + void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - /* - std::shared_ptr transit = _myAvatar->getTransit(); - bool initTransit = false; - if (!transit->isTransiting()) { - initTransit = transit->update(_myAvatar->getWorldPosition(), _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); - if (initTransit) { - _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); - _myAvatar->getSkeletonModel()->getRig().overrideAnimation("https://hifi-content.s3.amazonaws.com/luis/test_scripts/transit_app/animations/teleport01_warp.fbx", 30, false, 0, 49); - } - } - if (transit->isTransiting()){ - glm::vec3 nextPosition; - if (!transit->getNextPosition(nextPosition)) { - _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); - } + + AvatarTransit::Status status = _myAvatar->updateTransit(_myAvatar->getWorldPosition(), _transitConfig); + + if (_transitConfig._playAnimation) { + playTransitAnimations(status); } - */ + _myAvatar->update(deltaTime); render::Transaction transaction; _myAvatar->updateRenderItem(transaction); @@ -276,7 +295,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } // smooth other avatars positions { - avatar->_transit.update(avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); + avatar->_transit.update(avatar->_globalPosition, _transitConfig); } avatar->simulate(deltaTime, inView); @@ -866,3 +885,30 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV doc.insert("data", palData); return doc.toVariantMap(); } + + QVariantMap AvatarManager::getAvatarTransitData() { + QVariantMap result; + result["frameCount"] = _transitConfig._totalFrames; + result["framesPerMeter"] = _transitConfig._framesPerMeter; + result["isDistanceBased"] = _transitConfig._isDistanceBased; + result["triggerDistance"] = _transitConfig._triggerDistance; + result["playAnimation"] = _transitConfig._playAnimation; + return result; +} + void AvatarManager::setAvatarTransitData(const QVariantMap& data) { + if (data.contains("frameCount")) { + _transitConfig._totalFrames = data["frameCount"].toInt(); + } + if (data.contains("framesPerMeter")) { + _transitConfig._framesPerMeter = data["framesPerMeter"].toInt(); + } + if (data.contains("isDistanceBased")) { + _transitConfig._isDistanceBased = data["isDistanceBased"].toBool(); + } + if (data.contains("triggerDistance")) { + _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); + } + if (data.contains("playAnimation")) { + _transitConfig._playAnimation = data["playAnimation"].toBool(); + } +} \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 3fc675f9b8..e5936154a4 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -178,14 +178,8 @@ public: */ Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); - Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } - Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } - Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } - Q_INVOKABLE void setAvatarTransitFramesPerMeter(int frameCount) { _avatarTransitFramesPerMeter = frameCount; } - Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } - Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } - Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } - Q_INVOKABLE int getAvatarTransitFramesPerMeter() { return _avatarTransitFramesPerMeter; } + Q_INVOKABLE QVariantMap getAvatarTransitData(); + Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -212,6 +206,7 @@ private: AvatarSharedPointer newSharedAvatar() override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; + void playTransitAnimations(AvatarTransit::Status status); QVector _avatarsToFade; QVector _avatarsToCopy; @@ -237,11 +232,7 @@ private: // Other avatars smooth transit global configuration - bool _avatarTransitDistanceBased { true }; - float _avatarTransitMaxDistance; - int _avatarTransitFrameCount; - int _avatarTransitFramesPerMeter; - + AvatarTransit::TransitConfig _transitConfig; }; #endif // hifi_AvatarManager_h diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 05d49a9ec0..a3c3286793 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,29 +113,27 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } -bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { - bool starting = false; +AvatarTransit::Status AvatarTransit::update(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); - if (oneFrameDistance > maxDistance && !_isTransiting) { - start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); - starting = true; - } - updatePosition(avatarPosition); - return starting; + if (oneFrameDistance > config._triggerDistance && !_isTransiting) { + start(_lastPosition, currentPosition, config); + } + return updatePosition(avatarPosition); } -void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { +void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { _startPosition = startPosition; _endPosition = endPosition; + _framesBefore = config._startTransitAnimation._frameCount; + _framesAfter = config._endTransitAnimation._frameCount; _step = 0; - if (!isDistanceBased) { - calculateSteps(totalFrames); + if (!config._isDistanceBased) { + calculateSteps(config._totalFrames); } else { float distance = glm::length(_endPosition - _startPosition); - calculateSteps(framesPerMeter * distance); + calculateSteps(config._framesPerMeter * distance); } - _isTransiting = true; } @@ -145,22 +143,42 @@ void AvatarTransit::calculateSteps(int stepCount) { glm::vec3 transitLine = _endPosition - startPosition; glm::vec3 direction = glm::normalize(transitLine); glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; - for (auto i = 0; i < stepCount; i++) { - glm::vec3 localStep = _transitSteps.size() > 0 ? _transitSteps[i-1] + stepVector : _startPosition + stepVector; - _transitSteps.push_back(localStep); + int totalSteps = stepCount + _framesBefore + _framesAfter; + for (auto i = 0; i < totalSteps; i++) { + if (i < _framesBefore) { + _transitSteps.push_back(_startPosition); + } else if (i >= stepCount + _framesBefore) { + _transitSteps.push_back(_endPosition); + } else { + glm::vec3 localStep = _transitSteps.size() > _framesBefore ? _transitSteps[i - 1] + stepVector : _startPosition + stepVector; + _transitSteps.push_back(localStep); + } } } -void AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { +AvatarTransit::Status AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { + Status status = Status::IDLE; _lastPosition = _isTransiting ? _currentPosition : avatarPosition; if (_isTransiting) { int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { + if (_step == 0) { + status = Status::START_FRAME; + qDebug() << "Transit starting"; + } else if (_step == _framesBefore - 1) { + status = Status::START_TRANSIT; + } else if (_step == (int)_transitSteps.size() - _framesAfter) { + status = Status::END_TRANSIT; + } _step++; _currentPosition = _transitSteps[_step]; + } else { + status = Status::END_FRAME; + qDebug() << "Transit ending"; } } + return status; } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { @@ -1936,6 +1954,11 @@ float Avatar::getUnscaledEyeHeightFromSkeleton() const { } } +AvatarTransit::Status Avatar::updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { + std::lock_guard lock(_transitLock); + return _transit.update(avatarPosition, config); +} + void Avatar::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { std::lock_guard lock(_materialsLock); _materials[parentMaterialName].push(material); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 22163635ff..b955706861 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -52,21 +52,55 @@ class Texture; class AvatarTransit { public: + enum Status { + IDLE = 0, + START_FRAME, + START_TRANSIT, + TRANSITING, + END_TRANSIT, + END_FRAME + }; + + struct TransitAnimation { + TransitAnimation() {}; + TransitAnimation(const QString& animationUrl, int fps, int firstFrame, int frameCount) : + _firstFrame(firstFrame), _frameCount(frameCount), _animationUrl(animationUrl), _fps(fps) {}; + int _firstFrame; + int _frameCount; + QString _animationUrl; + int _fps; + }; + + struct TransitConfig { + TransitConfig() {}; + int _totalFrames { 0 }; + int _framesPerMeter { 0 }; + bool _isDistanceBased { false }; + float _triggerDistance { 0 }; + bool _playAnimation { false }; + TransitAnimation _startTransitAnimation; + TransitAnimation _middleTransitAnimation; + TransitAnimation _endTransitAnimation; + }; + + AvatarTransit() {}; - bool update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance); - void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); - bool getNextPosition(glm::vec3& nextPosition); + Status update(const glm::vec3& avatarPosition, const TransitConfig& config); bool isTransiting() { return _isTransiting; }; glm::vec3 getCurrentPosition() { return _currentPosition; }; + bool getNextPosition(glm::vec3& nextPosition); int getCurrentStep() { return _step; }; private: void calculateSteps(int stepCount); - void updatePosition(const glm::vec3& avatarPosition); + Status updatePosition(const glm::vec3& avatarPosition); + void start(const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); bool _isTransiting{ false }; glm::vec3 _startPosition; glm::vec3 _endPosition; glm::vec3 _currentPosition; + int _framesBefore { 0 }; + int _framesAfter { 0 }; std::vector _transitSteps; glm::vec3 _lastPosition; int _step { 0 }; @@ -385,6 +419,7 @@ public: std::shared_ptr getTransit() { return std::make_shared(_transit); }; + AvatarTransit::Status updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); signals: void targetScaleChanged(float targetScale); @@ -520,6 +555,7 @@ protected: RateCounter<> _skeletonModelSimulationRate; RateCounter<> _jointDataSimulationRate; + protected: class AvatarEntityDataHash { public: @@ -544,7 +580,7 @@ protected: float _modelScale { 1.0f }; AvatarTransit _transit; - + std::mutex _transitLock; static int _jointConesID; From 32da2cbef6cdf1a12bb462cb2f27a44cda60eefd Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 18 Sep 2018 18:11:11 -0300 Subject: [PATCH 118/434] Show password in android login --- android/app/build.gradle | 4 ++ .../hifiinterface/fragment/LoginFragment.java | 42 ------------------- .../src/main/res/drawable/ic_eye_noshow.xml | 27 ++++++++++++ .../app/src/main/res/drawable/ic_eye_show.xml | 15 +++++++ .../res/drawable/selector_show_password.xml | 5 +++ .../src/main/res/layout/fragment_login.xml | 41 +++++++++++------- android/app/src/main/res/values/colors.xml | 1 + android/app/src/main/res/values/strings.xml | 4 +- 8 files changed, 81 insertions(+), 58 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_eye_noshow.xml create mode 100644 android/app/src/main/res/drawable/ic_eye_show.xml create mode 100644 android/app/src/main/res/drawable/selector_show_password.xml diff --git a/android/app/build.gradle b/android/app/build.gradle index d3463411b8..24c067b176 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -133,6 +133,10 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' + compile 'com.android.support:support-v4:26.1.0' + compile 'com.android.support:appcompat-v7:26.1.0' + compile 'com.android.support:support-vector-drawable:26.1.0' + implementation 'com.android.support:appcompat-v7:26.1.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.android.support:cardview-v7:26.1.0' diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java index 1a030baabf..92cdec19a1 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java @@ -8,9 +8,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -62,44 +59,6 @@ public class LoginFragment extends Fragment { mLoginButton = rootView.findViewById(R.id.loginButton); mForgotPassword = rootView.findViewById(R.id.forgotPassword); - mUsername.addTextChangedListener(new TextWatcher() { - boolean ignoreNextChange = false; - boolean hadBlankSpace = false; - @Override - public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { - hadBlankSpace = charSequence.length() > 0 && charSequence.charAt(charSequence.length()-1) == ' '; - } - - @Override - public void onTextChanged(CharSequence charSequence, int start, int count, int after) { - - } - - @Override - public void afterTextChanged(Editable editable) { - if (!ignoreNextChange) { - ignoreNextChange = true; - boolean spaceFound = false; - for (int i = 0; i < editable.length(); i++) { - if (editable.charAt(i) == ' ') { - spaceFound=true; - editable.delete(i, i + 1); - i--; - } - } - - if (hadBlankSpace && !spaceFound && editable.length() > 0) { - editable.delete(editable.length()-1, editable.length()); - } - - editable.append(' '); - ignoreNextChange = false; - } - - } - }); - - mLoginButton.setOnClickListener(view -> login()); mForgotPassword.setOnClickListener(view -> forgotPassword()); @@ -208,7 +167,6 @@ public class LoginFragment extends Fragment { } public void handleLoginCompleted(boolean success) { - Log.d("[LOGIN]", "handleLoginCompleted " + success); getActivity().runOnUiThread(() -> { mLoginButton.setEnabled(true); cancelActivityIndicator(); diff --git a/android/app/src/main/res/drawable/ic_eye_noshow.xml b/android/app/src/main/res/drawable/ic_eye_noshow.xml new file mode 100644 index 0000000000..1d5304afac --- /dev/null +++ b/android/app/src/main/res/drawable/ic_eye_noshow.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_eye_show.xml b/android/app/src/main/res/drawable/ic_eye_show.xml new file mode 100644 index 0000000000..273ecc8339 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_eye_show.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/selector_show_password.xml b/android/app/src/main/res/drawable/selector_show_password.xml new file mode 100644 index 0000000000..a44092aceb --- /dev/null +++ b/android/app/src/main/res/drawable/selector_show_password.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_login.xml b/android/app/src/main/res/layout/fragment_login.xml index c50e6c1380..46ed783898 100644 --- a/android/app/src/main/res/layout/fragment_login.xml +++ b/android/app/src/main/res/layout/fragment_login.xml @@ -41,38 +41,51 @@ android:paddingTop="14dp" android:ems="10" android:fontFamily="@font/raleway" - android:textSize="14sp" + android:textSize="17sp" android:inputType="textEmailAddress" android:textStyle="italic" android:textColor="@color/editTextColor" android:textColorHint="@color/editTextColor" - android:gravity="right|center_vertical" + android:gravity="left|center_vertical" app:layout_constraintTop_toBottomOf="@id/header" android:layout_marginTop="70dp" android:hint="@string/username_or_email" /> - + + android:inputType="textPassword" /> +

97!MJYQl?Y=q*4YsHhGAd^V8V3f5 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%0DpIuU8KG@@UbK& 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.|9_K=*k&m*FjF(-ie z&MR=2ATXS9Jgfv7*?gl@wce|4Nlx;~)NpGf%UVrwYx73?+{480Q#4AM7y1}O?QZo* zE=0F-&{ko|+((YLN| zN`vQ6emE6uk|SJwq8 z*CqP-F4!X@zR)o+V9^-_%>KCPICMtjG2m>t)Hc=@K8f2`?Eg7P%z}C^HQ@cB2 z&W=GN^@MA4+{F1o;BV=EAKt&bp>Hkq*A>n=B??^(;+dw~@>z_^wdoz*#~jecesYgF$W|WLJB3ZFp8Mh;4UUF9LSvX3OWd&HZ&d zT$e%fxKH;!evW=Kb$dJaK>!>{2+d<~u7MP$drHFg^L|{3$yvudQ-uVH^$}-hJVk5# zn|eEtH;%EcjIwx&*CAE8MqB;dSYQ=bpbT&&G)DgnLPoZt2-|rjc&OgFhB#aIAZ)TP zIK3AK8sKmAR~+VThqos!!-9j%kzm{j!28zY<+C&JStZ+Hnaok`L3bAI&qARk^VQx} z8gKHw=xaEul@@e?8Nu~FyH&fJ_!VKru2EV)`}3}WIndZ7$0LvJ zn#*C*w)^>VWlN9ndr#L@TOj!Tg1`t z_Wd0-Z^wRdw%udhKy1!z_6Bxq{>8WNl1DY$kg$*$InGzy*iXn0{Wx$7@9d!a>!vV~ zXukz74>^@b(#q+*7S0Q|R-WVuEUjsATXAtm-cOa0?2K>uLC~*WI{`d&Myt#wbSwYh z;J&;h`)$i=ZRttf3LacC$0xAjO# znAuR|wzEu2@W;M@jSeNlP0ZjH3+i$*+zj43*=!xU1YeR6%%B%vu1{ID4}O}VJ-0KT z9CWWs^<6PcZr}>HVyEZ$H0Q>~yPu=}u;c)h{*Y2=jdLuz)ESTA?(Nu}!>!Yc=dvsj z&NMH5(QdB2(TnjPNc}$gt;y{f0R%PF@5NWly)^Q}`Ip|KO!7)cR4o%ZJ`HFK zTo*Aqr~a%wQ@rx-kg15zFBA6RhNyv6vw_dNQDtJDB4tB56Vyg%=O^G$Cyv+a+1fcu z@2%!Ed1VxLFJOOG^69FTk-mG6c$MxIni#elyj^nwcu#WzxWPYzA32mG@)K1F&ZA2w zfR7yz+(O~>?-M`^QPsfy5>e0fmmPh~Qs+ZY^hV9F%+Dvk!H9|h%-lgzCjrz7b##3H z*^zK>j^}Jw|1D*Ps>-o7FHX5#8$EXkNsq`Xgyg#qBNE;MlZ8=%`}=JprVx8w`;dh; zAB6I^SVD}a$7@sqVFC6~$^jY~6HwRdfkG~qe0w1I2;k6~dyb3S)3-rSTw`50`WFQP z6^+_Mx^1G&a!o@zj}*600IeadTO}T=;Kx%^k{0oq36feeh4I3I1YEmp}{-D zI#wvXEA_U?jfmUH=n%#Af$1;qxg)%=)v%YL1_4@d{gJ?1$Avgl2Osxh-5ndY?E7%; zZ^6%-o?lyOZ@RvyNFI--0{PHE#(7h+;*Pto$H{ zYJ>8JF8A|kx4zHK4M{pvfWlBBZ@+*sHXPSk<>W+D+q|~kJety5fCjhyT zODBNog}p~Oj>z6kM(vmY0{i!wjelNy8 z-EVt;vuWWC#9j@zi{+giMm$v%a$}rEK%ow}%vyX%7RLYPuO@$~j)reHzYeKzXjiXJ zaf_sB-=d9m72269%-OQ;+^E3$o&cJjIisWzd&p;Y)eLn@Ry&^3{{j~$M}F++(U zuT6v~|COW+xJS1eIPI1b`n9xt%Dm0oeXDavlgXESsKLA5K`0?5#7BZzU=ZA%Myadk zfC8D#v-V@Q`JsvdzeE!Y1IL1xq|gQc}BS{_Va>q7d?33E_+;Otms?X=pg+1 z2kY~oNq@`rLr`~(s@HQ(w+E#!K zx-a+yg{8*Sy*=>4!$rqA-@pc(1nN0u@m}*3w?ri+q}#Ky_0+#KRNo;GTMtoC^P6s( z^@IWcAYdSS({{GOlQpL;IS6k_`(}lI$=#)Ma(Zi1!^B%VT-*`De$A~ZQ(g_9wC`n2 zo2l9PVov}gp&iH2O5$2`OR~)MV!^;@!?)&*jeeUHNk&Ze?xr-w$otenS-Fs~W>*n_A+Tq7u*+P(udU;@u zP;P7M(v_{GR^Od3aNX>Zw>DQiQf+twCJU$bgTb+xdkU@VcDjMqxQ*THK5_j$?CYEb zbneicaxEOL$PJG8)HUQah+(mwUKk1iN+3UnRAk?F5Mu4#sCcAS0OJX~gAxs@s+($A zNy^B*3RFF3y{H-^6yk}@%U*c6V2OrzX1hMdevIqS*q(Ke#u+!?RA?;5B;Q_VTwGjh zX+wn#_66Ye%6?_68wtSbq5cu2n2B*k(rg_Z<8fCjYiCP;O3q zxT~v^iJ|JN?7{1yhELrx2Q4iS@o>%r{nyG}KCZTH9g34{BXJ{gGEX?OQ8LSw{kZuZ`*Px%&)u?4m<&zzrmR+$;NG6eW|4NM8vJ{&lk~7B69>|BAw_@0MGF#O*P%)qjezgE{8uG{A zrD^`I?HCj<<29+XRsQ=xp0Mq_j*>K=CVtv2MW-yA=NTTr=D^?>e`t%Gb&Ny{j);?^ zRdvtvzb9M`sh8}Csa!)0K7ZI#^*A3iM7L|tnOUs@QRdD8N!I2)=KXahs2I^PjaT?0 zj(^QbkW}7oTWe!HL>yOC+L2@6q3+y|bWVb}W*Q3L?XtQzTsWoQypb!9 z8!`D^H#geGu(R7VFS*Hg2n3!09N!N*DP^NMoF6~7kBOdI;tuY8HgEAH>j;5>XQ?Y{qU#8OOT(fMtA5?aockiO)c5di!Q4R+m$KJS~EnQb(cfC#X` z(1B!1?hj?Ya7^2E0YxHQ$AOm?ZKe(6;wvUL@&Z5;gH@{E7@#;D9BTKC=>nb~L`dks z_=t!6hIjMFe|@~z{puNu*2N}JY3jM_15^-6`QHTnRRuS*_ZqMHgYmTKZ;>OeyxJ%9<}FceMUii zsuYJB6~_jfZh5Z~K=G0EA>r+a05iCYY|DdU$Da2|Q6+jW_|!r(nyTnwN}(QshYv?4 z+t-kO`tyNIb4gN1G&_ZTs^S6&>sw8{a10LK(i!PUCjM{ z6;xFP28O-I&T`eFs4$d3kHmBk2;f8KLe7t(_wD=i3B+Qhg$46a z18}O{);@88_lL8m=qB9SZiFfC%ly+#3BmB8xK?P!&G`z)^ObWHUK3XHlAuJTWBI*z zPdw!&2a0xfYxl#N=6AM|TxT#4553uW7Au&*nb z4Xliw{;8^%$SDcp0#kvdoIKntZ$}{zw5|+bj(0~%oVKf|c^Dx}e1e_Rk#!%j z9j|ZRcIUYFv0PCQ-oq36FjS-^=ym;OLe)^oy-TyNZZK9HKKm=JC`UmvFjVR`cE@R9 zv<4y{_koZR;5JK4n+cu4ouNRypP$$oZ&v?mY#a`tBa z-F@l%xj=7kgA;&UTE*o0Q2hxY5-aNb1;wSui|4@^mlpBp(X5&{{B$z+xL67#8!`&VDO*dc`Lq& z2N`YXO1a%zG%A6gG~Z=jf~8PFQs&ZFMS|{^%KQ~Qm6fBDXRhkLhj;i?p)D3+$b8q( z(!BBx0op9u0&zAz528v_sJdiGe#%bwtUI z)w5y?x`MkC)E@){$?ebNj_ZHEEl42ro&baiIZHL(FkeOEO(O)0g~99QNSVa?5l0Vc zd{klv7qG@LrOlRG8|3ms|Lk9px%)W}DU$2()aVBD#UHnBeilI(HR(jR zwa&f?SW=d+^!ti=QQ5pUVJpqc-5zQL2KDh~*UIwyR0E}O_(Vm&Y-_i=xjDrLf?qXe z=BD)bd!G6Udai-l69eAEoxj;N4o{5=r;Q}Y3;e}GZsTmGi*e(>UlAhS;%(oL8OD_dfp~Nq-j~A~%r{&Go``yt0A9%IrO-`|CRH z0ssCsp9@aH4NYHL=jIecIEKcieWPUf4{7ojOO<}OF+*Nmrgus) z56IQM?ZT{>7r6(ek_GaL`f)P5Mp>*0I~C{tfh^n$U)c}ylk{6s%@5WrKo%(;>6a-5 z`V^aR&_$4XMNfOcoNjPidwIMoj-+rC)wjMgIQHu2?Ox?DX`YbqB|{5l^$&}8zyC$W z*96WCAY|Ch42a|)>m!#lu5f5iGip||UB02&)6;|Q##FC_3{7^&ucY3!!z=d|wZLLU z?467$1r7h)Ec2G!-D0*vZAk8HP!}+z9;gevCcXK!-}~0K{}`7e1cZ3(p18JF*FZ%m z5pBCbMa6aAZW6)u9yn#s=_ax!M~eg-L-aFlGiW4hi-wzwC!3GalN+r~E|9*(D3qvQ zs9)}T2+o$g0^_!%5}X-bTF?8Dc2|{2XRM74x>Xx{yN1y&-IQ66Jy~7GD#dtG;cC4R zm8ru=&A4kXP*!nttK&MV+1oaA)>2gd+KX<(@m@Cec05rlnI%`)wW3)heB*`-0bKLgtQ_k z_@cxw!dRAUFp}OM57IRR(!EGM@T5*!QkxXHKbKBSAia{>@U-LeaxsGm^@S8td+6(2 zp#Y3Hhv+U%T#Ib;;4ZzSg3~$WKuV&9=k^Pt2ci>oFO+p(?faqoUZ_7FbY#k zhvPhFN>i^Qg@n$QR10`5o--e#H*FyG@Bh=u^iMq=c6iXmOP163k&_LkXCZvjwgoo*pVIo;xQSv`2GY>Bgn zqjbPSmma5W@0WgFm!|yqOOlAfsba9W!E~#+F*Y-GF$-B>A(Cfp7!HAg_}SZVEfFZU zWS0GvlnA+$yJBW9yAD4Fj$3^rHCo?%R#&8~**=<+kff*IhA{xlxWTrkZL-7X&z&N5AG$ zT&VN3n?}jXULTN1OFj2vU~Bw>$Y_75S*D5ik97`bt0tM^2J-zlq?knHlW&w-3iK}J z|7^+rK*lPW{ZW=+{Rf zDs}5iHutP#ll#q!M?n%RF+SGufrEqVcW#)+-w9{pH#GhnXF_V|r=Y4J-Mb*R~_sFE0W4 zYQRpJP)tGngoT7aB%C{?{j0rZDolGrcS9})CKMoF&G$jm{O#Z>2#@Vwb56S)qAc^^ zaz&XuQ#f6pL^|o}q5t$rs;L`37cF^XN=-qHdE|`(d8q?4p?R0j%47++S4*Au{PIy= z=2-(Rt=#`(>b=9+aQ`>nC~DQLP+P4k61BHdo2pSWf>uz(ikLO3@u4=+qP1((Ol)En zMX0^^s1a%wwMz9|+TZt_^MC%xb>+$P-0yL}?lN0@5AopEs~WeTo(szN=Cxcb&FQ&zpQ81m#k`7i;(xVBz9fdz zhCL}TGJ!$2=;Qx^J@^>vLreZaW%#ZUF_GNdpl9!{?_c|m3v+2pB)iq5I|t7`@ik7% zqpx7bN^SR|fVsiX%UrJ4oh~@)C1wKU4rTikVlLR7$__j6O0nN;_-NhlyT-)u8>#|x zb16#3qlI#L)Pl$LP5YAUC?hrKw2gCBOHwEeB#w+rC^t;M2PgF`;Tg@RZrfhZ(t=vzGjQi~LECR!hvasf@1IS4~0OOgSL#&@hQgKc^YXlNZ$a za%gss7rGvOSI<6uYK;GQ$uM9h{%d>NgTHyW&!YrA>b=4WbFa1rafX6;dx`$q-gR+& zq((KqOAYl44KlftlOpL7Viokfu?|UUrD`QaMVExU3p3X-$U^6S11`A#9RpNp$kT(! zJS~mX=+Qq;*-p`m0 zNOC5!qQm+xCtY&>UiPJoK>Vk7uVhvlYJS)%%NMxcxZbX+jWVu7RRI6_)vr+jL$2`) zd(?jbpiT=ll2>*3@xa1>XM9&FGI~JhDn$OHH1us)9Vem<`E5EaV**USD7X2kEJ zI@R=QW*{|v_c9>kL(n;UzUaGo_~`U~Bb8z2bM4}iuC1+Abboi3#0u=cfw-=Zt8YUk zi_Wo;1yEHZ+{ufeM^7o^=;W z)sWC|UVZL@Vb^dNry7G(uBg54@h>|IOJFXt`)Pfjdga}H>pM5% zMUcg336Og-x|1nu>X;ivP4z>LyCPiCwN1GC?s?YMn@R(5okvBakE3fK*KY;`si6r# z{hF^)LN0^~*nQzJP`%)Ra9=)KdkzY;`C`_Pk04=Wo(uEY15HRG_t+Y|l4k4GgLMIu zS>A9J_F#X$q+2g>lqlYUz4)=6c`dlzg0#8ETamlb?hXDA2G5HvW`~{x-N(NHMomms z4lqL<1j)&{(}a0GIsuKt)lDWZM#H5*wyS>9uc%>&*e)9b*z;socb>SeGXDa>S2Q=X zqJteynS>wF(fu>E8@dS*$*U?FC{tR92UgR+{<1jtrT&oE(`tSeFIjbSb3`%h2!HnK z1y3bt$n1S?wUOSG(72&FXWn0Reg!%67tQ1_X4d9+=lOJKDrA;R+vT74ew3VCx^?EH>J+!vkfiX*&J~fSwuZblD6V5X8G%|-adD}37p84G z=~^6|H&^gI-o<5ee$!zwoD$c3Q`yF8O5zC#yHkUrh&xn2;Cmw0%R-8E&U?)sd6%S@ z@2$4Ohrtv}YUl>T#_c^FNaCZ>zc@*hAwb>a|2$*=XWxbbKWupOEDQx=R`~~>^HsEX-{8xFeEO$bDK6V= z*+cgA(l$W^>y^NZQzcsrz5CI=E7QzXYGo2_e!PqZNL!CFS(m%6{NOHl2PfA7n!*3tPpEuTU2A0E54uDbnB-(7M2 znQz=0URC#TUPDPRIC_znNe)zPTuU$12D!eA{t8v@P?V{v(Xaw-owV6%ORM{)t9gB0 z|MR-K59_faJ}(mh^hNPp{P7qUDeKdO4!io`tB3A7$9JqO`<{9F84{^Lhp(ileIT?L zrot*Se)u&Y=-L@Pe9f9OR22mO@Q;Z-v74iIQFHftTXmD!ize|qNx@IHeMA$BTeWY) z{GAK@Vy~SA7>33;DLrB<5vQfR-D~GE0tblA{k) zw#2IlMmK6!4WgBY6=hZqaQ5gu!R4kD^32I-7WVFD1PxpVa3!24DoLujF-tRJ=|{Om zc${$vnYIg4o1rGbde;`PZ@upMC31|gTWYdy39Fx(#<)8AEXv%Yg>V+g$ARRbQ%|#T z4}Sp(TNV>ciPvI+oSZw`p_rMjNGJzr1ibkgzrZj)VM$Mpt*)#yaP?C9^j6|M9eY&t z3u|lnM>9ETGP0VJp?mCtDusmdlJzO`9XYixYCX@#+w^IL5;Vpi{X<+{(?tqM9~cG{ zL$uc#yzjrX)YUx;ONYGz>Jf;LFBp(C(*?@j608{DsHP>`v7S7Cq{Z z_xZ$Tq$7-|gr(64SE<>dAgG$ye%C>+1hHudk_8qxatGz)IrZ&z51#a3Xb(^Imf z8#zV&I|Ikr)2UT9%URv&brE{(c~AptDWIDczsRV0{Psda%f>r7*ELjNru?1BII*e+ zI@EBjLdLgL7G1^kLa`BJZ-9t~GVVdTe)TDY^cwEFhkCP1@lVbzTZj0rB}M7s`rXyS z&Doj7S$Tog$NKgj{6kJimQTs<(MfWiCF|W=Q@5;VuG>5sCaQO9pBhh?jNr_ ze@qN+?v}aw6aTW~EInTGo@omxUUHa~?rhZ`>_$s$wBIf=ElsoUq2JO{U17Vs{lfAK z++!?B=gxFKdZMTlVsJB_=taD%u(4S*tyJ2m7JuJIy(#%h9cYvD#^qA<>fzLvuAs9m zFq)y3)NQSvS4!B3RMklr$4Bz-Dx#jMY_fHC&z#}MuE5<_YU(7^Tvs47eDGP>;pk9m z=k3F%C2Fl!Fn2e%84m0M+zr-Le_P)b@8W9AOeZLtNWQ90NG`zq<#b+?fGU7mx(9y% zuw6{QM^(cn>}zivk|%o6cHqv|4ZZmx$SA5b+qae}_+sWgbzw$zHZhwkZ~vpyKKG%+ z+06_9(rS~#28siDCg)%yxqsF-;A-9(ze$P=TcLR zfIk4cqu)j6qyBTZ_M_fd*#$WH;hYQ1b2S-D?lS&kVW)&@lYA#RQl0b5hBx`e?Iw4v z$BL;*OAl><4v8jGEWIZhvu*o1_3!s3&}!hbu%(gZkNzTsRdw$={`(E9HlDrtD;7^i zqeC3<>xHQEgK=vfK5(Mhb%X4L%$;y5wZA*f<}7ahx?mkW7RJ_}v;w%)ZH%#8PMh_c zgH{eht#Fk){-8jcu}7n{Jd_nrHERA3F;;`3%*hILwouWRSkYUXSp!s>*^_8wGOsec;fo#Bjywt2jCJf&p+jq zQ?${detGF@#v*n)*_{w=mZBKwsr+Wa#hQ~cC+u#0z2++y8@AogJ_6zd&CLJ@D(Ip& z5=#CsQm?P_Kp7w`z%yVZ_`g&7KYS+rUkoh@ zc*7KJSVNuz6ym8M_Wy;-lbt5%bUmd#DmeI+RJQLV=tJaFR;*+!o!cKo_t*0Rdyr6W%;k*I= ze*$H%hY;a~^AFN!mp_pGAD-4Y(lYn$fbipqHy$#+T5bbP7!Zd5O~2ew>QmO0o<9Jq z*$%Zxk76Rkb}&3^Ki(2*pwZ zPZ2q)vto-fyU5qBa%?fFFFwUGL)Djg?eopzVxyVjq5j#ZjS~zkfp8#mN2F_#bt__( zSz$SVJu0fJmP;O7J(FBg#QohmduNf??^`DBl$Rh~rMrn)4quRu#1jHDA2~l&A(az3 zo`}=#G-FWSrhl7IOp%hQ+3+bI7FpmtSaS^7!0552jgkx1*W;Qp>n72y zTLizGRkE`-r?NkYFhIT>T)*4S3DK^j*Wd=j_b$t0`c@7VLct9w$F^Ct8!-l(cb&9`(xf(3w`om?mNnqRO4!PF2H)`LkwvI%%Qaj zBb9jz4iVar{RLpGCmlSRp4okqK zH5qA@tRIffi<0>2ey6iS)g3}&CsaV1E;%JsD)0GC9(x2CxS}&fW8X+#(02kg=NbbC z8cuDdVq9&isQfKh!2+?I`5j{CE);pe19I8!dJ@T#xiu&pC5m!)cMrVbfGOodA{D|c z*`KxSA=X$&I^S`oPR~bxmuKyl(>c6{DWZMlSpbUhsiCHCwf@!!*VG9i;)UBbDJMq@ zkLTcK%7hhIL2N8@%b@b>-27aj=E@fQ6E`oqKA87cW-SR0MpSdj6u>ZmTS$7Z$ND)& zA<7wSUnMP9?$DIK-0pp#eU=3{B3>zcIs(I**H(yFD+P-$Sy z=z#bvJRx`c{hG&~R|CbNA9ibDjX!9#DcL@`Yw%$w7R@P?YsxkRzZjD4!1w;w18EYD z35u|Y^`P%#n+JGawxOuWYMJC$&CIxPzdKs@I2{@&R+yNiUBA!GyMumYpl5$n0~2D=J-C zKvf!_P6&>{Y(nxaj#=OvwK?ol%1U@*Kz5g(hQ6EJ(XkQ8fL5bSqpO=s^o3L3MUz#! z6_SX0VKsOP$79$ErZ2_xpm)s{Z?GO0XhHX4xpxKjA^S@RyVXI0CW zuUfAX;}!0Rz`m=Jn1Y-TrBR3#9U{N=@Q#sukS@i z$53S}tMKLc{=ubbt7>nUyZD)c%o6M%nW2Zu>O74&2Ewk208GAiH?ad;GFwE?-fwr2 zFcoIe&8h#Fe{f9>c2mk-@VCxv=KcEOjOGh0 zHY*%$-G}lgel_ zl(#==N&YGQJC%&Hx96cO>`v;eVu*_~|G*!>Er}KV`x+ZrTj%JPAO7VK0NYf3!dt>P z-q-e6YaRPen$!33X`O#ydktFM*ASUjc!&tBuJE#=+?(tmDAq2z(7coWh~1Lfs%ULaYZH6TzrTjgX$TtGMVq&Wqmi zbz_rgoJ+TV4)(N2nd^n40}E)9vB=dF%?P>vyI)4~vP%{PYFqiX5TywWA;O4v@o)q% z9L6)xX5bPSOzU|xYGDJF@96H}tobC*vhXxtD(y9K)QYyAC)#6v;Vo0g0!{ne;P!=i zNAF5t8^cWv0(s`+~Qii$?34oIR>sFJKb0^!I z+%_#EHMvp3ld}|J+s-ilgZ+lxT~j)`mwkZ&innUhoE>ZH{s6!-a)WWTSKB%{mkg?e z8WdIkO{Q&xCd}(B3>+9aI_*&1qb7q@EeTRpv?^TKN}xvR9_!-H6>VmO|v`B*FMea8YSD29ylylo+a1QTdK zl1-OBE4-iF>sX$h)Mp^@=xS}^@T*>ib5GEl95Yq-5=sA6r}f3i{PaDGl@z!7w!uZI3 zU#8PY<>C=2IUnsFmdYao3x$ z1tV#^AuL)`C%wLS`lN2|gs^6HkYY~HE>aFM@cUe`QaxqNJLl(n;k{#dXQAC=1hqMO zf7LUEOqMc{U5@MZM`KIlic2)CVVyUF!>8E-{jF{7WvECmEkfSf)qz3JgJ$FFBNDY){VB&5kbBb_ zN~gP5WG|K=Ytk1X5p$p-<;j8p_zeE36oZP?T6sdL?#54RdhVCG{3@yy^QTrJ*1P-P zqxKgsZ67~+B}_8-A0_#MAZz5e{ijZ>mw~C4m38qKtpTfO3<*E{-* zzrI+6=U+ovU4v_Oe-C+9W4o(tb1JJ7Fi0sWoOlg2+(owGMQIGL(t>htHEhKS_uy3A z9)WJDgo=BP2;Yi`^G7<7-wVHQ^apT%$V!hDK;>FMr=kM6?mvmA>%G{Jsk3-`Mz7f|6|p1Gn}WaH7#p{Lx6E}YZs57pSsHD0=8#6hN31}^Eb~0Hp<+&@ zYRy5qKkX~6NXm*_F4of*t>Fb~HUIj4=cf~b4d|5vz5x5tj_ofWD^Vrsa zy_4yf!naVCxRde+(As~4M{>PJ+k?yJwsl|kb~7|x9?s^~{;sYGxo08B2TG(#Pr&8m zuFfA@G#}C&anQOGYMVgJsi|}^X4#YWurC=_hfY#Yl<+sKhgH$D7gl1;67=65prgv~ z74zdCyT*Mk-uGiA`U4m)z)81EO><1tc@7O|DAhT#3HGOoeZeG&#Q~9N><=Zh%6Wf0 z&H5Hc@BP0SPHEWvYTw$$qj}#s-`?H&lykfZmUO`0)fu^4quS$#KW`;V{ z4T{|Hzf}2awmNlc9ov=7;zlOgTi_3XE09ZbMIaIX9i#T%py)(c3HfRD*?PdE#Xu^RXn?^=WRc{{A0<)6CAgSa8(ZQ3nwX~pqbgHl zm-${3WS&l=`-2#IO>JOGY4gkvEz=vb?|YFF7X~DS&E)(bUQ5yj(E&R>T9w>y+0gp; z-PGTy{k<~Yeydy_!cPki(^0H7g7qpfDbO6xPX|}m?NtRh-|2ZNYL7^g(&L>~gFQRG z_Xl9h|5e|-|6WvitUHDt1MQ-^$>5BcZ{=&DU0 z4LBWJ^zz2UR+)8((r)2Z*a|i%1%`Imdg9* z{E0NGwg@A8MbVwypQ@?eW&&i@;dU2{z7(;vAT3&$=J!3T4)8Qu8CuM3*p zYZZtn%m#phl%4p!_0|+|-%@nOMe@WmKDS0qaa{)B2lc&Wk+#^6~N~)!Du;jifq0kE7iDB{H;rI+8 z&+hceIH}Q58`9TTilf|EYmMRfx;Hv|HFM&JuG*ShFG$inD2{htRwYH4_gyrxctkA7 z-O~Rs0grD^xpOwY3G2C0IyO}15N~zOyf-wVbCj;@SP1Oz{jKD5F^!32(ABex!YVpr z)^3ClM-N%|D9YTN8gkQHnyV+RKB(7dOykm$8n`;*998Awd0QNuRHkAA>;$sJFU_ua z_+h1|Db9$4^0mwTMY$8|mZ$>-#^(&uW+^}AS>Z*T5GP#Cc>?k?GkB#Xm68}?3~g?IVlBSMSYBAQ zuk^mw?z$ar1ctqL`T@}{=VYfOS5d9@-EL&bTGSVI<8{jzr|5e5oK98PScn#= z;X66D2o)clh|eOdugFf1n9J=;0%*OAtk%optqxZ?!E3?E1!HZVbwTl4hVf635D4u` zgwxT3ygzqG><2R@cX@` ze?$y{szInSR#nItbW{<+(O+SbSL<$wgl)tN8=0;m8t-vZV@r)j94ZH;q8>~;-CJpV zLinoanCZz}w?;b-_F>qyy=|z~9uT}u^@L4&)W6*@tbV4Z}Mlx zW8GD~;hxY?)X6Dg?^b4>h`7v@-=yJFbqRewbhOtcme11|Nt%>Xz$h{~vejUuvvG#C z7D_#Y!i}^_zFl9DwBRA*sRtu%HHp-;G&Df61FGwX9X;SqnUZ%O(y6<3omh8W*RV#F zqEo-teL1OHfZlp8CEcO*QyB6GkZP@XMS*78yxx-0(mLpKTajRyo5$)(ThBjRjhxfs zrg@g+Ctvkl88h-_w)LmQUYU2u_uU}rm6@qm4dSu{{G;#7IBv2oKD%0)6U9i2)Cu?o zZ~=WCe(^UhZBD^pPRoy0Sg;9wV)58Y4a*lxlb7-9d)$90B1yity)Uqp_TKtmRN`}E&HA~NaSH}B_XV<3-%1d5tJT?saJ@o5soH%)oiKDc3rgEFD{<&2S7JH<31Ig;#2FANW9$< zdO0P^U&`^+ceye>!Nc0Fs^7k@`q2tiXesAp(p1eaCba3`OQXZ@jFKA~+xCBRO^ZZ- zDCBwWMrA7BI1GZmrF@vbB{jZY{3++^uBiA$0z20BenzvenivACdt!4_C&OloM#Vgl zv)z(Uqv|>>gu>*}J0_=(j&fkS7x_8*}!|o7 z@5?hV%ir{lS*BQb6Q&_0A5j=t_?cgRn@JPtcXpgPH{BpUosK&tk#-f=r;DBIzcXS? zpf;c>ET_xg!7Ev*-`21<*FM+|TB*BwwC&-@=MZaID6TD#7=fR91`~3(re`y5Ob8$XYD{f>?OlsP&ij|xb@2A zXD^!bZp}tJ%fw^!kDi(50&;fTwFB}{_C;=#9Al?@%A$%N>l~}tZ#X>a&H!~|68AQG zliGz<`xNvLn2l$Kgs9yOOm0c#O-eqkpGpu-v7{+%z>g<4Jn+v+HmY{r+uc`s>xjS= z=QVVXH`JXz7VpL@M2T?McC=0uwmTjOZGG|c2*$UHrU&Eh{R(rZdL9*4NaE)Apqut3 z;$GA#B%>$xQBGK;|9)$w$d}JA>>V6ZG$|IO>J1~LE%E^k7`_9fwxUu3jfU4Da=Tv-WKd|I%{w>0yI-OZg@8iqXY&%Rl8&y3p~j9i-u}h51=}ZQ zah1WciTG{*@>=I3%PckaLG85&Ej5Y9#+@ruQeX7K(wtPu&{ReLk&qg_pRt;gs+1rG zy#e{w{Uo4t-xoyJjxOKt8;;lY=`Y0;`kj;FWWbz{m6azIN&GM(S!UYb3&fgU!ztk2 zQxlH^)`G-9nKYCs+ylTH9#2@pd(V`QTIw zzaZ>RI_DzZ*pZe%(Tam6hAlX`a>Cv4nxKP47EXsCw2aY~$#?nUCr~B9=A%*!4q;VP zIF1dLEVxXiNfA7TDnqQozr}y;n0L7Ajb@O;qJgC>P`j!bMgDDZ*{F5At?Dm_sIGXx z5xZR27E`s>CzxF7JaZv$dPC~HmxPF80R)2DLm=V#52}2Es#6V$LbchK*7MuR$&uf_ zxcH!AL1lfkGdY~?E)q(d5n%SN1aFu;7TDEzav}<|v9#8wo*+2hCat-Jv^iDk40%bT z+PwV-pwASLRcfmYE+eO0E)mR@jElI7wS=+`%caT=lWLiEo(=Gw`3|J^H1i(p6O*9fc<#X*kSJKR1*THyE(&_EyZ@5RWIiA zlSJ7G`=HYINt2H;eLI@zGJ{8Se*imu@!2~z*cW-i4h3}DG=36ofkkOW05VP&30;i# zT}BmEp_TtrL{VU598@m>A5E?*w7k10*=M)=(eIWd^TE>Xho?1-(wh&#WEbXK_Zsn< z>s?4L$x~&k`xmcMQaK^p<~GXV??!C|IW-<`o4)iv(QU)rnB+z|n*f9&i&coAT9D}w zCA+FSvf>w2fhi02b_`XsH>T6sy(sIgVxW3O@Q!!T#zWhP%F@#pwW7OgKNc-?FD`Ft zbjvP*NJjcctQnX>skP`-IGbe=Qyg0sW9I5~Kn|JivPE&c)T_v*z-KLeT`curZuo;# zmssLsv1(r6;kZDY> z8VcCg%V?G5nuD<1qVXKvz*DLDB>G>$jD?7mf?%Y2x&t{LohhqCKXqr1ML4jbrX|3vg5ahZE@akE-p;KOEoT~2th zgQlF}UoV<^X=s>mjbB!vz5O46ciY#y$-5&W9<1Nc89!T^g^$=DWg-P2#TO! zcDq+xBVDJwB%8_5hTRY7idpn_$W8--msM;77X}RKvv6Epu?1+BsMXHZK8jtPT88PnOQ{ULJEPQx0Hz6tA_5&6aSti*5RFclZy|2&hcs6 zc{gT`c6JYO;x)~*`Q7{d9acH#9LB-|W)AbAmhlE1PlI)&3WX*v3KJHD!?9ElH0=q;{yv~Q#~wlO8Ry@zfO6o#mjxTB}!JXnHj$K7rvDupKE(fay|kq_T6 zZj_P@y2IbEOi_cKKayoW`uT6njv!Sf^F8=_%B9?$^mR_p!?m2#oyE}RE_Rzzs9FVeY&^q-`%le+X4q#W?&uj+J&*R$4Cz^>y~of5gH!M(vYyXd?6CnyIpuX(`h@ zsS4}|NK-6DJ;yZ0F zYLd<4QxlfG@b}@9ffdO$Cag7SGZ(4}9rhQmpTEeumD0NxU~fF!#kc!hta4&m)vvJl z+g71Xr;q#P$`9J<+t!QtTQZa2SW6wvI#u2*A{hDVquKFSo6z%9$TGZ?2gh#|SnnxE zJ(O18wld2VoD>q_BIyKRmK#(a03@X>Z?e6`Q_Y)^o{Q+8eO+_S6YnL?`!2QnthCX6 z+<$B-4ZncsPgMuDsnhAf0^3DM+fkoTHJs~)CUj6cB#R>OLi~Ne8h&YxwaQ|EUAUj? z5p9to!vIU!AAqk6VGW;Q^W=ATx8`>=S}O6F3|rMkQC_tE!x+H~nGwzpEs5kK?vJPB z4cVD;cB^ks70X1*ZST?u=^(+gI8w6jux~;x6_dmD2h1t;ILBPYcI>Co|U1S;uM?o;@ zMaVYAhvXFLhHq>i)6_mm57CrJb^ah~pC2lMUS?dP=fI*OJG+?yND;Hi#EO=~p5>k| zD#ZxIH;p0S(PzKYzm<*&IHs?#GpFH+L`%IS-~DN z|4l3QBah(ti?A(*0gks6Yo8{w+Ob1c)~km`^+#1V>ztt9e&d-Xqc7;s zun*(0HOgClkZqhF{p_6jjyo~u%H~HzSwiBEEuAO8LI4^6RQ!Y5LQHM|f-_P%aW~?$ z%Y&oZb=&#Qd_gQIdTScTVsX};X|j<&np6G|I%A6Xd|D@LzkKg=YclFYJ7do3&xl6?w{C$!&Vln!6fySDH<-i7O~XmT$K`v+{n*!bLk4T9)AE{ZP4EMrm=#q zcOWF~VGEXo{)p1XLF(Ot_1NNE_t?p0*U}$=A1kvevDGaPq`qoM*1a`-Ws0GAHOSU1 zxoG9w3&i@ejBG~m-jkX9F#cwS$6w=NPgylgTC_p;P=U^w9$xslA&SuxMJ6RIdplXA zQ1o>KF!fSRW1*1|}Nm_Uso6*xwqbG{#UhfIp*Un^ltvFwc^tiDAq(6&*@z-(rVdd~P zrCEnSqT?H=)-JEZ3lVSd(ag%;1ri;i{UBYtvu@9iOnRA)CI2FA1hH`{yrHpKR%Cqr zR=TyME#Y>f8u+sxOohxOzsci^WnE%R+tv3)cP6|<*t`;zpEn4qw;}U)?-93p=}}%4 z#>Gw(@}}!b*dck%SY@ntb;R>6_h^f`=w+H!__y_$O=j&jW(z(fL@S506uFSBV&wJ? z!von6Yv18da4zC~P4W_j+UCz3bcA%T?}Mx2>i+;lpn81YYB%x~)A&#ma3Z3cu;=ct zt7Y7>R)QS2*qCv8Y))iZs;iLikk@|2vwGGY`q*fiy(~V0AlL@u z5M-U>c3P$YV#t7F(bw}1Lwz9H=z0T1-Go&bpB7cTEGNKQeKvB5+nA9sXxQUz(9(?i^!@ z11geMYuNl0FJ#`#e^0E-C}s2l((}y9{haf{e*n_4VnK0Cy>^@Qub(Lt zWeS{|heCAk)uKNV9QT&X~Zsc#ML@Wg-by^C~F+Vn3sm*5rg2b!1=34}!{zEf|N>E2}^ zX2U=DrgllGN~O)sJ#ez^KDXEM{W+?+sJi*xhvK&PADz(yMFm1^8d-Z92?b@lAXgBq zswyreB?WUUUa$?u+WiAS)EkgI6!d0hlKH~pR|)wHjTOU5oeqFn-0E{gDk}mcS-8@8 zhBd+Rw2*UiZ&`=!nUN7aSDu`ID#0}KLWXIIA;dx_P|XJ4^!AlDcNW=IP*BE_e`V^v zmiI|>x|v&TSVN3VVt**UaiPN^FA7ToM$Q@P6aYvKxR||byHX2CNSN<5W3{M)ISp=0 zzQ4G5S|VpB52fWj<5YiHY@c@*cY5+;p;COwb4f3;E_BP)+umsFR3r{Va;e+Dq6?=f zIue%32M(5G6QGUGv}?`3MFM_dxy~i)ujeSQy<_=6?I5ar#}>9;=d@xswA0_v93jeO zZXQZh?h*0(hPm@}*M&^#L2<|a;Q)@C1%=C6B-L7h9jE2>4X#KJuxMT<)cK}fU?M?# z$~d2rQh~tCHsArpw{Q$pFZm6_etcZ2T%pRC;gpoO%o2pM`iGJcnU2LH(jj8P`6#B> zz|khEIT5ps+k3%Z=vpf(Qa^gQ9#~`x5)B68kBE#^`xdt6yY$K1 z^-if*cZ=I$EPx>apocsSdRjvY7cM$g^`?_c$k-pVIC%-{B*!J#TS>-eMPgMAiRkd;T0pS_iuu__ogBKKqf5h!1;wDueKW zF_OFDum6%%Qx}xobg!0qcvX~8?K#fp%FqyAI8L{CS3ith)p_(=!I#%$uOW1ys8g2u z>Y1D;JYTm3CPVT_43hH*5OV#u^ZrY)syhu=sr)3<7m31SnekCSl^dZ%kQAep(9lpU z&nioD?{njIOoG7 z9?eS2)doH7=@E$i^`>%--e9@;#9}P-bg9w8wOg)9%dKDhmNzD4YlYWB@aw1mE(9x( zA5T@DkiKs`C1joW*Q2JQqGC#tQ*BBx6V?{aG=13L;62LK>zQw~g|nTXoff_2>)^*U z+cf81^($4{|LFZiP%PL@>&)-*L_yoHn(ReW3f9IHn{6E}*h?7)c2$~u=T0}6H#`5QkhscYZk+SegGpYadXzC8Jq1%#&s zM{}YeoqJD_lcz%KD)1B@BdlF;jn7H+g6o*Y&B2b%r>Nc$MT2 z;6Z`PF*I;vo!HzV;dT@^R#p*?&18J0%dt-Q$HDCc~qt;r$4@d-R+=ILyk}(7{WodFf8N zL}Jg%zFXO>(Dz&R5ea_AHJ4^D5Ec&kKn^xM1|2^y2hVIzhKYiHu(C0V0|;zUE^70% zO5C1j*bu#}7>+hi&c39Ehv;-RF5rJwQyjP5_SFaKTfT>m@Y<98KV-dUIGgVq_#H*H zRi#?grl^`NwP#grs>7CO?GY^=G%{r#Wg|Gao! z-uJ8f#dTlDIX<8Be2ZkCBeO3rQ>)rq+FBHdMRxT%`qy8ZHkMY9&pt0-y`@H~cE|KQ zUueO5peDXP; zO{K$?bQRGhf7m4JzJsVe-=a*n`j{%A@x<5a5=`e5K&LU*(t{b+Qzv<=dDnhKIb5U@ zs5a7EJ6k8)YCrwiRKC^Ng_5)J+rwh%CFi7D^3nVXl>K8pqe6&Y%RQrwswoXqTXTy) z=iHENfG@S156R{))Ok46`Y#}0MzSGW#;FI`EoDzowt{f@`o1uH^;G|Rp};?efb0>= z$G&|QA@?da9Xnyg-yG6Na3qitIQoYA)*XX8|0ro@ff~~$zv*a}yTs2Th{BYawPOl=dl3Y0V|R=R(6I`)p@Es8dm%mTqLh`4+2 zjf>~&c)wJcHj(w+s2+XU*_{SCJ^41sm107HVh|0wfEJnsTqVzm>+DyH!XC+8v1!-Y z-i|O&$;wqXQwRT+Q=?I0+k97dpKtA~^yuHuxc*%+#b>t(?8*=(Gfvcc72B^tdLZgC zAcGT-QUOra*V%lV2HYr$kGwJ?agQqar*xY{O?XT-A5Kv?nqt#4CQCCVZmS4Blk6_+ z7#dpdWl}1W_T|MP8x&pZKY9J!X_|Sc>QshI$Nj;6GWz~3Osp~UXQDv;D=zV`dNek& z{=yRTFpJe*L_Is*va=6_Bm}+y)Xf$vHeOd7wTyY#A*`cdPXwZ-PKgFU)dY*n`VGNr z^1pz~HwxtA0`&@gxV!e`t~Q>xCu6*cTk_4XX33kkx)b}aLC;gIyxD1)UVkcyvs}M( z390171dPn+$5l~{C`BV<_kQMaUQM@%7cbTRq96tgMOwR1rpp%zV`a5*ofzbLk3fFb z#m^ki)omLLT5~3Z4j}Lw!lUne39XRbb+yFD$C{dRpqx=Do@;fsV&6k^qCH5?hOQW7 zmqRJg5)TNI^<_1K9Z!0LjcmUi3oTQv<&3eY6>_kLRF|FDR2-iy)IJ3uGISQyXw+ni zOVUbl7B>%_{Jo$)&OINct^J}Nuc)G8e=0c?CjKj8K=#*cCoMfuvmaHbM9=HxB-GwF zAcj#D;w|GG2}IPXXQ}%e5;8W9LyBlaaaXo0CjqKT^xH{{#B{GT!`PiLDe>0inwiZxes33lf{GTsTFiklTNGL5X=hVx)TSM}N7IXV@@Or^QaQ^!~u za~Vy{sFSk`wFlu&*|SKtrCz)MIoZc|Ta-fSX$c1q(Stw7|JWM?MAq4Y-teLDew(Bt zF>?FST|XmyIF>o14@14eyJwc^j1gd}3CRvwqf6=iLJX*;hAIfJ-vb8|BRXKTBm4^F zT0Dj=U=Jb)n{VratSXHfFHKdG54sF92)el|9gCCK1DRJ$3AH6eKKvFjk#ve2WoEw4 z&w4E#uV1G$Dkx`;j_=Zl>s50KSRKPYzHOB1U)!+Fdq&=KZpfs1wSx<+Ki#S837avV zHQXTP7DX(!grQ9qH>ppM>8E^A_eSpUhw%;yn8!q}x`G3o#qKElm}F+Bs;YQzJlQc= zhLC7kT?pE+O8kQ?`Bp}eZ5DvUC9|D7%Bg}KfX>e?tdUSsb|dZIPppFT8M*u^9==g8 z=Q^l($xB7$?A?Qr(B7j=4q77JkzuAA z*Lyjf?}?q;;gJga0Qz*cJUqzk`6l8J^i<#6Jt|)~y~AKmD^FZNJuzF4j!f0M`OjQm z#|>ttURJ-*pB5WeTGqX4y{_|=-TDlb^O6x~RwfJc*F$~}&TVDYJ41ff#GzU)XD68F zp}@5@mr<;nvibMM8s#S=n5%Vu`^~1qfw$(kw%cBH2zq0o^Y7JN8y@-fahqUN?FzEc zy!@qlF4k+9U59$d%)|crq^i1Ur(k=6Lk0-TNu^-3_#|N5zB)nE2qDH~Cb`pS-me>) zG7a^!f=iOnr0i3D>^aQ6lk9!#bZDd{NH6O(qMImb+REr9W&kqP{+cnnNB6R!JRfi80pTMhb=pgN+Xl7zACNl zURs8gz5P$J3RR3qyxba6Vv-ZxPoP4ftPinC)WO}_x zyEnSd7Wndp-(On%E5g_|adco!M{GbCHm8-oCL6(>X;pUbJ&pBC(+N+f!r2G+Zq}H| z!hT99R8Gt*7Ypp?CZ(vGsNiQhioJ(n?bG zu*%s)4I9$&PT+BMxPk`7Y08sdD`)Wvbij)Pb=2vce8{Y+Md!KJUCS8*iL&wMUy<;| zGM3p9-FHieiaf__J;P_)xX6XpUx}W@+kPk^+f)$QX%RnjnC+NjX*?nc}gOXgdYCXq0 zd|)#b4+rJQ6z(h(3X?2_rf+@<=lmQp!2+5_pa{gS+K~6Qb>VLHo?X!=XR<+fzS$z& zp_tZ#)?I*i=)uzxc?f?`{cPHj+pZ~MhDaIeF4Xq$?GV@3pu-W&UeT%Cr%Wp$3xj{b zjQ%}?ST*wA9025I99#R52oBeJ94K=*?|H*U;+2vpdOIG#7W8QMv(q7lOVyON_+Cslj3T1CVyClgrAgTtDyk(%WYK_fyX(-M zP<>fE1j?QoY^Z#7)8&O2L`k7X0Z!YqruNiN*QW}$7x#*81j^wBZu$XP3SxI5P-LM$d|TxE0Vq~Hr;NGWxa8Fy+r~-VX=rV%=h8h4!OnRBVZa0LpSUx#J@6n}12@YeO16&0GJBr0lP$e7T+W4_FxZ zE7eyUJc~j7t{WCHYrq#xfz$xBTw}3|_%sj9)U@Brwb#@$#TMml$@D*(0o7Ytk1-0g zD5(;q>arNu5xP()6Ue(9I~xBSEl-z`yz&aKV=ueo%w(B4wGv~$$};+f!G5#z&Biw& zs;s(<%5E?E6NAp@7((T=@96`3pOP(A5i~!M?TX%a>n@|&il^$K<&vU5W|jrR&nsR{ z@#>eDZ$D}DT{6S)f=8LPj&|TYzSm0i+XFqsofSCaHyJ6k_5r z=3uQ-T+H#~AD`@D*5PGH_YM0Opi0z8i3yWtxxbKGm4z#6{-C1mH%{s6)F+0_T;TclV{F6ht zbep7HTY^d)EV<-df9M$*)rG7p9dU(>Rb5i*=WFK8GeouaTXA+;a(T>NUv@xL=d1_L z_ef_lHBCbcjlH|pENiVqb6HAK?>fHU3Py4rZ3>g^A7`Hne@-kf$=nsnNSb2&W$w24 z^Yt+I$Eu%vPrZ0+QendB$3>QpYeG;G!qX==TPW!zxK)-4yy^>L)7JrN`7F4U4GCE} z%hD7)oxlmgQo{EDjb)X}@|NgP5Fq1`yl)%dmCFJ4s{=skL1_`Rcv?$=*{%!>c? znK$_&yg04jBf<<<|H^nqbaNKNw=>6vePG@%PVOwarE}nbKjCL_Zyn1JQY>m!8(%@z zj_aCyTKueU3m*mkB&>qF=e^vPcshIgVj!!)rH_WW+7?A7N_Orozr9Gw>u$=O*9vSz z<$i>C3tP#UZ;Cepu}$X=0FF$S8%p`ZgUX82@&*_Puj$|Ptua(QzR%wL!mG}1DFXQb zntn27_!Us5x0Y6beBM~a5n_j=F0AudRk(CmB34=>EB*7|$jbq!zA)KuD7U#{rWq2v zlJ|qLM(Elp$yr9D>1d1F7?ZNY-;?|X$OC|M+2@Z!Dq1Gj#JK=nU)Ev@I7kg5=D1*Y zPYBd~!kMz0hIc@5{JBl0rjhvM9U-F)qO%!SbTl0_bLlle*BtK|4!`_}W$TtSN{~)W z$r*X6e)c6Q?!t6L2=c2zF=WLr5%P@~Xb$n7k;8}Dc$iD!7;URyQNRBT2)n=Y0KJ!r z)hPdkIh^0LOb{;QzZY`rt{z?65wC@aC+Y@otV{Yji+{uUnd|D>G3d$C9{9Cc!1Xw) zbYaa*(_)8r3O8jKR(HzoJ2`oH(Fm=aPFAE3Jrg?HEnM6h>Mix|POpV)!)JfgCK)mb z=aB8gjKtIdXReChS5~qFSiQ1%x{Y>bQ)=;-HkU6v7rIJ!=2ZO677L=UG)TCo70h5! z@iNN4y9fjdVIJS)+8R&rBl~0`>(}OWS|#T--TeIr?p&Xg$~!GvEfk_jTt5a=46rVA znwnom#@ANglJ((nTrA553}CtzmG*gj{k(iMaRx*GCkT@i9ymx2|n{{RPO{mt-Uw;9eyr2MaV8Fz&;j>*{ zhcA-}D#?Esy6dYxJ~={fxxX4hsg+UMc#Le3{efg^zJEtj_|MFwsTbRr*#<38MbMMzA*H?E|6KQ}iW;HeTt0PWKAP_@ zfUbC9G~P$j!{#yyl%}O~rHxRlOLUD`z707KZS&k$^>r(ljiY$If9Xl6TU}_xtSnpq zkPVR#m0p&ybR1%!ul?88$3`6IuB@cd8`}0c-EZBTm@d!Xg6!Cp4K;&3-$G4{g_g|Dlr7htx!F@vYX zk!AN63d|~SUst9^N+O>|_W?^%T6gDcbkF$ZD7pfV_rxZ&G4fPaS6L$)m@LOmG`PCK zx=aDCQb?aT6R$(0*Z)%MJDWx538O?K5Z7Hw^#4{>mu1)gn}|yGZ*uF0Bz)SXx06(c zOa1OD7O(BF-YQt>aC$#higceutFO4S*T${ka?Pq*l6JX#_4;EEVeP#e=_K`QDFN