From 327154b0c01ac765c3c78422b1e5ad0bc39ff6e5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 5 Oct 2015 14:53:03 -0700 Subject: [PATCH 01/18] Make _acceptedExtensions static const --- interface/src/Application.cpp | 22 ++++++++-------------- interface/src/Application.h | 2 +- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c427379f74..8655105ab0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -322,6 +322,14 @@ bool setupEssentials(int& argc, char** argv) { return true; } +const QHash Application::_acceptedExtensions{ + {SNAPSHOT_EXTENSION, &Application::acceptSnapshot}, + {SVO_EXTENSION, &Application::importSVOFromURL}, + {SVO_JSON_EXTENSION, &Application::importSVOFromURL}, + {JS_EXTENSION, &Application::askToLoadScript}, + {FST_EXTENSION, &Application::askToSetAvatarUrl} +}; + // FIXME move to header, or better yet, design some kind of UI manager // to take care of highlighting keyboard focused items, rather than // continuing to overburden Application.cpp @@ -3954,19 +3962,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri #endif } -void Application::initializeAcceptedFiles() { - if (_acceptedExtensions.size() == 0) { - _acceptedExtensions[SNAPSHOT_EXTENSION] = &Application::acceptSnapshot; - _acceptedExtensions[SVO_EXTENSION] = &Application::importSVOFromURL; - _acceptedExtensions[SVO_JSON_EXTENSION] = &Application::importSVOFromURL; - _acceptedExtensions[JS_EXTENSION] = &Application::askToLoadScript; - _acceptedExtensions[FST_EXTENSION] = &Application::askToSetAvatarUrl; - } -} - bool Application::canAcceptURL(const QString& urlString) { - initializeAcceptedFiles(); - QUrl url(urlString); if (urlString.startsWith(HIFI_URL_SCHEME)) { return true; @@ -3983,8 +3979,6 @@ bool Application::canAcceptURL(const QString& urlString) { } bool Application::acceptURL(const QString& urlString) { - initializeAcceptedFiles(); - if (urlString.startsWith(HIFI_URL_SCHEME)) { // this is a hifi URL - have the AddressManager handle it QMetaObject::invokeMethod(DependencyManager::get().data(), "handleLookupString", diff --git a/interface/src/Application.h b/interface/src/Application.h index 0b75a94232..cfdd7681e1 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -500,7 +500,7 @@ private: GLCanvas* _glWidget{ nullptr }; typedef bool (Application::* AcceptURLMethod)(const QString &); - QHash _acceptedExtensions; + static const QHash _acceptedExtensions; QList _domainConnectionRefusals; glm::uvec2 _renderResolution; From 2d12b2ba9ad8a6b4d83403190439e48b1e5228d7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 5 Oct 2015 15:42:20 -0700 Subject: [PATCH 02/18] Spacing --- interface/src/Application.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8655105ab0..ba4c16eb78 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -322,12 +322,12 @@ bool setupEssentials(int& argc, char** argv) { return true; } -const QHash Application::_acceptedExtensions{ - {SNAPSHOT_EXTENSION, &Application::acceptSnapshot}, - {SVO_EXTENSION, &Application::importSVOFromURL}, - {SVO_JSON_EXTENSION, &Application::importSVOFromURL}, - {JS_EXTENSION, &Application::askToLoadScript}, - {FST_EXTENSION, &Application::askToSetAvatarUrl} +const QHash Application::_acceptedExtensions { + { SNAPSHOT_EXTENSION, &Application::acceptSnapshot }, + { SVO_EXTENSION, &Application::importSVOFromURL }, + { SVO_JSON_EXTENSION, &Application::importSVOFromURL }, + { JS_EXTENSION, &Application::askToLoadScript }, + { FST_EXTENSION, &Application::askToSetAvatarUrl } }; // FIXME move to header, or better yet, design some kind of UI manager From b666acdb26cb08e534974e098c9fc39a9d11b83f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 6 Oct 2015 10:57:33 -0700 Subject: [PATCH 03/18] Add fbx upload on drop --- interface/src/Application.cpp | 18 ++++++++++++++++++ interface/src/Application.h | 1 + interface/src/ui/AssetUploadDialogFactory.cpp | 4 ---- interface/src/ui/AssetUploadDialogFactory.h | 4 +++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ba4c16eb78..4597770ab4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -157,6 +157,7 @@ static const QString SVO_EXTENSION = ".svo"; static const QString SVO_JSON_EXTENSION = ".svo.json"; static const QString JS_EXTENSION = ".js"; static const QString FST_EXTENSION = ".fst"; +static const QString FBX_EXTENSION = ".fbx"; static const int MIRROR_VIEW_TOP_PADDING = 5; static const int MIRROR_VIEW_LEFT_PADDING = 10; @@ -190,6 +191,15 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; Setting::Handle maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); +const QHash Application::_acceptedExtensions { + { SNAPSHOT_EXTENSION, &Application::acceptSnapshot }, + { SVO_EXTENSION, &Application::importSVOFromURL }, + { SVO_JSON_EXTENSION, &Application::importSVOFromURL }, + { JS_EXTENSION, &Application::askToLoadScript }, + { FST_EXTENSION, &Application::askToSetAvatarUrl }, + { FBX_EXTENSION, &Application::askToUploadAsset } +}; + #ifdef Q_OS_WIN class MyNativeEventFilter : public QAbstractNativeEventFilter { public: @@ -4072,6 +4082,14 @@ bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { return true; } +#include "ui/AssetUploadDialogFactory.h" +bool Application::askToUploadAsset(const QString& filename) { + if (!filename.isEmpty()) { + AssetUploadDialogFactory::getInstance().showDialog(filename); + } + return false; +} + ScriptEngine* Application::loadScript(const QString& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor, bool activateMainWindow, bool reload) { diff --git a/interface/src/Application.h b/interface/src/Application.h index cfdd7681e1..dc1d9cdb84 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -327,6 +327,7 @@ private slots: bool acceptSnapshot(const QString& urlString); bool askToSetAvatarUrl(const QString& url); bool askToLoadScript(const QString& scriptFilenameOrURL); + bool askToUploadAsset(const QString& asset); void setSessionUUID(const QUuid& sessionUUID); void domainChanged(const QString& domainHostname); diff --git a/interface/src/ui/AssetUploadDialogFactory.cpp b/interface/src/ui/AssetUploadDialogFactory.cpp index a4426d0c1a..4910e6d604 100644 --- a/interface/src/ui/AssetUploadDialogFactory.cpp +++ b/interface/src/ui/AssetUploadDialogFactory.cpp @@ -29,10 +29,6 @@ AssetUploadDialogFactory& AssetUploadDialogFactory::getInstance() { return staticInstance; } -AssetUploadDialogFactory::AssetUploadDialogFactory() { - -} - static const QString PERMISSION_DENIED_ERROR = "You do not have permission to upload content to this asset-server."; void AssetUploadDialogFactory::showDialog() { diff --git a/interface/src/ui/AssetUploadDialogFactory.h b/interface/src/ui/AssetUploadDialogFactory.h index 50980862e6..36c5d10595 100644 --- a/interface/src/ui/AssetUploadDialogFactory.h +++ b/interface/src/ui/AssetUploadDialogFactory.h @@ -27,12 +27,14 @@ public: static AssetUploadDialogFactory& getInstance(); void setDialogParent(QWidget* dialogParent) { _dialogParent = dialogParent; } + public slots: void showDialog(); private slots: void handleUploadFinished(AssetUpload* upload, const QString& hash); + private: - AssetUploadDialogFactory(); + AssetUploadDialogFactory() = default; void showErrorDialog(const QString& filename, const QString& additionalError); From a1c154e7bebfa6b80fd08fa831e55aca81da16d6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Oct 2015 17:55:45 -0700 Subject: [PATCH 04/18] Fix compile error --- interface/src/Application.cpp | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4597770ab4..c5b4333ea6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -332,14 +332,6 @@ bool setupEssentials(int& argc, char** argv) { return true; } -const QHash Application::_acceptedExtensions { - { SNAPSHOT_EXTENSION, &Application::acceptSnapshot }, - { SVO_EXTENSION, &Application::importSVOFromURL }, - { SVO_JSON_EXTENSION, &Application::importSVOFromURL }, - { JS_EXTENSION, &Application::askToLoadScript }, - { FST_EXTENSION, &Application::askToSetAvatarUrl } -}; - // FIXME move to header, or better yet, design some kind of UI manager // to take care of highlighting keyboard focused items, rather than // continuing to overburden Application.cpp @@ -2027,26 +2019,18 @@ void Application::wheelEvent(QWheelEvent* event) { } void Application::dropEvent(QDropEvent *event) { - const QMimeData *mimeData = event->mimeData(); - bool atLeastOneFileAccepted = false; - foreach (QUrl url, mimeData->urls()) { + const QMimeData* mimeData = event->mimeData(); + for (auto& url : mimeData->urls()) { QString urlString = url.toString(); - if (canAcceptURL(urlString)) { - if (acceptURL(urlString)) { - atLeastOneFileAccepted = true; - break; - } + if (canAcceptURL(urlString) && acceptURL(urlString)) { + event->acceptProposedAction(); } } - - if (atLeastOneFileAccepted) { - event->acceptProposedAction(); - } } void Application::dragEnterEvent(QDragEnterEvent* event) { const QMimeData* mimeData = event->mimeData(); - foreach(QUrl url, mimeData->urls()) { + for (auto& url : mimeData->urls()) { auto urlString = url.toString(); if (canAcceptURL(urlString)) { event->acceptProposedAction(); @@ -4091,7 +4075,7 @@ bool Application::askToUploadAsset(const QString& filename) { } ScriptEngine* Application::loadScript(const QString& scriptFilename, bool isUserLoaded, - bool loadScriptFromEditor, bool activateMainWindow, bool reload) { + bool loadScriptFromEditor, bool activateMainWindow, bool reload) { if (isAboutToQuit()) { return NULL; From 75f0a6442f63c9d82c3508dffe4eb14eace766d8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Oct 2015 18:20:42 -0700 Subject: [PATCH 05/18] ModelEntities spawned with no dimension autoresize --- examples/edit.js | 25 --------------- examples/libraries/entitySelectionTool.js | 11 +++++-- .../src/RenderableModelEntityItem.cpp | 32 ++++++++++++++----- .../src/RenderableModelEntityItem.h | 21 ++++++------ .../RenderableParticleEffectEntityItem.cpp | 4 +-- libraries/entities/src/EntityTypes.cpp | 4 +-- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/examples/edit.js b/examples/edit.js index 0a1f31f0d7..0afc3ec1b6 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -296,37 +296,12 @@ var toolBar = (function () { function addModel(url) { var entityID = createNewEntity({ type: "Model", - dimensions: DEFAULT_DIMENSIONS, modelURL: url }, false); if (entityID) { print("Model added: " + url); - - var checkCount = 0; - function resize() { - var entityProperties = Entities.getEntityProperties(entityID); - var naturalDimensions = entityProperties.naturalDimensions; - - checkCount++; - - if (naturalDimensions.x == 0 && naturalDimensions.y == 0 && naturalDimensions.z == 0) { - if (checkCount < RESIZE_MAX_CHECKS) { - Script.setTimeout(resize, RESIZE_INTERVAL); - } else { - print("Resize failed: timed out waiting for model (" + url + ") to load"); - } - } else { - Entities.editEntity(entityID, { dimensions: naturalDimensions }); - - // Reset selection so that the selection overlays will be updated - selectionManager.setSelections([entityID]); - } - } - selectionManager.setSelections([entityID]); - - Script.setTimeout(resize, RESIZE_INTERVAL); } } diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index b2f6474089..c49408fef6 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -2325,9 +2325,14 @@ SelectionDisplay = (function () { }); that.checkMove = function() { - if (SelectionManager.hasSelection() && - (!Vec3.equal(Camera.getPosition(), lastCameraPosition) || !Quat.equal(Camera.getOrientation(), lastCameraOrientation))){ - that.updateRotationHandles(); + if (SelectionManager.hasSelection()) { + SelectionManager._update(); + + if (!Vec3.equal(Camera.getPosition(), lastCameraPosition) || + !Quat.equal(Camera.getOrientation(), lastCameraOrientation)) { + + that.updateRotationHandles(); + } } }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 5627338ebf..f48f8ec71e 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -26,6 +26,12 @@ EntityItemPointer RenderableModelEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared(entityID, properties); } +RenderableModelEntityItem::RenderableModelEntityItem(const EntityItemID& entityItemID, + const EntityItemProperties& properties) : + ModelEntityItem(entityItemID, properties), + _dimensionsInitialized { properties.dimensionsChanged() } +{ +} RenderableModelEntityItem::~RenderableModelEntityItem() { assert(_myRenderer || !_model); // if we have a model, we need to know our renderer @@ -35,6 +41,11 @@ RenderableModelEntityItem::~RenderableModelEntityItem() { } } +void RenderableModelEntityItem::setDimensions(const glm::vec3& value) { + _dimensionsInitialized = true; + ModelEntityItem::setDimensions(value); +} + bool RenderableModelEntityItem::setProperties(const EntityItemProperties& properties) { QString oldModelURL = getModelURL(); bool somethingChanged = ModelEntityItem::setProperties(properties); @@ -189,7 +200,6 @@ void makeEntityItemStatusGetters(RenderableModelEntityItem* entity, render::Item bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { - _myMetaItem = scene->allocateID(); auto renderData = std::make_shared(self); @@ -223,9 +233,6 @@ void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::sha void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RMEIrender"); assert(getType() == EntityTypes::Model); - - glm::vec3 position = getPosition(); - glm::vec3 dimensions = getDimensions(); if (hasModel()) { if (_model) { @@ -290,19 +297,28 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } } - glm::quat rotation = getRotation(); bool movingOrAnimating = isMoving() || isAnimatingSomething(); if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive()) { - _model->setScaleToFit(true, dimensions); + if (!_dimensionsInitialized) { + EntityItemProperties properties; + auto extents = _model->getMeshExtents(); + properties.setDimensions(extents.maximum - extents.minimum); + + qCDebug(entitiesrenderer) << "Autoresizing:" << (!getName().isEmpty() ? getName() : getModelURL()); + DependencyManager::get()->editEntity(getEntityItemID(), properties); + } + + _model->setScaleToFit(true, getDimensions()); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); - _model->setRotation(rotation); - _model->setTranslation(position); + _model->setRotation(getRotation()); + _model->setTranslation(getPosition()); // make sure to simulate so everything gets set up correctly for rendering { PerformanceTimer perfTimer("_model->simulate"); _model->simulate(0.0f); } + _needsInitialSimulation = false; } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 9673a378f6..60ac710d5e 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -25,16 +25,12 @@ class RenderableModelEntityItem : public ModelEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - RenderableModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - ModelEntityItem(entityItemID, properties), - _model(NULL), - _needsInitialSimulation(true), - _needsModelReload(true), - _myRenderer(NULL), - _originalTexturesRead(false) { } + RenderableModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual ~RenderableModelEntityItem(); + virtual void setDimensions(const glm::vec3& value) override; + virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const; virtual bool setProperties(const EntityItemProperties& properties); virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -74,14 +70,15 @@ public: private: void remapTextures(); - Model* _model; - bool _needsInitialSimulation; - bool _needsModelReload; - EntityTreeRenderer* _myRenderer; + Model* _model = nullptr; + bool _needsInitialSimulation = true; + bool _needsModelReload = true; + EntityTreeRenderer* _myRenderer = nullptr; QString _currentTextures; QStringList _originalTextures; - bool _originalTexturesRead; + bool _originalTexturesRead = false; QVector> _points; + bool _dimensionsInitialized = false; render::ItemID _myMetaItem; }; diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index 005252672d..a7bdffc020 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -263,8 +263,8 @@ void RenderableParticleEffectEntityItem::updateRenderItem() { } // update transform - glm::quat rot = _transform.getRotation(); - glm::vec3 pos = _transform.getTranslation(); + glm::quat rot = getRotation(); + glm::vec3 pos = getPosition(); Transform t; t.setRotation(rot); payload.setModelTransform(t); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 2ed52a9e62..1ef421efca 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -88,9 +88,7 @@ EntityItemPointer EntityTypes::constructEntityItem(EntityType entityType, const factory = _factories[entityType]; } if (factory) { - EntityItemProperties mutableProperties = properties; - mutableProperties.markAllChanged(); - newEntityItem = factory(entityID, mutableProperties); + newEntityItem = factory(entityID, properties); } return newEntityItem; } From 2229f942df99b14ecade9f08d909aa5fd6e3090e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Oct 2015 18:21:58 -0700 Subject: [PATCH 06/18] Spawn fbx dropped in front of avatar --- interface/src/Application.cpp | 61 +++++++++++++++++++++++++++++++++-- interface/src/Application.h | 2 ++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c5b4333ea6..ef7b5924eb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -4066,14 +4067,68 @@ bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { return true; } -#include "ui/AssetUploadDialogFactory.h" bool Application::askToUploadAsset(const QString& filename) { - if (!filename.isEmpty()) { - AssetUploadDialogFactory::getInstance().showDialog(filename); + QUrl url { filename }; + if (auto upload = DependencyManager::get()->createUpload(url.toLocalFile())) { + // connect to the finished signal so we know when the AssetUpload is done + QObject::connect(upload, &AssetUpload::finished, this, &Application::assetUploadFinished); + + // start the upload now + upload->start(); + + return true; } + + // display a message box with the error + auto errorMessage = QString("Failed to upload %1.\n\n").arg(filename); + QMessageBox::warning(_window, "Failed Upload", errorMessage); + return false; } +void Application::assetUploadFinished(AssetUpload* upload, const QString& hash) { + if (upload->getError() != AssetUpload::NoError) { + // figure out the right error message for the message box + QString additionalError; + + switch (upload->getError()) { + case AssetUpload::PermissionDenied: + additionalError = "You do not have permission to upload content to this asset-server."; + break; + case AssetUpload::TooLarge: + additionalError = "The uploaded content was too large and could not be stored in the asset-server."; + break; + case AssetUpload::FileOpenError: + additionalError = "The file could not be opened. Please check your permissions and try again."; + break; + case AssetUpload::NetworkError: + additionalError = "The file could not be opened. Please check your network connectivity."; + break; + default: + // not handled, do not show a message box + return; + } + + // display a message box with the error + auto filename = QFileInfo(upload->getFilename()).fileName(); + QString errorMessage = QString("Failed to upload %1.\n\n%2").arg(filename, additionalError); + QMessageBox::warning(_window, "Failed Upload", errorMessage); + } + + auto entities = DependencyManager::get(); + auto myAvatar = getMyAvatar(); + + EntityItemProperties properties; + properties.setType(EntityTypes::Model); + properties.setModelURL(QString("%1:%2.%3").arg(ATP_SCHEME).arg(hash).arg(upload->getExtension())); + properties.setPosition(myAvatar->getPosition() + myAvatar->getOrientation() * Vectors::FRONT * 2.0f); + properties.setName(QUrl(upload->getFilename()).fileName()); + + entities->addEntity(properties); + + upload->deleteLater(); +} + ScriptEngine* Application::loadScript(const QString& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor, bool activateMainWindow, bool reload) { diff --git a/interface/src/Application.h b/interface/src/Application.h index dc1d9cdb84..8444eab2b6 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -67,6 +67,7 @@ class OffscreenGlCanvas; class GLCanvas; class FaceTracker; class MainWindow; +class AssetUpload; #ifdef Q_OS_WIN static const UINT UWM_IDENTIFY_INSTANCES = @@ -328,6 +329,7 @@ private slots: bool askToSetAvatarUrl(const QString& url); bool askToLoadScript(const QString& scriptFilenameOrURL); bool askToUploadAsset(const QString& asset); + void assetUploadFinished(AssetUpload* upload, const QString& hash); void setSessionUUID(const QUuid& sessionUUID); void domainChanged(const QString& domainHostname); From e056743621badbd6e7f2a1571afd072111f96f6e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Oct 2015 18:33:38 -0700 Subject: [PATCH 07/18] Check for upload rights --- interface/src/Application.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ef7b5924eb..4589651728 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4068,6 +4068,12 @@ bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { } bool Application::askToUploadAsset(const QString& filename) { + if (DependencyManager::get()->getThisNodeCanRez()) { + QMessageBox::warning(_window, "Failed Upload", + QString("You don't have upload rights on that domain.\n\n")); + return false; + } + QUrl url { filename }; if (auto upload = DependencyManager::get()->createUpload(url.toLocalFile())) { // connect to the finished signal so we know when the AssetUpload is done @@ -4075,14 +4081,11 @@ bool Application::askToUploadAsset(const QString& filename) { // start the upload now upload->start(); - return true; } // display a message box with the error - auto errorMessage = QString("Failed to upload %1.\n\n").arg(filename); - QMessageBox::warning(_window, "Failed Upload", errorMessage); - + QMessageBox::warning(_window, "Failed Upload", QString("Failed to upload %1.\n\n").arg(filename)); return false; } From bcd148cb87bc033fc89cd2f71a6552451f72eb15 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 9 Oct 2015 11:25:16 -0700 Subject: [PATCH 08/18] Construct entity properties at definition --- .../entities/src/AnimationPropertyGroup.cpp | 12 -- .../entities/src/AnimationPropertyGroup.h | 36 ++-- .../entities/src/AtmospherePropertyGroup.cpp | 23 +- .../entities/src/AtmospherePropertyGroup.h | 28 ++- libraries/entities/src/BoxEntityItem.cpp | 4 +- .../entities/src/EntityEditPacketSender.cpp | 1 + libraries/entities/src/EntityItem.h | 3 +- .../entities/src/EntityItemProperties.cpp | 99 --------- libraries/entities/src/EntityItemProperties.h | 196 +++++++++--------- .../src/EntityItemPropertiesDefaults.h | 2 + .../entities/src/EntityItemPropertiesMacros.h | 56 ++--- .../entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/EntityTreeElement.cpp | 3 +- libraries/entities/src/LightEntityItem.cpp | 3 +- libraries/entities/src/LineEntityItem.cpp | 7 +- libraries/entities/src/ModelEntityItem.cpp | 5 +- libraries/entities/src/ModelEntityItem.h | 3 +- .../entities/src/ParticleEffectEntityItem.cpp | 1 - .../entities/src/ParticleEffectEntityItem.h | 2 +- libraries/entities/src/PolyLineEntityItem.cpp | 7 +- libraries/entities/src/PolyVoxEntityItem.cpp | 6 +- .../src/RecurseOctreeToMapOperator.cpp | 1 + .../entities/src/SkyboxPropertyGroup.cpp | 5 +- libraries/entities/src/SkyboxPropertyGroup.h | 18 +- libraries/entities/src/SphereEntityItem.cpp | 4 +- libraries/entities/src/StagePropertyGroup.cpp | 10 - libraries/entities/src/StagePropertyGroup.h | 20 +- libraries/entities/src/TextEntityItem.cpp | 4 +- .../entities/src/UpdateEntityOperator.cpp | 5 - libraries/entities/src/UpdateEntityOperator.h | 6 + libraries/entities/src/WebEntityItem.cpp | 4 +- libraries/entities/src/ZoneEntityItem.cpp | 5 +- libraries/entities/src/ZoneEntityItem.h | 2 + libraries/physics/src/EntityMotionState.cpp | 1 + 34 files changed, 231 insertions(+), 353 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 48cedfbf5d..d1da465079 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -18,18 +18,6 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -AnimationPropertyGroup::AnimationPropertyGroup() : -CONSTRUCT_PROPERTY(url, QString{}), -CONSTRUCT_PROPERTY(fps, 30.0f), -CONSTRUCT_PROPERTY(running, false), -CONSTRUCT_PROPERTY(loop, true), -CONSTRUCT_PROPERTY(firstFrame, 0.0f), -CONSTRUCT_PROPERTY(lastFrame, AnimationLoop::MAXIMUM_POSSIBLE_FRAME), -CONSTRUCT_PROPERTY(hold, false), -CONSTRUCT_PROPERTY(startAutomatically, false) -{ -} - void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 76782a85cd..848632b13e 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -13,26 +13,26 @@ #ifndef hifi_AnimationPropertyGroup_h #define hifi_AnimationPropertyGroup_h +#include + +#include + #include -#include "PropertyGroup.h" +#include "AnimationLoop.h" #include "EntityItemPropertiesMacros.h" +#include "PropertyGroup.h" class EntityItemProperties; class EncodeBitstreamParams; class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; -class AnimationLoop; - -#include -#include - class AnimationPropertyGroup : public PropertyGroup { public: - AnimationPropertyGroup(); - virtual ~AnimationPropertyGroup() {} + AnimationPropertyGroup() = default; + virtual ~AnimationPropertyGroup() = default; void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } // EntityItemProperty related helpers @@ -72,16 +72,16 @@ public: ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged); - - DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString); - DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float); - DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, CurrentFrame, currentFrame, float); - DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, Running, running, bool); // was animationIsPlaying - DEFINE_PROPERTY(PROP_ANIMATION_LOOP, Loop, loop, bool); // was animationSettings.loop - DEFINE_PROPERTY(PROP_ANIMATION_FIRST_FRAME, FirstFrame, firstFrame, float); // was animationSettings.firstFrame - DEFINE_PROPERTY(PROP_ANIMATION_LAST_FRAME, LastFrame, lastFrame, float); // was animationSettings.lastFrame - DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool); // was animationSettings.hold - DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically + + DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString, ""); + DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float, 30.0f); + DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, CurrentFrame, currentFrame, float, 0.0f); + DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, Running, running, bool, false); // was animationIsPlaying + DEFINE_PROPERTY(PROP_ANIMATION_LOOP, Loop, loop, bool, true); // was animationSettings.loop + DEFINE_PROPERTY(PROP_ANIMATION_FIRST_FRAME, FirstFrame, firstFrame, float, 0.0f); // was animationSettings.firstFrame + DEFINE_PROPERTY(PROP_ANIMATION_LAST_FRAME, LastFrame, lastFrame, float, AnimationLoop::MAXIMUM_POSSIBLE_FRAME); // was animationSettings.lastFrame + DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool, false); // was animationSettings.hold + DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool, false); // was animationSettings.startAutomatically protected: void setFromOldAnimationSettings(const QString& value); diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index 0f0e68ce72..090fdb6c6f 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -15,22 +15,13 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -AtmospherePropertyGroup::AtmospherePropertyGroup() { - const glm::vec3 DEFAULT_CENTER = glm::vec3(0.0f, -1000.0f, 0.0f); - const float DEFAULT_INNER_RADIUS = 1000.0f; - const float DEFAULT_OUTER_RADIUS = 1025.0f; - const float DEFAULT_RAYLEIGH_SCATTERING = 0.0025f; - const float DEFAULT_MIE_SCATTERING = 0.0010f; - const glm::vec3 DEFAULT_SCATTERING_WAVELENGTHS = glm::vec3(0.650f, 0.570f, 0.475f); - - _center = DEFAULT_CENTER; - _innerRadius = DEFAULT_INNER_RADIUS; - _outerRadius = DEFAULT_OUTER_RADIUS; - _mieScattering = DEFAULT_MIE_SCATTERING; - _rayleighScattering = DEFAULT_RAYLEIGH_SCATTERING; - _scatteringWavelengths = DEFAULT_SCATTERING_WAVELENGTHS; - _hasStars = true; -} +const glm::vec3 AtmospherePropertyGroup::DEFAULT_CENTER = glm::vec3(0.0f, -1000.0f, 0.0f); +const float AtmospherePropertyGroup::DEFAULT_INNER_RADIUS = 1000.0f; +const float AtmospherePropertyGroup::DEFAULT_OUTER_RADIUS = 1025.0f; +const float AtmospherePropertyGroup::DEFAULT_RAYLEIGH_SCATTERING = 0.0025f; +const float AtmospherePropertyGroup::DEFAULT_MIE_SCATTERING = 0.0010f; +const glm::vec3 AtmospherePropertyGroup::DEFAULT_SCATTERING_WAVELENGTHS = glm::vec3(0.650f, 0.570f, 0.475f); +const bool AtmospherePropertyGroup::DEFAULT_HAS_STARS = true; void AtmospherePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ATMOSPHERE_CENTER, Atmosphere, atmosphere, Center, center); diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index 50ed56ef87..b4ec1a96e2 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -49,8 +49,8 @@ class ReadBitstreamToTreeParams; class AtmospherePropertyGroup : public PropertyGroup { public: - AtmospherePropertyGroup(); - virtual ~AtmospherePropertyGroup() {} + AtmospherePropertyGroup() = default; + virtual ~AtmospherePropertyGroup() = default; // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; @@ -90,14 +90,22 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged); - - DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, Center, center, glm::vec3); - DEFINE_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, InnerRadius, innerRadius, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, OuterRadius, outerRadius, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, MieScattering, mieScattering, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, RayleighScattering, rayleighScattering, float); - DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, ScatteringWavelengths, scatteringWavelengths, glm::vec3); - DEFINE_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, HasStars, hasStars, bool); + + static const glm::vec3 DEFAULT_CENTER; + static const float DEFAULT_INNER_RADIUS; + static const float DEFAULT_OUTER_RADIUS; + static const float DEFAULT_RAYLEIGH_SCATTERING; + static const float DEFAULT_MIE_SCATTERING; + static const glm::vec3 DEFAULT_SCATTERING_WAVELENGTHS; + static const bool DEFAULT_HAS_STARS; + + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, Center, center, glm::vec3, DEFAULT_CENTER); + DEFINE_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, InnerRadius, innerRadius, float, DEFAULT_INNER_RADIUS); + DEFINE_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, OuterRadius, outerRadius, float, DEFAULT_OUTER_RADIUS); + DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, MieScattering, mieScattering, float, DEFAULT_MIE_SCATTERING); + DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, RayleighScattering, rayleighScattering, float, DEFAULT_RAYLEIGH_SCATTERING); + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, ScatteringWavelengths, scatteringWavelengths, glm::vec3, DEFAULT_SCATTERING_WAVELENGTHS); + DEFINE_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, HasStars, hasStars, bool, DEFAULT_HAS_STARS); }; #endif // hifi_AtmospherePropertyGroup_h diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 97a9d77236..70d5ba0c4f 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -15,11 +15,11 @@ #include #include "BoxEntityItem.h" -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" - EntityItemPointer BoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer result { new BoxEntityItem(entityID, properties) }; return result; diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 48809287a3..05bb558767 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -16,6 +16,7 @@ #include "EntityEditPacketSender.h" #include "EntitiesLogging.h" #include "EntityItem.h" +#include "EntityItemProperties.h" EntityEditPacketSender::EntityEditPacketSender() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 23892c6fc3..cddd9df312 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -25,8 +25,8 @@ #include #include "EntityItemID.h" -#include "EntityItemProperties.h" #include "EntityItemPropertiesDefaults.h" +#include "EntityPropertyFlags.h" #include "EntityTypes.h" #include "SimulationOwner.h" @@ -34,6 +34,7 @@ class EntitySimulation; class EntityTreeElement; class EntityTreeElementExtraEncodeData; class EntityActionInterface; +class EntityItemProperties; class EntityTree; typedef std::shared_ptr EntityTreePointer; typedef std::shared_ptr EntityActionPointer; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 7c6b660be4..4cbf7a043c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -21,13 +21,7 @@ #include "EntitiesLogging.h" #include "EntityItem.h" #include "EntityItemProperties.h" -#include "EntityItemPropertiesDefaults.h" #include "ModelEntityItem.h" -#include "ParticleEffectEntityItem.h" -#include "TextEntityItem.h" -#include "ZoneEntityItem.h" -#include "PolyVoxEntityItem.h" -#include "LineEntityItem.h" #include "PolyLineEntityItem.h" AnimationPropertyGroup EntityItemProperties::_staticAnimation; @@ -39,96 +33,6 @@ EntityPropertyList PROP_LAST_ITEM = (EntityPropertyList)(PROP_AFTER_LAST_ITEM - EntityItemProperties::EntityItemProperties(EntityPropertyFlags desiredProperties) : -CONSTRUCT_PROPERTY(visible, ENTITY_ITEM_DEFAULT_VISIBLE), -CONSTRUCT_PROPERTY(position, 0.0f), -CONSTRUCT_PROPERTY(dimensions, ENTITY_ITEM_DEFAULT_DIMENSIONS), -CONSTRUCT_PROPERTY(rotation, ENTITY_ITEM_DEFAULT_ROTATION), -CONSTRUCT_PROPERTY(density, ENTITY_ITEM_DEFAULT_DENSITY), -CONSTRUCT_PROPERTY(velocity, ENTITY_ITEM_DEFAULT_VELOCITY), -CONSTRUCT_PROPERTY(gravity, ENTITY_ITEM_DEFAULT_GRAVITY), -CONSTRUCT_PROPERTY(acceleration, ENTITY_ITEM_DEFAULT_ACCELERATION), -CONSTRUCT_PROPERTY(damping, ENTITY_ITEM_DEFAULT_DAMPING), -CONSTRUCT_PROPERTY(restitution, ENTITY_ITEM_DEFAULT_RESTITUTION), -CONSTRUCT_PROPERTY(friction, ENTITY_ITEM_DEFAULT_FRICTION), -CONSTRUCT_PROPERTY(lifetime, ENTITY_ITEM_DEFAULT_LIFETIME), -CONSTRUCT_PROPERTY(created, UNKNOWN_CREATED_TIME), -CONSTRUCT_PROPERTY(script, ENTITY_ITEM_DEFAULT_SCRIPT), -CONSTRUCT_PROPERTY(scriptTimestamp, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP), -CONSTRUCT_PROPERTY(collisionSoundURL, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL), -CONSTRUCT_PROPERTY(color, ), -CONSTRUCT_PROPERTY(colorSpread, ParticleEffectEntityItem::DEFAULT_COLOR_SPREAD), -CONSTRUCT_PROPERTY(colorStart, ParticleEffectEntityItem::DEFAULT_COLOR), -CONSTRUCT_PROPERTY(colorFinish, ParticleEffectEntityItem::DEFAULT_COLOR), -CONSTRUCT_PROPERTY(alpha, ENTITY_ITEM_DEFAULT_ALPHA), -CONSTRUCT_PROPERTY(alphaSpread, ParticleEffectEntityItem::DEFAULT_ALPHA_SPREAD), -CONSTRUCT_PROPERTY(alphaStart, ParticleEffectEntityItem::DEFAULT_ALPHA_START), -CONSTRUCT_PROPERTY(alphaFinish, ParticleEffectEntityItem::DEFAULT_ALPHA_FINISH), -CONSTRUCT_PROPERTY(modelURL, ""), -CONSTRUCT_PROPERTY(compoundShapeURL, ""), -CONSTRUCT_PROPERTY(registrationPoint, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT), -CONSTRUCT_PROPERTY(angularVelocity, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY), -CONSTRUCT_PROPERTY(angularDamping, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING), -CONSTRUCT_PROPERTY(ignoreForCollisions, ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS), -CONSTRUCT_PROPERTY(collisionsWillMove, ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE), -CONSTRUCT_PROPERTY(isSpotlight, false), -CONSTRUCT_PROPERTY(intensity, 1.0f), -CONSTRUCT_PROPERTY(exponent, 0.0f), -CONSTRUCT_PROPERTY(cutoff, ENTITY_ITEM_DEFAULT_CUTOFF), -CONSTRUCT_PROPERTY(locked, ENTITY_ITEM_DEFAULT_LOCKED), -CONSTRUCT_PROPERTY(textures, ""), -CONSTRUCT_PROPERTY(userData, ENTITY_ITEM_DEFAULT_USER_DATA), -CONSTRUCT_PROPERTY(simulationOwner, SimulationOwner()), -CONSTRUCT_PROPERTY(text, TextEntityItem::DEFAULT_TEXT), -CONSTRUCT_PROPERTY(lineHeight, TextEntityItem::DEFAULT_LINE_HEIGHT), -CONSTRUCT_PROPERTY(textColor, TextEntityItem::DEFAULT_TEXT_COLOR), -CONSTRUCT_PROPERTY(backgroundColor, TextEntityItem::DEFAULT_BACKGROUND_COLOR), -CONSTRUCT_PROPERTY(shapeType, SHAPE_TYPE_NONE), -CONSTRUCT_PROPERTY(maxParticles, ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES), -CONSTRUCT_PROPERTY(lifespan, ParticleEffectEntityItem::DEFAULT_LIFESPAN), -CONSTRUCT_PROPERTY(emitRate, ParticleEffectEntityItem::DEFAULT_EMIT_RATE), -CONSTRUCT_PROPERTY(emitSpeed, ParticleEffectEntityItem::DEFAULT_EMIT_SPEED), -CONSTRUCT_PROPERTY(speedSpread, ParticleEffectEntityItem::DEFAULT_SPEED_SPREAD), -CONSTRUCT_PROPERTY(emitOrientation, ParticleEffectEntityItem::DEFAULT_EMIT_ORIENTATION), -CONSTRUCT_PROPERTY(emitDimensions, ParticleEffectEntityItem::DEFAULT_EMIT_DIMENSIONS), -CONSTRUCT_PROPERTY(emitRadiusStart, ParticleEffectEntityItem::DEFAULT_EMIT_RADIUS_START), -CONSTRUCT_PROPERTY(polarStart, ParticleEffectEntityItem::DEFAULT_POLAR_START), -CONSTRUCT_PROPERTY(polarFinish, ParticleEffectEntityItem::DEFAULT_POLAR_FINISH), -CONSTRUCT_PROPERTY(azimuthStart, ParticleEffectEntityItem::DEFAULT_AZIMUTH_START), -CONSTRUCT_PROPERTY(azimuthFinish, ParticleEffectEntityItem::DEFAULT_AZIMUTH_FINISH), -CONSTRUCT_PROPERTY(emitAcceleration, ParticleEffectEntityItem::DEFAULT_EMIT_ACCELERATION), -CONSTRUCT_PROPERTY(accelerationSpread, ParticleEffectEntityItem::DEFAULT_ACCELERATION_SPREAD), -CONSTRUCT_PROPERTY(particleRadius, ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS), -CONSTRUCT_PROPERTY(radiusSpread, ParticleEffectEntityItem::DEFAULT_RADIUS_SPREAD), -CONSTRUCT_PROPERTY(radiusStart, ParticleEffectEntityItem::DEFAULT_RADIUS_START), -CONSTRUCT_PROPERTY(radiusFinish, ParticleEffectEntityItem::DEFAULT_RADIUS_FINISH), -CONSTRUCT_PROPERTY(marketplaceID, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID), -CONSTRUCT_PROPERTY(keyLightColor, ZoneEntityItem::DEFAULT_KEYLIGHT_COLOR), -CONSTRUCT_PROPERTY(keyLightIntensity, ZoneEntityItem::DEFAULT_KEYLIGHT_INTENSITY), -CONSTRUCT_PROPERTY(keyLightAmbientIntensity, ZoneEntityItem::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY), -CONSTRUCT_PROPERTY(keyLightDirection, ZoneEntityItem::DEFAULT_KEYLIGHT_DIRECTION), -CONSTRUCT_PROPERTY(voxelVolumeSize, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE), -CONSTRUCT_PROPERTY(voxelData, PolyVoxEntityItem::DEFAULT_VOXEL_DATA), -CONSTRUCT_PROPERTY(voxelSurfaceStyle, PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE), -CONSTRUCT_PROPERTY(name, ENTITY_ITEM_DEFAULT_NAME), -CONSTRUCT_PROPERTY(backgroundMode, BACKGROUND_MODE_INHERIT), -CONSTRUCT_PROPERTY(sourceUrl, ""), -CONSTRUCT_PROPERTY(lineWidth, LineEntityItem::DEFAULT_LINE_WIDTH), -CONSTRUCT_PROPERTY(linePoints, QVector()), -CONSTRUCT_PROPERTY(faceCamera, TextEntityItem::DEFAULT_FACE_CAMERA), -CONSTRUCT_PROPERTY(actionData, QByteArray()), -CONSTRUCT_PROPERTY(normals, QVector()), -CONSTRUCT_PROPERTY(strokeWidths, QVector()), -CONSTRUCT_PROPERTY(xTextureURL, ""), -CONSTRUCT_PROPERTY(yTextureURL, ""), -CONSTRUCT_PROPERTY(zTextureURL, ""), -CONSTRUCT_PROPERTY(xNNeighborID, UNKNOWN_ENTITY_ID), -CONSTRUCT_PROPERTY(yNNeighborID, UNKNOWN_ENTITY_ID), -CONSTRUCT_PROPERTY(zNNeighborID, UNKNOWN_ENTITY_ID), -CONSTRUCT_PROPERTY(xPNeighborID, UNKNOWN_ENTITY_ID), -CONSTRUCT_PROPERTY(yPNeighborID, UNKNOWN_ENTITY_ID), -CONSTRUCT_PROPERTY(zPNeighborID, UNKNOWN_ENTITY_ID), - - _id(UNKNOWN_ENTITY_ID), _idSet(false), _lastEdited(0), @@ -147,9 +51,6 @@ _desiredProperties(desiredProperties) { } -EntityItemProperties::~EntityItemProperties() { -} - void EntityItemProperties::setSittingPoints(const QVector& sittingPoints) { _sittingPoints.clear(); foreach (SittingPoint sitPoint, sittingPoints) { diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index a12328e438..22a4a298ef 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -32,12 +32,18 @@ #include "AnimationPropertyGroup.h" #include "AtmospherePropertyGroup.h" #include "EntityItemID.h" +#include "EntityItemPropertiesDefaults.h" #include "EntityItemPropertiesMacros.h" #include "EntityTypes.h" #include "EntityPropertyFlags.h" +#include "LineEntityItem.h" +#include "ParticleEffectEntityItem.h" +#include "PolyVoxEntityItem.h" #include "SimulationOwner.h" #include "SkyboxPropertyGroup.h" #include "StagePropertyGroup.h" +#include "TextEntityItem.h" +#include "ZoneEntityItem.h" const quint64 UNKNOWN_CREATED_TIME = 0; @@ -60,7 +66,7 @@ class EntityItemProperties { friend class PolyLineEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); - virtual ~EntityItemProperties(); + virtual ~EntityItemProperties() = default; EntityTypes::EntityType getType() const { return _type; } void setType(EntityTypes::EntityType type) { _type = type; } @@ -83,108 +89,108 @@ public: void debugDump() const; void setLastEdited(quint64 usecTime); - // Note: DEFINE_PROPERTY(PROP_FOO, Foo, foo, type) creates the following methods and variables: + // Note: DEFINE_PROPERTY(PROP_FOO, Foo, foo, type, value) creates the following methods and variables: // type getFoo() const; // void setFoo(type); // bool fooChanged() const; - // type _foo; - // bool _fooChanged; + // type _foo { value }; + // bool _fooChanged { false }; - DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool); - DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, glm::vec3); - DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3); - DEFINE_PROPERTY_REF(PROP_ROTATION, Rotation, rotation, glm::quat); - DEFINE_PROPERTY(PROP_DENSITY, Density, density, float); - DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, glm::vec3); - DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, glm::vec3); - DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3); - DEFINE_PROPERTY(PROP_DAMPING, Damping, damping, float); - DEFINE_PROPERTY(PROP_RESTITUTION, Restitution, restitution, float); - DEFINE_PROPERTY(PROP_FRICTION, Friction, friction, float); - DEFINE_PROPERTY(PROP_LIFETIME, Lifetime, lifetime, float); - DEFINE_PROPERTY(PROP_CREATED, Created, created, quint64); - DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString); - DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); - DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); - DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, xColor); - DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, xColor); - DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, xColor); - DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, xColor); - DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float); - DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); - DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float); - DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); - 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); - DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3); - DEFINE_PROPERTY(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); - DEFINE_PROPERTY(PROP_IGNORE_FOR_COLLISIONS, IgnoreForCollisions, ignoreForCollisions, bool); - DEFINE_PROPERTY(PROP_COLLISIONS_WILL_MOVE, CollisionsWillMove, collisionsWillMove, bool); - DEFINE_PROPERTY(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool); - DEFINE_PROPERTY(PROP_INTENSITY, Intensity, intensity, float); - DEFINE_PROPERTY(PROP_EXPONENT, Exponent, exponent, float); - DEFINE_PROPERTY(PROP_CUTOFF, Cutoff, cutoff, float); - DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool); - DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString); - DEFINE_PROPERTY_REF(PROP_USER_DATA, UserData, userData, QString); - DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); - DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString); - DEFINE_PROPERTY(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); - DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, xColor); - DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, xColor); - DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); - DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); - DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float); - DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); - DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float); - DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float); - DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float); - DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat); - DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3); - DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); - DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float); - DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float); - DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float); - DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float); - DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3); - DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3); - DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); - DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); - DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float); - DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); - DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor); - DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); - DEFINE_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, KeyLightAmbientIntensity, keyLightAmbientIntensity, float); - DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, glm::vec3); - DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3); - DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); - DEFINE_PROPERTY_REF(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); - DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString); - DEFINE_PROPERTY_REF_ENUM(PROP_BACKGROUND_MODE, BackgroundMode, backgroundMode, BackgroundMode); + DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE); + 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, 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); + DEFINE_PROPERTY(PROP_LIFETIME, Lifetime, lifetime, float, ENTITY_ITEM_DEFAULT_LIFETIME); + DEFINE_PROPERTY(PROP_CREATED, Created, created, quint64, UNKNOWN_CREATED_TIME); + 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_COLOR); + DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, xColor, ParticleEffectEntityItem::DEFAULT_COLOR_SPREAD); + DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, xColor, ParticleEffectEntityItem::DEFAULT_COLOR); + DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, xColor, ParticleEffectEntityItem::DEFAULT_COLOR); + DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, ParticleEffectEntityItem::DEFAULT_ALPHA); + DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, ParticleEffectEntityItem::DEFAULT_ALPHA_SPREAD); + DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, ParticleEffectEntityItem::DEFAULT_ALPHA); + DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, ParticleEffectEntityItem::DEFAULT_ALPHA); + 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(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING); + DEFINE_PROPERTY(PROP_IGNORE_FOR_COLLISIONS, IgnoreForCollisions, ignoreForCollisions, bool, ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS); + DEFINE_PROPERTY(PROP_COLLISIONS_WILL_MOVE, CollisionsWillMove, collisionsWillMove, bool, ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE); + DEFINE_PROPERTY(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool, false); + DEFINE_PROPERTY(PROP_INTENSITY, Intensity, intensity, float, 1.0f); + DEFINE_PROPERTY(PROP_EXPONENT, Exponent, exponent, float, 0.0f); + DEFINE_PROPERTY(PROP_CUTOFF, Cutoff, cutoff, float, ENTITY_ITEM_DEFAULT_CUTOFF); + DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool, ENTITY_ITEM_DEFAULT_LOCKED); + DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, ""); + DEFINE_PROPERTY_REF(PROP_USER_DATA, UserData, userData, QString, ENTITY_ITEM_DEFAULT_USER_DATA); + 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_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); + DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES); + DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, ParticleEffectEntityItem::DEFAULT_LIFESPAN); + DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool, true); + DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float, ParticleEffectEntityItem::DEFAULT_EMIT_RATE); + DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float, ParticleEffectEntityItem::DEFAULT_EMIT_SPEED); + DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float, ParticleEffectEntityItem::DEFAULT_SPEED_SPREAD); + DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, ParticleEffectEntityItem::DEFAULT_EMIT_ORIENTATION); + DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, ParticleEffectEntityItem::DEFAULT_EMIT_DIMENSIONS); + DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, ParticleEffectEntityItem::DEFAULT_EMIT_RADIUS_START); + DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, ParticleEffectEntityItem::DEFAULT_POLAR_START); + DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, ParticleEffectEntityItem::DEFAULT_POLAR_FINISH); + DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, ParticleEffectEntityItem::DEFAULT_AZIMUTH_START); + DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, ParticleEffectEntityItem::DEFAULT_AZIMUTH_FINISH); + DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, ParticleEffectEntityItem::DEFAULT_EMIT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, ParticleEffectEntityItem::DEFAULT_ACCELERATION_SPREAD); + DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS); + DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, ParticleEffectEntityItem::DEFAULT_RADIUS_SPREAD); + DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, ParticleEffectEntityItem::DEFAULT_RADIUS_START); + DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float, ParticleEffectEntityItem::DEFAULT_RADIUS_FINISH); + DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor, ZoneEntityItem::DEFAULT_KEYLIGHT_COLOR); + DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float, ZoneEntityItem::DEFAULT_KEYLIGHT_INTENSITY); + DEFINE_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, KeyLightAmbientIntensity, keyLightAmbientIntensity, float, ZoneEntityItem::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY); + DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, glm::vec3, ZoneEntityItem::DEFAULT_KEYLIGHT_DIRECTION); + 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); + DEFINE_PROPERTY_REF_ENUM(PROP_BACKGROUND_MODE, BackgroundMode, backgroundMode, BackgroundMode, BACKGROUND_MODE_INHERIT); DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup); DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); - DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); - DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float); - DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector); - DEFINE_PROPERTY_REF(PROP_HREF, Href, href, QString); - DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString); - DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); - DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray); - DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector); - DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); - DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); - DEFINE_PROPERTY_REF(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); - DEFINE_PROPERTY_REF(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); - DEFINE_PROPERTY_REF(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID); - DEFINE_PROPERTY_REF(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID); - DEFINE_PROPERTY_REF(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID); - DEFINE_PROPERTY_REF(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID); - DEFINE_PROPERTY_REF(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID); - DEFINE_PROPERTY_REF(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID); + 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(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, QVector()); + DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector, QVector()); + DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString, ""); + DEFINE_PROPERTY_REF(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString, ""); + DEFINE_PROPERTY_REF(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString, ""); + DEFINE_PROPERTY_REF(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); + DEFINE_PROPERTY_REF(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); + DEFINE_PROPERTY_REF(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); + DEFINE_PROPERTY_REF(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); + DEFINE_PROPERTY_REF(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); + DEFINE_PROPERTY_REF(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID); static QString getBackgroundModeString(BackgroundMode mode); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index a4aca0b344..538d7dd890 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -16,6 +16,8 @@ #include +#include + // There is a minor performance gain when comparing/copying an existing glm::vec3 rather than // creating a new one on the stack so we declare the ZERO_VEC3 constant as an optimization. const glm::vec3 ENTITY_ITEM_ZERO_VEC3 = glm::vec3(0.0f); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 5dcbf2e69d..b3299b6fe6 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -9,12 +9,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include #ifndef hifi_EntityItemPropertiesMacros_h #define hifi_EntityItemPropertiesMacros_h +#include + #include "EntityItemID.h" +#include #define APPEND_ENTITY_PROPERTY(P,V) \ if (requestedProperties.getHasProperty(P)) { \ @@ -329,10 +331,6 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid set##S##FromString(newValue); \ } \ } - -#define CONSTRUCT_PROPERTY(n, V) \ - _##n(V), \ - _##n##Changed(false) #define DEFINE_PROPERTY_GROUP(N, n, T) \ public: \ @@ -348,57 +346,45 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid #define ADD_GROUP_PROPERTY_TO_MAP(P, G, g, N, n) \ _propertyStringsToEnums[#g "." #n] = P; -#define DEFINE_PROPERTY(P, N, n, T) \ +#define DEFINE_CORE(N, n, T, V) \ + public: \ + bool n##Changed() const { return _##n##Changed; } \ + void set##N##Changed(bool value) { _##n##Changed = value; } \ + private: \ + T _##n = V; \ + bool _##n##Changed { false }; + +#define DEFINE_PROPERTY(P, N, n, T, V) \ public: \ T get##N() const { return _##n; } \ void set##N(T value) { _##n = value; _##n##Changed = true; } \ - bool n##Changed() const { return _##n##Changed; } \ - void set##N##Changed(bool value) { _##n##Changed = value; } \ - private: \ - T _##n; \ - bool _##n##Changed = false; + DEFINE_CORE(N, n, T, V) -#define DEFINE_PROPERTY_REF(P, N, n, T) \ +#define DEFINE_PROPERTY_REF(P, N, n, T, V) \ public: \ const T& get##N() const { return _##n; } \ void set##N(const T& value) { _##n = value; _##n##Changed = true; } \ - bool n##Changed() const { return _##n##Changed; } \ - void set##N##Changed(bool value) { _##n##Changed = value; } \ - private: \ - T _##n; \ - bool _##n##Changed = false; + DEFINE_CORE(N, n, T, V) -#define DEFINE_PROPERTY_REF_WITH_SETTER(P, N, n, T) \ +#define DEFINE_PROPERTY_REF_WITH_SETTER(P, N, n, T, V) \ public: \ const T& get##N() const { return _##n; } \ void set##N(const T& value); \ - bool n##Changed() const; \ - void set##N##Changed(bool value) { _##n##Changed = value; } \ - private: \ - T _##n; \ - bool _##n##Changed; + DEFINE_CORE(N, n, T, V) -#define DEFINE_PROPERTY_REF_WITH_SETTER_AND_GETTER(P, N, n, T) \ +#define DEFINE_PROPERTY_REF_WITH_SETTER_AND_GETTER(P, N, n, T, V) \ public: \ T get##N() const; \ void set##N(const T& value); \ - bool n##Changed() const; \ - void set##N##Changed(bool value) { _##n##Changed = value; } \ - private: \ - T _##n; \ - bool _##n##Changed; + DEFINE_CORE(N, n, T, V) -#define DEFINE_PROPERTY_REF_ENUM(P, N, n, T) \ +#define DEFINE_PROPERTY_REF_ENUM(P, N, n, T, V) \ public: \ const T& get##N() const { return _##n; } \ void set##N(const T& value) { _##n = value; _##n##Changed = true; } \ - bool n##Changed() const { return _##n##Changed; } \ QString get##N##AsString() const; \ void set##N##FromString(const QString& name); \ - void set##N##Changed(bool value) { _##n##Changed = value; } \ - private: \ - T _##n; \ - bool _##n##Changed; + DEFINE_CORE(N, n, T, V) #define DEBUG_PROPERTY(D, P, N, n, x) \ D << " " << #n << ":" << P.get##N() << x << "[changed:" << P.n##Changed() << "]\n"; diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 47f5312d88..cf10bdb997 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -28,7 +28,7 @@ #include "EntityEditPacketSender.h" #include "EntitiesScriptEngineProvider.h" - +#include "EntityItemProperties.h" class EntityTree; class MouseEvent; diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 9448c5523a..48c30caf20 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -14,8 +14,9 @@ #include #include -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" EntityTreeElement::EntityTreeElement(unsigned char* octalCode) : OctreeElement() { diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 376b84921a..fd3f674c5e 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -14,10 +14,11 @@ #include +#include "EntitiesLogging.h" #include "EntityItemID.h" +#include "EntityItemProperties.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "EntitiesLogging.h" #include "LightEntityItem.h" bool LightEntityItem::_lightsArePickable = false; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index ab9b656963..e03d3a7a96 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -9,19 +9,18 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "LineEntityItem.h" #include #include -#include "LineEntityItem.h" -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" #include "OctreeConstants.h" - - const float LineEntityItem::DEFAULT_LINE_WIDTH = 2.0f; const int LineEntityItem::MAX_POINTS_PER_LINE = 70; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index bcf2318a0d..eb2f1b0ebd 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -14,9 +14,10 @@ #include #include +#include "EntitiesLogging.h" +#include "EntityItemProperties.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "EntitiesLogging.h" #include "ResourceCache.h" #include "ModelEntityItem.h" @@ -264,7 +265,7 @@ bool ModelEntityItem::isAnimatingSomething() const { } bool ModelEntityItem::needsToCallUpdate() const { - return isAnimatingSomething() ? true : EntityItem::needsToCallUpdate(); + return isAnimatingSomething() || EntityItem::needsToCallUpdate(); } void ModelEntityItem::update(const quint64& now) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 187cad48eb..e8ffcab3e7 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -14,7 +14,8 @@ #include -#include "EntityItem.h" +#include "EntityItem.h" +#include "AnimationPropertyGroup.h" class ModelEntityItem : public EntityItem { public: diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index f6ed4a06ab..e17ef82f11 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -104,7 +104,6 @@ EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID), _lastSimulated(usecTimestampNow()), - _isEmitting(true), _particleLifetimes(DEFAULT_MAX_PARTICLES, 0.0f), _particlePositions(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)), _particleVelocities(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)), diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 7f5e67aecb..029d65cfc0 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -250,7 +250,7 @@ protected: quint64 _lastSimulated; - bool _isEmitting; + bool _isEmitting = true; QString _textures = DEFAULT_TEXTURES; bool _texturesChangedFlag = false; diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index fbb8250882..352d0425bf 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -14,13 +14,12 @@ #include -#include "PolyLineEntityItem.h" -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" #include "OctreeConstants.h" - - +#include "PolyLineEntityItem.h" const float PolyLineEntityItem::DEFAULT_LINE_WIDTH = 0.1f; const int PolyLineEntityItem::MAX_POINTS_PER_LINE = 70; diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index 368954b891..403d0bb1bc 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -16,11 +16,11 @@ #include -#include "PolyVoxEntityItem.h" -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" - +#include "PolyVoxEntityItem.h" const glm::vec3 PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE = glm::vec3(32, 32, 32); const float PolyVoxEntityItem::MAX_VOXEL_DIMENSION = 128.0f; diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index 8d7de67837..81465bfaf5 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -11,6 +11,7 @@ #include "RecurseOctreeToMapOperator.h" +#include "EntityItemProperties.h" RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, OctreeElementPointer top, diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index b79b535d8e..d291627d1e 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -15,10 +15,7 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -SkyboxPropertyGroup::SkyboxPropertyGroup() { - _color.red = _color.green = _color.blue = 0; - _url = QString(); -} +const xColor 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); diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 6e8d4340fe..9e0b77cc03 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -12,6 +12,10 @@ #ifndef hifi_SkyboxPropertyGroup_h #define hifi_SkyboxPropertyGroup_h +#include + +#include + #include #include "PropertyGroup.h" @@ -23,14 +27,10 @@ class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; -#include -#include - - class SkyboxPropertyGroup : public PropertyGroup { public: - SkyboxPropertyGroup(); - virtual ~SkyboxPropertyGroup() {} + SkyboxPropertyGroup() = default; + virtual ~SkyboxPropertyGroup() = default; // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; @@ -78,9 +78,9 @@ public: return color; } - - DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, xColor); - DEFINE_PROPERTY_REF(PROP_SKYBOX_URL, URL, url, QString); + static const xColor DEFAULT_COLOR; + DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, xColor, DEFAULT_COLOR); + DEFINE_PROPERTY_REF(PROP_SKYBOX_URL, URL, url, QString, ""); }; #endif // hifi_SkyboxPropertyGroup_h diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 3f41ef6d91..26177f89de 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -17,12 +17,12 @@ #include #include +#include "EntitiesLogging.h" +#include "EntityItemProperties.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "EntitiesLogging.h" #include "SphereEntityItem.h" - EntityItemPointer SphereEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer result { new SphereEntityItem(entityID, properties) }; return result; diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp index 7110f0481d..629f65b72f 100644 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -26,16 +26,6 @@ const float StagePropertyGroup::DEFAULT_STAGE_ALTITUDE = 0.03f; const quint16 StagePropertyGroup::DEFAULT_STAGE_DAY = 60; const float StagePropertyGroup::DEFAULT_STAGE_HOUR = 12.0f; -StagePropertyGroup::StagePropertyGroup() { - _sunModelEnabled = DEFAULT_STAGE_SUN_MODEL_ENABLED; - _latitude = DEFAULT_STAGE_LATITUDE; - _longitude = DEFAULT_STAGE_LONGITUDE; - _altitude = DEFAULT_STAGE_ALTITUDE; - _day = DEFAULT_STAGE_DAY; - _hour = DEFAULT_STAGE_HOUR; - _automaticHourDay = false; -} - void StagePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_SUN_MODEL_ENABLED, Stage, stage, SunModelEnabled, sunModelEnabled); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_LATITUDE, Stage, stage, Latitude, latitude); diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index 208eff479c..b8a8b5b6d2 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -29,8 +29,8 @@ class ReadBitstreamToTreeParams; class StagePropertyGroup : public PropertyGroup { public: - StagePropertyGroup(); - virtual ~StagePropertyGroup() {} + StagePropertyGroup() = default; + virtual ~StagePropertyGroup() = default; // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; @@ -79,14 +79,14 @@ public: float calculateHour() const; uint16_t calculateDay() const; - - DEFINE_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled, sunModelEnabled, bool); - DEFINE_PROPERTY(PROP_STAGE_LATITUDE, Latitude, latitude, float); - DEFINE_PROPERTY(PROP_STAGE_LONGITUDE, Longitude, longitude, float); - DEFINE_PROPERTY(PROP_STAGE_ALTITUDE, Altitude, altitude, float); - DEFINE_PROPERTY(PROP_STAGE_DAY, Day, day, uint16_t); - DEFINE_PROPERTY(PROP_STAGE_HOUR, Hour, hour, float); - DEFINE_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay, automaticHourDay, bool); + + DEFINE_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled, sunModelEnabled, bool, DEFAULT_STAGE_SUN_MODEL_ENABLED); + DEFINE_PROPERTY(PROP_STAGE_LATITUDE, Latitude, latitude, float, DEFAULT_STAGE_LATITUDE); + DEFINE_PROPERTY(PROP_STAGE_LONGITUDE, Longitude, longitude, float, DEFAULT_STAGE_LONGITUDE); + DEFINE_PROPERTY(PROP_STAGE_ALTITUDE, Altitude, altitude, float, DEFAULT_STAGE_ALTITUDE); + DEFINE_PROPERTY(PROP_STAGE_DAY, Day, day, uint16_t, DEFAULT_STAGE_DAY); + DEFINE_PROPERTY(PROP_STAGE_HOUR, Hour, hour, float, DEFAULT_STAGE_HOUR); + DEFINE_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay, automaticHourDay, bool, false); }; #endif // hifi_StagePropertyGroup_h diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index d19e3be4c9..49d3c13d80 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -17,12 +17,12 @@ #include #include +#include "EntityItemProperties.h" +#include "EntitiesLogging.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "EntitiesLogging.h" #include "TextEntityItem.h" - const QString TextEntityItem::DEFAULT_TEXT(""); const float TextEntityItem::DEFAULT_LINE_HEIGHT = 0.1f; const xColor TextEntityItem::DEFAULT_TEXT_COLOR = { 255, 255, 255 }; diff --git a/libraries/entities/src/UpdateEntityOperator.cpp b/libraries/entities/src/UpdateEntityOperator.cpp index 5d6f3986b2..617663f48a 100644 --- a/libraries/entities/src/UpdateEntityOperator.cpp +++ b/libraries/entities/src/UpdateEntityOperator.cpp @@ -9,11 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "EntityItem.h" -#include "EntityTree.h" -#include "EntityTreeElement.h" -#include "EntitiesLogging.h" - #include "UpdateEntityOperator.h" UpdateEntityOperator::UpdateEntityOperator(EntityTreePointer tree, diff --git a/libraries/entities/src/UpdateEntityOperator.h b/libraries/entities/src/UpdateEntityOperator.h index f1c791f9f1..46322997f7 100644 --- a/libraries/entities/src/UpdateEntityOperator.h +++ b/libraries/entities/src/UpdateEntityOperator.h @@ -12,6 +12,12 @@ #ifndef hifi_UpdateEntityOperator_h #define hifi_UpdateEntityOperator_h +#include "EntitiesLogging.h" +#include "EntityItem.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" +#include "EntityTreeElement.h" + class UpdateEntityOperator : public RecurseOctreeOperator { public: UpdateEntityOperator(EntityTreePointer tree, EntityTreeElementPointer containingElement, diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp index 496f2b412d..56f8357c8f 100644 --- a/libraries/entities/src/WebEntityItem.cpp +++ b/libraries/entities/src/WebEntityItem.cpp @@ -15,10 +15,10 @@ #include #include +#include "EntitiesLogging.h" +#include "EntityItemProperties.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "EntitiesLogging.h" - const QString WebEntityItem::DEFAULT_SOURCE_URL("http://www.google.com"); diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 69357426ed..3147af35e8 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -14,10 +14,11 @@ #include -#include "ZoneEntityItem.h" -#include "EntityTree.h" #include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" #include "EntityTreeElement.h" +#include "ZoneEntityItem.h" bool ZoneEntityItem::_zonesArePickable = false; bool ZoneEntityItem::_drawZoneBoundaries = false; diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index a81cc97c2f..e7f2e03981 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -17,6 +17,8 @@ #include "AtmospherePropertyGroup.h" #include "EntityItem.h" #include "EntityTree.h" +#include "SkyboxPropertyGroup.h" +#include "StagePropertyGroup.h" class ZoneEntityItem : public EntityItem { public: diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 9cbe89dda6..42bf9bd438 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -10,6 +10,7 @@ // #include +#include #include #include From ae83dfe041be5e6140e9a9fea664542e81bb5420 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 9 Oct 2015 12:22:55 -0700 Subject: [PATCH 09/18] Move auto-resize to update --- interface/src/Application.cpp | 2 +- .../src/RenderableModelEntityItem.cpp | 29 ++++++++++++------- .../src/RenderableModelEntityItem.h | 5 ++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4589651728..cfeb77f638 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4068,7 +4068,7 @@ bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { } bool Application::askToUploadAsset(const QString& filename) { - if (DependencyManager::get()->getThisNodeCanRez()) { + if (!DependencyManager::get()->getThisNodeCanRez()) { QMessageBox::warning(_window, "Failed Upload", QString("You don't have upload rights on that domain.\n\n")); return false; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index f48f8ec71e..f4f8c4c2f7 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -298,16 +298,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } bool movingOrAnimating = isMoving() || isAnimatingSomething(); - if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive()) { - if (!_dimensionsInitialized) { - EntityItemProperties properties; - auto extents = _model->getMeshExtents(); - properties.setDimensions(extents.maximum - extents.minimum); - - qCDebug(entitiesrenderer) << "Autoresizing:" << (!getName().isEmpty() ? getName() : getModelURL()); - DependencyManager::get()->editEntity(getEntityItemID(), properties); - } - + if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive() && _dimensionsInitialized) { _model->setScaleToFit(true, getDimensions()); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); _model->setRotation(getRotation()); @@ -376,7 +367,23 @@ Model* RenderableModelEntityItem::getModel(EntityTreeRenderer* renderer) { } bool RenderableModelEntityItem::needsToCallUpdate() const { - return _needsInitialSimulation || ModelEntityItem::needsToCallUpdate(); + return !_dimensionsInitialized || _needsInitialSimulation || ModelEntityItem::needsToCallUpdate(); +} + +void RenderableModelEntityItem::update(const quint64& now) { + if (!_dimensionsInitialized && _model && _model->isActive()) { + EntityItemProperties properties; + auto extents = _model->getMeshExtents(); + properties.setDimensions(extents.maximum - extents.minimum); + + qCDebug(entitiesrenderer) << "Autoresizing:" << (!getName().isEmpty() ? getName() : getModelURL()); + QMetaObject::invokeMethod(DependencyManager::get().data(), "editEntity", + Qt::QueuedConnection, + Q_ARG(QUuid, getEntityItemID()), + Q_ARG(EntityItemProperties, properties)); + } + + ModelEntityItem::update(now); } EntityItemProperties RenderableModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 60ac710d5e..c87f70d4d6 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -57,8 +57,9 @@ public: void** intersectedObject, bool precisionPicking) const; Model* getModel(EntityTreeRenderer* renderer); - - bool needsToCallUpdate() const; + + virtual bool needsToCallUpdate() const; + virtual void update(const quint64& now); virtual void setCompoundShapeURL(const QString& url); From 3e71c4cc4e9f15bc80955fea7f239ce9255de6fb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 9 Oct 2015 13:18:05 -0700 Subject: [PATCH 10/18] CR --- libraries/entities/src/AnimationPropertyGroup.h | 2 -- libraries/entities/src/AtmospherePropertyGroup.h | 3 --- libraries/entities/src/PropertyGroup.h | 3 +-- libraries/entities/src/SkyboxPropertyGroup.h | 3 --- libraries/entities/src/StagePropertyGroup.h | 3 --- tests/entities/src/main.cpp | 3 ++- 6 files changed, 3 insertions(+), 14 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 848632b13e..d0d218f4b3 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -31,8 +31,6 @@ class ReadBitstreamToTreeParams; class AnimationPropertyGroup : public PropertyGroup { public: - AnimationPropertyGroup() = default; - virtual ~AnimationPropertyGroup() = default; void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } // EntityItemProperty related helpers diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index b4ec1a96e2..661d91087b 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -49,9 +49,6 @@ class ReadBitstreamToTreeParams; class AtmospherePropertyGroup : public PropertyGroup { public: - AtmospherePropertyGroup() = default; - virtual ~AtmospherePropertyGroup() = default; - // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); diff --git a/libraries/entities/src/PropertyGroup.h b/libraries/entities/src/PropertyGroup.h index ea73f8656a..27d35fa714 100644 --- a/libraries/entities/src/PropertyGroup.h +++ b/libraries/entities/src/PropertyGroup.h @@ -51,8 +51,7 @@ class ReadBitstreamToTreeParams; class PropertyGroup { public: - PropertyGroup() {} - virtual ~PropertyGroup() {} + virtual ~PropertyGroup() = default; // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const = 0; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 9e0b77cc03..2ebfcfda14 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -29,9 +29,6 @@ class ReadBitstreamToTreeParams; class SkyboxPropertyGroup : public PropertyGroup { public: - SkyboxPropertyGroup() = default; - virtual ~SkyboxPropertyGroup() = default; - // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index b8a8b5b6d2..95964f8264 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -29,9 +29,6 @@ class ReadBitstreamToTreeParams; class StagePropertyGroup : public PropertyGroup { public: - StagePropertyGroup() = default; - virtual ~StagePropertyGroup() = default; - // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); diff --git a/tests/entities/src/main.cpp b/tests/entities/src/main.cpp index 1b150ee3f5..0cbd354e92 100644 --- a/tests/entities/src/main.cpp +++ b/tests/entities/src/main.cpp @@ -16,9 +16,10 @@ #include #include -#include #include +#include #include +#include const QString& getTestResourceDir() { static QString dir; From c6c44e8b810b647ab707432d9c3e1bcf65b66e55 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Oct 2015 15:42:30 -0700 Subject: [PATCH 11/18] add a userdata flag that allows toggling of the ignoreForCollisions entity property when an item is held. --- examples/controllers/handControllerGrab.js | 33 +++++++++++----------- examples/grab.js | 16 +++++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 47bcc0083c..1cdd6c5a77 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -84,6 +84,11 @@ var STATE_RELEASE = 10; var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with grab.js var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js +var DEFAULT_GRABBABLE_DATA = { + grabbable: true, + invertSolidWhileHeld: false +}; + function getTag() { return "grab-" + MyAvatar.sessionUUID; } @@ -254,10 +259,6 @@ function MyController(hand, triggerAction) { this.lineOn(pickRay.origin, Vec3.multiply(pickRay.direction, LINE_LENGTH), NO_INTERSECT_COLOR); - var defaultGrabbableData = { - grabbable: true - }; - var intersection = Entities.findRayIntersection(pickRay, true); if (intersection.intersects && intersection.properties.locked === 0) { // the ray is intersecting something we can move. @@ -265,7 +266,7 @@ function MyController(hand, triggerAction) { var intersectionDistance = Vec3.distance(handControllerPosition, intersection.intersection); this.grabbedEntity = intersection.entityID; - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { this.grabbedEntity = null; return; @@ -298,7 +299,7 @@ function MyController(hand, triggerAction) { for (i = 0; i < nearbyEntities.length; i++) { - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, nearbyEntities[i], defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, nearbyEntities[i], DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { return; } @@ -690,24 +691,24 @@ function MyController(hand, triggerAction) { }; this.activateEntity = function(entityID, grabbedProperties) { + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, entityID, DEFAULT_GRABBABLE_DATA); + var invertSolidWhileHeld = grabbableData["invertSolidWhileHeld"]; var data = getEntityCustomData(GRAB_USER_DATA_KEY, entityID, {}); data["activated"] = true; data["avatarId"] = MyAvatar.sessionUUID; data["refCount"] = data["refCount"] ? data["refCount"] + 1 : 1; - // zero gravity and set ignoreForCollisions to true, but in a way that lets us put them back, after all grabs are done + // zero gravity and set ignoreForCollisions in a way that lets us put them back, after all grabs are done if (data["refCount"] == 1) { data["gravity"] = grabbedProperties.gravity; data["ignoreForCollisions"] = grabbedProperties.ignoreForCollisions; - Entities.editEntity(entityID, { - gravity: { - x: 0, - y: 0, - z: 0 - }, - ignoreForCollisions: true - }); + var whileHeldProperties = {gravity: {x:0, y:0, z:0}}; + if (invertSolidWhileHeld) { + whileHeldProperties["ignoreForCollisions"] = ! grabbedProperties.ignoreForCollisions; + } + Entities.editEntity(entityID, whileHeldProperties); } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); + return data; }; this.deactivateEntity = function(entityID) { @@ -742,4 +743,4 @@ function cleanup() { } Script.scriptEnding.connect(cleanup); -Script.update.connect(update); \ No newline at end of file +Script.update.connect(update); diff --git a/examples/grab.js b/examples/grab.js index 1c49775a49..1a02911db9 100644 --- a/examples/grab.js +++ b/examples/grab.js @@ -29,8 +29,9 @@ var IDENTITY_QUAT = { var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with handControllerGrab.js var GRAB_USER_DATA_KEY = "grabKey"; // shared with handControllerGrab.js -var defaultGrabbableData = { - grabbable: true +var DEFAULT_GRABBABLE_DATA = { + grabbable: true, + invertSolidWhileHeld: false }; @@ -324,8 +325,7 @@ Grabber.prototype.pressEvent = function(event) { return; } - - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, pickResults.entityID, defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, pickResults.entityID, DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { return; } @@ -496,6 +496,8 @@ Grabber.prototype.keyPressEvent = function(event) { } Grabber.prototype.activateEntity = function(entityID, grabbedProperties) { + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, entityID, DEFAULT_GRABBABLE_DATA); + var invertSolidWhileHeld = grabbableData["invertSolidWhileHeld"]; var data = getEntityCustomData(GRAB_USER_DATA_KEY, entityID, {}); data["activated"] = true; data["avatarId"] = MyAvatar.sessionUUID; @@ -504,7 +506,11 @@ Grabber.prototype.activateEntity = function(entityID, grabbedProperties) { if (data["refCount"] == 1) { data["gravity"] = grabbedProperties.gravity; data["ignoreForCollisions"] = grabbedProperties.ignoreForCollisions; - Entities.editEntity(entityID, {gravity: {x:0, y:0, z:0}, ignoreForCollisions: true}); + var whileHeldProperties = {gravity: {x:0, y:0, z:0}}; + if (invertSolidWhileHeld) { + whileHeldProperties["ignoreForCollisions"] = ! grabbedProperties.ignoreForCollisions; + } + Entities.editEntity(entityID, whileHeldProperties); } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); }; From 37f530f97f37c3985f77b65b626148a613abf3a5 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 9 Oct 2015 16:15:29 -0700 Subject: [PATCH 12/18] first cut at wiring up devices and inputs to JS --- interface/src/devices/DeviceTracker.h | 4 +++- .../ControllerScriptingInterface.cpp | 24 ++++++++++++++++++- .../scripting/ControllerScriptingInterface.h | 5 +++- .../src/input-plugins/UserInputMapper.h | 7 ++++-- .../AbstractControllerScriptingInterface.h | 4 +++- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/interface/src/devices/DeviceTracker.h b/interface/src/devices/DeviceTracker.h index b28e22b06d..543e9bab1a 100644 --- a/interface/src/devices/DeviceTracker.h +++ b/interface/src/devices/DeviceTracker.h @@ -91,6 +91,9 @@ public: /// Get the name assigned to the Device when registered after creation, or "Unknown" if it hasn't been registered which should not happen. const Name& getName() const { return _name; } + typedef std::map< Name, ID > Map; + static const Map& getDevices() { return Singleton::get()->_devicesMap; } + protected: DeviceTracker(); virtual ~DeviceTracker(); @@ -103,7 +106,6 @@ private: void assignIDAndName( const ID id, const Name& name ) { _ID = id; _name = name; } typedef std::vector< DeviceTracker* > Vector; - typedef std::map< Name, ID > Map; struct SingletonData { Map _devicesMap; Vector _devicesVector; diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 6f36a6267f..1c05ae1087 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -111,7 +111,7 @@ void inputPairFromScriptValue(const QScriptValue& object, UserInputMapper::Input inputPair.second = QString(object.property("inputName").toVariant().toString()); } -void ControllerScriptingInterface::registerControllerTypes(QScriptEngine* engine) { +void ControllerScriptingInterface::registerControllerTypes(ScriptEngine* engine) { qScriptRegisterSequenceMetaType >(engine); qScriptRegisterSequenceMetaType >(engine); qScriptRegisterSequenceMetaType >(engine); @@ -119,6 +119,8 @@ void ControllerScriptingInterface::registerControllerTypes(QScriptEngine* engine qScriptRegisterMetaType(engine, inputChannelToScriptValue, inputChannelFromScriptValue); qScriptRegisterMetaType(engine, inputToScriptValue, inputFromScriptValue); qScriptRegisterMetaType(engine, inputPairToScriptValue, inputPairFromScriptValue); + + wireUpControllers(engine); } void ControllerScriptingInterface::handleMetaEvent(HFMetaEvent* event) { @@ -381,6 +383,26 @@ glm::vec2 ControllerScriptingInterface::getViewportDimensions() const { return qApp->getUiSize(); } +void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { + + qDebug() << "------------------- wire up controllers --------------------------"; + ///_registeredDevices + + auto devices = DependencyManager::get()->getDevices(); + + for(const auto& deviceMapping : devices) { + auto device = deviceMapping.second.get(); + qDebug() << device->getName(); + auto deviceInputs = device->getAvailabeInputs(); + for (const auto& inputMapping : deviceInputs) { + auto input = inputMapping.first; + auto inputName = inputMapping.second; + qDebug() << device->getName() << "." << inputName << "["<< input.getID() <<"]"; + } + } + qDebug() << "------------------- DONE wire up controllers --------------------------"; +} + AbstractInputController* ControllerScriptingInterface::createInputController(const QString& deviceName, const QString& tracker) { // This is where we retreive the Device Tracker category and then the sub tracker within it //TODO C++11 auto icIt = _inputControllers.find(0); diff --git a/interface/src/scripting/ControllerScriptingInterface.h b/interface/src/scripting/ControllerScriptingInterface.h index 6956619bf0..1cb6fdb981 100644 --- a/interface/src/scripting/ControllerScriptingInterface.h +++ b/interface/src/scripting/ControllerScriptingInterface.h @@ -56,7 +56,7 @@ class ControllerScriptingInterface : public AbstractControllerScriptingInterface public: ControllerScriptingInterface(); - virtual void registerControllerTypes(QScriptEngine* engine); + virtual void registerControllerTypes(ScriptEngine* engine); void emitKeyPressEvent(QKeyEvent* event) { emit keyPressEvent(KeyEvent(*event)); } void emitKeyReleaseEvent(QKeyEvent* event) { emit keyReleaseEvent(KeyEvent(*event)); } @@ -164,6 +164,9 @@ private: typedef std::map< AbstractInputController::Key, AbstractInputController* > InputControllerMap; InputControllerMap _inputControllers; + + void wireUpControllers(ScriptEngine* engine); + }; const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 2; // the hand and the tip diff --git a/libraries/input-plugins/src/input-plugins/UserInputMapper.h b/libraries/input-plugins/src/input-plugins/UserInputMapper.h index 2657f335a0..1ad4294e0c 100755 --- a/libraries/input-plugins/src/input-plugins/UserInputMapper.h +++ b/libraries/input-plugins/src/input-plugins/UserInputMapper.h @@ -109,7 +109,8 @@ public: class DeviceProxy { public: DeviceProxy(QString name) { _name = name; } - + const QString& getName() const { return _name; } + QString _name; ButtonGetter getButton = [] (const Input& input, int timestamp) -> bool { return false; }; AxisGetter getAxis = [] (const Input& input, int timestamp) -> float { return 0.0f; }; @@ -234,12 +235,14 @@ public: UserInputMapper(); + typedef std::map DevicesMap; + DevicesMap getDevices() { return _registeredDevices; } + signals: void actionEvent(int action, float state); protected: - typedef std::map DevicesMap; DevicesMap _registeredDevices; uint16 _nextFreeDeviceID = 1; diff --git a/libraries/script-engine/src/AbstractControllerScriptingInterface.h b/libraries/script-engine/src/AbstractControllerScriptingInterface.h index b44e13f012..d6a6b51b62 100644 --- a/libraries/script-engine/src/AbstractControllerScriptingInterface.h +++ b/libraries/script-engine/src/AbstractControllerScriptingInterface.h @@ -24,6 +24,8 @@ #include "TouchEvent.h" #include "WheelEvent.h" +class ScriptEngine; + class AbstractInputController : public QObject { Q_OBJECT @@ -52,7 +54,7 @@ class AbstractControllerScriptingInterface : public QObject { Q_OBJECT public slots: - virtual void registerControllerTypes(QScriptEngine* engine) = 0; + virtual void registerControllerTypes(ScriptEngine* engine) = 0; virtual bool isPrimaryButtonPressed() const = 0; virtual glm::vec2 getPrimaryJoystickPosition() const = 0; From 7ba149fbbdd8faf195b50218c49ffecd06a8b220 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 9 Oct 2015 16:19:14 -0700 Subject: [PATCH 13/18] Log when hydra is disconnected. --- libraries/input-plugins/src/input-plugins/SixenseManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index f542e63668..3950fdea43 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -166,6 +166,9 @@ void SixenseManager::update(float deltaTime, bool jointsCaptured) { auto userInputMapper = DependencyManager::get(); if (sixenseGetNumActiveControllers() == 0) { + if (_hydrasConnected) { + qCDebug(inputplugins, "hydra disconnected"); + } _hydrasConnected = false; if (_deviceID != 0) { userInputMapper->removeDevice(_deviceID); From 7824d03e11b4918fad6861da769b928622cc3919 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Oct 2015 17:56:32 -0700 Subject: [PATCH 14/18] grab script picks 5x per second rather than 60x --- examples/controllers/handControllerGrab.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 47bcc0083c..e040befdf8 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -67,6 +67,8 @@ var MSEC_PER_SEC = 1000.0; var startTime = Date.now(); var LIFETIME = 10; var ACTION_LIFETIME = 10; // seconds +var PICKS_PER_SECOND_PER_HAND = 5; +var MSECS_PER_SEC = 1000.0; // states for the state machine var STATE_OFF = 0; @@ -234,6 +236,7 @@ function MyController(hand, triggerAction) { this.off = function() { if (this.triggerSmoothedSqueezed()) { + this.lastPickTime = 0; this.setState(STATE_SEARCHING); return; } @@ -258,6 +261,13 @@ function MyController(hand, triggerAction) { grabbable: true }; + // don't pick 60x per second. do this check after updating the line so it's not jumpy. + var now = Date.now(); + if (now - this.lastPickTime < MSECS_PER_SEC / PICKS_PER_SECOND_PER_HAND) { + return; + } + this.lastPickTime = now; + var intersection = Entities.findRayIntersection(pickRay, true); if (intersection.intersects && intersection.properties.locked === 0) { // the ray is intersecting something we can move. From d3ee9b0f39ae19a29d55328e054309f3c48e5034 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 9 Oct 2015 20:58:23 -0700 Subject: [PATCH 15/18] more work on exposing device inputs as JavaScript named constants --- .../scripts/controllerScriptingExamples.js | 6 +++ .../ControllerScriptingInterface.cpp | 16 ++++-- .../scripting/ControllerScriptingInterface.h | 2 + libraries/script-engine/src/ScriptEngine.cpp | 51 ++++++++++++++++--- libraries/script-engine/src/ScriptEngine.h | 3 ++ 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/examples/example/scripts/controllerScriptingExamples.js b/examples/example/scripts/controllerScriptingExamples.js index 515effd15c..d803fbd20f 100644 --- a/examples/example/scripts/controllerScriptingExamples.js +++ b/examples/example/scripts/controllerScriptingExamples.js @@ -11,6 +11,12 @@ // Assumes you only have the default keyboard connected +Object.keys(Controller.Hardware).forEach(function (deviceName) { + Object.keys(Controller.Hardware[deviceName]).forEach(function (input) { + print(deviceName + "." + input + ":" + Controller.Hardware[deviceName][input]); + }); +}); + // Resets every device to its default key bindings: Controller.resetAllDeviceBindings(); diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 1c05ae1087..3262fc7d2a 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -383,21 +383,29 @@ glm::vec2 ControllerScriptingInterface::getViewportDimensions() const { return qApp->getUiSize(); } +QString ControllerScriptingInterface::sanatizeName(const QString& name) { + QString cleanName { name }; + cleanName.replace(QString(" "), QString("")).replace(QString("."), QString("")).replace(QString("("), QString("")).replace(QString(")"), QString("")); + return cleanName; +} + void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { qDebug() << "------------------- wire up controllers --------------------------"; - ///_registeredDevices auto devices = DependencyManager::get()->getDevices(); for(const auto& deviceMapping : devices) { auto device = deviceMapping.second.get(); - qDebug() << device->getName(); + auto deviceName = sanatizeName(device->getName()); auto deviceInputs = device->getAvailabeInputs(); for (const auto& inputMapping : deviceInputs) { auto input = inputMapping.first; - auto inputName = inputMapping.second; - qDebug() << device->getName() << "." << inputName << "["<< input.getID() <<"]"; + auto inputName = sanatizeName(inputMapping.second); + inputName.replace(QString(" "), QString("")); + QString deviceInputName { "Controller.Hardware." + deviceName + "." + inputName }; + engine->registerValue(deviceInputName, input.getID()); + qDebug() << deviceInputName << "[" << input.getID() << "]"; } } qDebug() << "------------------- DONE wire up controllers --------------------------"; diff --git a/interface/src/scripting/ControllerScriptingInterface.h b/interface/src/scripting/ControllerScriptingInterface.h index 1cb6fdb981..aa0526accb 100644 --- a/interface/src/scripting/ControllerScriptingInterface.h +++ b/interface/src/scripting/ControllerScriptingInterface.h @@ -150,6 +150,8 @@ public slots: virtual void releaseInputController(AbstractInputController* input); private: + QString sanatizeName(const QString& name); /// makes a name clean for inclusing in JavaScript + const PalmData* getPrimaryPalm() const; const PalmData* getPalm(int palmIndex) const; int getNumberOfActivePalms() const; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 3906d68c42..76590f266b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -277,10 +277,6 @@ void ScriptEngine::init() { registerAvatarTypes(this); registerAudioMetaTypes(this); - if (_controllerScriptingInterface) { - _controllerScriptingInterface->registerControllerTypes(this); - } - qScriptRegisterMetaType(this, EntityPropertyFlagsToScriptValue, EntityPropertyFlagsFromScriptValue); qScriptRegisterMetaType(this, EntityItemPropertiesToScriptValue, EntityItemPropertiesFromScriptValueHonorReadOnly); qScriptRegisterMetaType(this, EntityItemIDtoScriptValue, EntityItemIDfromScriptValue); @@ -323,6 +319,43 @@ void ScriptEngine::init() { // constants globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE))); + + if (_controllerScriptingInterface) { + _controllerScriptingInterface->registerControllerTypes(this); + } + + +} + +void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) { + if (QThread::currentThread() != thread()) { +#ifdef THREAD_DEBUGGING + qDebug() << "*** WARNING *** ScriptEngine::registerValue() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name; +#endif + QMetaObject::invokeMethod(this, "registerValue", + Q_ARG(const QString&, valueName), + Q_ARG(QScriptValue, value)); + return; + } + + QStringList pathToValue = valueName.split("."); + int partsToGo = pathToValue.length(); + QScriptValue partObject = globalObject(); + + for (const auto& pathPart : pathToValue) { + partsToGo--; + if (!partObject.property(pathPart).isValid()) { + if (partsToGo > 0) { + //QObject *object = new QObject; + QScriptValue partValue = newArray(); //newQObject(object, QScriptEngine::ScriptOwnership); + qDebug() << "partValue[" << pathPart<<"].isArray() :" << partValue.isArray(); + partObject.setProperty(pathPart, partValue); + } else { + partObject.setProperty(pathPart, value); + } + } + partObject = partObject.property(pathPart); + } } void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { @@ -339,9 +372,13 @@ void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { qDebug() << "ScriptEngine::registerGlobalObject() called on thread [" << QThread::currentThread() << "] name:" << name; #endif - if (object) { - QScriptValue value = newQObject(object); - globalObject().setProperty(name, value); + if (!globalObject().property(name).isValid()) { + if (object) { + QScriptValue value = newQObject(object); + globalObject().setProperty(name, value); + } else { + globalObject().setProperty(name, QScriptValue()); + } } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 3ff397e98d..1d3986143a 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -84,6 +84,9 @@ public: Q_INVOKABLE void registerFunction(const QString& parent, const QString& name, QScriptEngine::FunctionSignature fun, int numArguments = -1); + /// registers a global object by name + Q_INVOKABLE void registerValue(const QString& valueName, QScriptValue value); + /// evaluate some code in the context of the ScriptEngine and return the result Q_INVOKABLE QScriptValue evaluate(const QString& program, const QString& fileName = QString(), int lineNumber = 1); // this is also used by the script tool widget From 5c5ee8d699954f31c6a77a7d8e069777207728b2 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 9 Oct 2015 21:01:44 -0700 Subject: [PATCH 16/18] remove debug code --- interface/src/scripting/ControllerScriptingInterface.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 3262fc7d2a..f6a8ed6e3f 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -390,9 +390,6 @@ QString ControllerScriptingInterface::sanatizeName(const QString& name) { } void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { - - qDebug() << "------------------- wire up controllers --------------------------"; - auto devices = DependencyManager::get()->getDevices(); for(const auto& deviceMapping : devices) { @@ -402,13 +399,10 @@ void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { for (const auto& inputMapping : deviceInputs) { auto input = inputMapping.first; auto inputName = sanatizeName(inputMapping.second); - inputName.replace(QString(" "), QString("")); QString deviceInputName { "Controller.Hardware." + deviceName + "." + inputName }; engine->registerValue(deviceInputName, input.getID()); - qDebug() << deviceInputName << "[" << input.getID() << "]"; } } - qDebug() << "------------------- DONE wire up controllers --------------------------"; } AbstractInputController* ControllerScriptingInterface::createInputController(const QString& deviceName, const QString& tracker) { From f55b6115d675007da5c88df0e072411d500b89b4 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 9 Oct 2015 21:11:38 -0700 Subject: [PATCH 17/18] cleanup sanatize name function --- interface/src/scripting/ControllerScriptingInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index f6a8ed6e3f..0127f8b88f 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -385,7 +385,7 @@ glm::vec2 ControllerScriptingInterface::getViewportDimensions() const { QString ControllerScriptingInterface::sanatizeName(const QString& name) { QString cleanName { name }; - cleanName.replace(QString(" "), QString("")).replace(QString("."), QString("")).replace(QString("("), QString("")).replace(QString(")"), QString("")); + cleanName.remove(QRegularExpression{"[\\(\\)\\.\\s]"}); return cleanName; } From 63f3156a613c371e73b9d5b5ef6bd36ef9f5965b Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 9 Oct 2015 21:23:19 -0700 Subject: [PATCH 18/18] add Controler.Actions --- .../example/scripts/controllerScriptingExamples.js | 4 ++++ .../src/scripting/ControllerScriptingInterface.cpp | 12 +++++++++++- .../src/input-plugins/UserInputMapper.cpp | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/examples/example/scripts/controllerScriptingExamples.js b/examples/example/scripts/controllerScriptingExamples.js index d803fbd20f..88c4ae2daa 100644 --- a/examples/example/scripts/controllerScriptingExamples.js +++ b/examples/example/scripts/controllerScriptingExamples.js @@ -17,6 +17,10 @@ Object.keys(Controller.Hardware).forEach(function (deviceName) { }); }); +Object.keys(Controller.Actions).forEach(function (actionName) { + print(actionName + ":" + Controller.Actions[actionName]); +}); + // Resets every device to its default key bindings: Controller.resetAllDeviceBindings(); diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 0127f8b88f..4db482b6d4 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -390,8 +390,9 @@ QString ControllerScriptingInterface::sanatizeName(const QString& name) { } void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { - auto devices = DependencyManager::get()->getDevices(); + // Controller.Hardware.* + auto devices = DependencyManager::get()->getDevices(); for(const auto& deviceMapping : devices) { auto device = deviceMapping.second.get(); auto deviceName = sanatizeName(device->getName()); @@ -403,6 +404,15 @@ void ControllerScriptingInterface::wireUpControllers(ScriptEngine* engine) { engine->registerValue(deviceInputName, input.getID()); } } + + // Controller.Actions.* + auto actionNames = DependencyManager::get()->getActionNames(); + int actionNumber = 0; + for (const auto& actionName : actionNames) { + QString safeActionName { "Controller.Actions." + sanatizeName(actionName) }; + engine->registerValue(safeActionName, actionNumber); + actionNumber++; + } } AbstractInputController* ControllerScriptingInterface::createInputController(const QString& deviceName, const QString& tracker) { diff --git a/libraries/input-plugins/src/input-plugins/UserInputMapper.cpp b/libraries/input-plugins/src/input-plugins/UserInputMapper.cpp index 1b9b87684c..5c51db9410 100755 --- a/libraries/input-plugins/src/input-plugins/UserInputMapper.cpp +++ b/libraries/input-plugins/src/input-plugins/UserInputMapper.cpp @@ -319,4 +319,6 @@ void UserInputMapper::createActionNames() { _actionNames[SHIFT] = "SHIFT"; _actionNames[ACTION1] = "ACTION1"; _actionNames[ACTION2] = "ACTION2"; + _actionNames[CONTEXT_MENU] = "CONTEXT_MENU"; + _actionNames[TOGGLE_MUTE] = "TOGGLE_MUTE"; }