History

Merge branch 'master' into menu-updates

vladest committed 8 years ago

Commit c7ab1f32 parents 5a5bfcf 6ec91cf329 files · +2008 −1623Browse files

Showing the changes to interface/src/Application.cpp (1 of 329 files). Show all

Unified · Split

interface/src/Application.cpp+52−50
@@ -967,7 +967,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 966 unmodified lines
967967 _entitySimulation(new PhysicalEntitySimulation()),
968968 _physicsEngine(new PhysicsEngine(Vectors::ZERO)),
969969 _entityClipboard(new EntityTree()),
970− _lastQueriedTime(usecTimestampNow()),
971970 _previousScriptLocation("LastScriptLocation", DESKTOP_LOCATION),
972971 _fieldOfView("fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES),
973972 _hmdTabletScale("hmdTabletScale", DEFAULT_HMD_TABLET_SCALE_PERCENT),
@@ -1325,6 +1324,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 351 unmodified lines
13251324
13261325 // Create the main thread context, the GPU backend, and the display plugins
13271326 initializeGL();
1327+ DependencyManager::get<TextureCache>()->setGPUContext(_gpuContext);
13281328 qCDebug(interfaceapp, "Initialized Display.");
13291329 // Create the rendering engine. This can be slow on some machines due to lots of
13301330 // GPU pipeline creation.
@@ -5081,7 +5081,7 @@ void Application::reloadResourceCaches() { · 3750 unmodified lines
50815081 resetPhysicsReadyInformation();
50825082
50835083 // Query the octree to refresh everything in view
5084− _lastQueriedTime = 0;
5084+ _queryExpiry = SteadyClock::now();
50855085 _octreeQuery.incrementConnectionID();
50865086
50875087 queryOctree(NodeType::EntityServer, PacketType::EntityQuery);
@@ -5224,13 +5224,12 @@ void Application::updateSecondaryCameraViewFrustum() { · 136 unmodified lines
52245224 auto renderConfig = _renderEngine->getConfiguration();
52255225 assert(renderConfig);
52265226 auto camera = dynamic_cast<SecondaryCameraJobConfig*>(renderConfig->getConfig("SecondaryCamera"));
5227− assert(camera);
52285227
5229− if (!camera->isEnabled()) {
5230− _hasSecondaryViewFrustum = false;
5228+ if (!camera || !camera->isEnabled()) {
52315229 return;
52325230 }
52335231
5232+ ViewFrustum secondaryViewFrustum;
52345233 if (camera->mirrorProjection && !camera->attachedEntityId.isNull()) {
52355234 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
52365235 auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId);
@@ -5255,36 +5254,37 @@ void Application::updateSecondaryCameraViewFrustum() { · 18 unmodified lines
52555254
52565255 // set frustum position to be mirrored camera and set orientation to mirror's adjusted rotation
52575256 glm::quat mirrorCameraOrientation = glm::quat_cast(worldFromMirrorRotation);
5258− _secondaryViewFrustum.setPosition(mirrorCameraPositionWorld);
5259− _secondaryViewFrustum.setOrientation(mirrorCameraOrientation);
5257+ secondaryViewFrustum.setPosition(mirrorCameraPositionWorld);
5258+ secondaryViewFrustum.setOrientation(mirrorCameraOrientation);
52605259
52615260 // build frustum using mirror space translation of mirrored camera
52625261 float nearClip = mirrorCameraPositionMirror.z + mirrorPropertiesDimensions.z * 2.0f;
52635262 glm::vec3 upperRight = halfMirrorPropertiesDimensions - mirrorCameraPositionMirror;
52645263 glm::vec3 bottomLeft = -halfMirrorPropertiesDimensions - mirrorCameraPositionMirror;
52655264 glm::mat4 frustum = glm::frustum(bottomLeft.x, upperRight.x, bottomLeft.y, upperRight.y, nearClip, camera->farClipPlaneDistance);
5266− _secondaryViewFrustum.setProjection(frustum);
5265+ secondaryViewFrustum.setProjection(frustum);
52675266 } else {
52685267 if (!camera->attachedEntityId.isNull()) {
52695268 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
52705269 auto entityProperties = entityScriptingInterface->getEntityProperties(camera->attachedEntityId);
5271− _secondaryViewFrustum.setPosition(entityProperties.getPosition());
5272− _secondaryViewFrustum.setOrientation(entityProperties.getRotation());
5270+ secondaryViewFrustum.setPosition(entityProperties.getPosition());
5271+ secondaryViewFrustum.setOrientation(entityProperties.getRotation());
52735272 } else {
5274− _secondaryViewFrustum.setPosition(camera->position);
5275− _secondaryViewFrustum.setOrientation(camera->orientation);
5273+ secondaryViewFrustum.setPosition(camera->position);
5274+ secondaryViewFrustum.setOrientation(camera->orientation);
52765275 }
52775276
52785277 float aspectRatio = (float)camera->textureWidth / (float)camera->textureHeight;
5279− _secondaryViewFrustum.setProjection(camera->vFoV,
5278+ secondaryViewFrustum.setProjection(camera->vFoV,
52805279 aspectRatio,
52815280 camera->nearClipPlaneDistance,
52825281 camera->farClipPlaneDistance);
52835282 }
52845283 // Without calculating the bound planes, the secondary camera will use the same culling frustum as the main camera,
52855284 // which is not what we want here.
5286− _secondaryViewFrustum.calculate();
5287− _hasSecondaryViewFrustum = true;
5285+ secondaryViewFrustum.calculate();
5286+
5287+ _conicalViews.push_back(secondaryViewFrustum);
52885288 }
52895289
52905290 static bool domainLoadingInProgress = false;
@@ -5641,6 +5641,8 @@ void Application::update(float deltaTime) { · 350 unmodified lines
56415641 QMutexLocker viewLocker(&_viewMutex);
56425642 _myCamera.loadViewFrustum(_viewFrustum);
56435643
5644+ _conicalViews.clear();
5645+ _conicalViews.push_back(_viewFrustum);
56445646 // TODO: Fix this by modeling the way the secondary camera works on how the main camera works
56455647 // ie. Use a camera object stored in the game logic and informs the Engine on where the secondary
56465648 // camera should be.
@@ -5654,21 +5656,31 @@ void Application::update(float deltaTime) { · 7 unmodified lines
56545656 PROFILE_RANGE_EX(app, "QueryOctree", 0xffff0000, (uint64_t)getActiveDisplayPlugin()->presentCount());
56555657 PerformanceTimer perfTimer("queryOctree");
56565658 QMutexLocker viewLocker(&_viewMutex);
5657− quint64 sinceLastQuery = now - _lastQueriedTime;
5658− const quint64 TOO_LONG_SINCE_LAST_QUERY = 3 * USECS_PER_SECOND;
5659− bool queryIsDue = sinceLastQuery > TOO_LONG_SINCE_LAST_QUERY;
5660− bool viewIsDifferentEnough = !_lastQueriedViewFrustum.isVerySimilar(_viewFrustum);
5661− viewIsDifferentEnough |= _hasSecondaryViewFrustum && !_lastQueriedSecondaryViewFrustum.isVerySimilar(_secondaryViewFrustum);
5659+
5660+ bool viewIsDifferentEnough = false;
5661+ if (_conicalViews.size() == _lastQueriedViews.size()) {
5662+ for (size_t i = 0; i < _conicalViews.size(); ++i) {
5663+ if (!_conicalViews[i].isVerySimilar(_lastQueriedViews[i])) {
5664+ viewIsDifferentEnough = true;
5665+ break;
5666+ }
5667+ }
5668+ } else {
5669+ viewIsDifferentEnough = true;
5670+ }
5671+
56625672
56635673 // if it's been a while since our last query or the view has significantly changed then send a query, otherwise suppress it
5664− if (queryIsDue || viewIsDifferentEnough) {
5665− _lastQueriedTime = now;
5674+ static const std::chrono::seconds MIN_PERIOD_BETWEEN_QUERIES { 3 };
5675+ auto now = SteadyClock::now();
5676+ if (now > _queryExpiry || viewIsDifferentEnough) {
56665677 if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {
56675678 queryOctree(NodeType::EntityServer, PacketType::EntityQuery);
56685679 }
5669− sendAvatarViewFrustum();
5670− _lastQueriedViewFrustum = _viewFrustum;
5671− _lastQueriedSecondaryViewFrustum = _secondaryViewFrustum;
5680+ queryAvatars();
5681+
5682+ _lastQueriedViews = _conicalViews;
5683+ _queryExpiry = now + MIN_PERIOD_BETWEEN_QUERIES;
56725684 }
56735685 }
56745686
@@ -5840,18 +5852,20 @@ void Application::update(float deltaTime) { · 165 unmodified lines
58405852 }
58415853 }
58425854
5843−void Application::sendAvatarViewFrustum() {
5844− uint8_t numFrustums = 1;
5845− QByteArray viewFrustumByteArray = _viewFrustum.toByteArray();
5855+void Application::queryAvatars() {
5856+ auto avatarPacket = NLPacket::create(PacketType::AvatarQuery);
5857+ auto destinationBuffer = reinterpret_cast<unsigned char*>(avatarPacket->getPayload());
5858+ unsigned char* bufferStart = destinationBuffer;
58465859
5847− if (_hasSecondaryViewFrustum) {
5848− ++numFrustums;
5849− viewFrustumByteArray += _secondaryViewFrustum.toByteArray();
5860+ uint8_t numFrustums = (uint8_t)_conicalViews.size();
5861+ memcpy(destinationBuffer, &numFrustums, sizeof(numFrustums));
5862+ destinationBuffer += sizeof(numFrustums);
5863+
5864+ for (const auto& view : _conicalViews) {
5865+ destinationBuffer += view.serialize(destinationBuffer);
58505866 }
58515867
5852− auto avatarPacket = NLPacket::create(PacketType::ViewFrustum, viewFrustumByteArray.size() + sizeof(numFrustums));
5853− avatarPacket->writePrimitive(numFrustums);
5854− avatarPacket->write(viewFrustumByteArray);
5868+ avatarPacket->setPayloadSize(destinationBuffer - bufferStart);
58555869
58565870 DependencyManager::get<NodeList>()->broadcastToNodes(std::move(avatarPacket), NodeSet() << NodeType::AvatarMixer);
58575871 }
@@ -5913,16 +5927,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType) { · 55 unmodified lines
59135927 return; // bail early if settings are not loaded
59145928 }
59155929
5916− ViewFrustum viewFrustum;
5917− copyViewFrustum(viewFrustum);
5918− _octreeQuery.setMainViewFrustum(viewFrustum);
5919−
5920− if (hasSecondaryViewFrustum()) {
5921− copySecondaryViewFrustum(viewFrustum);
5922− _octreeQuery.setSecondaryViewFrustum(viewFrustum);
5923− } else {
5924− _octreeQuery.clearSecondaryViewFrustum();
5925− }
5930+ _octreeQuery.setConicalViews(_conicalViews);
59265931
59275932 auto lodManager = DependencyManager::get<LODManager>();
59285933 _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
@@ -6007,11 +6012,6 @@ void Application::copyDisplayViewFrustum(ViewFrustum& viewOut) const { · 78 unmodified lines
60076012 viewOut = _displayViewFrustum;
60086013 }
60096014
6010−void Application::copySecondaryViewFrustum(ViewFrustum& viewOut) const {
6011− QMutexLocker viewLocker(&_viewMutex);
6012− viewOut = _secondaryViewFrustum;
6013−}
6014−
60156015 void Application::resetSensors(bool andReload) {
60166016 DependencyManager::get<DdeFaceTracker>()->reset();
60176017 DependencyManager::get<EyeTracker>()->reset();
@@ -6137,7 +6137,7 @@ void Application::nodeActivated(SharedNodePointer node) { · 119 unmodified lines
61376137 // If we get a new EntityServer activated, reset lastQueried time
61386138 // so we will do a proper query during update
61396139 if (node->getType() == NodeType::EntityServer) {
6140− _lastQueriedTime = 0;
6140+ _queryExpiry = SteadyClock::now();
61416141 _octreeQuery.incrementConnectionID();
61426142 }
61436143
@@ -6146,6 +6146,8 @@ void Application::nodeActivated(SharedNodePointer node) { · 2 unmodified lines
61466146 }
61476147
61486148 if (node->getType() == NodeType::AvatarMixer) {
6149+ _queryExpiry = SteadyClock::now();
6150+
61496151 // new avatar mixer, send off our identity packet on next update loop
61506152 // Reset skeletonModelUrl if the last server modified our choice.
61516153 // Override the avatar url (but not model name) here too.