diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index edba366601..549a0858b7 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -23,7 +23,6 @@ #include #include -#include #include #include @@ -31,6 +30,7 @@ #include "AudioGate.h" #include "MixedAudioStream.h" +#include "entities/EntityTreeHeadlessViewer.h" #include "avatars/ScriptableAvatar.h" class Agent : public ThreadedAssignment { diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.cpp b/assignment-client/src/entities/EntityTreeHeadlessViewer.cpp similarity index 100% rename from libraries/entities/src/EntityTreeHeadlessViewer.cpp rename to assignment-client/src/entities/EntityTreeHeadlessViewer.cpp diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.h b/assignment-client/src/entities/EntityTreeHeadlessViewer.h similarity index 97% rename from libraries/entities/src/EntityTreeHeadlessViewer.h rename to assignment-client/src/entities/EntityTreeHeadlessViewer.h index fe05323a0b..17bb37186a 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.h +++ b/assignment-client/src/entities/EntityTreeHeadlessViewer.h @@ -16,9 +16,9 @@ #include #include #include -#include #include +#include "../octree/OctreeHeadlessViewer.h" #include "EntityTree.h" class EntitySimulation; diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/assignment-client/src/octree/OctreeHeadlessViewer.cpp similarity index 98% rename from libraries/octree/src/OctreeHeadlessViewer.cpp rename to assignment-client/src/octree/OctreeHeadlessViewer.cpp index 28d3794a54..4e885da7a5 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/assignment-client/src/octree/OctreeHeadlessViewer.cpp @@ -9,17 +9,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - -#include "OctreeLogging.h" #include "OctreeHeadlessViewer.h" -OctreeHeadlessViewer::OctreeHeadlessViewer() : OctreeRenderer() { - _viewFrustum.setProjection(glm::perspective(glm::radians(DEFAULT_FIELD_OF_VIEW_DEGREES), DEFAULT_ASPECT_RATIO, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP)); -} +#include +#include -void OctreeHeadlessViewer::init() { - OctreeRenderer::init(); + +OctreeHeadlessViewer::OctreeHeadlessViewer() { + _viewFrustum.setProjection(glm::perspective(glm::radians(DEFAULT_FIELD_OF_VIEW_DEGREES), DEFAULT_ASPECT_RATIO, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP)); } void OctreeHeadlessViewer::queryOctree() { diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/assignment-client/src/octree/OctreeHeadlessViewer.h similarity index 82% rename from libraries/octree/src/OctreeHeadlessViewer.h rename to assignment-client/src/octree/OctreeHeadlessViewer.h index a502844fa5..5a7544498d 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/assignment-client/src/octree/OctreeHeadlessViewer.h @@ -12,28 +12,17 @@ #ifndef hifi_OctreeHeadlessViewer_h #define hifi_OctreeHeadlessViewer_h -#include -#include -#include +#include +#include +#include -#include "JurisdictionListener.h" -#include "Octree.h" -#include "OctreeConstants.h" -#include "OctreeQuery.h" -#include "OctreeRenderer.h" -#include "OctreeSceneStats.h" -#include "Octree.h" // Generic client side Octree renderer class. -class OctreeHeadlessViewer : public OctreeRenderer { +class OctreeHeadlessViewer : public OctreeProcessor { Q_OBJECT public: OctreeHeadlessViewer(); virtual ~OctreeHeadlessViewer() {}; - virtual void renderElement(OctreeElementPointer element, RenderArgs* args) override { /* swallow these */ } - - virtual void init() override ; - virtual void render(RenderArgs* renderArgs) override { /* swallow these */ } void setJurisdictionListener(JurisdictionListener* jurisdictionListener) { _jurisdictionListener = jurisdictionListener; } @@ -71,6 +60,7 @@ private: JurisdictionListener* _jurisdictionListener = nullptr; OctreeQuery _octreeQuery; + ViewFrustum _viewFrustum; float _voxelSizeScale { DEFAULT_OCTREE_SIZE_SCALE }; int _boundaryLevelAdjust { 0 }; int _maxPacketsPerSecond { DEFAULT_MAX_OCTREE_PPS }; diff --git a/assignment-client/src/scripts/EntityScriptServer.h b/assignment-client/src/scripts/EntityScriptServer.h index 696b082467..84454375e5 100644 --- a/assignment-client/src/scripts/EntityScriptServer.h +++ b/assignment-client/src/scripts/EntityScriptServer.h @@ -19,10 +19,10 @@ #include #include -#include #include #include #include +#include "../entities/EntityTreeHeadlessViewer.h" class EntityScriptServer : public ThreadedAssignment { Q_OBJECT diff --git a/cmake/externals/quazip/CMakeLists.txt b/cmake/externals/quazip/CMakeLists.txt index 3a86852d76..7af13dafa7 100644 --- a/cmake/externals/quazip/CMakeLists.txt +++ b/cmake/externals/quazip/CMakeLists.txt @@ -12,12 +12,19 @@ elseif ($ENV{QT_CMAKE_PREFIX_PATH}) set(QT_CMAKE_PREFIX_PATH $ENV{QT_CMAKE_PREFIX_PATH}) endif () +set(QUAZIP_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) + +if (APPLE) +else () + set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11) +endif () + ExternalProject_Add( ${EXTERNAL_NAME} URL https://s3-us-west-1.amazonaws.com/hifi-production/dependencies/quazip-0.7.2.zip URL_MD5 2955176048a31262c09259ca8d309d19 BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON + CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 diff --git a/cmake/macros/LinkHifiLibraries.cmake b/cmake/macros/LinkHifiLibraries.cmake index de4ff23863..395af01f8d 100644 --- a/cmake/macros/LinkHifiLibraries.cmake +++ b/cmake/macros/LinkHifiLibraries.cmake @@ -7,16 +7,18 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # -macro(LINK_HIFI_LIBRARIES) +function(LINK_HIFI_LIBRARIES) file(RELATIVE_PATH RELATIVE_LIBRARY_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR} "${HIFI_LIBRARY_DIR}") set(LIBRARIES_TO_LINK ${ARGN}) - - foreach(HIFI_LIBRARY ${LIBRARIES_TO_LINK}) + foreach(HIFI_LIBRARY ${LIBRARIES_TO_LINK}) if (NOT TARGET ${HIFI_LIBRARY}) add_subdirectory("${RELATIVE_LIBRARY_DIR_PATH}/${HIFI_LIBRARY}" "${RELATIVE_LIBRARY_DIR_PATH}/${HIFI_LIBRARY}") endif () + endforeach() + + foreach(HIFI_LIBRARY ${LIBRARIES_TO_LINK}) include_directories("${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src") include_directories("${CMAKE_BINARY_DIR}/libraries/${HIFI_LIBRARY}/shaders") @@ -29,4 +31,4 @@ macro(LINK_HIFI_LIBRARIES) setup_memory_debugger() -endmacro(LINK_HIFI_LIBRARIES) +endfunction() diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index c5e9b08143..817333bb72 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -147,6 +147,7 @@ { "name": "security", "label": "Security", + "restart": false, "settings": [ { "name": "http_username", diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml index 1812c52dad..9d38539b42 100644 --- a/domain-server/resources/web/settings/index.shtml +++ b/domain-server/resources/web/settings/index.shtml @@ -26,7 +26,7 @@ - + @@ -77,7 +77,7 @@ diff --git a/domain-server/resources/web/settings/js/settings.js b/domain-server/resources/web/settings/js/settings.js index 39628ebb11..dd577701a5 100644 --- a/domain-server/resources/web/settings/js/settings.js +++ b/domain-server/resources/web/settings/js/settings.js @@ -1328,6 +1328,18 @@ function makeTableCategoryInput(setting, numVisibleColumns) { return html; } +function getDescriptionForKey(key) { + for (var i in Settings.data.descriptions) { + if (Settings.data.descriptions[i].name === key) { + return Settings.data.descriptions[i]; + } + } +} + +var SAVE_BUTTON_LABEL_SAVE = "Save"; +var SAVE_BUTTON_LABEL_RESTART = "Save and restart"; +var reasonsForRestart = []; + function badgeSidebarForDifferences(changedElement) { // figure out which group this input is in var panelParentID = changedElement.closest('.panel').attr('id'); @@ -1350,13 +1362,24 @@ function badgeSidebarForDifferences(changedElement) { } var badgeValue = 0 + var description = getDescriptionForKey(panelParentID); // badge for any settings we have that are not the same or are not present in initialValues for (var setting in panelJSON) { if ((!_.has(initialPanelJSON, setting) && panelJSON[setting] !== "") || (!_.isEqual(panelJSON[setting], initialPanelJSON[setting]) && (panelJSON[setting] !== "" || _.has(initialPanelJSON, setting)))) { - badgeValue += 1 + badgeValue += 1; + + // add a reason to restart + if (description && description.restart != false) { + reasonsForRestart.push(setting); + } + } else { + // remove a reason to restart + if (description && description.restart != false) { + reasonsForRestart = $.grep(reasonsForRestart, function(v) { return v != setting; }); + } } } @@ -1365,6 +1388,7 @@ function badgeSidebarForDifferences(changedElement) { badgeValue = "" } + $(".save-button").html(reasonsForRestart.length > 0 ? SAVE_BUTTON_LABEL_RESTART : SAVE_BUTTON_LABEL_SAVE); $("a[href='#" + panelParentID + "'] .badge").html(badgeValue); } diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index 42db16aa72..3dcf747113 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -353,6 +353,14 @@ FocusScope { showDesktop(); } + function ensureTitleBarVisible(targetWindow) { + // Reposition window to ensure that title bar is vertically inside window. + if (targetWindow.frame && targetWindow.frame.decoration) { + var topMargin = -targetWindow.frame.decoration.anchors.topMargin; // Frame's topMargin is a negative value. + targetWindow.y = Math.max(targetWindow.y, topMargin); + } + } + function centerOnVisible(item) { var targetWindow = d.getDesktopWindow(item); if (!targetWindow) { @@ -375,11 +383,12 @@ FocusScope { targetWindow.x = newX; targetWindow.y = newY; + ensureTitleBarVisible(targetWindow); + // If we've noticed that our recommended desktop rect has changed, record that change here. if (recommendedRect != newRecommendedRect) { recommendedRect = newRecommendedRect; } - } function repositionOnVisible(item) { @@ -394,7 +403,6 @@ FocusScope { return; } - var oldRecommendedRect = recommendedRect; var oldRecommendedDimmensions = { x: oldRecommendedRect.width, y: oldRecommendedRect.height }; var newRecommendedRect = Controller.getRecommendedOverlayRect(); @@ -426,7 +434,6 @@ FocusScope { newPosition.y = -1 } - if (newPosition.x === -1 && newPosition.y === -1) { var originRelativeX = (targetWindow.x - oldRecommendedRect.x); var originRelativeY = (targetWindow.y - oldRecommendedRect.y); @@ -444,6 +451,8 @@ FocusScope { } targetWindow.x = newPosition.x; targetWindow.y = newPosition.y; + + ensureTitleBarVisible(targetWindow); } Component { id: messageDialogBuilder; MessageDialog { } } diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index a86defdfd7..91c1d99cf5 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -590,14 +590,11 @@ Item { console.log("This avatar is no longer present. goToUserInDomain() failed."); return; } - var vector = Vec3.subtract(avatar.position, MyAvatar.position); - var distance = Vec3.length(vector); - var target = Vec3.multiply(Vec3.normalize(vector), distance - 2.0); // FIXME: We would like the avatar to recompute the avatar's "maybe fly" test at the new position, so that if high enough up, // the avatar goes into fly mode rather than falling. However, that is not exposed to Javascript right now. // FIXME: it would be nice if this used the same teleport steps and smoothing as in the teleport.js script. // Note, however, that this script allows teleporting to a person in the air, while teleport.js is going to a grounded target. - MyAvatar.orientation = Quat.lookAtSimple(MyAvatar.position, avatar.position); - MyAvatar.position = Vec3.sum(MyAvatar.position, target); + MyAvatar.position = Vec3.sum(avatar.position, Vec3.multiplyQbyV(avatar.orientation, {x: 0, y: 0, z: -2})); + MyAvatar.orientation = Quat.multiply(avatar.orientation, {y: 1}); } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2d65d2f58d..8505e07181 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -582,7 +582,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _undoStackScriptingInterface(&_undoStack), _entitySimulation(new PhysicalEntitySimulation()), _physicsEngine(new PhysicsEngine(Vectors::ZERO)), - _entityClipboardRenderer(false, this, this), _entityClipboard(new EntityTree()), _lastQueriedTime(usecTimestampNow()), _previousScriptLocation("LastScriptLocation", DESKTOP_LOCATION), @@ -957,7 +956,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo // Make sure we don't time out during slow operations at startup updateHeartbeat(); - connect(this, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit())); + connect(this, SIGNAL(aboutToQuit()), this, SLOT(onAboutToQuit())); // hook up bandwidth estimator QSharedPointer bandwidthRecorder = DependencyManager::get(); @@ -1451,7 +1450,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo }); sendStatsTimer->start(); - // Periodically check for count of nearby avatars static int lastCountOfNearbyAvatars = -1; QTimer* checkNearbyAvatarsTimer = new QTimer(this); @@ -1646,7 +1644,7 @@ void Application::updateHeartbeat() const { static_cast(_deadlockWatchdogThread)->updateHeartbeat(); } -void Application::aboutToQuit() { +void Application::onAboutToQuit() { emit beforeAboutToQuit(); foreach(auto inputPlugin, PluginManager::getInstance()->getInputPlugins()) { @@ -3990,11 +3988,6 @@ void Application::init() { DependencyManager::get()->sendDomainServerCheckIn(); getEntities()->init(); - { - QMutexLocker viewLocker(&_viewMutex); - getEntities()->setViewFrustum(_viewFrustum); - } - getEntities()->setEntityLoadingPriorityFunction([this](const EntityItem& item) { auto dims = item.getDimensions(); auto maxSize = glm::compMax(dims); @@ -4024,13 +4017,6 @@ void Application::init() { // of events related clicking, hovering over, and entering entities getEntities()->connectSignalsToSlots(entityScriptingInterface.data()); - _entityClipboardRenderer.init(); - { - QMutexLocker viewLocker(&_viewMutex); - _entityClipboardRenderer.setViewFrustum(_viewFrustum); - } - _entityClipboardRenderer.setTree(_entityClipboard); - // Make sure any new sounds are loaded as soon as know about them. connect(tree.get(), &EntityTree::newCollisionSoundURL, this, [this](QUrl newURL, EntityItemID id) { EntityTreePointer tree = getEntities()->getTree(); @@ -5023,9 +5009,6 @@ QRect Application::getDesirableApplicationGeometry() const { return applicationGeometry; } -// FIXME, preprocessor guard this check to occur only in DEBUG builds -static QThread * activeRenderingThread = nullptr; - PickRay Application::computePickRay(float x, float y) const { vec2 pickPoint { x, y }; PickRay result; @@ -5096,7 +5079,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se auto myAvatar = getMyAvatar(); myAvatar->preDisplaySide(renderArgs); - activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(render, __FUNCTION__); PerformanceTimer perfTimer("display"); PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()"); @@ -5169,8 +5151,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // Before the deferred pass, let's try to use the render engine _renderEngine->run(); } - - activeRenderingThread = nullptr; } void Application::resetSensors(bool andReload) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 9db492b177..dadedde7bd 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -181,7 +181,6 @@ public: QUndoStack* getUndoStack() { return &_undoStack; } MainWindow* getWindow() const { return _window; } EntityTreePointer getEntityClipboard() const { return _entityClipboard; } - EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } EntityEditPacketSender* getEntityEditPacketSender() { return &_entityEditSender; } ivec2 getMouse() const; @@ -399,7 +398,7 @@ private slots: void showDesktop(); void clearDomainOctreeDetails(); void clearDomainAvatars(); - void aboutToQuit(); + void onAboutToQuit(); void resettingDomain(); @@ -532,7 +531,6 @@ private: PhysicalEntitySimulationPointer _entitySimulation; PhysicsEnginePointer _physicsEngine; - EntityTreeRenderer _entityClipboardRenderer; EntityTreePointer _entityClipboard; mutable QMutex _viewMutex { QMutex::Recursive }; diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index d25546ca2d..3d5161298d 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -17,6 +17,7 @@ #include #include #include +#include const float DEFAULT_DESKTOP_LOD_DOWN_FPS = 20.0; const float DEFAULT_HMD_LOD_DOWN_FPS = 20.0; @@ -45,7 +46,6 @@ const float ADJUST_LOD_MAX_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE; // This controls how low the auto-adjust LOD will go. We want a minimum vision of ~20:500 or 0.04 of default const float ADJUST_LOD_MIN_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE * 0.04f; -class RenderArgs; class AABox; class LODManager : public QObject, public Dependency { diff --git a/interface/src/audio/AudioScope.h b/interface/src/audio/AudioScope.h index 615bdaf17f..e0c8840bb2 100644 --- a/interface/src/audio/AudioScope.h +++ b/interface/src/audio/AudioScope.h @@ -19,7 +19,6 @@ #include #include -#include class AudioScope : public QObject, public Dependency { diff --git a/interface/src/scripting/MenuScriptingInterface.cpp b/interface/src/scripting/MenuScriptingInterface.cpp index cf186271d2..91fba1ce9e 100644 --- a/interface/src/scripting/MenuScriptingInterface.cpp +++ b/interface/src/scripting/MenuScriptingInterface.cpp @@ -152,9 +152,13 @@ void MenuScriptingInterface::closeInfoView(const QString& path) { } bool MenuScriptingInterface::isInfoViewVisible(const QString& path) { + if (QThread::currentThread() == qApp->thread()) { + return Menu::getInstance()->isInfoViewVisible(path); + } + bool result; QMetaObject::invokeMethod(Menu::getInstance(), "isInfoViewVisible", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(bool, result), Q_ARG(const QString&, path)); + Q_RETURN_ARG(bool, result), Q_ARG(const QString&, path)); return result; } diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 161c407a45..8e3636dd7e 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include "SequenceNumberStats.h" #include "StatTracker.h" + HIFI_QML_DEF(Stats) using namespace std; @@ -454,7 +456,7 @@ void Stats::updateStats(bool force) { } } -void Stats::setRenderDetails(const RenderDetails& details) { +void Stats::setRenderDetails(const render::RenderDetails& details) { STAT_UPDATE(triangles, details._trianglesRendered); STAT_UPDATE(materialSwitches, details._materialSwitches); if (_expanded) { diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 2abb84faea..74d2589c35 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -9,10 +9,11 @@ #ifndef hifi_Stats_h #define hifi_Stats_h +#include + #include -#include -#include #include +#include #define STATS_PROPERTY(type, name, initialValue) \ Q_PROPERTY(type name READ name NOTIFY name##Changed) \ @@ -138,7 +139,7 @@ public: Stats(QQuickItem* parent = nullptr); bool includeTimingRecord(const QString& name); - void setRenderDetails(const RenderDetails& details); + void setRenderDetails(const render::RenderDetails& details); const QString& monospaceFont() { return _monospaceFont; } diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index 45d63d9cf1..3e0bb74bc4 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -112,7 +112,7 @@ void Image3DOverlay::render(RenderArgs* args) { _geometryId ); - batch->setResourceTexture(0, args->_whiteTexture); // restore default white color after me + batch->setResourceTexture(0, nullptr); // restore default white color after me } const render::ShapeKey Image3DOverlay::getShapeKey() { diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp deleted file mode 100644 index ba82ba780a..0000000000 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// LocalModelsOverlay.cpp -// interface/src/ui/overlays -// -// Created by Ryan Huffman on 07/08/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "LocalModelsOverlay.h" - -#include -#include - - -QString const LocalModelsOverlay::TYPE = "localmodels"; - -LocalModelsOverlay::LocalModelsOverlay(EntityTreeRenderer* entityTreeRenderer) : - Volume3DOverlay(), - _entityTreeRenderer(entityTreeRenderer) { -} - -LocalModelsOverlay::LocalModelsOverlay(const LocalModelsOverlay* localModelsOverlay) : - Volume3DOverlay(localModelsOverlay), - _entityTreeRenderer(localModelsOverlay->_entityTreeRenderer) -{ -} - -void LocalModelsOverlay::update(float deltatime) { - _entityTreeRenderer->update(); -} - -void LocalModelsOverlay::render(RenderArgs* args) { - if (_visible) { - auto batch = args ->_batch; - - Transform transform = Transform(); - transform.setTranslation(args->getViewFrustum().getPosition() + getPosition()); - batch->setViewTransform(transform); - _entityTreeRenderer->render(args); - transform.setTranslation(args->getViewFrustum().getPosition()); - batch->setViewTransform(transform); - } -} - -LocalModelsOverlay* LocalModelsOverlay::createClone() const { - return new LocalModelsOverlay(this); -} diff --git a/interface/src/ui/overlays/LocalModelsOverlay.h b/interface/src/ui/overlays/LocalModelsOverlay.h deleted file mode 100644 index 6bab7f5f86..0000000000 --- a/interface/src/ui/overlays/LocalModelsOverlay.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// LocalModelsOverlay.h -// interface/src/ui/overlays -// -// Created by Ryan Huffman on 07/08/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_LocalModelsOverlay_h -#define hifi_LocalModelsOverlay_h - -#include "Volume3DOverlay.h" - -class EntityTreeRenderer; - -class LocalModelsOverlay : public Volume3DOverlay { - Q_OBJECT -public: - static QString const TYPE; - virtual QString getType() const override { return TYPE; } - - LocalModelsOverlay(EntityTreeRenderer* entityTreeRenderer); - LocalModelsOverlay(const LocalModelsOverlay* localModelsOverlay); - - virtual void update(float deltatime) override; - virtual void render(RenderArgs* args) override; - - virtual LocalModelsOverlay* createClone() const override; - -private: - EntityTreeRenderer* _entityTreeRenderer; -}; - -#endif // hifi_LocalModelsOverlay_h diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 4970112405..a9efd51a3e 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -26,7 +26,6 @@ #include "Shape3DOverlay.h" #include "ImageOverlay.h" #include "Line3DOverlay.h" -#include "LocalModelsOverlay.h" #include "ModelOverlay.h" #include "Rectangle3DOverlay.h" #include "Sphere3DOverlay.h" @@ -171,8 +170,6 @@ OverlayID Overlays::addOverlay(const QString& type, const QVariant& properties) thisOverlay = std::make_shared(); } else if (type == Grid3DOverlay::TYPE) { thisOverlay = std::make_shared(); - } else if (type == LocalModelsOverlay::TYPE) { - thisOverlay = std::make_shared(qApp->getEntityClipboardRenderer()); } else if (type == ModelOverlay::TYPE) { thisOverlay = std::make_shared(); } else if (type == Web3DOverlay::TYPE) { diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index f1beeea7f5..d14805c1ba 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -21,7 +21,6 @@ #include "Cube3DOverlay.h" #include "ImageOverlay.h" #include "Line3DOverlay.h" -#include "LocalModelsOverlay.h" #include "ModelOverlay.h" #include "Overlays.h" #include "Rectangle3DOverlay.h" diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index c75c46f045..25155efea6 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -321,7 +321,7 @@ void Web3DOverlay::render(RenderArgs* args) { geometryCache->bindOpaqueWebBrowserProgram(batch, _isAA); } geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color, _geometryId); - batch.setResourceTexture(0, args->_whiteTexture); // restore default white color after me + batch.setResourceTexture(0, nullptr); // restore default white color after me } const render::ShapeKey Web3DOverlay::getShapeKey() { @@ -443,17 +443,27 @@ void Web3DOverlay::handlePointerEventAsTouch(const PointerEvent& event) { touchEvent->setTouchPoints(touchPoints); touchEvent->setTouchPointStates(touchPointState); + // Send mouse events to the Web surface so that HTML dialog elements work with mouse press and hover. + // FIXME: Scroll bar dragging is a bit unstable in the tablet (content can jump up and down at times). + // This may be improved in Qt 5.8. Release notes: "Cleaned up touch and mouse event delivery". + // + // In Qt 5.9 mouse events must be sent before touch events to make sure some QtQuick components will + // receive mouse events +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + if (!(this->_pressed && event.getType() == PointerEvent::Move)) { + QMouseEvent* mouseEvent = new QMouseEvent(mouseType, windowPoint, windowPoint, windowPoint, button, buttons, Qt::NoModifier); + QCoreApplication::postEvent(_webSurface->getWindow(), mouseEvent); + } +#endif QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent); - if (this->_pressed && event.getType() == PointerEvent::Move) { +#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0) + if (this->_pressed && event.getType() == PointerEvent::Move) { return; } - // Send mouse events to the Web surface so that HTML dialog elements work with mouse press and hover. - // FIXME: Scroll bar dragging is a bit unstable in the tablet (content can jump up and down at times). - // This may be improved in Qt 5.8. Release notes: "Cleaned up touch and mouse event delivery". - QMouseEvent* mouseEvent = new QMouseEvent(mouseType, windowPoint, windowPoint, windowPoint, button, buttons, Qt::NoModifier); QCoreApplication::postEvent(_webSurface->getWindow(), mouseEvent); +#endif } void Web3DOverlay::handlePointerEventAsMouse(const PointerEvent& event) { diff --git a/libraries/animation/CMakeLists.txt b/libraries/animation/CMakeLists.txt index cc2f3858a3..b9fef19fbb 100644 --- a/libraries/animation/CMakeLists.txt +++ b/libraries/animation/CMakeLists.txt @@ -1,5 +1,7 @@ set(TARGET_NAME animation) setup_hifi_library(Network Script) link_hifi_libraries(shared model fbx) +include_hifi_library_headers(networking) +include_hifi_library_headers(gpu) target_nsight() diff --git a/libraries/audio-client/CMakeLists.txt b/libraries/audio-client/CMakeLists.txt index 9c298ce664..d419a2fb7a 100644 --- a/libraries/audio-client/CMakeLists.txt +++ b/libraries/audio-client/CMakeLists.txt @@ -1,6 +1,8 @@ set(TARGET_NAME audio-client) setup_hifi_library(Network Multimedia) link_hifi_libraries(audio plugins) +include_hifi_library_headers(shared) +include_hifi_library_headers(networking) # append audio includes to our list of includes to bubble target_include_directories(${TARGET_NAME} PUBLIC "${HIFI_LIBRARY_DIR}/audio/src") diff --git a/libraries/avatars-renderer/CMakeLists.txt b/libraries/avatars-renderer/CMakeLists.txt index 2ac5e6766d..bfbeab086d 100644 --- a/libraries/avatars-renderer/CMakeLists.txt +++ b/libraries/avatars-renderer/CMakeLists.txt @@ -2,5 +2,17 @@ set(TARGET_NAME avatars-renderer) AUTOSCRIBE_SHADER_LIB(gpu model render render-utils) setup_hifi_library(Widgets Network Script) link_hifi_libraries(shared gpu model animation model-networking script-engine render image render-utils) +include_hifi_library_headers(avatars) +include_hifi_library_headers(networking) +include_hifi_library_headers(fbx) +include_hifi_library_headers(recording) +include_hifi_library_headers(trackers) +include_hifi_library_headers(ktx) +include_hifi_library_headers(procedural) +include_hifi_library_headers(physics) +include_hifi_library_headers(entities-renderer) +include_hifi_library_headers(audio) +include_hifi_library_headers(entities) +include_hifi_library_headers(octree) target_bullet() diff --git a/libraries/controllers/CMakeLists.txt b/libraries/controllers/CMakeLists.txt index bf226f2647..6b1ab72c60 100644 --- a/libraries/controllers/CMakeLists.txt +++ b/libraries/controllers/CMakeLists.txt @@ -5,6 +5,7 @@ setup_hifi_library(Script Qml) # use setup_hifi_library macro to setup our project and link appropriate Qt modules link_hifi_libraries(shared) +include_hifi_library_headers(networking) GroupSources("src/controllers") diff --git a/libraries/display-plugins/CMakeLists.txt b/libraries/display-plugins/CMakeLists.txt index b7542c1d86..83a1c635ca 100644 --- a/libraries/display-plugins/CMakeLists.txt +++ b/libraries/display-plugins/CMakeLists.txt @@ -2,6 +2,14 @@ set(TARGET_NAME display-plugins) AUTOSCRIBE_SHADER_LIB(gpu display-plugins) setup_hifi_library(OpenGL) link_hifi_libraries(shared plugins ui-plugins gl gpu-gl ui render-utils) +include_hifi_library_headers(gpu) +include_hifi_library_headers(model-networking) +include_hifi_library_headers(networking) +include_hifi_library_headers(model) +include_hifi_library_headers(fbx) +include_hifi_library_headers(image) +include_hifi_library_headers(ktx) +include_hifi_library_headers(render) target_opengl() diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp index 5a3e5afc86..fd45398236 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp @@ -10,7 +10,6 @@ #include #include -#include #include const QString DebugHmdDisplayPlugin::NAME("HMD Simulator"); diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 8ef28bbc7b..3df33b6a5d 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -2,6 +2,16 @@ set(TARGET_NAME entities-renderer) AUTOSCRIBE_SHADER_LIB(gpu model procedural render render-utils) setup_hifi_library(Widgets Network Script) link_hifi_libraries(shared gpu procedural model model-networking script-engine render render-utils image) +include_hifi_library_headers(networking) +include_hifi_library_headers(gl) +include_hifi_library_headers(ktx) +include_hifi_library_headers(octree) +include_hifi_library_headers(audio) +include_hifi_library_headers(physics) +include_hifi_library_headers(animation) +include_hifi_library_headers(fbx) +include_hifi_library_headers(entities) +include_hifi_library_headers(avatars) target_bullet() diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 1b92adbc37..5b258db46b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "EntityTreeRenderer.h" + #include #include @@ -24,7 +26,6 @@ #include #include -#include "EntityTreeRenderer.h" #include "RenderableEntityItem.h" @@ -130,7 +131,12 @@ void EntityTreeRenderer::clear() { if (scene) { render::Transaction transaction; foreach(auto entity, _entitiesInScene) { - entity->removeFromScene(entity, scene, transaction); + auto renderable = entity->getRenderableInterface(); + if (!renderable) { + qCWarning(entitiesrenderer) << "EntityTreeRenderer::deletingEntity(), trying to remove non-renderable entity"; + continue; + } + renderable->removeFromScene(entity, scene, transaction); } scene->enqueueTransaction(transaction); } else { @@ -141,7 +147,7 @@ void EntityTreeRenderer::clear() { // reset the zone to the default (while we load the next scene) _layeredZones.clear(); - OctreeRenderer::clear(); + OctreeProcessor::clear(); } void EntityTreeRenderer::reloadEntityScripts() { @@ -155,7 +161,7 @@ void EntityTreeRenderer::reloadEntityScripts() { } void EntityTreeRenderer::init() { - OctreeRenderer::init(); + OctreeProcessor::init(); EntityTreePointer entityTree = std::static_pointer_cast(_tree); entityTree->setFBXService(this); @@ -181,7 +187,7 @@ void EntityTreeRenderer::shutdown() { } void EntityTreeRenderer::setTree(OctreePointer newTree) { - OctreeRenderer::setTree(newTree); + OctreeProcessor::setTree(newTree); std::static_pointer_cast(_tree)->setFBXService(this); } @@ -791,24 +797,33 @@ void EntityTreeRenderer::mouseMoveEvent(QMouseEvent* event) { } void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) { + if (!_entitiesInScene.contains(entityID)) { + return; + } + if (_tree && !_shuttingDown && _entitiesScriptEngine) { _entitiesScriptEngine->unloadEntityScript(entityID, true); } + auto scene = _viewState->getMain3DScene(); + if (!scene) { + qCWarning(entitiesrenderer) << "EntityTreeRenderer::deletingEntity(), Unexpected null scene, possibly during application shutdown"; + return; + } + + auto entity = _entitiesInScene.take(entityID); + auto renderable = entity->getRenderableInterface(); + if (!renderable) { + qCWarning(entitiesrenderer) << "EntityTreeRenderer::deletingEntity(), trying to remove non-renderable entity"; + return; + } + forceRecheckEntities(); // reset our state to force checking our inside/outsideness of entities // here's where we remove the entity payload from the scene - if (_entitiesInScene.contains(entityID)) { - auto entity = _entitiesInScene.take(entityID); - render::Transaction transaction; - auto scene = _viewState->getMain3DScene(); - if (scene) { - entity->removeFromScene(entity, scene, transaction); - scene->enqueueTransaction(transaction); - } else { - qCWarning(entitiesrenderer) << "EntityTreeRenderer::deletingEntity(), Unexpected null scene, possibly during application shutdown"; - } - } + render::Transaction transaction; + renderable->removeFromScene(entity, scene, transaction); + scene->enqueueTransaction(transaction); } void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { @@ -820,18 +835,25 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { } } -void EntityTreeRenderer::addEntityToScene(EntityItemPointer entity) { +void EntityTreeRenderer::addEntityToScene(const EntityItemPointer& entity) { // here's where we add the entity payload to the scene - render::Transaction transaction; auto scene = _viewState->getMain3DScene(); - if (scene) { - if (entity->addToScene(entity, scene, transaction)) { - _entitiesInScene.insert(entity->getEntityItemID(), entity); - } - scene->enqueueTransaction(transaction); - } else { + if (!scene) { qCWarning(entitiesrenderer) << "EntityTreeRenderer::addEntityToScene(), Unexpected null scene, possibly during application shutdown"; + return; } + + auto renderable = entity->getRenderableInterface(); + if (!renderable) { + qCWarning(entitiesrenderer) << "EntityTreeRenderer::addEntityToScene(), Unexpected non-renderable entity"; + return; + } + + render::Transaction transaction; + if (renderable->addToScene(entity, scene, transaction)) { + _entitiesInScene.insert(entity->getEntityItemID(), entity); + } + scene->enqueueTransaction(transaction); } @@ -1050,3 +1072,4 @@ bool EntityTreeRenderer::LayeredZones::contains(const LayeredZones& other) { } return result; } + diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index bf4148212b..5dcbd1aeb9 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -20,9 +20,10 @@ #include #include #include -#include #include #include +#include +#include class AbstractScriptingServicesInterface; class AbstractViewStateInterface; @@ -38,7 +39,7 @@ using ModelWeakPointer = std::weak_ptr; using CalculateEntityLoadingPriority = std::function; // Generic client side Octree renderer class. -class EntityTreeRenderer : public OctreeRenderer, public EntityItemFBXService, public Dependency { +class EntityTreeRenderer : public OctreeProcessor, public EntityItemFBXService, public Dependency { Q_OBJECT public: EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, @@ -144,7 +145,7 @@ protected: private: void resetEntitiesScriptEngine(); - void addEntityToScene(EntityItemPointer entity); + void addEntityToScene(const EntityItemPointer& entity); bool findBestZoneAndMaybeContainingEntities(QVector* entitiesContainingAvatar = nullptr); bool applyLayeredZones(); diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index be9ef08c0b..f8d155600a 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -40,7 +40,7 @@ namespace render { template <> void payloadRender(const RenderableEntityItemProxy::Pointer& payload, RenderArgs* args) { if (args) { if (payload && payload->_entity && payload->_entity->getVisible()) { - payload->_entity->render(args); + payload->_entity->getRenderableInterface()->render(args); } } } diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 1c08707e82..244a850d67 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -34,13 +34,23 @@ enum class RenderItemStatusIcon { void makeEntityItemStatusGetters(EntityItemPointer entity, render::Item::Status::Getters& statusGetters); +// Renderable entity item interface +class RenderableEntityInterface { +public: + virtual void render(RenderArgs* args) {}; + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) = 0; + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) = 0; + virtual RenderableEntityInterface* getRenderableInterface() { return nullptr; } +}; + class RenderableEntityItemProxy { public: - RenderableEntityItemProxy(EntityItemPointer entity, render::ItemID metaID) : _entity(entity), _metaID(metaID) { } + RenderableEntityItemProxy(const EntityItemPointer& entity, render::ItemID metaID) + : _entity(entity), _metaID(metaID) {} typedef render::Payload Payload; typedef Payload::DataPointer Pointer; - EntityItemPointer _entity; + const EntityItemPointer _entity; render::ItemID _metaID; }; @@ -51,10 +61,11 @@ namespace render { template <> uint32_t metaFetchMetaSubItems(const RenderableEntityItemProxy::Pointer& payload, ItemIDs& subItems); } + // Mixin class for implementing basic single item rendering -class SimpleRenderableEntityItem { +class SimplerRenderableEntitySupport : public RenderableEntityInterface { public: - bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { + bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override { _myItem = scene->allocateID(); auto renderData = std::make_shared(self, _myItem); @@ -69,7 +80,7 @@ public: return true; } - void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { + void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override { transaction.removeItem(_myItem); render::Item::clearID(_myItem); } @@ -91,7 +102,6 @@ public: qCWarning(entitiesrenderer) << "SimpleRenderableEntityItem::notifyChanged(), Unexpected null scene, possibly during application shutdown"; } } - private: render::ItemID _myItem { render::Item::INVALID_ITEM_ID }; }; @@ -99,20 +109,18 @@ private: #define SIMPLE_RENDERABLE() \ public: \ - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override { return _renderHelper.addToScene(self, scene, transaction); } \ - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override { _renderHelper.removeFromScene(self, scene, transaction); } \ - virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); _renderHelper.notifyChanged(); } \ - virtual void dimensionsChanged() override { EntityItem::dimensionsChanged(); _renderHelper.notifyChanged(); } \ + virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); notifyChanged(); } \ + virtual void dimensionsChanged() override { EntityItem::dimensionsChanged(); notifyChanged(); } \ + virtual RenderableEntityInterface* getRenderableInterface() override { return this; } \ void checkFading() { \ bool transparent = isTransparent(); \ if (transparent != _prevIsTransparent) { \ - _renderHelper.notifyChanged(); \ + notifyChanged(); \ _isFading = false; \ _prevIsTransparent = transparent; \ } \ } \ private: \ - SimpleRenderableEntityItem _renderHelper; \ bool _prevIsTransparent { isTransparent() }; diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index cc292759f0..09cbe3dcf2 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -27,7 +27,7 @@ RenderableLightEntityItem::RenderableLightEntityItem(const EntityItemID& entityI { } -bool RenderableLightEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { +bool RenderableLightEntityItem::addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { _myItem = scene->allocateID(); auto renderItem = std::make_shared(); @@ -51,7 +51,7 @@ void RenderableLightEntityItem::somethingChangedNotification() { LightEntityItem::somethingChangedNotification(); } -void RenderableLightEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { +void RenderableLightEntityItem::removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myItem); render::Item::clearID(_myItem); } diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.h b/libraries/entities-renderer/src/RenderableLightEntityItem.h index 3676023bed..a9f4ba84b6 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.h @@ -17,11 +17,13 @@ #include "RenderableEntityItem.h" -class RenderableLightEntityItem : public LightEntityItem { +class RenderableLightEntityItem : public LightEntityItem, public RenderableEntityInterface { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderableLightEntityItem(const EntityItemID& entityItemID); + RenderableEntityInterface* getRenderableInterface() override { return this; } + virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, @@ -30,10 +32,10 @@ public: void updateLightFromEntity(render::Transaction& transaction); - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void somethingChangedNotification() override; - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void locationChanged(bool tellPhysics = true) override; diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h index 6282bbbfc0..b8663c0055 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -16,7 +16,7 @@ #include "RenderableEntityItem.h" #include -class RenderableLineEntityItem : public LineEntityItem { +class RenderableLineEntityItem : public LineEntityItem, public SimplerRenderableEntitySupport { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderableLineEntityItem(const EntityItemID& entityItemID) : diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index e89646d838..f343fdb155 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -213,7 +213,7 @@ namespace render { if (args) { if (payload && payload->entity) { PROFILE_RANGE(render_detail, "MetaModelRender"); - payload->entity->render(args); + payload->entity->getRenderableInterface()->render(args); } } } @@ -228,7 +228,7 @@ namespace render { } } -bool RenderableModelEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, +bool RenderableModelEntityItem::addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { _myMetaItem = scene->allocateID(); @@ -249,7 +249,7 @@ bool RenderableModelEntityItem::addToScene(EntityItemPointer self, const render: return true; } -void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, +void RenderableModelEntityItem::removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myMetaItem); render::Item::clearID(_myMetaItem); @@ -390,7 +390,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (!_model || _needsModelReload) { // TODO: this getModel() appears to be about 3% of model render time. We should optimize PerformanceTimer perfTimer("getModel"); - auto renderer = qSharedPointerCast(args->_renderer); + auto renderer = qSharedPointerCast(args->_renderData); getModel(renderer); // Remap textures immediately after loading to avoid flicker diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index b440aacd7e..2bbb51b3f0 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -20,7 +20,7 @@ class Model; class EntityTreeRenderer; -class RenderableModelEntityItem : public ModelEntityItem { +class RenderableModelEntityItem : public ModelEntityItem, RenderableEntityInterface { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); @@ -28,6 +28,8 @@ public: virtual ~RenderableModelEntityItem(); + RenderableEntityInterface* getRenderableInterface() override { return this; } + virtual void setDimensions(const glm::vec3& value) override; virtual void setModelURL(const QString& url) override; @@ -40,8 +42,8 @@ public: void doInitialModelSimulation(); - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; void updateModelBounds(); diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index d813a73773..10bd70be13 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -161,7 +161,7 @@ RenderableParticleEffectEntityItem::RenderableParticleEffectEntityItem(const Ent } } -bool RenderableParticleEffectEntityItem::addToScene(EntityItemPointer self, +bool RenderableParticleEffectEntityItem::addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { _scene = scene; @@ -176,7 +176,7 @@ bool RenderableParticleEffectEntityItem::addToScene(EntityItemPointer self, return true; } -void RenderableParticleEffectEntityItem::removeFromScene(EntityItemPointer self, +void RenderableParticleEffectEntityItem::removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_renderItemId); diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h index daa6ba0691..678b582b41 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h @@ -15,18 +15,20 @@ #include #include "RenderableEntityItem.h" -class RenderableParticleEffectEntityItem : public ParticleEffectEntityItem { +class RenderableParticleEffectEntityItem : public ParticleEffectEntityItem, public RenderableEntityInterface { friend class ParticlePayloadData; public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderableParticleEffectEntityItem(const EntityItemID& entityItemID); + RenderableEntityInterface* getRenderableInterface() override { return this; } + virtual void update(const quint64& now) override; void updateRenderItem(); - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; protected: virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); notifyBoundChanged(); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 1e20956301..d2bf8e3532 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -206,7 +206,7 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { if (_texture->isLoaded()) { batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, _texture->getGPUTexture()); } else { - batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, args->_whiteTexture); + batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, nullptr); } batch.setInputFormat(_format); diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index eca6b7035a..8a62a761e0 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -22,7 +22,7 @@ #include -class RenderablePolyLineEntityItem : public PolyLineEntityItem { +class RenderablePolyLineEntityItem : public PolyLineEntityItem, public SimplerRenderableEntitySupport { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); static void createPipeline(); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 7567566919..6cda472d96 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -820,7 +820,7 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { batch.drawIndexed(gpu::TRIANGLES, (gpu::uint32)mesh->getNumIndices(), 0); } -bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, +bool RenderablePolyVoxEntityItem::addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { _myItem = scene->allocateID(); @@ -838,7 +838,7 @@ bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, return true; } -void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, +void RenderablePolyVoxEntityItem::removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myItem); @@ -865,7 +865,7 @@ namespace render { template <> void payloadRender(const PolyVoxPayload::Pointer& payload, RenderArgs* args) { if (args && payload && payload->_owner) { - payload->_owner->render(args); + payload->_owner->getRenderableInterface()->render(args); } } } diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index ff97f09ee1..174d6338d3 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -41,13 +41,15 @@ namespace render { } -class RenderablePolyVoxEntityItem : public PolyVoxEntityItem { +class RenderablePolyVoxEntityItem : public PolyVoxEntityItem, public RenderableEntityInterface { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderablePolyVoxEntityItem(const EntityItemID& entityItemID); virtual ~RenderablePolyVoxEntityItem(); + RenderableEntityInterface* getRenderableInterface() override { return this; } + void initializePolyVox(); virtual void somethingChangedNotification() override { @@ -105,10 +107,10 @@ public: virtual void setYTextureURL(const QString& yTextureURL) override; virtual void setZTextureURL(const QString& zTextureURL) override; - virtual bool addToScene(EntityItemPointer self, + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; diff --git a/libraries/entities-renderer/src/RenderableShapeEntityItem.h b/libraries/entities-renderer/src/RenderableShapeEntityItem.h index 7eefe0e7a4..0cc6a54f81 100644 --- a/libraries/entities-renderer/src/RenderableShapeEntityItem.h +++ b/libraries/entities-renderer/src/RenderableShapeEntityItem.h @@ -14,7 +14,7 @@ #include "RenderableEntityItem.h" -class RenderableShapeEntityItem : public ShapeEntityItem { +class RenderableShapeEntityItem : public ShapeEntityItem, private SimplerRenderableEntitySupport { using Pointer = std::shared_ptr; static Pointer baseFactory(const EntityItemID& entityID, const EntityItemProperties& properties); public: diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.h b/libraries/entities-renderer/src/RenderableTextEntityItem.h index ee75931513..3ca1260b7b 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.h +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.h @@ -19,7 +19,7 @@ const int FIXED_FONT_POINT_SIZE = 40; -class RenderableTextEntityItem : public TextEntityItem { +class RenderableTextEntityItem : public TextEntityItem, public SimplerRenderableEntitySupport { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderableTextEntityItem(const EntityItemID& entityItemID) : TextEntityItem(entityItemID) { } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 3b3480443d..948a219831 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -198,7 +198,7 @@ void RenderableWebEntityItem::render(RenderArgs* args) { #endif if (!_webSurface) { - auto renderer = qSharedPointerCast(args->_renderer); + auto renderer = qSharedPointerCast(args->_renderData); if (!buildWebSurface(renderer)) { return; } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index e47e6bdfd3..bbd59a03d6 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -27,7 +27,7 @@ class EntityTreeRenderer; class RenderableWebEntityItem; -class RenderableWebEntityItem : public WebEntityItem { +class RenderableWebEntityItem : public WebEntityItem, SimplerRenderableEntitySupport { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); RenderableWebEntityItem(const EntityItemID& entityItemID); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index d3fd9a0980..2d4dd50e88 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -257,7 +257,7 @@ bool RenderableZoneEntityItem::contains(const glm::vec3& point) const { return false; } -bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, +bool RenderableZoneEntityItem::addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { _myMetaItem = scene->allocateID(); @@ -277,7 +277,7 @@ bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, const render:: return true; } -void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, +void RenderableZoneEntityItem::removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myMetaItem); render::Item::clearID(_myMetaItem); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index d0c7f64fbb..4685a0d3e1 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -14,13 +14,14 @@ #include #include +#include "RenderableEntityItem.h" class NetworkGeometry; class KeyLightPayload; class RenderableZoneEntityItemMeta; -class RenderableZoneEntityItem : public ZoneEntityItem { +class RenderableZoneEntityItem : public ZoneEntityItem, public RenderableEntityInterface { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); @@ -30,6 +31,8 @@ public: _needsInitialSimulation(true) { } + RenderableEntityInterface* getRenderableInterface() override { return this; } + virtual bool setProperties(const EntityItemProperties& properties) override; virtual void somethingChangedNotification() override; @@ -41,8 +44,8 @@ public: virtual void render(RenderArgs* args) override; virtual bool contains(const glm::vec3& point) const override; - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual bool addToScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(const EntityItemPointer& self, const render::ScenePointer& scene, render::Transaction& transaction) override; render::ItemID getRenderItemID() const { return _myMetaItem; } diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index b2ae0f0ab7..ddb5fbaf73 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -1,6 +1,8 @@ set(TARGET_NAME entities) setup_hifi_library(Network Script) link_hifi_libraries(avatars shared audio octree model model-networking fbx networking animation) +include_hifi_library_headers(networking) +include_hifi_library_headers(gpu) target_bullet() diff --git a/libraries/entities/src/AddEntityOperator.cpp b/libraries/entities/src/AddEntityOperator.cpp index 7cf4e4a472..e86e70dd80 100644 --- a/libraries/entities/src/AddEntityOperator.cpp +++ b/libraries/entities/src/AddEntityOperator.cpp @@ -30,7 +30,7 @@ AddEntityOperator::AddEntityOperator(EntityTreePointer tree, EntityItemPointer n _newEntityBox = queryCube.clamp((float)(-HALF_TREE_SCALE), (float)HALF_TREE_SCALE); } -bool AddEntityOperator::preRecursion(OctreeElementPointer element) { +bool AddEntityOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); // In Pre-recursion, we're generally deciding whether or not we want to recurse this @@ -60,7 +60,7 @@ bool AddEntityOperator::preRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -bool AddEntityOperator::postRecursion(OctreeElementPointer element) { +bool AddEntityOperator::postRecursion(const OctreeElementPointer& element) { // Post-recursion is the unwinding process. For this operation, while we // unwind we want to mark the path as being dirty if we changed it below. // We might have two paths, one for the old entity and one for the new entity. @@ -74,7 +74,7 @@ bool AddEntityOperator::postRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -OctreeElementPointer AddEntityOperator::possiblyCreateChildAt(OctreeElementPointer element, int childIndex) { +OctreeElementPointer AddEntityOperator::possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) { // If we're getting called, it's because there was no child element at this index while recursing. // We only care if this happens while still searching for the new entity location. // Check to see if diff --git a/libraries/entities/src/AddEntityOperator.h b/libraries/entities/src/AddEntityOperator.h index 0f33cacae3..48ee49f4d1 100644 --- a/libraries/entities/src/AddEntityOperator.h +++ b/libraries/entities/src/AddEntityOperator.h @@ -16,9 +16,9 @@ class AddEntityOperator : public RecurseOctreeOperator { public: AddEntityOperator(EntityTreePointer tree, EntityItemPointer newEntity); - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override; - virtual OctreeElementPointer possiblyCreateChildAt(OctreeElementPointer element, int childIndex) override; + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override; + virtual OctreeElementPointer possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) override; private: EntityTreePointer _tree; EntityItemPointer _newEntity; diff --git a/libraries/entities/src/DeleteEntityOperator.cpp b/libraries/entities/src/DeleteEntityOperator.cpp index 48335c22b8..709c281341 100644 --- a/libraries/entities/src/DeleteEntityOperator.cpp +++ b/libraries/entities/src/DeleteEntityOperator.cpp @@ -55,7 +55,7 @@ void DeleteEntityOperator::addEntityIDToDeleteList(const EntityItemID& searchEnt // does this entity tree element contain the old entity -bool DeleteEntityOperator::subTreeContainsSomeEntitiesToDelete(OctreeElementPointer element) { +bool DeleteEntityOperator::subTreeContainsSomeEntitiesToDelete(const OctreeElementPointer& element) { bool containsEntity = false; // If we don't have an old entity, then we don't contain the entity, otherwise @@ -72,7 +72,7 @@ bool DeleteEntityOperator::subTreeContainsSomeEntitiesToDelete(OctreeElementPoin return containsEntity; } -bool DeleteEntityOperator::preRecursion(OctreeElementPointer element) { +bool DeleteEntityOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); // In Pre-recursion, we're generally deciding whether or not we want to recurse this @@ -108,7 +108,7 @@ bool DeleteEntityOperator::preRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -bool DeleteEntityOperator::postRecursion(OctreeElementPointer element) { +bool DeleteEntityOperator::postRecursion(const OctreeElementPointer& element) { // Post-recursion is the unwinding process. For this operation, while we // unwind we want to mark the path as being dirty if we changed it below. // We might have two paths, one for the old entity and one for the new entity. diff --git a/libraries/entities/src/DeleteEntityOperator.h b/libraries/entities/src/DeleteEntityOperator.h index 245d331743..135949a53d 100644 --- a/libraries/entities/src/DeleteEntityOperator.h +++ b/libraries/entities/src/DeleteEntityOperator.h @@ -36,8 +36,8 @@ public: ~DeleteEntityOperator(); void addEntityIDToDeleteList(const EntityItemID& searchEntityID); - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override; + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override; const RemovedEntities& getEntities() const { return _entitiesToDelete; } private: @@ -46,7 +46,7 @@ private: quint64 _changeTime; int _foundCount; int _lookingCount; - bool subTreeContainsSomeEntitiesToDelete(OctreeElementPointer element); + bool subTreeContainsSomeEntitiesToDelete(const OctreeElementPointer& element); }; #endif // hifi_DeleteEntityOperator_h diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 7c08137a1c..0318c72991 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -51,10 +51,6 @@ typedef std::shared_ptr EntityTreeElementPointer; using EntityTreeElementExtraEncodeDataPointer = std::shared_ptr; -namespace render { - class Scene; - class Transaction; -} #define DONT_ALLOW_INSTANTIATION virtual void pureVirtualFunctionPlaceHolder() = 0; #define ALLOW_INSTANTIATION virtual void pureVirtualFunctionPlaceHolder() override { }; @@ -65,6 +61,8 @@ namespace render { class MeshProxyList; +class RenderableEntityInterface; + /// EntityItem class this is the base class for all entity types. It handles the basic properties and functionality available /// to all other entity types. In particular: postion, size, rotation, age, lifetime, velocity, gravity. You can not instantiate @@ -83,6 +81,8 @@ public: EntityItem(const EntityItemID& entityItemID); virtual ~EntityItem(); + virtual RenderableEntityInterface* getRenderableInterface() { return nullptr; } + inline EntityItemPointer getThisPointer() const { return std::static_pointer_cast(std::const_pointer_cast(shared_from_this())); } @@ -150,13 +150,6 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) { somethingChanged = false; return 0; } - - virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, - render::Transaction& transaction) { return false; } // by default entity items don't add to scene - virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, - render::Transaction& transaction) { } // by default entity items don't add to scene - virtual void render(RenderArgs* args) { } // by default entity items don't know how to render - static int expectedBytes(); static void adjustEditPacketForClockSkew(QByteArray& buffer, qint64 clockSkew); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 2c37b8679d..11694c4cea 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -554,7 +554,7 @@ public: }; -bool EntityTree::findNearPointOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::findNearPointOperation(const OctreeElementPointer& element, void* extraData) { FindNearPointArgs* args = static_cast(extraData); EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); @@ -589,7 +589,7 @@ bool EntityTree::findNearPointOperation(OctreeElementPointer element, void* extr return false; } -bool findRayIntersectionOp(OctreeElementPointer element, void* extraData) { +bool findRayIntersectionOp(const OctreeElementPointer& element, void* extraData) { RayArgs* args = static_cast(extraData); bool keepSearching = true; EntityTreeElementPointer entityTreeElementPointer = std::dynamic_pointer_cast(element); @@ -625,7 +625,7 @@ bool EntityTree::findRayIntersection(const glm::vec3& origin, const glm::vec3& d } -EntityItemPointer EntityTree::findClosestEntity(glm::vec3 position, float targetRadius) { +EntityItemPointer EntityTree::findClosestEntity(const glm::vec3& position, float targetRadius) { FindNearPointArgs args = { position, targetRadius, false, NULL, FLT_MAX }; withReadLock([&] { // NOTE: This should use recursion, since this is a spatial operation @@ -642,7 +642,7 @@ public: }; -bool EntityTree::findInSphereOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::findInSphereOperation(const OctreeElementPointer& element, void* extraData) { FindAllNearPointArgs* args = static_cast(extraData); glm::vec3 penetration; bool sphereIntersection = element->getAACube().findSpherePenetration(args->position, args->targetRadius, penetration); @@ -678,7 +678,7 @@ public: QVector _foundEntities; }; -bool EntityTree::findInCubeOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::findInCubeOperation(const OctreeElementPointer& element, void* extraData) { FindEntitiesInCubeArgs* args = static_cast(extraData); if (element->getAACube().touches(args->_cube)) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); @@ -707,7 +707,7 @@ public: QVector _foundEntities; }; -bool EntityTree::findInBoxOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::findInBoxOperation(const OctreeElementPointer& element, void* extraData) { FindEntitiesInBoxArgs* args = static_cast(extraData); if (element->getAACube().touches(args->_box)) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); @@ -732,7 +732,7 @@ public: QVector entities; }; -bool EntityTree::findInFrustumOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::findInFrustumOperation(const OctreeElementPointer& element, void* extraData) { FindInFrustumArgs* args = static_cast(extraData); if (element->isInView(args->frustum)) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); @@ -1527,15 +1527,15 @@ void EntityTree::debugDumpMap() { class ContentsDimensionOperator : public RecurseOctreeOperator { public: - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override { return true; } + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override { return true; } glm::vec3 getDimensions() const { return _contentExtents.size(); } float getLargestDimension() const { return _contentExtents.largestDimension(); } private: Extents _contentExtents; }; -bool ContentsDimensionOperator::preRecursion(OctreeElementPointer element) { +bool ContentsDimensionOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); entityTreeElement->expandExtentsToContents(_contentExtents); return true; @@ -1555,11 +1555,11 @@ float EntityTree::getContentsLargestDimension() { class DebugOperator : public RecurseOctreeOperator { public: - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override { return true; } + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override { return true; } }; -bool DebugOperator::preRecursion(OctreeElementPointer element) { +bool DebugOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); qCDebug(entities) << "EntityTreeElement [" << entityTreeElement.get() << "]"; entityTreeElement->debugDump(); @@ -1573,11 +1573,11 @@ void EntityTree::dumpTree() { class PruneOperator : public RecurseOctreeOperator { public: - virtual bool preRecursion(OctreeElementPointer element) override { return true; } - virtual bool postRecursion(OctreeElementPointer element) override; + virtual bool preRecursion(const OctreeElementPointer& element) override { return true; } + virtual bool postRecursion(const OctreeElementPointer& element) override; }; -bool PruneOperator::postRecursion(OctreeElementPointer element) { +bool PruneOperator::postRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); entityTreeElement->pruneChildren(); return true; @@ -1639,6 +1639,7 @@ QVector EntityTree::sendEntities(EntityEditPacketSender* packetSen // If this is called repeatedly (e.g., multiple pastes with the same data), the new elements will clash unless we // use new identifiers. We need to keep a map so that we can map parent identifiers correctly. QHash map; + args.map = ↦ withReadLock([&] { recurseTreeWithOperation(sendEntitiesOperation, &args); @@ -1692,7 +1693,7 @@ QVector EntityTree::sendEntities(EntityEditPacketSender* packetSen return map.values().toVector(); } -bool EntityTree::sendEntitiesOperation(OctreeElementPointer element, void* extraData) { +bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void* extraData) { SendEntitiesOperationArgs* args = static_cast(extraData); EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 00ded171db..8e3c9f5412 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -136,7 +136,7 @@ public: /// \param position point of query in world-frame (meters) /// \param targetRadius radius of query (meters) - EntityItemPointer findClosestEntity(glm::vec3 position, float targetRadius); + EntityItemPointer findClosestEntity(const glm::vec3& position, float targetRadius); EntityItemPointer findEntityByID(const QUuid& id); EntityItemPointer findEntityByEntityItemID(const EntityItemID& entityID); virtual SpatiallyNestablePointer findByID(const QUuid& id) override { return findEntityByID(id); } @@ -294,12 +294,12 @@ protected: bool updateEntityWithElement(EntityItemPointer entity, const EntityItemProperties& properties, EntityTreeElementPointer containingElement, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); - static bool findNearPointOperation(OctreeElementPointer element, void* extraData); - static bool findInSphereOperation(OctreeElementPointer element, void* extraData); - static bool findInCubeOperation(OctreeElementPointer element, void* extraData); - static bool findInBoxOperation(OctreeElementPointer element, void* extraData); - static bool findInFrustumOperation(OctreeElementPointer element, void* extraData); - static bool sendEntitiesOperation(OctreeElementPointer element, void* extraData); + static bool findNearPointOperation(const OctreeElementPointer& element, void* extraData); + static bool findInSphereOperation(const OctreeElementPointer& element, void* extraData); + static bool findInCubeOperation(const OctreeElementPointer& element, void* extraData); + static bool findInBoxOperation(const OctreeElementPointer& element, void* extraData); + static bool findInFrustumOperation(const OctreeElementPointer& element, void* extraData); + static bool sendEntitiesOperation(const OctreeElementPointer& element, void* extraData); static void bumpTimestamp(EntityItemProperties& properties); void notifyNewlyCreatedEntity(const EntityItem& newEntity, const SharedNodePointer& senderNode); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index fd09d4e67b..316bf2b813 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -17,8 +17,6 @@ #include #include -#include // for RenderArgs - #include "EntitiesLogging.h" class EntityItem; diff --git a/libraries/entities/src/MovingEntitiesOperator.cpp b/libraries/entities/src/MovingEntitiesOperator.cpp index 0002ebb570..ab97c67aa2 100644 --- a/libraries/entities/src/MovingEntitiesOperator.cpp +++ b/libraries/entities/src/MovingEntitiesOperator.cpp @@ -109,7 +109,7 @@ void MovingEntitiesOperator::addEntityToMoveList(EntityItemPointer entity, const } // does this entity tree element contain the old entity -bool MovingEntitiesOperator::shouldRecurseSubTree(OctreeElementPointer element) { +bool MovingEntitiesOperator::shouldRecurseSubTree(const OctreeElementPointer& element) { bool containsEntity = false; // If we don't have an old entity, then we don't contain the entity, otherwise @@ -141,7 +141,7 @@ bool MovingEntitiesOperator::shouldRecurseSubTree(OctreeElementPointer element) return containsEntity; } -bool MovingEntitiesOperator::preRecursion(OctreeElementPointer element) { +bool MovingEntitiesOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); // In Pre-recursion, we're generally deciding whether or not we want to recurse this @@ -221,7 +221,7 @@ bool MovingEntitiesOperator::preRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -bool MovingEntitiesOperator::postRecursion(OctreeElementPointer element) { +bool MovingEntitiesOperator::postRecursion(const OctreeElementPointer& element) { // Post-recursion is the unwinding process. For this operation, while we // unwind we want to mark the path as being dirty if we changed it below. // We might have two paths, one for the old entity and one for the new entity. @@ -261,7 +261,7 @@ bool MovingEntitiesOperator::postRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -OctreeElementPointer MovingEntitiesOperator::possiblyCreateChildAt(OctreeElementPointer element, int childIndex) { +OctreeElementPointer MovingEntitiesOperator::possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) { // If we're getting called, it's because there was no child element at this index while recursing. // We only care if this happens while still searching for the new entity locations. if (_foundNewCount < _lookingCount) { diff --git a/libraries/entities/src/MovingEntitiesOperator.h b/libraries/entities/src/MovingEntitiesOperator.h index 27ecb340a8..fc6ccf2513 100644 --- a/libraries/entities/src/MovingEntitiesOperator.h +++ b/libraries/entities/src/MovingEntitiesOperator.h @@ -38,9 +38,9 @@ public: ~MovingEntitiesOperator(); void addEntityToMoveList(EntityItemPointer entity, const AACube& newCube); - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override; - virtual OctreeElementPointer possiblyCreateChildAt(OctreeElementPointer element, int childIndex) override; + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override; + virtual OctreeElementPointer possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) override; bool hasMovingEntities() const { return _entitiesToMove.size() > 0; } private: EntityTreePointer _tree; @@ -49,7 +49,7 @@ private: int _foundOldCount; int _foundNewCount; int _lookingCount; - bool shouldRecurseSubTree(OctreeElementPointer element); + bool shouldRecurseSubTree(const OctreeElementPointer& element); bool _wantDebug; }; diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index e930d5ef5f..217dc0db12 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -14,7 +14,7 @@ #include "EntityItemProperties.h" RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, - OctreeElementPointer top, + const OctreeElementPointer& top, QScriptEngine* engine, bool skipDefaultValues, bool skipThoseWithBadParents) : @@ -34,14 +34,14 @@ RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, } }; -bool RecurseOctreeToMapOperator::preRecursion(OctreeElementPointer element) { +bool RecurseOctreeToMapOperator::preRecursion(const OctreeElementPointer& element) { if (element == _top) { _withinTop = true; } return true; } -bool RecurseOctreeToMapOperator::postRecursion(OctreeElementPointer element) { +bool RecurseOctreeToMapOperator::postRecursion(const OctreeElementPointer& element) { EntityItemProperties defaultProperties; diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.h b/libraries/entities/src/RecurseOctreeToMapOperator.h index dbf8dbd15b..c661badd88 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.h +++ b/libraries/entities/src/RecurseOctreeToMapOperator.h @@ -13,10 +13,10 @@ class RecurseOctreeToMapOperator : public RecurseOctreeOperator { public: - RecurseOctreeToMapOperator(QVariantMap& map, OctreeElementPointer top, QScriptEngine* engine, bool skipDefaultValues, + RecurseOctreeToMapOperator(QVariantMap& map, const OctreeElementPointer& top, QScriptEngine* engine, bool skipDefaultValues, bool skipThoseWithBadParents); - bool preRecursion(OctreeElementPointer element) override; - bool postRecursion(OctreeElementPointer element) override; + bool preRecursion(const OctreeElementPointer& element) override; + bool postRecursion(const OctreeElementPointer& element) override; private: QVariantMap& _map; OctreeElementPointer _top; diff --git a/libraries/entities/src/UpdateEntityOperator.cpp b/libraries/entities/src/UpdateEntityOperator.cpp index 84f801b059..ec6051af04 100644 --- a/libraries/entities/src/UpdateEntityOperator.cpp +++ b/libraries/entities/src/UpdateEntityOperator.cpp @@ -77,7 +77,7 @@ UpdateEntityOperator::~UpdateEntityOperator() { // does this entity tree element contain the old entity -bool UpdateEntityOperator::subTreeContainsOldEntity(OctreeElementPointer element) { +bool UpdateEntityOperator::subTreeContainsOldEntity(const OctreeElementPointer& element) { // We've found cases where the old entity might be placed in an element that is not actually the best fit // so when we're searching the tree for the old element, we use the known cube for the known containing element @@ -95,7 +95,7 @@ bool UpdateEntityOperator::subTreeContainsOldEntity(OctreeElementPointer element return elementContainsOldBox; } -bool UpdateEntityOperator::subTreeContainsNewEntity(OctreeElementPointer element) { +bool UpdateEntityOperator::subTreeContainsNewEntity(const OctreeElementPointer& element) { bool elementContainsNewBox = element->getAACube().contains(_newEntityBox); if (_wantDebug) { @@ -112,7 +112,7 @@ bool UpdateEntityOperator::subTreeContainsNewEntity(OctreeElementPointer element } -bool UpdateEntityOperator::preRecursion(OctreeElementPointer element) { +bool UpdateEntityOperator::preRecursion(const OctreeElementPointer& element) { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); // In Pre-recursion, we're generally deciding whether or not we want to recurse this @@ -238,7 +238,7 @@ bool UpdateEntityOperator::preRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -bool UpdateEntityOperator::postRecursion(OctreeElementPointer element) { +bool UpdateEntityOperator::postRecursion(const OctreeElementPointer& element) { // Post-recursion is the unwinding process. For this operation, while we // unwind we want to mark the path as being dirty if we changed it below. // We might have two paths, one for the old entity and one for the new entity. @@ -270,7 +270,7 @@ bool UpdateEntityOperator::postRecursion(OctreeElementPointer element) { return keepSearching; // if we haven't yet found it, keep looking } -OctreeElementPointer UpdateEntityOperator::possiblyCreateChildAt(OctreeElementPointer element, int childIndex) { +OctreeElementPointer UpdateEntityOperator::possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) { // If we're getting called, it's because there was no child element at this index while recursing. // We only care if this happens while still searching for the new entity location. // Check to see if diff --git a/libraries/entities/src/UpdateEntityOperator.h b/libraries/entities/src/UpdateEntityOperator.h index b33d6c6c3b..5597f93012 100644 --- a/libraries/entities/src/UpdateEntityOperator.h +++ b/libraries/entities/src/UpdateEntityOperator.h @@ -25,9 +25,9 @@ public: ~UpdateEntityOperator(); - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override; - virtual OctreeElementPointer possiblyCreateChildAt(OctreeElementPointer element, int childIndex) override; + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override; + virtual OctreeElementPointer possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) override; private: EntityTreePointer _tree; EntityItemPointer _existingEntity; @@ -45,8 +45,8 @@ private: AABox _oldEntityBox; // clamped to domain AABox _newEntityBox; // clamped to domain - bool subTreeContainsOldEntity(OctreeElementPointer element); - bool subTreeContainsNewEntity(OctreeElementPointer element); + bool subTreeContainsOldEntity(const OctreeElementPointer& element); + bool subTreeContainsNewEntity(const OctreeElementPointer& element); bool _wantDebug; }; diff --git a/libraries/fbx/CMakeLists.txt b/libraries/fbx/CMakeLists.txt index d9f4aaf03e..d9c073f213 100644 --- a/libraries/fbx/CMakeLists.txt +++ b/libraries/fbx/CMakeLists.txt @@ -1,3 +1,4 @@ set(TARGET_NAME fbx) setup_hifi_library() link_hifi_libraries(shared model networking) +include_hifi_library_headers(gpu) diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp index 88e5cde330..4161242a24 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp @@ -223,12 +223,21 @@ TransferJob::TransferJob(const GLTexture& parent, uint16_t sourceMip, uint16_t t // Buffering can invoke disk IO, so it should be off of the main and render threads _bufferingLambda = [=] { - _mipData = _parent._gpuObject.accessStoredMipFace(sourceMip, face)->createView(_transferSize, _transferOffset); + auto mipStorage = _parent._gpuObject.accessStoredMipFace(sourceMip, face); + if (mipStorage) { + _mipData = mipStorage->createView(_transferSize, _transferOffset); + } else { + qCWarning(gpugllogging) << "Buffering failed because mip could not be retrieved from texture " << _parent._source.c_str() ; + } }; _transferLambda = [=] { - _parent.copyMipFaceLinesFromTexture(targetMip, face, transferDimensions, lineOffset, internalFormat, format, type, _mipData->size(), _mipData->readData()); - _mipData.reset(); + if (_mipData) { + _parent.copyMipFaceLinesFromTexture(targetMip, face, transferDimensions, lineOffset, internalFormat, format, type, _mipData->size(), _mipData->readData()); + _mipData.reset(); + } else { + qCWarning(gpugllogging) << "Transfer failed because mip could not be retrieved from texture " << _parent._source.c_str(); + } }; } diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp index ad54ccc3e9..d8b3968ed8 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp @@ -123,7 +123,7 @@ GLuint GL45Texture::allocate(const Texture& texture) { glCreateTextures(getGLTextureType(texture), 1, &result); #ifdef DEBUG auto source = texture.source(); - glObjectLabel(GL_TEXTURE, result, source.length(), source.data()); + glObjectLabel(GL_TEXTURE, result, (GLsizei)source.length(), source.data()); #endif return result; } diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index 211dc7b8ce..1877b494cf 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -18,7 +18,7 @@ #include #include - +#include #include "Forward.h" #include "Resource.h" #include "Metric.h" @@ -311,6 +311,7 @@ public: class KtxStorage : public Storage { public: KtxStorage(const std::string& filename); + KtxStorage(const cache::FilePointer& file); PixelsPointer getMipFace(uint16 level, uint8 face = 0) const override; Size getMipFaceSize(uint16 level, uint8 face = 0) const override; bool isMipAvailable(uint16 level, uint8 face = 0) const override; @@ -328,6 +329,7 @@ public: mutable std::weak_ptr _cacheFile; std::string _filename; + cache::FilePointer _cacheEntry; std::atomic _minMipLevelAvailable; size_t _offsetToMinMipKV; @@ -499,6 +501,7 @@ public: void setStorage(std::unique_ptr& newStorage); void setKtxBacking(const std::string& filename); + void setKtxBacking(const cache::FilePointer& cacheEntry); // Usage is a a set of flags providing Semantic about the usage of the Texture. void setUsage(const Usage& usage) { _usage = usage; } @@ -529,8 +532,9 @@ public: // Serialize a texture into a KTX file static ktx::KTXUniquePointer serialize(const Texture& texture); + static TexturePointer build(const ktx::KTXDescriptor& descriptor); static TexturePointer unserialize(const std::string& ktxFile); - static TexturePointer unserialize(const std::string& ktxFile, const ktx::KTXDescriptor& descriptor); + static TexturePointer unserialize(const cache::FilePointer& cacheEntry); static bool evalKTXFormat(const Element& mipFormat, const Element& texelFormat, ktx::Header& header); static bool evalTextureFormat(const ktx::Header& header, Element& mipFormat, Element& texelFormat); diff --git a/libraries/gpu/src/gpu/Texture_ktx.cpp b/libraries/gpu/src/gpu/Texture_ktx.cpp index f455fde009..14fd983ec2 100644 --- a/libraries/gpu/src/gpu/Texture_ktx.cpp +++ b/libraries/gpu/src/gpu/Texture_ktx.cpp @@ -154,6 +154,10 @@ struct IrradianceKTXPayload { }; const std::string IrradianceKTXPayload::KEY{ "hifi.irradianceSH" }; +KtxStorage::KtxStorage(const cache::FilePointer& cacheEntry) : KtxStorage(cacheEntry->getFilepath()) { + _cacheEntry = cacheEntry; +} + KtxStorage::KtxStorage(const std::string& filename) : _filename(filename) { { // We are doing a lot of work here just to get descriptor data @@ -295,20 +299,35 @@ void KtxStorage::assignMipFaceData(uint16 level, uint8 face, const storage::Stor throw std::runtime_error("Invalid call"); } +bool validKtx(const std::string& filename) { + ktx::StoragePointer storage { new storage::FileStorage(filename.c_str()) }; + auto ktxPointer = ktx::KTX::create(storage); + if (!ktxPointer) { + return false; + } + return true; +} + void Texture::setKtxBacking(const std::string& filename) { // Check the KTX file for validity before using it as backing storage - { - ktx::StoragePointer storage { new storage::FileStorage(filename.c_str()) }; - auto ktxPointer = ktx::KTX::create(storage); - if (!ktxPointer) { - return; - } + if (!validKtx(filename)) { + return; } auto newBacking = std::unique_ptr(new KtxStorage(filename)); setStorage(newBacking); } +void Texture::setKtxBacking(const cache::FilePointer& cacheEntry) { + // Check the KTX file for validity before using it as backing storage + if (!validKtx(cacheEntry->getFilepath())) { + return; + } + + auto newBacking = std::unique_ptr(new KtxStorage(cacheEntry)); + setStorage(newBacking); +} + ktx::KTXUniquePointer Texture::serialize(const Texture& texture) { ktx::Header header; @@ -442,21 +461,10 @@ ktx::KTXUniquePointer Texture::serialize(const Texture& texture) { return ktxBuffer; } -TexturePointer Texture::unserialize(const std::string& ktxfile) { - std::unique_ptr ktxPointer = ktx::KTX::create(std::make_shared(ktxfile.c_str())); - if (!ktxPointer) { - return nullptr; - } - - ktx::KTXDescriptor descriptor { ktxPointer->toDescriptor() }; - return unserialize(ktxfile, ktxPointer->toDescriptor()); -} - -TexturePointer Texture::unserialize(const std::string& ktxfile, const ktx::KTXDescriptor& descriptor) { - const auto& header = descriptor.header; - +TexturePointer Texture::build(const ktx::KTXDescriptor& descriptor) { Format mipFormat = Format::COLOR_BGRA_32; Format texelFormat = Format::COLOR_SRGBA_32; + const auto& header = descriptor.header; if (!Texture::evalTextureFormat(header, mipFormat, texelFormat)) { return nullptr; @@ -485,20 +493,19 @@ TexturePointer Texture::unserialize(const std::string& ktxfile, const ktx::KTXDe } auto texture = create(gpuktxKeyValue._usageType, - type, - texelFormat, - header.getPixelWidth(), - header.getPixelHeight(), - header.getPixelDepth(), - 1, // num Samples - header.getNumberOfSlices(), - header.getNumberOfLevels(), - gpuktxKeyValue._samplerDesc); + type, + texelFormat, + header.getPixelWidth(), + header.getPixelHeight(), + header.getPixelDepth(), + 1, // num Samples + header.getNumberOfSlices(), + header.getNumberOfLevels(), + gpuktxKeyValue._samplerDesc); texture->setUsage(gpuktxKeyValue._usage); // Assing the mips availables texture->setStoredMipFormat(mipFormat); - texture->setKtxBacking(ktxfile); IrradianceKTXPayload irradianceKtxKeyValue; if (IrradianceKTXPayload::findInKeyValues(descriptor.keyValues, irradianceKtxKeyValue)) { @@ -508,6 +515,36 @@ TexturePointer Texture::unserialize(const std::string& ktxfile, const ktx::KTXDe return texture; } + + +TexturePointer Texture::unserialize(const cache::FilePointer& cacheEntry) { + std::unique_ptr ktxPointer = ktx::KTX::create(std::make_shared(cacheEntry->getFilepath().c_str())); + if (!ktxPointer) { + return nullptr; + } + + auto texture = build(ktxPointer->toDescriptor()); + if (texture) { + texture->setKtxBacking(cacheEntry); + } + + return texture; +} + +TexturePointer Texture::unserialize(const std::string& ktxfile) { + std::unique_ptr ktxPointer = ktx::KTX::create(std::make_shared(ktxfile.c_str())); + if (!ktxPointer) { + return nullptr; + } + + auto texture = build(ktxPointer->toDescriptor()); + if (texture) { + texture->setKtxBacking(ktxfile); + } + + return texture; +} + bool Texture::evalKTXFormat(const Element& mipFormat, const Element& texelFormat, ktx::Header& header) { if (texelFormat == Format::COLOR_RGBA_32 && mipFormat == Format::COLOR_BGRA_32) { header.setUncompressed(ktx::GLType::UNSIGNED_BYTE, 1, ktx::GLFormat::BGRA, ktx::GLInternalFormat::RGBA8, ktx::GLBaseInternalFormat::RGBA); diff --git a/libraries/ktx/CMakeLists.txt b/libraries/ktx/CMakeLists.txt index 404660b247..967ea71eb6 100644 --- a/libraries/ktx/CMakeLists.txt +++ b/libraries/ktx/CMakeLists.txt @@ -1,3 +1,3 @@ set(TARGET_NAME ktx) setup_hifi_library() -link_hifi_libraries() \ No newline at end of file +include_hifi_library_headers(shared) \ No newline at end of file diff --git a/libraries/model-networking/CMakeLists.txt b/libraries/model-networking/CMakeLists.txt index f7175bc533..db5563d7ea 100644 --- a/libraries/model-networking/CMakeLists.txt +++ b/libraries/model-networking/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME model-networking) setup_hifi_library() link_hifi_libraries(shared networking model fbx ktx image) - +include_hifi_library_headers(gpu) diff --git a/libraries/model-networking/src/model-networking/KTXCache.h b/libraries/model-networking/src/model-networking/KTXCache.h index 5617019c52..a919c88bd7 100644 --- a/libraries/model-networking/src/model-networking/KTXCache.h +++ b/libraries/model-networking/src/model-networking/KTXCache.h @@ -14,7 +14,7 @@ #include -#include +#include namespace ktx { class KTX; diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 8683d56b6b..15eb4be839 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -612,9 +612,10 @@ void NetworkTexture::maybeHandleFinishedInitialLoad() { if (!texture) { KTXFilePointer ktxFile = textureCache->_ktxCache.getFile(hash); if (ktxFile) { - texture = gpu::Texture::unserialize(ktxFile->getFilepath()); + texture = gpu::Texture::unserialize(ktxFile); if (texture) { texture = textureCache->cacheTextureByHash(hash, texture); + _file = ktxFile; } } } @@ -644,8 +645,8 @@ void NetworkTexture::maybeHandleFinishedInitialLoad() { auto newKtxDescriptor = memKtx->toDescriptor(); - texture = gpu::Texture::unserialize(_file->getFilepath(), newKtxDescriptor); - texture->setKtxBacking(file->getFilepath()); + texture = gpu::Texture::build(newKtxDescriptor); + texture->setKtxBacking(file); texture->setSource(filename); auto& images = _originalKtxDescriptor->images; @@ -796,7 +797,7 @@ void ImageReader::read() { if (!texture) { KTXFilePointer ktxFile = textureCache->_ktxCache.getFile(hash); if (ktxFile) { - texture = gpu::Texture::unserialize(ktxFile->getFilepath()); + texture = gpu::Texture::unserialize(ktxFile); if (texture) { texture = textureCache->cacheTextureByHash(hash, texture); } else { @@ -848,7 +849,7 @@ void ImageReader::read() { if (!networkTexture->_file) { qCWarning(modelnetworking) << _url << "file cache failed"; } else { - texture->setKtxBacking(networkTexture->_file->getFilepath()); + texture->setKtxBacking(networkTexture->_file); } } else { qCWarning(modelnetworking) << "Unable to serialize texture to KTX " << _url; diff --git a/libraries/model/src/model/Geometry.h b/libraries/model/src/model/Geometry.h index 2375944f04..a3198eed26 100755 --- a/libraries/model/src/model/Geometry.h +++ b/libraries/model/src/model/Geometry.h @@ -13,10 +13,10 @@ #include -#include "AABox.h" +#include -#include "gpu/Resource.h" -#include "gpu/Stream.h" +#include +#include namespace model { typedef gpu::BufferView::Index Index; diff --git a/libraries/octree/src/DirtyOctreeElementOperator.cpp b/libraries/octree/src/DirtyOctreeElementOperator.cpp index 0f7e6d9f04..ed8d26cf72 100644 --- a/libraries/octree/src/DirtyOctreeElementOperator.cpp +++ b/libraries/octree/src/DirtyOctreeElementOperator.cpp @@ -11,20 +11,20 @@ #include "DirtyOctreeElementOperator.h" -DirtyOctreeElementOperator::DirtyOctreeElementOperator(OctreeElementPointer element) +DirtyOctreeElementOperator::DirtyOctreeElementOperator(const OctreeElementPointer& element) : _element(element) { assert(_element.get()); _point = _element->getAACube().calcCenter(); } -bool DirtyOctreeElementOperator::preRecursion(OctreeElementPointer element) { +bool DirtyOctreeElementOperator::preRecursion(const OctreeElementPointer& element) { if (element == _element) { return false; } return element->getAACube().contains(_point); } -bool DirtyOctreeElementOperator::postRecursion(OctreeElementPointer element) { +bool DirtyOctreeElementOperator::postRecursion(const OctreeElementPointer& element) { element->markWithChangedTime(); return true; } diff --git a/libraries/octree/src/DirtyOctreeElementOperator.h b/libraries/octree/src/DirtyOctreeElementOperator.h index a8d00a13f0..c28dbbf324 100644 --- a/libraries/octree/src/DirtyOctreeElementOperator.h +++ b/libraries/octree/src/DirtyOctreeElementOperator.h @@ -16,12 +16,12 @@ class DirtyOctreeElementOperator : public RecurseOctreeOperator { public: - DirtyOctreeElementOperator(OctreeElementPointer element); + DirtyOctreeElementOperator(const OctreeElementPointer& element); ~DirtyOctreeElementOperator() {} - virtual bool preRecursion(OctreeElementPointer element) override; - virtual bool postRecursion(OctreeElementPointer element) override; + virtual bool preRecursion(const OctreeElementPointer& element) override; + virtual bool postRecursion(const OctreeElementPointer& element) override; private: glm::vec3 _point; OctreeElementPointer _element; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index dfc6195f95..180f25f106 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -74,7 +74,7 @@ Octree::~Octree() { // non-sorted array // returns -1 if size exceeded // originalIndexArray is optional -int insertOctreeElementIntoSortedArrays(OctreeElementPointer value, float key, int originalIndex, +int insertOctreeElementIntoSortedArrays(const OctreeElementPointer& value, float key, int originalIndex, OctreeElementPointer* valueArray, float* keyArray, int* originalIndexArray, int currentCount, int maxCount) { @@ -108,17 +108,17 @@ int insertOctreeElementIntoSortedArrays(OctreeElementPointer value, float key, i // Recurses voxel tree calling the RecurseOctreeOperation function for each element. // stops recursion if operation function returns false. -void Octree::recurseTreeWithOperation(RecurseOctreeOperation operation, void* extraData) { +void Octree::recurseTreeWithOperation(const RecurseOctreeOperation& operation, void* extraData) { recurseElementWithOperation(_rootElement, operation, extraData); } // Recurses voxel tree calling the RecurseOctreePostFixOperation function for each element in post-fix order. -void Octree::recurseTreeWithPostOperation(RecurseOctreeOperation operation, void* extraData) { +void Octree::recurseTreeWithPostOperation(const RecurseOctreeOperation& operation, void* extraData) { recurseElementWithPostOperation(_rootElement, operation, extraData); } // Recurses voxel element with an operation function -void Octree::recurseElementWithOperation(OctreeElementPointer element, RecurseOctreeOperation operation, void* extraData, +void Octree::recurseElementWithOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { static QString repeatedMessage @@ -140,7 +140,7 @@ void Octree::recurseElementWithOperation(OctreeElementPointer element, RecurseOc } // Recurses voxel element with an operation function -void Octree::recurseElementWithPostOperation(OctreeElementPointer element, RecurseOctreeOperation operation, +void Octree::recurseElementWithPostOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { static QString repeatedMessage @@ -162,14 +162,14 @@ void Octree::recurseElementWithPostOperation(OctreeElementPointer element, Recur // Recurses voxel tree calling the RecurseOctreeOperation function for each element. // stops recursion if operation function returns false. -void Octree::recurseTreeWithOperationDistanceSorted(RecurseOctreeOperation operation, +void Octree::recurseTreeWithOperationDistanceSorted(const RecurseOctreeOperation& operation, const glm::vec3& point, void* extraData) { recurseElementWithOperationDistanceSorted(_rootElement, operation, point, extraData); } // Recurses voxel element with an operation function -void Octree::recurseElementWithOperationDistanceSorted(OctreeElementPointer element, RecurseOctreeOperation operation, +void Octree::recurseElementWithOperationDistanceSorted(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, const glm::vec3& point, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { @@ -212,7 +212,7 @@ void Octree::recurseTreeWithOperator(RecurseOctreeOperator* operatorObject) { recurseElementWithOperator(_rootElement, operatorObject); } -bool Octree::recurseElementWithOperator(OctreeElementPointer element, +bool Octree::recurseElementWithOperator(const OctreeElementPointer& element, RecurseOctreeOperator* operatorObject, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { static QString repeatedMessage @@ -245,7 +245,7 @@ bool Octree::recurseElementWithOperator(OctreeElementPointer element, } -OctreeElementPointer Octree::nodeForOctalCode(OctreeElementPointer ancestorElement, const unsigned char* needleCode, +OctreeElementPointer Octree::nodeForOctalCode(const OctreeElementPointer& ancestorElement, const unsigned char* needleCode, OctreeElementPointer* parentOfFoundElement) const { // special case for NULL octcode if (!needleCode) { @@ -281,7 +281,7 @@ OctreeElementPointer Octree::nodeForOctalCode(OctreeElementPointer ancestorEleme } // returns the element created! -OctreeElementPointer Octree::createMissingElement(OctreeElementPointer lastParentElement, +OctreeElementPointer Octree::createMissingElement(const OctreeElementPointer& lastParentElement, const unsigned char* codeToReach, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { @@ -311,7 +311,7 @@ OctreeElementPointer Octree::createMissingElement(OctreeElementPointer lastParen } } -int Octree::readElementData(OctreeElementPointer destinationElement, const unsigned char* nodeData, int bytesAvailable, +int Octree::readElementData(const OctreeElementPointer& destinationElement, const unsigned char* nodeData, int bytesAvailable, ReadBitstreamToTreeParams& args) { int bytesLeftToRead = bytesAvailable; @@ -529,7 +529,7 @@ void Octree::deleteOctalCodeFromTree(const unsigned char* codeBuffer, bool colla }); } -void Octree::deleteOctalCodeFromTreeRecursion(OctreeElementPointer element, void* extraData) { +void Octree::deleteOctalCodeFromTreeRecursion(const OctreeElementPointer& element, void* extraData) { DeleteOctalCodeFromTreeArgs* args = (DeleteOctalCodeFromTreeArgs*)extraData; int lengthOfElementCode = numberOfThreeBitSectionsInCode(element->getOctalCode()); @@ -703,7 +703,7 @@ public: void* penetratedObject; /// the type is defined by the type of Octree, the caller is assumed to know the type }; -bool findSpherePenetrationOp(OctreeElementPointer element, void* extraData) { +bool findSpherePenetrationOp(const OctreeElementPointer& element, void* extraData) { SphereArgs* args = static_cast(extraData); // coarse check against bounds @@ -765,7 +765,7 @@ public: CubeList* cubes; }; -bool findCapsulePenetrationOp(OctreeElementPointer element, void* extraData) { +bool findCapsulePenetrationOp(const OctreeElementPointer& element, void* extraData) { CapsuleArgs* args = static_cast(extraData); // coarse check against bounds @@ -798,7 +798,7 @@ uint qHash(const glm::vec3& point) { (((quint64)(point.z * RESOLUTION_PER_METER)) % MAX_SCALED_COMPONENT << 2 * BITS_PER_COMPONENT)); } -bool findContentInCubeOp(OctreeElementPointer element, void* extraData) { +bool findContentInCubeOp(const OctreeElementPointer& element, void* extraData) { ContentArgs* args = static_cast(extraData); // coarse check against bounds @@ -851,7 +851,7 @@ public: }; // Find the smallest colored voxel enclosing a point (if there is one) -bool getElementEnclosingOperation(OctreeElementPointer element, void* extraData) { +bool getElementEnclosingOperation(const OctreeElementPointer& element, void* extraData) { GetElementEnclosingArgs* args = static_cast(extraData); if (element->getAACube().contains(args->point)) { if (element->hasContent() && element->isLeaf()) { @@ -885,7 +885,7 @@ OctreeElementPointer Octree::getElementEnclosingPoint(const glm::vec3& point, Oc -int Octree::encodeTreeBitstream(OctreeElementPointer element, +int Octree::encodeTreeBitstream(const OctreeElementPointer& element, OctreePacketData* packetData, OctreeElementBag& bag, EncodeBitstreamParams& params) { @@ -979,7 +979,7 @@ int Octree::encodeTreeBitstream(OctreeElementPointer element, return bytesWritten; } -int Octree::encodeTreeBitstreamRecursion(OctreeElementPointer element, +int Octree::encodeTreeBitstreamRecursion(const OctreeElementPointer& element, OctreePacketData* packetData, OctreeElementBag& bag, EncodeBitstreamParams& params, int& currentEncodeLevel, const ViewFrustum::intersection& parentLocationThisView) const { @@ -1866,7 +1866,7 @@ bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputSt return success; } -bool Octree::writeToFile(const char* fileName, OctreeElementPointer element, QString persistAsFileType) { +bool Octree::writeToFile(const char* fileName, const OctreeElementPointer& element, QString persistAsFileType) { // make the sure file extension makes sense QString qFileName = fileNameWithoutExtension(QString(fileName), PERSIST_EXTENSIONS) + "." + persistAsFileType; QByteArray byteArray = qFileName.toUtf8(); @@ -1883,7 +1883,7 @@ bool Octree::writeToFile(const char* fileName, OctreeElementPointer element, QSt return success; } -bool Octree::writeToJSONFile(const char* fileName, OctreeElementPointer element, bool doGzip) { +bool Octree::writeToJSONFile(const char* fileName, const OctreeElementPointer& element, bool doGzip) { QVariantMap entityDescription; qCDebug(octree, "Saving JSON SVO to file %s...", fileName); @@ -1937,7 +1937,7 @@ unsigned long Octree::getOctreeElementsCount() { return nodeCount; } -bool Octree::countOctreeElementsOperation(OctreeElementPointer element, void* extraData) { +bool Octree::countOctreeElementsOperation(const OctreeElementPointer& element, void* extraData) { (*(unsigned long*)extraData)++; return true; // keep going } diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index caae31eaa5..512a0ab64e 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -41,13 +41,13 @@ extern QVector PERSIST_EXTENSIONS; /// derive from this class to use the Octree::recurseTreeWithOperator() method class RecurseOctreeOperator { public: - virtual bool preRecursion(OctreeElementPointer element) = 0; - virtual bool postRecursion(OctreeElementPointer element) = 0; - virtual OctreeElementPointer possiblyCreateChildAt(OctreeElementPointer element, int childIndex) { return NULL; } + virtual bool preRecursion(const OctreeElementPointer& element) = 0; + virtual bool postRecursion(const OctreeElementPointer& element) = 0; + virtual OctreeElementPointer possiblyCreateChildAt(const OctreeElementPointer& element, int childIndex) { return NULL; } }; // Callback function, for recuseTreeWithOperation -typedef bool (*RecurseOctreeOperation)(OctreeElementPointer element, void* extraData); +using RecurseOctreeOperation = std::function; typedef enum {GRADIENT, RANDOM, NATURAL} creationMode; typedef QHash CubeList; @@ -233,7 +233,7 @@ public: void readBitstreamToTree(const unsigned char* bitstream, unsigned long int bufferSizeBytes, ReadBitstreamToTreeParams& args); void deleteOctalCodeFromTree(const unsigned char* codeBuffer, bool collapseEmptyTrees = DONT_COLLAPSE); - void reaverageOctreeElements(OctreeElementPointer startElement = NULL); + void reaverageOctreeElements(OctreeElementPointer startElement = OctreeElementPointer()); void deleteOctreeElementAt(float x, float y, float z, float s); @@ -248,18 +248,18 @@ public: OctreeElementPointer getOrCreateChildElementAt(float x, float y, float z, float s); OctreeElementPointer getOrCreateChildElementContaining(const AACube& box); - void recurseTreeWithOperation(RecurseOctreeOperation operation, void* extraData = NULL); - void recurseTreeWithPostOperation(RecurseOctreeOperation operation, void* extraData = NULL); + void recurseTreeWithOperation(const RecurseOctreeOperation& operation, void* extraData = NULL); + void recurseTreeWithPostOperation(const RecurseOctreeOperation& operation, void* extraData = NULL); /// \param operation type of operation /// \param point point in world-frame (meters) /// \param extraData hook for user data to be interpreted by special context - void recurseTreeWithOperationDistanceSorted(RecurseOctreeOperation operation, + void recurseTreeWithOperationDistanceSorted(const RecurseOctreeOperation& operation, const glm::vec3& point, void* extraData = NULL); void recurseTreeWithOperator(RecurseOctreeOperator* operatorObject); - int encodeTreeBitstream(OctreeElementPointer element, OctreePacketData* packetData, OctreeElementBag& bag, + int encodeTreeBitstream(const OctreeElementPointer& element, OctreePacketData* packetData, OctreeElementBag& bag, EncodeBitstreamParams& params) ; bool isDirty() const { return _isDirty; } @@ -293,8 +293,8 @@ public: void loadOctreeFile(const char* fileName); // Octree exporters - bool writeToFile(const char* filename, OctreeElementPointer element = NULL, QString persistAsFileType = "json.gz"); - bool writeToJSONFile(const char* filename, OctreeElementPointer element = NULL, bool doGzip = false); + bool writeToFile(const char* filename, const OctreeElementPointer& element = NULL, QString persistAsFileType = "json.gz"); + bool writeToJSONFile(const char* filename, const OctreeElementPointer& element = NULL, bool doGzip = false); virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, bool skipThoseWithBadParents) = 0; @@ -311,18 +311,18 @@ public: bool getShouldReaverage() const { return _shouldReaverage; } - void recurseElementWithOperation(OctreeElementPointer element, RecurseOctreeOperation operation, + void recurseElementWithOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount = 0); /// Traverse child nodes of node applying operation in post-fix order /// - void recurseElementWithPostOperation(OctreeElementPointer element, RecurseOctreeOperation operation, + void recurseElementWithPostOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount = 0); - void recurseElementWithOperationDistanceSorted(OctreeElementPointer element, RecurseOctreeOperation operation, + void recurseElementWithOperationDistanceSorted(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, const glm::vec3& point, void* extraData, int recursionCount = 0); - bool recurseElementWithOperator(OctreeElementPointer element, RecurseOctreeOperator* operatorObject, int recursionCount = 0); + bool recurseElementWithOperator(const OctreeElementPointer& element, RecurseOctreeOperator* operatorObject, int recursionCount = 0); bool getIsViewing() const { return _isViewing; } /// This tree is receiving inbound viewer datagrams. void setIsViewing(bool isViewing) { _isViewing = isViewing; } @@ -353,18 +353,18 @@ public slots: protected: - void deleteOctalCodeFromTreeRecursion(OctreeElementPointer element, void* extraData); + void deleteOctalCodeFromTreeRecursion(const OctreeElementPointer& element, void* extraData); - int encodeTreeBitstreamRecursion(OctreeElementPointer element, + int encodeTreeBitstreamRecursion(const OctreeElementPointer& element, OctreePacketData* packetData, OctreeElementBag& bag, EncodeBitstreamParams& params, int& currentEncodeLevel, const ViewFrustum::intersection& parentLocationThisView) const; - static bool countOctreeElementsOperation(OctreeElementPointer element, void* extraData); + static bool countOctreeElementsOperation(const OctreeElementPointer& element, void* extraData); - OctreeElementPointer nodeForOctalCode(OctreeElementPointer ancestorElement, const unsigned char* needleCode, OctreeElementPointer* parentOfFoundElement) const; - OctreeElementPointer createMissingElement(OctreeElementPointer lastParentElement, const unsigned char* codeToReach, int recursionCount = 0); - int readElementData(OctreeElementPointer destinationElement, const unsigned char* nodeData, + OctreeElementPointer nodeForOctalCode(const OctreeElementPointer& ancestorElement, const unsigned char* needleCode, OctreeElementPointer* parentOfFoundElement) const; + OctreeElementPointer createMissingElement(const OctreeElementPointer& lastParentElement, const unsigned char* codeToReach, int recursionCount = 0); + int readElementData(const OctreeElementPointer& destinationElement, const unsigned char* nodeData, int bufferSizeBytes, ReadBitstreamToTreeParams& args); OctreeElementPointer _rootElement = nullptr; diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index b56edcfcc6..989951b661 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -233,7 +233,7 @@ OctreeElementPointer OctreeElement::removeChildAtIndex(int childIndex) { return returnedChild; } -bool OctreeElement::isParentOf(OctreeElementPointer possibleChild) const { +bool OctreeElement::isParentOf(const OctreeElementPointer& possibleChild) const { if (possibleChild) { for (int childIndex = 0; childIndex < NUMBER_OF_CHILDREN; childIndex++) { OctreeElementPointer childAt = getChildAtIndex(childIndex); @@ -300,7 +300,7 @@ void OctreeElement::deleteAllChildren() { } } -void OctreeElement::setChildAtIndex(int childIndex, OctreeElementPointer child) { +void OctreeElement::setChildAtIndex(int childIndex, const OctreeElementPointer& child) { #ifdef SIMPLE_CHILD_ARRAY int previousChildCount = getChildCount(); if (child) { diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 350ec9e5fa..9ab5d9429d 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -122,7 +122,7 @@ public: OctreeElementPointer getChildAtIndex(int childIndex) const; void deleteChildAtIndex(int childIndex); OctreeElementPointer removeChildAtIndex(int childIndex); - bool isParentOf(OctreeElementPointer possibleChild) const; + bool isParentOf(const OctreeElementPointer& possibleChild) const; /// handles deletion of all descendants, returns false if delete not approved bool safeDeepDeleteChildAtIndex(int childIndex, int recursionCount = 0); @@ -222,7 +222,7 @@ public: protected: void deleteAllChildren(); - void setChildAtIndex(int childIndex, OctreeElementPointer child); + void setChildAtIndex(int childIndex, const OctreeElementPointer& child); void calculateAACube(); diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index 10d80e5799..afd2d5cdc3 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -23,7 +23,7 @@ bool OctreeElementBag::isEmpty() { return _bagElements.empty(); } -void OctreeElementBag::insert(OctreeElementPointer element) { +void OctreeElementBag::insert(const OctreeElementPointer& element) { _bagElements[element.get()] = element; } diff --git a/libraries/octree/src/OctreeElementBag.h b/libraries/octree/src/OctreeElementBag.h index 5e671df78b..34c49f1e60 100644 --- a/libraries/octree/src/OctreeElementBag.h +++ b/libraries/octree/src/OctreeElementBag.h @@ -24,7 +24,7 @@ class OctreeElementBag { using Bag = std::unordered_map; public: - void insert(OctreeElementPointer element); // put a element into the bag + void insert(const OctreeElementPointer& element); // put a element into the bag OctreeElementPointer extract(); /// pull a element out of the bag (could come in any order) and if all of the /// elements have expired, a single null pointer will be returned diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeProcessor.cpp similarity index 77% rename from libraries/octree/src/OctreeRenderer.cpp rename to libraries/octree/src/OctreeProcessor.cpp index 06c0ff1f12..65b30dd197 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeProcessor.cpp @@ -1,5 +1,5 @@ // -// OctreeRenderer.cpp +// OctreeProcessor.cpp // libraries/octree/src // // Created by Brad Hefta-Gaub on 12/6/13. @@ -14,49 +14,48 @@ #include #include -#include #include #include "OctreeLogging.h" -#include "OctreeRenderer.h" +#include "OctreeProcessor.h" -OctreeRenderer::OctreeRenderer() : +OctreeProcessor::OctreeProcessor() : _tree(NULL), _managedTree(false) { } -void OctreeRenderer::init() { +void OctreeProcessor::init() { if (!_tree) { _tree = createTree(); _managedTree = true; } } -OctreeRenderer::~OctreeRenderer() { +OctreeProcessor::~OctreeProcessor() { } -void OctreeRenderer::setTree(OctreePointer newTree) { +void OctreeProcessor::setTree(OctreePointer newTree) { _tree = newTree; } -void OctreeRenderer::processDatagram(ReceivedMessage& message, SharedNodePointer sourceNode) { +void OctreeProcessor::processDatagram(ReceivedMessage& message, SharedNodePointer sourceNode) { bool extraDebugging = false; if (extraDebugging) { - qCDebug(octree) << "OctreeRenderer::processDatagram()"; + qCDebug(octree) << "OctreeProcessor::processDatagram()"; } if (!_tree) { - qCDebug(octree) << "OctreeRenderer::processDatagram() called before init, calling init()..."; + qCDebug(octree) << "OctreeProcessor::processDatagram() called before init, calling init()..."; this->init(); } bool showTimingDetails = false; // Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); - PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram()", showTimingDetails); + PerformanceWarning warn(showTimingDetails, "OctreeProcessor::processDatagram()", showTimingDetails); if (message.getType() == getExpectedPacketType()) { - PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram expected PacketType", showTimingDetails); + PerformanceWarning warn(showTimingDetails, "OctreeProcessor::processDatagram expected PacketType", showTimingDetails); // if we are getting inbound packets, then our tree is also viewing, and we should remember that fact. _tree->setIsViewing(true); @@ -79,7 +78,7 @@ void OctreeRenderer::processDatagram(ReceivedMessage& message, SharedNodePointer OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionLength = 0; if (extraDebugging) { - qCDebug(octree) << "OctreeRenderer::processDatagram() ... " + qCDebug(octree) << "OctreeProcessor::processDatagram() ... " "Got Packet Section color:" << packetIsColored << "compressed:" << packetIsCompressed << "sequence: " << sequence << @@ -130,7 +129,7 @@ void OctreeRenderer::processDatagram(ReceivedMessage& message, SharedNodePointer packetData.loadFinalizedContent(reinterpret_cast(message.getRawMessage() + message.getPosition()), sectionLength); if (extraDebugging) { - qCDebug(octree) << "OctreeRenderer::processDatagram() ... " + qCDebug(octree) << "OctreeProcessor::processDatagram() ... " "Got Packet Section color:" << packetIsColored << "compressed:" << packetIsCompressed << "sequence: " << sequence << @@ -143,13 +142,13 @@ void OctreeRenderer::processDatagram(ReceivedMessage& message, SharedNodePointer } if (extraDebugging) { - qCDebug(octree) << "OctreeRenderer::processDatagram() ******* START _tree->readBitstreamToTree()..."; + qCDebug(octree) << "OctreeProcessor::processDatagram() ******* START _tree->readBitstreamToTree()..."; } startReadBitsteam = usecTimestampNow(); _tree->readBitstreamToTree(packetData.getUncompressedData(), packetData.getUncompressedSize(), args); endReadBitsteam = usecTimestampNow(); if (extraDebugging) { - qCDebug(octree) << "OctreeRenderer::processDatagram() ******* END _tree->readBitstreamToTree()..."; + qCDebug(octree) << "OctreeProcessor::processDatagram() ******* END _tree->readBitstreamToTree()..."; } }); @@ -198,32 +197,7 @@ void OctreeRenderer::processDatagram(ReceivedMessage& message, SharedNodePointer } } -bool OctreeRenderer::renderOperation(OctreeElementPointer element, void* extraData) { - RenderArgs* args = static_cast(extraData); - if (element->isInView(args->getViewFrustum())) { - if (element->hasContent()) { - if (element->calculateShouldRender(args->getViewFrustum(), args->_sizeScale, args->_boundaryLevelAdjust)) { - args->_renderer->renderElement(element, args); - } else { - return false; // if we shouldn't render, then we also should stop recursing. - } - } - return true; // continue recursing - } - // if not in view stop recursing - return false; -} - -void OctreeRenderer::render(RenderArgs* renderArgs) { - if (_tree) { - renderArgs->_renderer = sharedFromThis(); - _tree->withReadLock([&] { - _tree->recurseTreeWithOperation(renderOperation, renderArgs); - }); - } -} - -void OctreeRenderer::clear() { +void OctreeProcessor::clear() { if (_tree) { _tree->withWriteLock([&] { _tree->eraseAllOctreeElements(); diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeProcessor.h similarity index 75% rename from libraries/octree/src/OctreeRenderer.h rename to libraries/octree/src/OctreeProcessor.h index c18464b7ea..25e280abca 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeProcessor.h @@ -1,5 +1,5 @@ // -// OctreeRenderer.h +// OctreeProcessor.h // libraries/octree/src // // Created by Brad Hefta-Gaub on 12/6/13. @@ -9,8 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_OctreeRenderer_h -#define hifi_OctreeRenderer_h +#ifndef hifi_OctreeProcessor_h +#define hifi_OctreeProcessor_h #include #include @@ -18,27 +18,22 @@ #include #include -#include #include -#include #include "Octree.h" #include "OctreePacketData.h" -class OctreeRenderer; - // Generic client side Octree renderer class. -class OctreeRenderer : public QObject, public QEnableSharedFromThis { +class OctreeProcessor : public QObject, public QEnableSharedFromThis { Q_OBJECT public: - OctreeRenderer(); - virtual ~OctreeRenderer(); + OctreeProcessor(); + virtual ~OctreeProcessor(); virtual char getMyNodeType() const = 0; virtual PacketType getMyQueryMessageType() const = 0; virtual PacketType getExpectedPacketType() const = 0; - virtual void renderElement(OctreeElementPointer element, RenderArgs* args) { } virtual void setTree(OctreePointer newTree); @@ -48,14 +43,6 @@ public: /// initialize and GPU/rendering related resources virtual void init(); - /// render the content of the octree - virtual void render(RenderArgs* renderArgs); - - const ViewFrustum& getViewFrustum() const { return _viewFrustum; } - void setViewFrustum(const ViewFrustum& viewFrustum) { _viewFrustum = viewFrustum; } - - static bool renderOperation(OctreeElementPointer element, void* extraData); - /// clears the tree virtual void clear(); @@ -75,7 +62,6 @@ protected: OctreePointer _tree; bool _managedTree; - ViewFrustum _viewFrustum; SimpleMovingAverage _elementsPerPacket; SimpleMovingAverage _entitiesPerPacket; @@ -95,4 +81,4 @@ protected: }; -#endif // hifi_OctreeRenderer_h +#endif // hifi_OctreeProcessor_h diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index fdaa6b4928..09b2d6ddf5 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -141,7 +141,7 @@ OctreeSceneStats::~OctreeSceneStats() { reset(); } -void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, OctreeElementPointer root, +void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, const OctreeElementPointer& root, JurisdictionMap* jurisdictionMap) { reset(); // resets packet and octree stats _isStarted = true; @@ -246,7 +246,7 @@ void OctreeSceneStats::packetSent(int bytes) { _bytes += bytes; } -void OctreeSceneStats::traversed(const OctreeElementPointer element) { +void OctreeSceneStats::traversed(const OctreeElementPointer& element) { _traversed++; if (element->isLeaf()) { _leaves++; @@ -255,7 +255,7 @@ void OctreeSceneStats::traversed(const OctreeElementPointer element) { } } -void OctreeSceneStats::skippedDistance(const OctreeElementPointer element) { +void OctreeSceneStats::skippedDistance(const OctreeElementPointer& element) { _skippedDistance++; if (element->isLeaf()) { _leavesSkippedDistance++; @@ -264,7 +264,7 @@ void OctreeSceneStats::skippedDistance(const OctreeElementPointer element) { } } -void OctreeSceneStats::skippedOutOfView(const OctreeElementPointer element) { +void OctreeSceneStats::skippedOutOfView(const OctreeElementPointer& element) { _skippedOutOfView++; if (element->isLeaf()) { _leavesSkippedOutOfView++; @@ -273,7 +273,7 @@ void OctreeSceneStats::skippedOutOfView(const OctreeElementPointer element) { } } -void OctreeSceneStats::skippedWasInView(const OctreeElementPointer element) { +void OctreeSceneStats::skippedWasInView(const OctreeElementPointer& element) { _skippedWasInView++; if (element->isLeaf()) { _leavesSkippedWasInView++; @@ -282,7 +282,7 @@ void OctreeSceneStats::skippedWasInView(const OctreeElementPointer element) { } } -void OctreeSceneStats::skippedNoChange(const OctreeElementPointer element) { +void OctreeSceneStats::skippedNoChange(const OctreeElementPointer& element) { _skippedNoChange++; if (element->isLeaf()) { _leavesSkippedNoChange++; @@ -291,7 +291,7 @@ void OctreeSceneStats::skippedNoChange(const OctreeElementPointer element) { } } -void OctreeSceneStats::skippedOccluded(const OctreeElementPointer element) { +void OctreeSceneStats::skippedOccluded(const OctreeElementPointer& element) { _skippedOccluded++; if (element->isLeaf()) { _leavesSkippedOccluded++; @@ -300,7 +300,7 @@ void OctreeSceneStats::skippedOccluded(const OctreeElementPointer element) { } } -void OctreeSceneStats::colorSent(const OctreeElementPointer element) { +void OctreeSceneStats::colorSent(const OctreeElementPointer& element) { _colorSent++; if (element->isLeaf()) { _leavesColorSent++; @@ -309,7 +309,7 @@ void OctreeSceneStats::colorSent(const OctreeElementPointer element) { } } -void OctreeSceneStats::didntFit(const OctreeElementPointer element) { +void OctreeSceneStats::didntFit(const OctreeElementPointer& element) { _didntFit++; if (element->isLeaf()) { _leavesDidntFit++; diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index e7d697f785..3774d4287d 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -39,7 +39,7 @@ public: OctreeSceneStats& operator= (const OctreeSceneStats& other); // copy assignment /// Call when beginning the computation of a scene. Initializes internal structures - void sceneStarted(bool fullScene, bool moving, OctreeElementPointer root, JurisdictionMap* jurisdictionMap); + void sceneStarted(bool fullScene, bool moving, const OctreeElementPointer& root, JurisdictionMap* jurisdictionMap); bool getIsSceneStarted() const { return _isStarted; } /// Call when the computation of a scene is completed. Finalizes internal structures @@ -57,28 +57,28 @@ public: void encodeStopped(); /// Track that a element was traversed as part of computation of a scene. - void traversed(const OctreeElementPointer element); + void traversed(const OctreeElementPointer& element); /// Track that a element was skipped as part of computation of a scene due to being beyond the LOD distance. - void skippedDistance(const OctreeElementPointer element); + void skippedDistance(const OctreeElementPointer& element); /// Track that a element was skipped as part of computation of a scene due to being out of view. - void skippedOutOfView(const OctreeElementPointer element); + void skippedOutOfView(const OctreeElementPointer& element); /// Track that a element was skipped as part of computation of a scene due to previously being in view while in delta sending - void skippedWasInView(const OctreeElementPointer element); + void skippedWasInView(const OctreeElementPointer& element); /// Track that a element was skipped as part of computation of a scene due to not having changed since last full scene sent - void skippedNoChange(const OctreeElementPointer element); + void skippedNoChange(const OctreeElementPointer& element); /// Track that a element was skipped as part of computation of a scene due to being occluded - void skippedOccluded(const OctreeElementPointer element); + void skippedOccluded(const OctreeElementPointer& element); /// Track that a element's color was was sent as part of computation of a scene - void colorSent(const OctreeElementPointer element); + void colorSent(const OctreeElementPointer& element); /// Track that a element was due to be sent, but didn't fit in the packet and was moved to next packet - void didntFit(const OctreeElementPointer element); + void didntFit(const OctreeElementPointer& element); /// Track that the color bitmask was was sent as part of computation of a scene void colorBitsWritten(); diff --git a/libraries/physics/CMakeLists.txt b/libraries/physics/CMakeLists.txt index 7733c019e0..e219d3dbcd 100644 --- a/libraries/physics/CMakeLists.txt +++ b/libraries/physics/CMakeLists.txt @@ -1,5 +1,11 @@ set(TARGET_NAME physics) setup_hifi_library() link_hifi_libraries(shared fbx entities model) +include_hifi_library_headers(networking) +include_hifi_library_headers(gpu) +include_hifi_library_headers(avatars) +include_hifi_library_headers(audio) +include_hifi_library_headers(octree) +include_hifi_library_headers(animation) target_bullet() diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index c359924e0d..0079ffae66 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -4,6 +4,9 @@ AUTOSCRIBE_SHADER_LIB(gpu model render) qt5_add_resources(QT_RESOURCES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/fonts/fonts.qrc") setup_hifi_library(Widgets OpenGL Network Qml Quick Script) link_hifi_libraries(shared ktx gpu model model-networking render animation fbx entities image procedural) +include_hifi_library_headers(networking) +include_hifi_library_headers(octree) +include_hifi_library_headers(audio) if (NOT ANDROID) target_nsight() diff --git a/libraries/render-utils/src/DeferredFrameTransform.h b/libraries/render-utils/src/DeferredFrameTransform.h index 84be943998..93e194f052 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.h +++ b/libraries/render-utils/src/DeferredFrameTransform.h @@ -12,10 +12,10 @@ #ifndef hifi_DeferredFrameTransform_h #define hifi_DeferredFrameTransform_h -#include "gpu/Resource.h" -#include "render/DrawTask.h" +#include -class RenderArgs; +#include +#include // DeferredFrameTransform is a helper class gathering in one place the needed camera transform // and frame resolution needed for all the deferred rendering passes taking advantage of the Deferred buffers diff --git a/libraries/render-utils/src/DeferredFramebuffer.h b/libraries/render-utils/src/DeferredFramebuffer.h index 6c83fbb91f..6002bf6494 100644 --- a/libraries/render-utils/src/DeferredFramebuffer.h +++ b/libraries/render-utils/src/DeferredFramebuffer.h @@ -15,7 +15,6 @@ #include "gpu/Resource.h" #include "gpu/Framebuffer.h" -class RenderArgs; // DeferredFramebuffer is a helper class gathering in one place the GBuffer (Framebuffer) and lighting framebuffer class DeferredFramebuffer { diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index c171973216..d69c72e97d 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -37,7 +37,6 @@ #include "AmbientOcclusionEffect.h" -class RenderArgs; struct LightLocations; using LightLocationsPtr = std::shared_ptr; diff --git a/libraries/render-utils/src/LightingModel.h b/libraries/render-utils/src/LightingModel.h index 26fb4faac5..e058b10921 100644 --- a/libraries/render-utils/src/LightingModel.h +++ b/libraries/render-utils/src/LightingModel.h @@ -12,10 +12,10 @@ #ifndef hifi_LightingModel_h #define hifi_LightingModel_h -#include "gpu/Resource.h" -#include "render/DrawTask.h" +#include -class RenderArgs; +#include +#include // LightingModel is a helper class gathering in one place the flags to enable the lighting contributions class LightingModel { diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index b4fd7e7d2a..b16134db5f 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -557,6 +557,7 @@ void ModelMeshPartPayload::render(RenderArgs* args) { if (_fadeState == FADE_WAITING_TO_START) { if (model->isLoaded()) { + // FIXME as far as I can tell this is the ONLY reason render-util depends on entities. if (EntityItem::getEntitiesShouldFadeFunction()()) { _fadeStartTime = usecTimestampNow(); _fadeState = FADE_IN_PROGRESS; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 447d0e37bd..73f0e37d6c 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "Model.h" + #include #include #include @@ -24,7 +26,6 @@ #include "AbstractViewStateInterface.h" #include "MeshPartPayload.h" -#include "Model.h" #include "RenderUtilsLogging.h" #include diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 53d446d306..adee4d57b1 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -34,10 +35,10 @@ #include "TextureCache.h" #include "Rig.h" + class AbstractViewStateInterface; class QScriptEngine; -#include "RenderArgs.h" class ViewFrustum; namespace render { diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 1b99fe92ee..b49a066bf7 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 84514eeb1a..a77d741aa5 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -15,7 +15,6 @@ #include #include -#include #include #include diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index 2374f24211..2d4efc0573 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -11,7 +11,6 @@ #include "StencilMaskPass.h" -#include #include #include diff --git a/libraries/render-utils/src/ToneMappingEffect.cpp b/libraries/render-utils/src/ToneMappingEffect.cpp index ce41cf16fa..72d692c5b2 100644 --- a/libraries/render-utils/src/ToneMappingEffect.cpp +++ b/libraries/render-utils/src/ToneMappingEffect.cpp @@ -14,7 +14,6 @@ #include #include -#include #include "StencilMaskPass.h" #include "FramebufferCache.h" diff --git a/libraries/render-utils/src/ToneMappingEffect.h b/libraries/render-utils/src/ToneMappingEffect.h index 13dffd16a7..2d1414e1ef 100644 --- a/libraries/render-utils/src/ToneMappingEffect.h +++ b/libraries/render-utils/src/ToneMappingEffect.h @@ -17,11 +17,10 @@ #include #include +#include #include -class RenderArgs; - class ToneMappingEffect { public: ToneMappingEffect(); diff --git a/libraries/render/CMakeLists.txt b/libraries/render/CMakeLists.txt index 8fd05bd320..561dff4290 100644 --- a/libraries/render/CMakeLists.txt +++ b/libraries/render/CMakeLists.txt @@ -2,7 +2,8 @@ set(TARGET_NAME render) AUTOSCRIBE_SHADER_LIB(gpu model) setup_hifi_library() +link_hifi_libraries(shared ktx gpu model) # render needs octree only for getAccuracyAngle(float, int) -link_hifi_libraries(shared ktx gpu model octree) +include_hifi_library_headers(octree) target_nsight() diff --git a/libraries/render/src/render/Args.h b/libraries/render/src/render/Args.h new file mode 100644 index 0000000000..901e0db22f --- /dev/null +++ b/libraries/render/src/render/Args.h @@ -0,0 +1,128 @@ +// +// Created by Brad Hefta-Gaub on 10/29/14. +// Copyright 2013-2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once +#ifndef hifi_render_Args_h +#define hifi_render_Args_h + +#include +#include +#include + +#include +#include + +#include +#include "Forward.h" + + +class AABox; + +namespace render { + class RenderDetails { + public: + enum Type { + ITEM, + SHADOW, + OTHER + }; + + struct Item { + int _considered = 0; + int _outOfView = 0; + int _tooSmall = 0; + int _rendered = 0; + }; + + int _materialSwitches = 0; + int _trianglesRendered = 0; + + Item _item; + Item _shadow; + Item _other; + + Item& edit(Type type) { + switch (type) { + case SHADOW: + return _shadow; + case ITEM: + return _item; + default: + return _other; + } + } + }; + + + class Args { + public: + enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, DIFFUSE_RENDER_MODE, NORMAL_RENDER_MODE, MIRROR_RENDER_MODE }; + enum DisplayMode { MONO, STEREO_MONITOR, STEREO_HMD }; + enum DebugFlags { + RENDER_DEBUG_NONE = 0, + RENDER_DEBUG_HULLS = 1 + }; + + Args() {} + + Args(const gpu::ContextPointer& context, + QSharedPointer renderData = QSharedPointer(nullptr), + float sizeScale = 1.0f, + int boundaryLevelAdjust = 0, + RenderMode renderMode = DEFAULT_RENDER_MODE, + DisplayMode displayMode = MONO, + DebugFlags debugFlags = RENDER_DEBUG_NONE, + gpu::Batch* batch = nullptr) : + _context(context), + _renderData(renderData), + _sizeScale(sizeScale), + _boundaryLevelAdjust(boundaryLevelAdjust), + _renderMode(renderMode), + _displayMode(displayMode), + _debugFlags(debugFlags), + _batch(batch) { + } + + bool hasViewFrustum() const { return _viewFrustums.size() > 0; } + void setViewFrustum(const ViewFrustum& viewFrustum) { + while (_viewFrustums.size() > 0) { + _viewFrustums.pop(); + } + _viewFrustums.push(viewFrustum); + } + const ViewFrustum& getViewFrustum() const { assert(_viewFrustums.size() > 0); return _viewFrustums.top(); } + void pushViewFrustum(const ViewFrustum& viewFrustum) { _viewFrustums.push(viewFrustum); } + void popViewFrustum() { _viewFrustums.pop(); } + + std::shared_ptr _context; + std::shared_ptr _blitFramebuffer; + std::shared_ptr _pipeline; + QSharedPointer _renderData; + std::stack _viewFrustums; + glm::ivec4 _viewport { 0.0f, 0.0f, 1.0f, 1.0f }; + glm::vec3 _boomOffset { 0.0f, 0.0f, 1.0f }; + float _sizeScale { 1.0f }; + int _boundaryLevelAdjust { 0 }; + RenderMode _renderMode { DEFAULT_RENDER_MODE }; + DisplayMode _displayMode { MONO }; + DebugFlags _debugFlags { RENDER_DEBUG_NONE }; + gpu::Batch* _batch = nullptr; + + uint32_t _globalShapeKey { 0 }; + bool _enableTexturing { true }; + + RenderDetails _details; + render::ScenePointer _scene; + int8_t _cameraMode { -1 }; + }; + +} + +using RenderArgs = render::Args; + +#endif // hifi_render_Args_h diff --git a/libraries/render/src/render/DrawSceneOctree.cpp b/libraries/render/src/render/DrawSceneOctree.cpp index c48a9ddbe3..de5ff1f74c 100644 --- a/libraries/render/src/render/DrawSceneOctree.cpp +++ b/libraries/render/src/render/DrawSceneOctree.cpp @@ -16,11 +16,11 @@ #include #include -#include #include #include +#include "Args.h" #include "drawCellBounds_vert.h" #include "drawCellBounds_frag.h" diff --git a/libraries/render/src/render/DrawSceneOctree.h b/libraries/render/src/render/DrawSceneOctree.h index 4838e34c57..9c416262ca 100644 --- a/libraries/render/src/render/DrawSceneOctree.h +++ b/libraries/render/src/render/DrawSceneOctree.h @@ -12,9 +12,10 @@ #ifndef hifi_render_DrawSceneOctree_h #define hifi_render_DrawSceneOctree_h -#include "DrawTask.h" -#include "gpu/Batch.h" #include +#include + +#include "DrawTask.h" namespace render { class DrawSceneOctreeConfig : public Job::Config { diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index d6275a8d7a..148e104453 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -16,10 +16,11 @@ #include #include -#include #include +#include "Args.h" + #include "drawItemBounds_vert.h" #include "drawItemBounds_frag.h" #include "drawItemStatus_vert.h" diff --git a/libraries/render/src/render/Forward.h b/libraries/render/src/render/Forward.h new file mode 100644 index 0000000000..4aba074d1e --- /dev/null +++ b/libraries/render/src/render/Forward.h @@ -0,0 +1,25 @@ +// +// Created by Bradley Austin Davis on 2017/06/15 +// Copyright 2013-2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once +#ifndef hifi_render_Forward_h +#define hifi_render_Forward_h + +#include + +namespace render { + class Scene; + using ScenePointer = std::shared_ptr; + class ShapePipeline; + class Args; +} + +using RenderArgs = render::Args; + + +#endif // hifi_render_Forward_h diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index b0d84d5379..007b34395d 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -22,7 +22,8 @@ #include #include -#include + +#include "Args.h" #include "model/Material.h" #include "ShapePipeline.h" diff --git a/libraries/render/src/render/ShapePipeline.h b/libraries/render/src/render/ShapePipeline.h index 73e8f82f24..434c909198 100644 --- a/libraries/render/src/render/ShapePipeline.h +++ b/libraries/render/src/render/ShapePipeline.h @@ -15,7 +15,8 @@ #include #include -#include + +#include "Args.h" namespace render { diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index 1cb0c117da..b310e137b7 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -529,7 +529,11 @@ void ScriptEngines::launchScriptEngine(ScriptEngine* scriptEngine) { initializer(scriptEngine); } - auto const wantDebug = scriptEngine->isDebuggable() || (qApp->queryKeyboardModifiers() & Qt::ShiftModifier); + // FIXME disabling 'shift key' debugging for now. If you start up the application with + // the shift key held down, it triggers a deadlock because of script interfaces running + // on the main thread + auto const wantDebug = scriptEngine->isDebuggable(); // || (qApp->queryKeyboardModifiers() & Qt::ShiftModifier); + if (HIFI_SCRIPT_DEBUGGABLES && wantDebug) { scriptEngine->runDebuggable(); } else { diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h deleted file mode 100644 index d4d88c26a8..0000000000 --- a/libraries/shared/src/RenderArgs.h +++ /dev/null @@ -1,137 +0,0 @@ -// -// RenderArgs.h -// libraries/shared -// -// Created by Brad Hefta-Gaub on 10/29/14. -// Copyright 2013-2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_RenderArgs_h -#define hifi_RenderArgs_h - -#include -#include -#include - -#include -#include - - - -class AABox; -class OctreeRenderer; -namespace render { - class Scene; - using ScenePointer = std::shared_ptr; -} - -namespace gpu { -class Batch; -class Context; -class Texture; -class Framebuffer; -} - -namespace render { -class ShapePipeline; -} - -class RenderDetails { -public: - enum Type { - ITEM, - SHADOW, - OTHER - }; - - struct Item { - int _considered = 0; - int _outOfView = 0; - int _tooSmall = 0; - int _rendered = 0; - }; - - int _materialSwitches = 0; - int _trianglesRendered = 0; - - Item _item; - Item _shadow; - Item _other; - - Item& edit(Type type) { - switch (type) { - case SHADOW: - return _shadow; - case ITEM: - return _item; - default: - return _other; - } - } -}; - -class RenderArgs { -public: - enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, DIFFUSE_RENDER_MODE, NORMAL_RENDER_MODE, MIRROR_RENDER_MODE }; - enum DisplayMode { MONO, STEREO_MONITOR, STEREO_HMD }; - enum DebugFlags { - RENDER_DEBUG_NONE = 0, - RENDER_DEBUG_HULLS = 1 - }; - - RenderArgs(std::shared_ptr context = nullptr, - QSharedPointer renderer = QSharedPointer(nullptr), - float sizeScale = 1.0f, - int boundaryLevelAdjust = 0, - RenderMode renderMode = DEFAULT_RENDER_MODE, - DisplayMode displayMode = MONO, - DebugFlags debugFlags = RENDER_DEBUG_NONE, - gpu::Batch* batch = nullptr) : - _context(context), - _renderer(renderer), - _sizeScale(sizeScale), - _boundaryLevelAdjust(boundaryLevelAdjust), - _renderMode(renderMode), - _displayMode(displayMode), - _debugFlags(debugFlags), - _batch(batch) { - } - - bool hasViewFrustum() const { return _viewFrustums.size() > 0; } - void setViewFrustum(const ViewFrustum& viewFrustum) { - while (_viewFrustums.size() > 0) { - _viewFrustums.pop(); - } - _viewFrustums.push(viewFrustum); - } - const ViewFrustum& getViewFrustum() const { assert(_viewFrustums.size() > 0); return _viewFrustums.top(); } - void pushViewFrustum(const ViewFrustum& viewFrustum) { _viewFrustums.push(viewFrustum); } - void popViewFrustum() { _viewFrustums.pop(); } - - std::shared_ptr _context = nullptr; - std::shared_ptr _blitFramebuffer = nullptr; - std::shared_ptr _pipeline = nullptr; - QSharedPointer _renderer; - std::stack _viewFrustums; - glm::ivec4 _viewport{ 0.0f, 0.0f, 1.0f, 1.0f }; - glm::vec3 _boomOffset{ 0.0f, 0.0f, 1.0f }; - float _sizeScale = 1.0f; - int _boundaryLevelAdjust = 0; - RenderMode _renderMode = DEFAULT_RENDER_MODE; - DisplayMode _displayMode = MONO; - DebugFlags _debugFlags = RENDER_DEBUG_NONE; - gpu::Batch* _batch = nullptr; - - std::shared_ptr _whiteTexture; - uint32_t _globalShapeKey { 0 }; - bool _enableTexturing { true }; - - RenderDetails _details; - render::ScenePointer _scene; - int8_t _cameraMode { -1 }; -}; - -#endif // hifi_RenderArgs_h diff --git a/libraries/networking/src/FileCache.cpp b/libraries/shared/src/shared/FileCache.cpp similarity index 84% rename from libraries/networking/src/FileCache.cpp rename to libraries/shared/src/shared/FileCache.cpp index 95304e3866..801c68e302 100644 --- a/libraries/networking/src/FileCache.cpp +++ b/libraries/shared/src/shared/FileCache.cpp @@ -21,8 +21,8 @@ #include #include -#include -#include +#include "../PathUtils.h" +#include "../NumericalConstants.h" #ifdef Q_OS_WIN #include @@ -87,6 +87,12 @@ FileCache::~FileCache() { } void FileCache::initialize() { + Lock lock(_mutex); + if (_initialized) { + qCWarning(file_cache) << "File cache already initialized"; + return; + } + QDir dir(_dirpath.c_str()); if (dir.exists()) { @@ -120,21 +126,31 @@ FilePointer FileCache::addFile(Metadata&& metadata, const std::string& filepath) file->_cache = this; emit dirty(); - Lock lock(_filesMutex); _files[file->getKey()] = file; } return file; } FilePointer FileCache::writeFile(const char* data, File::Metadata&& metadata, bool overwrite) { - assert(_initialized); + FilePointer file; + + if (0 == metadata.length) { + qCWarning(file_cache) << "Cannot store empty files in the cache"; + return file; + } + + + Lock lock(_mutex); + + if (!_initialized) { + qCWarning(file_cache) << "File cache used before initialization"; + return file; + } std::string filepath = getFilepath(metadata.key); - Lock lock(_filesMutex); - // if file already exists, return it - FilePointer file = getFile(metadata.key); + file = getFile(metadata.key); if (file) { if (!overwrite) { qCWarning(file_cache, "[%s] Attempted to overwrite %s", _dirname.c_str(), metadata.key.c_str()); @@ -158,12 +174,15 @@ FilePointer FileCache::writeFile(const char* data, File::Metadata&& metadata, bo return file; } + FilePointer FileCache::getFile(const Key& key) { - assert(_initialized); + Lock lock(_mutex); FilePointer file; - - Lock lock(_filesMutex); + if (!_initialized) { + qCWarning(file_cache) << "File cache used before initialization"; + return file; + } // check if file exists const auto it = _files.find(key); @@ -172,7 +191,10 @@ FilePointer FileCache::getFile(const Key& key) { if (file) { file->touch(); // if it exists, it is active - remove it from the cache - removeUnusedFile(file); + if (_unusedFiles.erase(file)) { + _numUnusedFiles -= 1; + _unusedFilesSize -= file->getLength(); + } qCDebug(file_cache, "[%s] Found %s", _dirname.c_str(), key.c_str()); emit dirty(); } else { @@ -188,31 +210,19 @@ std::string FileCache::getFilepath(const Key& key) { return _dirpath + DIR_SEP + key + EXT_SEP + _ext; } +// This is a non-public function that uses the mutex because it's +// essentially a public function specifically to a File object void FileCache::addUnusedFile(const FilePointer& file) { - { - Lock lock(_filesMutex); - _files[file->getKey()] = file; - } - - { - Lock lock(_unusedFilesMutex); - _unusedFiles.insert(file); - _numUnusedFiles += 1; - _unusedFilesSize += file->getLength(); - } + Lock lock(_mutex); + _files[file->getKey()] = file; + _unusedFiles.insert(file); + _numUnusedFiles += 1; + _unusedFilesSize += file->getLength(); clean(); emit dirty(); } -void FileCache::removeUnusedFile(const FilePointer& file) { - Lock lock(_unusedFilesMutex); - if (_unusedFiles.erase(file)) { - _numUnusedFiles -= 1; - _unusedFilesSize -= file->getLength(); - } -} - size_t FileCache::getOverbudgetAmount() const { size_t result = 0; @@ -241,20 +251,13 @@ void FileCache::eject(const FilePointer& file) { const auto& length = file->getLength(); const auto& key = file->getKey(); - { - Lock lock(_filesMutex); - if (0 != _files.erase(key)) { - _numTotalFiles -= 1; - _totalFilesSize -= length; - } + if (0 != _files.erase(key)) { + _numTotalFiles -= 1; + _totalFilesSize -= length; } - - { - Lock unusedLock(_unusedFilesMutex); - if (0 != _unusedFiles.erase(file)) { - _numUnusedFiles -= 1; - _unusedFilesSize -= length; - } + if (0 != _unusedFiles.erase(file)) { + _numUnusedFiles -= 1; + _unusedFilesSize -= length; } } @@ -266,7 +269,6 @@ void FileCache::clean() { return; } - Lock unusedLock(_unusedFilesMutex); using Queue = std::priority_queue, FilePointerComparator>; Queue queue; for (const auto& file : _unusedFiles) { @@ -283,18 +285,19 @@ void FileCache::clean() { } void FileCache::wipe() { - Lock unusedFilesLock(_unusedFilesMutex); + Lock lock(_mutex); while (!_unusedFiles.empty()) { eject(*_unusedFiles.begin()); } } void FileCache::clear() { + Lock lock(_mutex); + // Eliminate any overbudget files clean(); - // Mark everything remaining as persisted - Lock unusedFilesLock(_unusedFilesMutex); + // Mark everything remaining as persisted while effectively ejecting from the cache for (auto& file : _unusedFiles) { file->_shouldPersist = true; file->_cache = nullptr; @@ -329,4 +332,4 @@ File::~File() { void File::touch() { utime(_filepath.c_str(), nullptr); _modified = std::max(QFileInfo(_filepath.c_str()).lastRead().toMSecsSinceEpoch(), _modified); -} \ No newline at end of file +} diff --git a/libraries/networking/src/FileCache.h b/libraries/shared/src/shared/FileCache.h similarity index 95% rename from libraries/networking/src/FileCache.h rename to libraries/shared/src/shared/FileCache.h index f29d75f779..25210af1da 100644 --- a/libraries/networking/src/FileCache.h +++ b/libraries/shared/src/shared/FileCache.h @@ -108,7 +108,6 @@ private: FilePointer addFile(Metadata&& metadata, const std::string& filepath); void addUnusedFile(const FilePointer& file); - void removeUnusedFile(const FilePointer& file); void clean(); void clear(); // Remove a file from the cache @@ -125,16 +124,14 @@ private: std::atomic _totalFilesSize { 0 }; std::atomic _unusedFilesSize { 0 }; - std::string _ext; - std::string _dirname; - std::string _dirpath; + const std::string _ext; + const std::string _dirname; + const std::string _dirpath; bool _initialized { false }; + Mutex _mutex; Map _files; - Mutex _filesMutex; - Set _unusedFiles; - Mutex _unusedFilesMutex; }; class File : public QObject { @@ -146,7 +143,7 @@ public: const Key& getKey() const { return _key; } const size_t& getLength() const { return _length; } - std::string getFilepath() const { return _filepath; } + const std::string& getFilepath() const { return _filepath; } virtual ~File(); /// overrides should call File::deleter to maintain caching behavior diff --git a/libraries/trackers/CMakeLists.txt b/libraries/trackers/CMakeLists.txt index 0999a45b59..6943f1a197 100644 --- a/libraries/trackers/CMakeLists.txt +++ b/libraries/trackers/CMakeLists.txt @@ -2,5 +2,6 @@ set(TARGET_NAME trackers) setup_hifi_library() GroupSources("src") link_hifi_libraries(shared) +include_hifi_library_headers(octree) target_bullet() diff --git a/libraries/ui-plugins/CMakeLists.txt b/libraries/ui-plugins/CMakeLists.txt index 9ce189b117..8da0815082 100644 --- a/libraries/ui-plugins/CMakeLists.txt +++ b/libraries/ui-plugins/CMakeLists.txt @@ -1,3 +1,4 @@ set(TARGET_NAME ui-plugins) setup_hifi_library(OpenGL) link_hifi_libraries(shared plugins ui) +include_hifi_library_headers(gpu) \ No newline at end of file diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index 2e9137c4d9..1a4df550d9 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include "OpenVrHelpers.h" using PuckPosePair = std::pair; diff --git a/script-archive/libraries/overlayManager.js b/script-archive/libraries/overlayManager.js index 7e25cc04ec..cca9be8f75 100644 --- a/script-archive/libraries/overlayManager.js +++ b/script-archive/libraries/overlayManager.js @@ -269,9 +269,6 @@ "minorGridWidth", "majorGridEvery" ]); - LocalModelsOverlay = generateOverlayClass(Volume3DOverlay, "localmodels", [ - ]); - ModelOverlay = generateOverlayClass(Volume3DOverlay, "model", [ "url", "dimensions", "textures" ]); diff --git a/tests/gpu-test/src/TestFbx.cpp b/tests/gpu-test/src/TestFbx.cpp index 11cd60c3f7..538bb0a973 100644 --- a/tests/gpu-test/src/TestFbx.cpp +++ b/tests/gpu-test/src/TestFbx.cpp @@ -13,7 +13,6 @@ #include #include -#include struct MyVertex { vec3 position; diff --git a/tests/gpu-test/src/TestWindow.cpp b/tests/gpu-test/src/TestWindow.cpp index d62467f510..6436ff1ef4 100644 --- a/tests/gpu-test/src/TestWindow.cpp +++ b/tests/gpu-test/src/TestWindow.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #ifdef DEFERRED_LIGHTING extern void initDeferredPipelines(render::ShapePlumber& plumber); diff --git a/tests/gpu-test/src/main.cpp b/tests/gpu-test/src/main.cpp index 975dbf175c..d37be7c790 100644 --- a/tests/gpu-test/src/main.cpp +++ b/tests/gpu-test/src/main.cpp @@ -45,8 +45,6 @@ #include #include #include -#include -#include #include #include diff --git a/tests/render-perf/CMakeLists.txt b/tests/render-perf/CMakeLists.txt index 553e7c06e7..a8e4ab286c 100644 --- a/tests/render-perf/CMakeLists.txt +++ b/tests/render-perf/CMakeLists.txt @@ -10,7 +10,8 @@ setup_hifi_project(Quick Gui OpenGL) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") # link in the shared libraries -link_hifi_libraries(shared octree ktx gl gpu gpu-gl render model model-networking networking render-utils fbx entities entities-renderer animation audio avatars script-engine physics image procedural) +link_hifi_libraries(shared networking model fbx ktx image octree gl gpu gpu-gl render model-networking networking render-utils entities entities-renderer animation audio avatars script-engine physics procedural) + package_libraries_for_deployment() diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index 1e81ee590e..52592cd202 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -507,7 +507,6 @@ public: REGISTER_ENTITY_TYPE_WITH_FACTORY(Web, WebEntityItem::factory); DependencyManager::set(_octree->getTree()); - getEntities()->setViewFrustum(_viewFrustum); auto nodeList = DependencyManager::get(); NodePermissions permissions; permissions.setAll(true); @@ -735,8 +734,8 @@ private: class EntityUpdateOperator : public RecurseOctreeOperator { public: EntityUpdateOperator(const qint64& now) : now(now) {} - bool preRecursion(OctreeElementPointer element) override { return true; } - bool postRecursion(OctreeElementPointer element) override { + bool preRecursion(const OctreeElementPointer& element) override { return true; } + bool postRecursion(const OctreeElementPointer& element) override { EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); entityTreeElement->forEachEntity([&](EntityItemPointer entityItem) { if (!entityItem->isParentIDValid()) { @@ -865,7 +864,6 @@ private: } } - getEntities()->setViewFrustum(_viewFrustum); EntityUpdateOperator updateOperator(now); //getEntities()->getTree()->recurseTreeWithOperator(&updateOperator); { diff --git a/tests/networking/src/FileCacheTests.cpp b/tests/shared/src/FileCacheTests.cpp similarity index 100% rename from tests/networking/src/FileCacheTests.cpp rename to tests/shared/src/FileCacheTests.cpp diff --git a/tests/networking/src/FileCacheTests.h b/tests/shared/src/FileCacheTests.h similarity index 100% rename from tests/networking/src/FileCacheTests.h rename to tests/shared/src/FileCacheTests.h diff --git a/unpublishedScripts/marketplace/shortbow/bow/bow.js b/unpublishedScripts/marketplace/shortbow/bow/bow.js index f8ef025728..a8e76f76fd 100644 --- a/unpublishedScripts/marketplace/shortbow/bow/bow.js +++ b/unpublishedScripts/marketplace/shortbow/bow/bow.js @@ -103,7 +103,7 @@ function getControllerLocation(controllerHand) { const STRING_PULL_SOUND_URL = Script.resolvePath('Bow_draw.1.L.wav'); const ARROW_HIT_SOUND_URL = Script.resolvePath('Arrow_impact1.L.wav'); - const ARROW_MODEL_URL = Script.resolvePath('arrow.fbx'); + const ARROW_MODEL_URL = Script.resolvePath('models/arrow.baked.fbx'); const ARROW_DIMENSIONS = { x: 0.20, y: 0.19, diff --git a/unpublishedScripts/marketplace/shortbow/bow/models/Arrow-texture.ktx b/unpublishedScripts/marketplace/shortbow/bow/models/Arrow-texture.ktx new file mode 100644 index 0000000000..ea8c420d28 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/bow/models/Arrow-texture.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/bow/models/arrow.baked.fbx b/unpublishedScripts/marketplace/shortbow/bow/models/arrow.baked.fbx new file mode 100644 index 0000000000..f29172bdc2 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/bow/models/arrow.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/bow/arrow.fbx b/unpublishedScripts/marketplace/shortbow/bow/models/arrow.fbx similarity index 100% rename from unpublishedScripts/marketplace/shortbow/bow/arrow.fbx rename to unpublishedScripts/marketplace/shortbow/bow/models/arrow.fbx diff --git a/unpublishedScripts/marketplace/shortbow/bow/models/bow-deadly.baked.fbx b/unpublishedScripts/marketplace/shortbow/bow/models/bow-deadly.baked.fbx new file mode 100644 index 0000000000..830300896a Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/bow/models/bow-deadly.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/bow/bow-deadly.fbx b/unpublishedScripts/marketplace/shortbow/bow/models/bow-deadly.fbx similarity index 100% rename from unpublishedScripts/marketplace/shortbow/bow/bow-deadly.fbx rename to unpublishedScripts/marketplace/shortbow/bow/models/bow-deadly.fbx diff --git a/unpublishedScripts/marketplace/shortbow/bow/models/bow_bump-SM.ktx b/unpublishedScripts/marketplace/shortbow/bow/models/bow_bump-SM.ktx new file mode 100644 index 0000000000..6a5cc84e0d Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/bow/models/bow_bump-SM.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/bow/bow_collision_hull.obj b/unpublishedScripts/marketplace/shortbow/bow/models/bow_collision_hull.obj similarity index 100% rename from unpublishedScripts/marketplace/shortbow/bow/bow_collision_hull.obj rename to unpublishedScripts/marketplace/shortbow/bow/models/bow_collision_hull.obj diff --git a/unpublishedScripts/marketplace/shortbow/bow/models/bow_diff-SM.ktx b/unpublishedScripts/marketplace/shortbow/bow/models/bow_diff-SM.ktx new file mode 100644 index 0000000000..a7bd1dd0b7 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/bow/models/bow_diff-SM.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/bow/spawnBow.js b/unpublishedScripts/marketplace/shortbow/bow/spawnBow.js index cb94b05556..ca8b24fe41 100644 --- a/unpublishedScripts/marketplace/shortbow/bow/spawnBow.js +++ b/unpublishedScripts/marketplace/shortbow/bow/spawnBow.js @@ -37,7 +37,7 @@ var userData = { var id = Entities.addEntity({ "position": MyAvatar.position, "collisionsWillMove": 1, - "compoundShapeURL": Script.resolvePath("bow_collision_hull.obj"), + "compoundShapeURL": Script.resolvePath("models/bow_collision_hull.obj"), "created": "2016-09-01T23:57:55Z", "dimensions": { "x": 0.039999999105930328, @@ -50,7 +50,7 @@ var id = Entities.addEntity({ "y": -9.8, "z": 0 }, - "modelURL": Script.resolvePath("bow-deadly.fbx"), + "modelURL": Script.resolvePath("models/bow-deadly.baked.fbx"), "name": "Hifi-Bow", "rotation": { "w": 0.9718012809753418, diff --git a/unpublishedScripts/marketplace/shortbow/models/Amber.baked.fbx b/unpublishedScripts/marketplace/shortbow/models/Amber.baked.fbx new file mode 100644 index 0000000000..5deec8ec79 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/Amber.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/Ball_C_9.ktx b/unpublishedScripts/marketplace/shortbow/models/Ball_C_9.ktx new file mode 100644 index 0000000000..a180d2314b Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/Ball_C_9.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/Metallic.ktx b/unpublishedScripts/marketplace/shortbow/models/Metallic.ktx new file mode 100644 index 0000000000..b9d7fa81fe Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/Metallic.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/Roughness.ktx b/unpublishedScripts/marketplace/shortbow/models/Roughness.ktx new file mode 100644 index 0000000000..187373a4ad Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/Roughness.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.ground Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.ground Diffuse Color.ktx new file mode 100644 index 0000000000..de9b9d3926 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.ground Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.platform Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.platform Diffuse Color.ktx new file mode 100644 index 0000000000..19ecc14bc1 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.platform Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.scoreboard Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.scoreboard Diffuse Color.ktx new file mode 100644 index 0000000000..ed7236ef59 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.scoreboard Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.spawner Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.spawner Diffuse Color.ktx new file mode 100644 index 0000000000..4c501cf18d Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.spawner Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.target Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.target Diffuse Color.ktx new file mode 100644 index 0000000000..1ea63bd64b Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.target Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/mat.turret Diffuse Color.ktx b/unpublishedScripts/marketplace/shortbow/models/mat.turret Diffuse Color.ktx new file mode 100644 index 0000000000..378dc69d74 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/mat.turret Diffuse Color.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/play-area-Diffuse.ktx b/unpublishedScripts/marketplace/shortbow/models/play-area-Diffuse.ktx new file mode 100644 index 0000000000..d4fe5e5cc5 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/play-area-Diffuse.ktx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/shortbow-button.baked.fbx b/unpublishedScripts/marketplace/shortbow/models/shortbow-button.baked.fbx new file mode 100644 index 0000000000..8793cf5a30 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/shortbow-button.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.baked.fbx b/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.baked.fbx new file mode 100644 index 0000000000..afc8d95e29 Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.baked.fbx b/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.baked.fbx new file mode 100644 index 0000000000..03c84f091c Binary files /dev/null and b/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.baked.fbx differ diff --git a/unpublishedScripts/marketplace/shortbow/shortbow.js b/unpublishedScripts/marketplace/shortbow/shortbow.js index 641e9c45a6..a81108e2b3 100644 --- a/unpublishedScripts/marketplace/shortbow/shortbow.js +++ b/unpublishedScripts/marketplace/shortbow/shortbow.js @@ -114,7 +114,7 @@ SHORTBOW_ENTITIES = "id": "{04288f77-64df-4323-ac38-9c1960a393a5}", "lastEdited": 1487893058314990, "lastEditedBy": "{fce8028a-4bac-43e8-96ff-4c7286ea4ab3}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-button.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-button.baked.fbx", "name": "SB.StartButton", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "parentID": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", @@ -758,7 +758,7 @@ SHORTBOW_ENTITIES = "id": "{d4c8f577-944d-4d50-ac85-e56387c0ef0a}", "lastEdited": 1487892440231278, "lastEditedBy": "{91f193dd-829a-4b33-ab27-e9a26160634a}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.baked.fbx", "name": "SB.Platform", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "parentID": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", @@ -794,7 +794,7 @@ SHORTBOW_ENTITIES = "id": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", "lastEdited": 1487892440231832, "lastEditedBy": "{91f193dd-829a-4b33-ab27-e9a26160634a}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.baked.fbx", "name": "SB.Scoreboard", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "queryAACube": { diff --git a/unpublishedScripts/marketplace/shortbow/shortbow.json b/unpublishedScripts/marketplace/shortbow/shortbow.json index 47934baea5..f29ef5f528 100644 --- a/unpublishedScripts/marketplace/shortbow/shortbow.json +++ b/unpublishedScripts/marketplace/shortbow/shortbow.json @@ -96,7 +96,7 @@ "id": "{04288f77-64df-4323-ac38-9c1960a393a5}", "lastEdited": 1487893058314990, "lastEditedBy": "{fce8028a-4bac-43e8-96ff-4c7286ea4ab3}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-button.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-button.baked.fbx", "name": "SB.StartButton", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "parentID": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", @@ -740,7 +740,7 @@ "id": "{d4c8f577-944d-4d50-ac85-e56387c0ef0a}", "lastEdited": 1487892440231278, "lastEditedBy": "{91f193dd-829a-4b33-ab27-e9a26160634a}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-platform.baked.fbx", "name": "SB.Platform", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "parentID": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", @@ -776,7 +776,7 @@ "id": "{0cd1f1f7-53b9-4c15-bf25-42c0760d16f0}", "lastEdited": 1487892440231832, "lastEditedBy": "{91f193dd-829a-4b33-ab27-e9a26160634a}", - "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.fbx", + "modelURL": "file:///c:/Users/ryanh/dev/hifi/unpublishedScripts/marketplace/shortbow/models/shortbow-scoreboard.baked.fbx", "name": "SB.Scoreboard", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "queryAACube": { diff --git a/unpublishedScripts/marketplace/shortbow/shortbowGameManager.js b/unpublishedScripts/marketplace/shortbow/shortbowGameManager.js index bd42e40427..9f0d8c93f3 100644 --- a/unpublishedScripts/marketplace/shortbow/shortbowGameManager.js +++ b/unpublishedScripts/marketplace/shortbow/shortbowGameManager.js @@ -131,7 +131,7 @@ var baseEnemyProperties = { }, "lifetime": 30, "id": "{ed8f7339-8bbd-4750-968e-c3ceb9d64721}", - "modelURL": Script.resolvePath("models/Amber.fbx"), + "modelURL": Script.resolvePath("models/Amber.baked.fbx"), "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "queryAACube": { "scale": 1.0999215841293335, @@ -290,7 +290,7 @@ ShortbowGameManager.prototype = { "position": props.position, "rotation": props.rotation, "collisionsWillMove": 1, - "compoundShapeURL": Script.resolvePath("bow/bow_collision_hull.obj"), + "compoundShapeURL": Script.resolvePath("bow/models/bow_collision_hull.obj"), "created": "2016-09-01T23:57:55Z", "dimensions": { "x": 0.039999999105930328, @@ -303,7 +303,7 @@ ShortbowGameManager.prototype = { "y": -9.8, "z": 0 }, - "modelURL": Script.resolvePath("bow/bow-deadly.fbx"), + "modelURL": Script.resolvePath("bow/models/bow-deadly.baked.fbx"), "name": "WG.Hifi-Bow", "script": Script.resolvePath("bow/bow.js"), "shapeType": "compound",