From d7279e4c883aabec5b4549ffd9e72803a6411030 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 02:51:23 +0100 Subject: [PATCH 01/10] Support for Camera Entities. - New entity type: camera, with just the basic properties of an entity (position, rotation, name etc.). - New CameraMode: CameraEntity - Example script using the new cameraEntity - Updated edit.js to use the CameraEntities (with button to preview the camera) --- examples/edit.js | 23 ++++++++++++++++ interface/src/Application.cpp | 21 +++++++++++++-- interface/src/Camera.cpp | 27 +++++++++++++++++++ interface/src/Camera.h | 8 ++++++ interface/src/Menu.cpp | 3 +++ interface/src/Menu.h | 1 + libraries/entities/src/CameraEntityItem.cpp | 30 +++++++++++++++++++++ libraries/entities/src/CameraEntityItem.h | 27 +++++++++++++++++++ libraries/entities/src/EntityTypes.cpp | 4 ++- libraries/entities/src/EntityTypes.h | 3 ++- 10 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 libraries/entities/src/CameraEntityItem.cpp create mode 100644 libraries/entities/src/CameraEntityItem.h diff --git a/examples/edit.js b/examples/edit.js index 7a16030afc..eccb9a152c 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -155,6 +155,7 @@ var toolBar = (function() { newWebButton, newZoneButton, newPolyVoxButton, + newCameraButton, browseMarketplaceButton; function initialize() { @@ -299,6 +300,20 @@ var toolBar = (function() { visible: false }); + newCameraButton = toolBar.addTool({ + imageURL: toolIconUrl + "polyvox.svg", + subImage: { + x: 0, + y: 0, + width: 256, + height: 256 + }, + width: toolWidth, + height: toolHeight, + alpha: 0.9, + visible: false + }); + that.setActive(false); } @@ -345,6 +360,7 @@ var toolBar = (function() { toolBar.showTool(newWebButton, doShow); toolBar.showTool(newZoneButton, doShow); toolBar.showTool(newPolyVoxButton, doShow); + toolBar.showTool(newCameraButton, doShow); }; var RESIZE_INTERVAL = 50; @@ -601,6 +617,13 @@ var toolBar = (function() { } + return true; + } + if (newCameraButton === toolBar.clicked(clickedOverlay)) { + createNewEntity({ + type: "Camera" + }); + return true; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6d41679bea..f34462f2eb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1187,6 +1187,19 @@ void Application::paintGL() { glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror); } renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; + } else if (_myCamera.getMode() == CAMERA_MODE_CAMERA_ENTITY) { + EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); + if (cameraEntity != nullptr) { + if (isHMDMode()) { + glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix()); + _myCamera.setPosition(cameraEntity->getPosition() + hmdOffset); + glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix()); + _myCamera.setRotation(cameraEntity->getRotation() * hmdRotation); + } else { + _myCamera.setPosition(cameraEntity->getPosition()); + _myCamera.setRotation(cameraEntity->getRotation()); + } + } } // Update camera position if (!isHMDMode()) { @@ -2640,8 +2653,8 @@ void Application::cycleCamera() { menu->setIsOptionChecked(MenuOption::ThirdPerson, false); menu->setIsOptionChecked(MenuOption::FullscreenMirror, true); - } else if (menu->isOptionChecked(MenuOption::IndependentMode)) { - // do nothing if in independe mode + } else if (menu->isOptionChecked(MenuOption::IndependentMode) || menu->isOptionChecked(MenuOption::CameraEntityMode)) { + // do nothing if in independent or camera entity modes return; } cameraMenuChanged(); // handle the menu change @@ -2668,6 +2681,10 @@ void Application::cameraMenuChanged() { if (_myCamera.getMode() != CAMERA_MODE_INDEPENDENT) { _myCamera.setMode(CAMERA_MODE_INDEPENDENT); } + } else if (Menu::getInstance()->isOptionChecked(MenuOption::CameraEntityMode)) { + if (_myCamera.getMode() != CAMERA_MODE_CAMERA_ENTITY) { + _myCamera.setMode(CAMERA_MODE_CAMERA_ENTITY); + } } } diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 17c745bdba..ae654c4906 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -28,6 +28,8 @@ CameraMode stringToMode(const QString& mode) { return CAMERA_MODE_MIRROR; } else if (mode == "independent") { return CAMERA_MODE_INDEPENDENT; + } else if (mode == "camera entity") { + return CAMERA_MODE_CAMERA_ENTITY; } return CAMERA_MODE_NULL; } @@ -41,6 +43,8 @@ QString modeToString(CameraMode mode) { return "mirror"; } else if (mode == CAMERA_MODE_INDEPENDENT) { return "independent"; + } else if (mode == CAMERA_MODE_CAMERA_ENTITY) { + return "camera entity"; } return "unknown"; } @@ -94,6 +98,26 @@ void Camera::setMode(CameraMode mode) { emit modeUpdated(modeToString(mode)); } +QUuid Camera::getCameraEntity() const { + if (_cameraEntity != nullptr) { + return _cameraEntity->getID(); + } + return QUuid(); +}; + +void Camera::setCameraEntity(QUuid cameraEntityID) { + EntityItemPointer entity = qApp->getEntities()->getTree()->findEntityByID(cameraEntityID); + if (entity == nullptr) { + qDebug() << "entity pointer not found"; + return; + } + if (entity->getType() != EntityTypes::Camera) { + qDebug() << "entity type is not camera"; + return; + } + _cameraEntity = entity; +} + void Camera::setProjection(const glm::mat4& projection) { _projection = projection; } @@ -118,6 +142,9 @@ void Camera::setModeString(const QString& mode) { case CAMERA_MODE_INDEPENDENT: Menu::getInstance()->setIsOptionChecked(MenuOption::IndependentMode, true); break; + case CAMERA_MODE_CAMERA_ENTITY: + Menu::getInstance()->setIsOptionChecked(MenuOption::CameraEntityMode, true); + break; default: break; } diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 7f7515cf5f..7aa31456e9 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -24,6 +24,7 @@ enum CameraMode CAMERA_MODE_FIRST_PERSON, CAMERA_MODE_MIRROR, CAMERA_MODE_INDEPENDENT, + CAMERA_MODE_CAMERA_ENTITY, NUM_CAMERA_MODES }; @@ -36,6 +37,7 @@ class Camera : public QObject { Q_PROPERTY(glm::vec3 position READ getPosition WRITE setPosition) Q_PROPERTY(glm::quat orientation READ getOrientation WRITE setOrientation) Q_PROPERTY(QString mode READ getModeString WRITE setModeString) + Q_PROPERTY(QUuid cameraEntity READ getCameraEntity WRITE setCameraEntity) public: Camera(); @@ -49,6 +51,8 @@ public: void loadViewFrustum(ViewFrustum& frustum) const; ViewFrustum toViewFrustum() const; + EntityItemPointer getCameraEntityPointer() const { return _cameraEntity; } + public slots: QString getModeString() const; void setModeString(const QString& mode); @@ -68,6 +72,9 @@ public slots: const glm::mat4& getProjection() const { return _projection; } void setProjection(const glm::mat4& projection); + QUuid getCameraEntity() const; + void setCameraEntity(QUuid cameraEntityID); + PickRay computePickRay(float x, float y); // These only work on independent cameras @@ -97,6 +104,7 @@ private: glm::quat _rotation; bool _isKeepLookingAt{ false }; glm::vec3 _lookingAt; + EntityItemPointer _cameraEntity; }; #endif // hifi_Camera_h diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1565db2905..88a33c6f34 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -279,6 +279,9 @@ Menu::Menu() { cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu, MenuOption::IndependentMode, 0, false, qApp, SLOT(cameraMenuChanged()))); + cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu, + MenuOption::CameraEntityMode, 0, + false, qApp, SLOT(cameraMenuChanged()))); cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu, MenuOption::FullscreenMirror, 0, // QML Qt::Key_H, false, qApp, SLOT(cameraMenuChanged()))); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 162fad1b9f..5c84bb11fa 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -157,6 +157,7 @@ namespace MenuOption { const QString Bookmarks = "Bookmarks"; const QString CachesSize = "RAM Caches Size"; const QString CalibrateCamera = "Calibrate Camera"; + const QString CameraEntityMode = "Camera Entity"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; const QString Collisions = "Collisions"; diff --git a/libraries/entities/src/CameraEntityItem.cpp b/libraries/entities/src/CameraEntityItem.cpp new file mode 100644 index 0000000000..2c6ca903b3 --- /dev/null +++ b/libraries/entities/src/CameraEntityItem.cpp @@ -0,0 +1,30 @@ +// +// CameraEntityItem.cpp +// libraries/entities/src +// +// Created by Thijs Wenker on 11/4/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "EntitiesLogging.h" +#include "EntityItemID.h" +#include "EntityItemProperties.h" +#include "CameraEntityItem.h" + + +EntityItemPointer CameraEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + EntityItemPointer result { new CameraEntityItem(entityID, properties) }; + return result; +} + +// our non-pure virtual subclass for now... +CameraEntityItem::CameraEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : + EntityItem(entityItemID) +{ + _type = EntityTypes::Camera; + + setProperties(properties); +} diff --git a/libraries/entities/src/CameraEntityItem.h b/libraries/entities/src/CameraEntityItem.h new file mode 100644 index 0000000000..3b046ddc90 --- /dev/null +++ b/libraries/entities/src/CameraEntityItem.h @@ -0,0 +1,27 @@ +// +// CameraEntityItem.h +// libraries/entities/src +// +// Created by Thijs Wenker on 11/4/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_CameraEntityItem_h +#define hifi_CameraEntityItem_h + +#include "EntityItem.h" + +class CameraEntityItem : public EntityItem { +public: + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + + CameraEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); + + ALLOW_INSTANTIATION // This class can be instantiated + +}; + +#endif // hifi_CameraEntityItem_h diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 52c2242629..b7d9077f57 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -29,6 +29,7 @@ #include "LineEntityItem.h" #include "PolyVoxEntityItem.h" #include "PolyLineEntityItem.h" +#include "CameraEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -48,7 +49,8 @@ REGISTER_ENTITY_TYPE(ParticleEffect) REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) -REGISTER_ENTITY_TYPE(PolyLine); +REGISTER_ENTITY_TYPE(PolyLine) +REGISTER_ENTITY_TYPE(Camera); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 30b6edbc07..82bbffe254 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -48,7 +48,8 @@ public: Line, PolyVox, PolyLine, - LAST = PolyLine + Camera, + LAST = Camera } EntityType; static const QString& getEntityTypeName(EntityType entityType); From d60661ff8a75bf5d10029778cc53c8de8bf0f464 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 03:24:32 +0100 Subject: [PATCH 02/10] preview camera button in edit.js script --- examples/edit.js | 13 +++++++++---- examples/html/entityProperties.html | 11 +++++++++-- examples/libraries/entityPropertyDialogBox.js | 13 ++++++++++++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/examples/edit.js b/examples/edit.js index eccb9a152c..ff4021c46f 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -301,12 +301,12 @@ var toolBar = (function() { }); newCameraButton = toolBar.addTool({ - imageURL: toolIconUrl + "polyvox.svg", + imageURL: toolIconUrl + "light.svg", subImage: { x: 0, - y: 0, - width: 256, - height: 256 + y: Tool.IMAGE_WIDTH, + width: Tool.IMAGE_WIDTH, + height: Tool.IMAGE_HEIGHT }, width: toolWidth, height: toolHeight, @@ -1640,6 +1640,11 @@ PropertiesTool = function(opts) { pushCommandForSelections(); selectionManager._update(); } + } else if (data.action == "previewCamera") { + if (selectionManager.hasSelection()) { + Camera.mode = "camera entity"; + Camera.cameraEntity = selectionManager.selections[0]; + } } else if (data.action == "rescaleDimensions") { var multiplier = data.percentage / 100; if (selectionManager.hasSelection()) { diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 412b413b2b..bc6a6920d1 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -382,7 +382,7 @@ var elHyperlinkHref = document.getElementById("property-hyperlink-href"); var elHyperlinkDescription = document.getElementById("property-hyperlink-description"); - + var elPreviewCameraButton = document.getElementById("preview-camera-button"); if (window.EventBridge !== undefined) { EventBridge.scriptEventReceived.connect(function(data) { @@ -931,6 +931,12 @@ action: "centerAtmosphereToZone", })); }); + elPreviewCameraButton.addEventListener("click", function() { + EventBridge.emitWebEvent(JSON.stringify({ + type: "action", + action: "previewCamera" + })); + }); window.onblur = function() { // Fake a change event @@ -1032,7 +1038,7 @@
- +
@@ -1044,6 +1050,7 @@
+
diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index 4fd24756e0..b47e26579d 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -204,7 +204,7 @@ EntityPropertyDialogBox = (function () { array.push({ label: "Collisions Will Move:", type: "checkbox", value: properties.collisionsWillMove }); index++; array.push({ label: "Collision Sound URL:", value: properties.collisionSoundURL }); - index++; + index++; array.push({ label: "Lifetime:", value: properties.lifetime.toFixed(decimals) }); index++; @@ -260,6 +260,12 @@ EntityPropertyDialogBox = (function () { array.push({ label: "Cutoff (in degrees):", value: properties.cutoff }); index++; } + + if (properties.type == "Camera") { + array.push({ label: "", type: "inlineButton", buttonLabel: "Preview Camera", name: "previewCamera" }); + index++; + } + array.push({ button: "Cancel" }); index++; @@ -268,6 +274,11 @@ EntityPropertyDialogBox = (function () { }; Window.inlineButtonClicked.connect(function (name) { + if (name == "previewCamera") { + Camera.mode = "camera entity"; + Camera.cameraEntity = propertiesForEditedEntity.id; + } + if (name == "resetDimensions") { Window.reloadNonBlockingForm([ { value: propertiesForEditedEntity.naturalDimensions.x.toFixed(decimals), oldIndex: dimensionX }, From 184f793cdd2a17f63257170958802ab5d7d9e7b0 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 19:15:29 +0100 Subject: [PATCH 03/10] Camera properties were not stored --- libraries/entities/src/CameraEntityItem.cpp | 54 +++++++++++++++++++ libraries/entities/src/CameraEntityItem.h | 20 +++++++ libraries/entities/src/EntityItemProperties.h | 1 + 3 files changed, 75 insertions(+) diff --git a/libraries/entities/src/CameraEntityItem.cpp b/libraries/entities/src/CameraEntityItem.cpp index 2c6ca903b3..8370447389 100644 --- a/libraries/entities/src/CameraEntityItem.cpp +++ b/libraries/entities/src/CameraEntityItem.cpp @@ -28,3 +28,57 @@ CameraEntityItem::CameraEntityItem(const EntityItemID& entityItemID, const Entit setProperties(properties); } + + +EntityItemProperties CameraEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { + EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class + return properties; +} + +bool CameraEntityItem::setProperties(const EntityItemProperties& properties) { + bool somethingChanged = false; + somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class + + if (somethingChanged) { + bool wantDebug = false; + if (wantDebug) { + uint64_t now = usecTimestampNow(); + int elapsed = now - getLastEdited(); + qCDebug(entities) << "CameraEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + "now=" << now << " getLastEdited()=" << getLastEdited(); + } + setLastEdited(properties._lastEdited); + } + + return somethingChanged; +} + +int CameraEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + return bytesRead; +} + + +// TODO: eventually only include properties changed since the params.lastViewFrustumSent time +EntityPropertyFlags CameraEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + return requestedProperties; +} + +void CameraEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; +} + diff --git a/libraries/entities/src/CameraEntityItem.h b/libraries/entities/src/CameraEntityItem.h index 3b046ddc90..6256c200c2 100644 --- a/libraries/entities/src/CameraEntityItem.h +++ b/libraries/entities/src/CameraEntityItem.h @@ -22,6 +22,26 @@ public: ALLOW_INSTANTIATION // This class can be instantiated + // methods for getting/setting all properties of an entity + virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const; + virtual bool setProperties(const EntityItemProperties& properties); + + // TODO: eventually only include properties changed since the params.lastViewFrustumSent time + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); + }; #endif // hifi_CameraEntityItem_h diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index b95f4d35f4..4522e4fc45 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -64,6 +64,7 @@ class EntityItemProperties { friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyLineEntityItem; // TODO: consider removing this friend relationship and use public methods + friend class CameraEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); virtual ~EntityItemProperties() = default; From 128a0c2397eeae266ce068023d1271f6c562e96f Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 20:23:03 +0100 Subject: [PATCH 04/10] securityCamera.js - Camera Entity example --- examples/example/securityCamera.js | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 examples/example/securityCamera.js diff --git a/examples/example/securityCamera.js b/examples/example/securityCamera.js new file mode 100644 index 0000000000..224eb9fac9 --- /dev/null +++ b/examples/example/securityCamera.js @@ -0,0 +1,55 @@ +// +// securityCamera.js +// examples/example +// +// Created by Thijs Wenker on November 4, 2015 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +const CAMERA_OFFSET = {x: 0, y: 4, z: -14}; +const LOOKAT_START_OFFSET = {x: -10, y: 0, z: 14}; +const LOOKAT_END_OFFSET = {x: 10, y: 0, z: 14}; + +var lookatTargets = [Vec3.sum(MyAvatar.position, LOOKAT_START_OFFSET), Vec3.sum(MyAvatar.position, LOOKAT_END_OFFSET)]; +var currentTarget = 0; + +var forward = true; + +var oldCameraMode = Camera.mode; + +var cameraLookAt = function(cameraPos, lookAtPos) { + var lookAtRaw = Quat.lookAt(cameraPos, lookAtPos, Vec3.UP); + lookAtRaw.w = -lookAtRaw.w; + return lookAtRaw; +}; + +cameraEntity = Entities.addEntity({ + type: "Camera", + position: Vec3.sum(MyAvatar.position, CAMERA_OFFSET) +}); + +Camera.mode = "camera entity"; +Camera.cameraEntity = cameraEntity; + +Script.update.connect(function(deltaTime) { + var cameraProperties = Entities.getEntityProperties(cameraEntity, ["position", "rotation"]); + var targetOrientation = cameraLookAt(cameraProperties.position, lookatTargets[currentTarget]); + if (Math.abs(targetOrientation.x - cameraProperties.rotation.x) < 0.01 && + Math.abs(targetOrientation.y - cameraProperties.rotation.y) < 0.01 && + Math.abs(targetOrientation.z - cameraProperties.rotation.z) < 0.01 && + Math.abs(targetOrientation.w - cameraProperties.rotation.w) < 0.01 + ) { + currentTarget = (currentTarget + 1) % lookatTargets.length; + return; + } + Entities.editEntity(cameraEntity, {rotation: Quat.mix(cameraProperties.rotation, targetOrientation, deltaTime / 3)}); +}); + +Script.scriptEnding.connect(function() { + Entities.deleteEntity(cameraEntity); + Camera.mode = oldCameraMode; + Camera.cameraEntity = null; +}); From 0ebd6e47cc33668092c67bc32c3b9150e59adb78 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 21:21:03 +0100 Subject: [PATCH 05/10] fix magic number --- examples/example/securityCamera.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/example/securityCamera.js b/examples/example/securityCamera.js index 224eb9fac9..19c381d3df 100644 --- a/examples/example/securityCamera.js +++ b/examples/example/securityCamera.js @@ -12,6 +12,7 @@ const CAMERA_OFFSET = {x: 0, y: 4, z: -14}; const LOOKAT_START_OFFSET = {x: -10, y: 0, z: 14}; const LOOKAT_END_OFFSET = {x: 10, y: 0, z: 14}; +const TINY_VALUE = 0.001; var lookatTargets = [Vec3.sum(MyAvatar.position, LOOKAT_START_OFFSET), Vec3.sum(MyAvatar.position, LOOKAT_END_OFFSET)]; var currentTarget = 0; @@ -37,11 +38,11 @@ Camera.cameraEntity = cameraEntity; Script.update.connect(function(deltaTime) { var cameraProperties = Entities.getEntityProperties(cameraEntity, ["position", "rotation"]); var targetOrientation = cameraLookAt(cameraProperties.position, lookatTargets[currentTarget]); - if (Math.abs(targetOrientation.x - cameraProperties.rotation.x) < 0.01 && - Math.abs(targetOrientation.y - cameraProperties.rotation.y) < 0.01 && - Math.abs(targetOrientation.z - cameraProperties.rotation.z) < 0.01 && - Math.abs(targetOrientation.w - cameraProperties.rotation.w) < 0.01 - ) { + if (Math.abs(targetOrientation.x - cameraProperties.rotation.x) < TINY_VALUE && + Math.abs(targetOrientation.y - cameraProperties.rotation.y) < TINY_VALUE && + Math.abs(targetOrientation.z - cameraProperties.rotation.z) < TINY_VALUE && + Math.abs(targetOrientation.w - cameraProperties.rotation.w) < TINY_VALUE) { + currentTarget = (currentTarget + 1) % lookatTargets.length; return; } From 42cbccc725191bdf922e8ccb8ca7d6b3fad621ca Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Nov 2015 21:39:22 +0100 Subject: [PATCH 06/10] fix stretchy HMD view on entity camera --- interface/src/Application.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index eb913ce2f6..35aeba8602 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1204,13 +1204,13 @@ void Application::paintGL() { EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); if (cameraEntity != nullptr) { if (isHMDMode()) { - glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix()); - _myCamera.setPosition(cameraEntity->getPosition() + hmdOffset); glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix()); _myCamera.setRotation(cameraEntity->getRotation() * hmdRotation); + glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix()); + _myCamera.setPosition(cameraEntity->getPosition() + (hmdRotation * hmdOffset)); } else { - _myCamera.setPosition(cameraEntity->getPosition()); _myCamera.setRotation(cameraEntity->getRotation()); + _myCamera.setPosition(cameraEntity->getPosition()); } } } From de98a17ada0c21f57bfffe92a45bd67326f38399 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Fri, 6 Nov 2015 01:58:08 +0100 Subject: [PATCH 07/10] - rename CameraEntityItem to AnchorEntityItem --- examples/edit.js | 14 +++++------ examples/example/securityCamera.js | 6 ++--- examples/libraries/entityPropertyDialogBox.js | 2 +- interface/src/Application.cpp | 6 ++--- interface/src/Camera.cpp | 23 ++++++------------ interface/src/Camera.h | 4 ++-- interface/src/Menu.h | 2 +- ...eraEntityItem.cpp => AnchorEntityItem.cpp} | 24 +++++++++---------- ...{CameraEntityItem.h => AnchorEntityItem.h} | 12 +++++----- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityTypes.cpp | 4 ++-- libraries/entities/src/EntityTypes.h | 4 ++-- 12 files changed, 47 insertions(+), 56 deletions(-) rename libraries/entities/src/{CameraEntityItem.cpp => AnchorEntityItem.cpp} (76%) rename libraries/entities/src/{CameraEntityItem.h => AnchorEntityItem.h} (87%) diff --git a/examples/edit.js b/examples/edit.js index ff4021c46f..cf5163b824 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -155,7 +155,7 @@ var toolBar = (function() { newWebButton, newZoneButton, newPolyVoxButton, - newCameraButton, + newAnchorButton, browseMarketplaceButton; function initialize() { @@ -300,8 +300,8 @@ var toolBar = (function() { visible: false }); - newCameraButton = toolBar.addTool({ - imageURL: toolIconUrl + "light.svg", + newAnchorButton = toolBar.addTool({ + imageURL: toolIconUrl + "add-anchor.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, @@ -360,7 +360,7 @@ var toolBar = (function() { toolBar.showTool(newWebButton, doShow); toolBar.showTool(newZoneButton, doShow); toolBar.showTool(newPolyVoxButton, doShow); - toolBar.showTool(newCameraButton, doShow); + toolBar.showTool(newAnchorButton, doShow); }; var RESIZE_INTERVAL = 50; @@ -619,9 +619,9 @@ var toolBar = (function() { return true; } - if (newCameraButton === toolBar.clicked(clickedOverlay)) { + if (newAnchorButton === toolBar.clicked(clickedOverlay)) { createNewEntity({ - type: "Camera" + type: "Anchor" }); return true; @@ -1642,7 +1642,7 @@ PropertiesTool = function(opts) { } } else if (data.action == "previewCamera") { if (selectionManager.hasSelection()) { - Camera.mode = "camera entity"; + Camera.mode = "entity"; Camera.cameraEntity = selectionManager.selections[0]; } } else if (data.action == "rescaleDimensions") { diff --git a/examples/example/securityCamera.js b/examples/example/securityCamera.js index 19c381d3df..15d2c03e2e 100644 --- a/examples/example/securityCamera.js +++ b/examples/example/securityCamera.js @@ -28,11 +28,11 @@ var cameraLookAt = function(cameraPos, lookAtPos) { }; cameraEntity = Entities.addEntity({ - type: "Camera", - position: Vec3.sum(MyAvatar.position, CAMERA_OFFSET) + type: "Anchor", + position: Vec3.sum(MyAvatar.position, CAMERA_OFFSET) }); -Camera.mode = "camera entity"; +Camera.mode = "entity"; Camera.cameraEntity = cameraEntity; Script.update.connect(function(deltaTime) { diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index b47e26579d..b34bec2a25 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -275,7 +275,7 @@ EntityPropertyDialogBox = (function () { Window.inlineButtonClicked.connect(function (name) { if (name == "previewCamera") { - Camera.mode = "camera entity"; + Camera.mode = "entity"; Camera.cameraEntity = propertiesForEditedEntity.id; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 35aeba8602..7d82f2269b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1200,7 +1200,7 @@ void Application::paintGL() { glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror); } renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; - } else if (_myCamera.getMode() == CAMERA_MODE_CAMERA_ENTITY) { + } else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); if (cameraEntity != nullptr) { if (isHMDMode()) { @@ -2687,8 +2687,8 @@ void Application::cameraMenuChanged() { _myCamera.setMode(CAMERA_MODE_INDEPENDENT); } } else if (Menu::getInstance()->isOptionChecked(MenuOption::CameraEntityMode)) { - if (_myCamera.getMode() != CAMERA_MODE_CAMERA_ENTITY) { - _myCamera.setMode(CAMERA_MODE_CAMERA_ENTITY); + if (_myCamera.getMode() != CAMERA_MODE_ENTITY) { + _myCamera.setMode(CAMERA_MODE_ENTITY); } } } diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index ae654c4906..53a3500bff 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -28,8 +28,8 @@ CameraMode stringToMode(const QString& mode) { return CAMERA_MODE_MIRROR; } else if (mode == "independent") { return CAMERA_MODE_INDEPENDENT; - } else if (mode == "camera entity") { - return CAMERA_MODE_CAMERA_ENTITY; + } else if (mode == "entity") { + return CAMERA_MODE_ENTITY; } return CAMERA_MODE_NULL; } @@ -43,8 +43,8 @@ QString modeToString(CameraMode mode) { return "mirror"; } else if (mode == CAMERA_MODE_INDEPENDENT) { return "independent"; - } else if (mode == CAMERA_MODE_CAMERA_ENTITY) { - return "camera entity"; + } else if (mode == CAMERA_MODE_ENTITY) { + return "entity"; } return "unknown"; } @@ -105,17 +105,8 @@ QUuid Camera::getCameraEntity() const { return QUuid(); }; -void Camera::setCameraEntity(QUuid cameraEntityID) { - EntityItemPointer entity = qApp->getEntities()->getTree()->findEntityByID(cameraEntityID); - if (entity == nullptr) { - qDebug() << "entity pointer not found"; - return; - } - if (entity->getType() != EntityTypes::Camera) { - qDebug() << "entity type is not camera"; - return; - } - _cameraEntity = entity; +void Camera::setCameraEntity(QUuid entityID) { + _cameraEntity = qApp->getEntities()->getTree()->findEntityByID(entityID); } void Camera::setProjection(const glm::mat4& projection) { @@ -142,7 +133,7 @@ void Camera::setModeString(const QString& mode) { case CAMERA_MODE_INDEPENDENT: Menu::getInstance()->setIsOptionChecked(MenuOption::IndependentMode, true); break; - case CAMERA_MODE_CAMERA_ENTITY: + case CAMERA_MODE_ENTITY: Menu::getInstance()->setIsOptionChecked(MenuOption::CameraEntityMode, true); break; default: diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 7aa31456e9..017bd742a4 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -24,7 +24,7 @@ enum CameraMode CAMERA_MODE_FIRST_PERSON, CAMERA_MODE_MIRROR, CAMERA_MODE_INDEPENDENT, - CAMERA_MODE_CAMERA_ENTITY, + CAMERA_MODE_ENTITY, NUM_CAMERA_MODES }; @@ -73,7 +73,7 @@ public slots: void setProjection(const glm::mat4& projection); QUuid getCameraEntity() const; - void setCameraEntity(QUuid cameraEntityID); + void setCameraEntity(QUuid entityID); PickRay computePickRay(float x, float y); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 5c84bb11fa..5964049f93 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -157,7 +157,7 @@ namespace MenuOption { const QString Bookmarks = "Bookmarks"; const QString CachesSize = "RAM Caches Size"; const QString CalibrateCamera = "Calibrate Camera"; - const QString CameraEntityMode = "Camera Entity"; + const QString CameraEntityMode = "Entity Mode"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; const QString Collisions = "Collisions"; diff --git a/libraries/entities/src/CameraEntityItem.cpp b/libraries/entities/src/AnchorEntityItem.cpp similarity index 76% rename from libraries/entities/src/CameraEntityItem.cpp rename to libraries/entities/src/AnchorEntityItem.cpp index 8370447389..d84ac3c3a5 100644 --- a/libraries/entities/src/CameraEntityItem.cpp +++ b/libraries/entities/src/AnchorEntityItem.cpp @@ -1,5 +1,5 @@ // -// CameraEntityItem.cpp +// AnchorEntityItem.cpp // libraries/entities/src // // Created by Thijs Wenker on 11/4/15. @@ -12,30 +12,30 @@ #include "EntitiesLogging.h" #include "EntityItemID.h" #include "EntityItemProperties.h" -#include "CameraEntityItem.h" +#include "AnchorEntityItem.h" -EntityItemPointer CameraEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { - EntityItemPointer result { new CameraEntityItem(entityID, properties) }; +EntityItemPointer AnchorEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + EntityItemPointer result { new AnchorEntityItem(entityID, properties) }; return result; } // our non-pure virtual subclass for now... -CameraEntityItem::CameraEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : +AnchorEntityItem::AnchorEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID) { - _type = EntityTypes::Camera; + _type = EntityTypes::Anchor; setProperties(properties); } -EntityItemProperties CameraEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { +EntityItemProperties AnchorEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class return properties; } -bool CameraEntityItem::setProperties(const EntityItemProperties& properties) { +bool AnchorEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -44,7 +44,7 @@ bool CameraEntityItem::setProperties(const EntityItemProperties& properties) { if (wantDebug) { uint64_t now = usecTimestampNow(); int elapsed = now - getLastEdited(); - qCDebug(entities) << "CameraEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + qCDebug(entities) << "AnchorEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << "now=" << now << " getLastEdited()=" << getLastEdited(); } setLastEdited(properties._lastEdited); @@ -53,7 +53,7 @@ bool CameraEntityItem::setProperties(const EntityItemProperties& properties) { return somethingChanged; } -int CameraEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, +int AnchorEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) { @@ -66,12 +66,12 @@ int CameraEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data // TODO: eventually only include properties changed since the params.lastViewFrustumSent time -EntityPropertyFlags CameraEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { +EntityPropertyFlags AnchorEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); return requestedProperties; } -void CameraEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, +void AnchorEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, diff --git a/libraries/entities/src/CameraEntityItem.h b/libraries/entities/src/AnchorEntityItem.h similarity index 87% rename from libraries/entities/src/CameraEntityItem.h rename to libraries/entities/src/AnchorEntityItem.h index 6256c200c2..bd385517c3 100644 --- a/libraries/entities/src/CameraEntityItem.h +++ b/libraries/entities/src/AnchorEntityItem.h @@ -1,5 +1,5 @@ // -// CameraEntityItem.h +// AnchorEntityItem.h // libraries/entities/src // // Created by Thijs Wenker on 11/4/15. @@ -9,16 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_CameraEntityItem_h -#define hifi_CameraEntityItem_h +#ifndef hifi_AnchorEntityItem_h +#define hifi_AnchorEntityItem_h #include "EntityItem.h" -class CameraEntityItem : public EntityItem { +class AnchorEntityItem : public EntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - CameraEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); + AnchorEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); ALLOW_INSTANTIATION // This class can be instantiated @@ -44,4 +44,4 @@ public: }; -#endif // hifi_CameraEntityItem_h +#endif // hifi_AnchorEntityItem_h diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 4522e4fc45..60199d9784 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -64,7 +64,7 @@ class EntityItemProperties { friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyLineEntityItem; // TODO: consider removing this friend relationship and use public methods - friend class CameraEntityItem; // TODO: consider removing this friend relationship and use public methods + friend class AnchorEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); virtual ~EntityItemProperties() = default; diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index b7d9077f57..f5915ae8c3 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -29,7 +29,7 @@ #include "LineEntityItem.h" #include "PolyVoxEntityItem.h" #include "PolyLineEntityItem.h" -#include "CameraEntityItem.h" +#include "AnchorEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -50,7 +50,7 @@ REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) REGISTER_ENTITY_TYPE(PolyLine) -REGISTER_ENTITY_TYPE(Camera); +REGISTER_ENTITY_TYPE(Anchor); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 82bbffe254..dbe9569f63 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -48,8 +48,8 @@ public: Line, PolyVox, PolyLine, - Camera, - LAST = Camera + Anchor, + LAST = Anchor } EntityType; static const QString& getEntityTypeName(EntityType entityType); From 7f6a20af99b3a118475c2c4dc87a9c507e55b533 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 10 Nov 2015 19:22:57 +0100 Subject: [PATCH 08/10] bump entities protocol version --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 24034ff9b3..64936c3a59 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -38,7 +38,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityAdd: case PacketType::EntityEdit: case PacketType::EntityData: - return VERSION_ENTITIES_PARTICLES_ADDITIVE_BLENDING; + return VERSION_ENTITIES_ANCHOR; case PacketType::AvatarData: case PacketType::BulkAvatarData: default: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 82d905bf28..56cb60e02b 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -146,5 +146,6 @@ const PacketVersion VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP = 46; const PacketVersion VERSION_ENTITIES_KEYLIGHT_PROPERTIES_GROUP = 47; const PacketVersion VERSION_ENTITIES_KEYLIGHT_PROPERTIES_GROUP_BIS = 48; const PacketVersion VERSION_ENTITIES_PARTICLES_ADDITIVE_BLENDING = 49; +const PacketVersion VERSION_ENTITIES_ANCHOR = 50; #endif // hifi_PacketHeaders_h From 6a31f76d5f4d6800062461bf39ea2797ddde7f68 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 12 Nov 2015 02:11:07 +0100 Subject: [PATCH 09/10] Revert Anchor entity addition --- libraries/entities/src/AnchorEntityItem.cpp | 84 ------------------- libraries/entities/src/AnchorEntityItem.h | 47 ----------- libraries/entities/src/EntityTypes.cpp | 2 - libraries/entities/src/EntityTypes.h | 3 +- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 1 - 6 files changed, 2 insertions(+), 137 deletions(-) delete mode 100644 libraries/entities/src/AnchorEntityItem.cpp delete mode 100644 libraries/entities/src/AnchorEntityItem.h diff --git a/libraries/entities/src/AnchorEntityItem.cpp b/libraries/entities/src/AnchorEntityItem.cpp deleted file mode 100644 index d84ac3c3a5..0000000000 --- a/libraries/entities/src/AnchorEntityItem.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// -// AnchorEntityItem.cpp -// libraries/entities/src -// -// Created by Thijs Wenker on 11/4/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "EntitiesLogging.h" -#include "EntityItemID.h" -#include "EntityItemProperties.h" -#include "AnchorEntityItem.h" - - -EntityItemPointer AnchorEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { - EntityItemPointer result { new AnchorEntityItem(entityID, properties) }; - return result; -} - -// our non-pure virtual subclass for now... -AnchorEntityItem::AnchorEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - EntityItem(entityItemID) -{ - _type = EntityTypes::Anchor; - - setProperties(properties); -} - - -EntityItemProperties AnchorEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { - EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - return properties; -} - -bool AnchorEntityItem::setProperties(const EntityItemProperties& properties) { - bool somethingChanged = false; - somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - - if (somethingChanged) { - bool wantDebug = false; - if (wantDebug) { - uint64_t now = usecTimestampNow(); - int elapsed = now - getLastEdited(); - qCDebug(entities) << "AnchorEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << - "now=" << now << " getLastEdited()=" << getLastEdited(); - } - setLastEdited(properties._lastEdited); - } - - return somethingChanged; -} - -int AnchorEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) { - - int bytesRead = 0; - const unsigned char* dataAt = data; - - return bytesRead; -} - - -// TODO: eventually only include properties changed since the params.lastViewFrustumSent time -EntityPropertyFlags AnchorEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { - EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); - return requestedProperties; -} - -void AnchorEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const { - - bool successPropertyFits = true; -} - diff --git a/libraries/entities/src/AnchorEntityItem.h b/libraries/entities/src/AnchorEntityItem.h deleted file mode 100644 index bd385517c3..0000000000 --- a/libraries/entities/src/AnchorEntityItem.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// AnchorEntityItem.h -// libraries/entities/src -// -// Created by Thijs Wenker on 11/4/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_AnchorEntityItem_h -#define hifi_AnchorEntityItem_h - -#include "EntityItem.h" - -class AnchorEntityItem : public EntityItem { -public: - static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - - AnchorEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); - - ALLOW_INSTANTIATION // This class can be instantiated - - // methods for getting/setting all properties of an entity - virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const; - virtual bool setProperties(const EntityItemProperties& properties); - - // TODO: eventually only include properties changed since the params.lastViewFrustumSent time - virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; - - virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const; - - virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged); - -}; - -#endif // hifi_AnchorEntityItem_h diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index f5915ae8c3..50b98d4b5e 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -29,7 +29,6 @@ #include "LineEntityItem.h" #include "PolyVoxEntityItem.h" #include "PolyLineEntityItem.h" -#include "AnchorEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -50,7 +49,6 @@ REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) REGISTER_ENTITY_TYPE(PolyLine) -REGISTER_ENTITY_TYPE(Anchor); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index dbe9569f63..30b6edbc07 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -48,8 +48,7 @@ public: Line, PolyVox, PolyLine, - Anchor, - LAST = Anchor + LAST = PolyLine } EntityType; static const QString& getEntityTypeName(EntityType entityType); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 64936c3a59..24034ff9b3 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -38,7 +38,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityAdd: case PacketType::EntityEdit: case PacketType::EntityData: - return VERSION_ENTITIES_ANCHOR; + return VERSION_ENTITIES_PARTICLES_ADDITIVE_BLENDING; case PacketType::AvatarData: case PacketType::BulkAvatarData: default: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 56cb60e02b..82d905bf28 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -146,6 +146,5 @@ const PacketVersion VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP = 46; const PacketVersion VERSION_ENTITIES_KEYLIGHT_PROPERTIES_GROUP = 47; const PacketVersion VERSION_ENTITIES_KEYLIGHT_PROPERTIES_GROUP_BIS = 48; const PacketVersion VERSION_ENTITIES_PARTICLES_ADDITIVE_BLENDING = 49; -const PacketVersion VERSION_ENTITIES_ANCHOR = 50; #endif // hifi_PacketHeaders_h From 764af63ea97aec235d8aa3e265fa2aaa616b6107 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 12 Nov 2015 02:19:08 +0100 Subject: [PATCH 10/10] remove Anchor entity from example and edit script, replace with invisible Box in example --- examples/edit.js | 23 ------------------- examples/example/securityCamera.js | 3 ++- examples/libraries/entityPropertyDialogBox.js | 6 ++--- libraries/entities/src/EntityItemProperties.h | 1 - libraries/entities/src/EntityTypes.cpp | 2 +- 5 files changed, 5 insertions(+), 30 deletions(-) diff --git a/examples/edit.js b/examples/edit.js index cf5163b824..74551384c9 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -155,7 +155,6 @@ var toolBar = (function() { newWebButton, newZoneButton, newPolyVoxButton, - newAnchorButton, browseMarketplaceButton; function initialize() { @@ -300,20 +299,6 @@ var toolBar = (function() { visible: false }); - newAnchorButton = toolBar.addTool({ - imageURL: toolIconUrl + "add-anchor.svg", - subImage: { - x: 0, - y: Tool.IMAGE_WIDTH, - width: Tool.IMAGE_WIDTH, - height: Tool.IMAGE_HEIGHT - }, - width: toolWidth, - height: toolHeight, - alpha: 0.9, - visible: false - }); - that.setActive(false); } @@ -360,7 +345,6 @@ var toolBar = (function() { toolBar.showTool(newWebButton, doShow); toolBar.showTool(newZoneButton, doShow); toolBar.showTool(newPolyVoxButton, doShow); - toolBar.showTool(newAnchorButton, doShow); }; var RESIZE_INTERVAL = 50; @@ -617,13 +601,6 @@ var toolBar = (function() { } - return true; - } - if (newAnchorButton === toolBar.clicked(clickedOverlay)) { - createNewEntity({ - type: "Anchor" - }); - return true; } diff --git a/examples/example/securityCamera.js b/examples/example/securityCamera.js index 15d2c03e2e..6f5ca549cd 100644 --- a/examples/example/securityCamera.js +++ b/examples/example/securityCamera.js @@ -28,7 +28,8 @@ var cameraLookAt = function(cameraPos, lookAtPos) { }; cameraEntity = Entities.addEntity({ - type: "Anchor", + type: "Box", + visible: false, position: Vec3.sum(MyAvatar.position, CAMERA_OFFSET) }); diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index b34bec2a25..39ffbed629 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -261,10 +261,8 @@ EntityPropertyDialogBox = (function () { index++; } - if (properties.type == "Camera") { - array.push({ label: "", type: "inlineButton", buttonLabel: "Preview Camera", name: "previewCamera" }); - index++; - } + array.push({ label: "", type: "inlineButton", buttonLabel: "Preview Camera", name: "previewCamera" }); + index++; array.push({ button: "Cancel" }); index++; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 1f08789cdc..84a5aeca5d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -64,7 +64,6 @@ class EntityItemProperties { friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyLineEntityItem; // TODO: consider removing this friend relationship and use public methods - friend class AnchorEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); virtual ~EntityItemProperties() = default; diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 50b98d4b5e..52c2242629 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -48,7 +48,7 @@ REGISTER_ENTITY_TYPE(ParticleEffect) REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) -REGISTER_ENTITY_TYPE(PolyLine) +REGISTER_ENTITY_TYPE(PolyLine); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType);