Model Server to Entity Server Refactoring
Showing the changes to interface/src/Application.cpp (1 of 158 files). Show all
Unified · Split
| @@ -52,9 +52,9 @@ · 51 unmodified lines | ||
| 52 | 52 | |
| 53 | 53 | #include <AccountManager.h> |
| 54 | 54 | #include <AudioInjector.h> |
| 55 | +#include <EntityScriptingInterface.h> | |
| 55 | 56 | #include <LocalVoxelsList.h> |
| 56 | 57 | #include <Logging.h> |
| 57 | −#include <ModelsScriptingInterface.h> | |
| 58 | 58 | #include <NetworkAccessManager.h> |
| 59 | 59 | #include <OctalCode.h> |
| 60 | 60 | #include <OctreeSceneStats.h> |
| @@ -141,8 +141,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 80 unmodified lines | ||
| 141 | 141 | _voxelImporter(), |
| 142 | 142 | _importSucceded(false), |
| 143 | 143 | _sharedVoxelSystem(TREE_SCALE, DEFAULT_MAX_VOXELS_PER_SYSTEM, &_clipboard), |
| 144 | − _modelClipboardRenderer(), | |
| 145 | − _modelClipboard(), | |
| 144 | + _entityClipboardRenderer(), | |
| 145 | + _entityClipboard(), | |
| 146 | 146 | _wantToKillLocalVoxels(false), |
| 147 | 147 | _viewFrustum(), |
| 148 | 148 | _lastQueriedViewFrustum(), |
| @@ -303,13 +303,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 154 unmodified lines | ||
| 303 | 303 | |
| 304 | 304 | // tell the NodeList instance who to tell the domain server we care about |
| 305 | 305 | nodeList->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer |
| 306 | − << NodeType::VoxelServer << NodeType::ParticleServer << NodeType::ModelServer | |
| 306 | + << NodeType::VoxelServer << NodeType::ParticleServer << NodeType::EntityServer | |
| 307 | 307 | << NodeType::MetavoxelServer); |
| 308 | 308 | |
| 309 | 309 | // connect to the packet sent signal of the _voxelEditSender and the _particleEditSender |
| 310 | 310 | connect(&_voxelEditSender, &VoxelEditPacketSender::packetSent, this, &Application::packetSent); |
| 311 | 311 | connect(&_particleEditSender, &ParticleEditPacketSender::packetSent, this, &Application::packetSent); |
| 312 | − connect(&_modelEditSender, &ModelEditPacketSender::packetSent, this, &Application::packetSent); | |
| 312 | + connect(&_entityEditSender, &EntityEditPacketSender::packetSent, this, &Application::packetSent); | |
| 313 | 313 | |
| 314 | 314 | // move the silentNodeTimer to the _nodeThread |
| 315 | 315 | QTimer* silentNodeTimer = new QTimer(); |
| @@ -352,7 +352,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 36 unmodified lines | ||
| 352 | 352 | // Tell our voxel edit sender about our known jurisdictions |
| 353 | 353 | _voxelEditSender.setVoxelServerJurisdictions(&_voxelServerJurisdictions); |
| 354 | 354 | _particleEditSender.setServerJurisdictions(&_particleServerJurisdictions); |
| 355 | − _modelEditSender.setServerJurisdictions(&_modelServerJurisdictions); | |
| 355 | + _entityEditSender.setServerJurisdictions(&_entityServerJurisdictions); | |
| 356 | 356 | |
| 357 | 357 | Particle::setVoxelEditPacketSender(&_voxelEditSender); |
| 358 | 358 | Particle::setParticleEditPacketSender(&_particleEditSender); |
| @@ -364,7 +364,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 5 unmodified lines | ||
| 364 | 364 | // probably not the right long term solution. But for now, we're going to do this to |
| 365 | 365 | // allow you to move a particle around in your hand |
| 366 | 366 | _particleEditSender.setPacketsPerSecond(3000); // super high!! |
| 367 | − _modelEditSender.setPacketsPerSecond(3000); // super high!! | |
| 367 | + _entityEditSender.setPacketsPerSecond(3000); // super high!! | |
| 368 | 368 | |
| 369 | 369 | // Set the sixense filtering |
| 370 | 370 | _sixenseManager.setFilter(Menu::getInstance()->isOptionChecked(MenuOption::FilterSixense)); |
| @@ -454,7 +454,7 @@ Application::~Application() { · 83 unmodified lines | ||
| 454 | 454 | _voxelHideShowThread.terminate(); |
| 455 | 455 | _voxelEditSender.terminate(); |
| 456 | 456 | _particleEditSender.terminate(); |
| 457 | − _modelEditSender.terminate(); | |
| 457 | + _entityEditSender.terminate(); | |
| 458 | 458 | |
| 459 | 459 | |
| 460 | 460 | VoxelTreeElement::removeDeleteHook(&_voxels); // we don't need to do this processing on shutdown |
| @@ -549,7 +549,7 @@ void Application::initializeGL() { · 88 unmodified lines | ||
| 549 | 549 | _voxelEditSender.initialize(_enableProcessVoxelsThread); |
| 550 | 550 | _voxelHideShowThread.initialize(_enableProcessVoxelsThread); |
| 551 | 551 | _particleEditSender.initialize(_enableProcessVoxelsThread); |
| 552 | − _modelEditSender.initialize(_enableProcessVoxelsThread); | |
| 552 | + _entityEditSender.initialize(_enableProcessVoxelsThread); | |
| 553 | 553 | |
| 554 | 554 | if (_enableProcessVoxelsThread) { |
| 555 | 555 | qDebug("Voxel parsing thread created."); |
| @@ -801,7 +801,7 @@ void Application::controlledBroadcastToNodes(const QByteArray& packet, const Nod · 245 unmodified lines | ||
| 801 | 801 | break; |
| 802 | 802 | case NodeType::VoxelServer: |
| 803 | 803 | case NodeType::ParticleServer: |
| 804 | − case NodeType::ModelServer: | |
| 804 | + case NodeType::EntityServer: | |
| 805 | 805 | channel = BandwidthMeter::VOXELS; |
| 806 | 806 | break; |
| 807 | 807 | default: |
| @@ -1339,7 +1339,7 @@ void Application::dropEvent(QDropEvent *event) { · 531 unmodified lines | ||
| 1339 | 1339 | void Application::sendPingPackets() { |
| 1340 | 1340 | QByteArray pingPacket = NodeList::getInstance()->constructPingPacket(); |
| 1341 | 1341 | controlledBroadcastToNodes(pingPacket, NodeSet() |
| 1342 | − << NodeType::VoxelServer << NodeType::ParticleServer << NodeType::ModelServer | |
| 1342 | + << NodeType::VoxelServer << NodeType::ParticleServer << NodeType::EntityServer | |
| 1343 | 1343 | << NodeType::AudioMixer << NodeType::AvatarMixer |
| 1344 | 1344 | << NodeType::MetavoxelServer); |
| 1345 | 1345 | } |
| @@ -1523,22 +1523,21 @@ struct SendVoxelsOperationArgs { · 177 unmodified lines | ||
| 1523 | 1523 | const unsigned char* newBaseOctCode; |
| 1524 | 1524 | }; |
| 1525 | 1525 | |
| 1526 | −bool Application::exportModels(const QString& filename, float x, float y, float z, float scale) { | |
| 1527 | − QVector<ModelItem*> models; | |
| 1528 | − _models.getTree()->findModelsInCube(AACube(glm::vec3(x / (float)TREE_SCALE, y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), models); | |
| 1529 | − if (models.size() > 0) { | |
| 1526 | +bool Application::exportEntities(const QString& filename, float x, float y, float z, float scale) { | |
| 1527 | + QVector<EntityItem*> entities; | |
| 1528 | + _entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE, | |
| 1529 | + y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), entities); | |
| 1530 | + | |
| 1531 | + if (entities.size() > 0) { | |
| 1530 | 1532 | glm::vec3 root(x, y, z); |
| 1531 | − ModelTree exportTree; | |
| 1533 | + EntityTree exportTree; | |
| 1532 | 1534 | |
| 1533 | − for (int i = 0; i < models.size(); i++) { | |
| 1534 | − ModelItemProperties properties; | |
| 1535 | − ModelItemID id = models.at(i)->getModelItemID(); | |
| 1536 | − id.isKnownID = false; | |
| 1537 | − properties.copyFromNewModelItem(*models.at(i)); | |
| 1535 | + for (int i = 0; i < entities.size(); i++) { | |
| 1536 | + EntityItemProperties properties = entities.at(i)->getProperties(); | |
| 1537 | + EntityItemID id = entities.at(i)->getEntityItemID(); | |
| 1538 | 1538 | properties.setPosition(properties.getPosition() - root); |
| 1539 | − exportTree.addModel(id, properties); | |
| 1539 | + exportTree.addEntity(id, properties); | |
| 1540 | 1540 | } |
| 1541 | − | |
| 1542 | 1541 | exportTree.writeToSVOFile(filename.toLocal8Bit().constData()); |
| 1543 | 1542 | } else { |
| 1544 | 1543 | qDebug() << "No models were selected"; |
| @@ -1631,17 +1630,17 @@ void Application::importVoxels() { · 86 unmodified lines | ||
| 1631 | 1630 | emit importDone(); |
| 1632 | 1631 | } |
| 1633 | 1632 | |
| 1634 | −bool Application::importModels(const QString& filename) { | |
| 1635 | − _modelClipboard.eraseAllOctreeElements(); | |
| 1636 | − bool success = _modelClipboard.readFromSVOFile(filename.toLocal8Bit().constData()); | |
| 1633 | +bool Application::importEntities(const QString& filename) { | |
| 1634 | + _entityClipboard.eraseAllOctreeElements(); | |
| 1635 | + bool success = _entityClipboard.readFromSVOFile(filename.toLocal8Bit().constData()); | |
| 1637 | 1636 | if (success) { |
| 1638 | − _modelClipboard.reaverageOctreeElements(); | |
| 1637 | + _entityClipboard.reaverageOctreeElements(); | |
| 1639 | 1638 | } |
| 1640 | 1639 | return success; |
| 1641 | 1640 | } |
| 1642 | 1641 | |
| 1643 | −void Application::pasteModels(float x, float y, float z) { | |
| 1644 | − _modelClipboard.sendModels(&_modelEditSender, x, y, z); | |
| 1642 | +void Application::pasteEntities(float x, float y, float z) { | |
| 1643 | + _entityClipboard.sendEntities(&_entityEditSender, _entities.getTree(), x, y, z); | |
| 1645 | 1644 | } |
| 1646 | 1645 | |
| 1647 | 1646 | void Application::cutVoxels(const VoxelDetail& sourceVoxel) { |
| @@ -1797,12 +1796,12 @@ void Application::init() { · 149 unmodified lines | ||
| 1797 | 1796 | _particles.init(); |
| 1798 | 1797 | _particles.setViewFrustum(getViewFrustum()); |
| 1799 | 1798 | |
| 1800 | − _models.init(); | |
| 1801 | − _models.setViewFrustum(getViewFrustum()); | |
| 1799 | + _entities.init(); | |
| 1800 | + _entities.setViewFrustum(getViewFrustum()); | |
| 1802 | 1801 | |
| 1803 | − _modelClipboardRenderer.init(); | |
| 1804 | − _modelClipboardRenderer.setViewFrustum(getViewFrustum()); | |
| 1805 | − _modelClipboardRenderer.setTree(&_modelClipboard); | |
| 1802 | + _entityClipboardRenderer.init(); | |
| 1803 | + _entityClipboardRenderer.setViewFrustum(getViewFrustum()); | |
| 1804 | + _entityClipboardRenderer.setTree(&_entityClipboard); | |
| 1806 | 1805 | |
| 1807 | 1806 | _metavoxels.init(); |
| 1808 | 1807 | |
| @@ -2032,7 +2031,7 @@ void Application::updateThreads(float deltaTime) { · 223 unmodified lines | ||
| 2032 | 2031 | _voxelHideShowThread.threadRoutine(); |
| 2033 | 2032 | _voxelEditSender.threadRoutine(); |
| 2034 | 2033 | _particleEditSender.threadRoutine(); |
| 2035 | − _modelEditSender.threadRoutine(); | |
| 2034 | + _entityEditSender.threadRoutine(); | |
| 2036 | 2035 | } |
| 2037 | 2036 | } |
| 2038 | 2037 | |
| @@ -2165,8 +2164,8 @@ void Application::update(float deltaTime) { · 126 unmodified lines | ||
| 2165 | 2164 | } |
| 2166 | 2165 | |
| 2167 | 2166 | { |
| 2168 | − PerformanceTimer perfTimer("models"); | |
| 2169 | − _models.update(); // update the models... | |
| 2167 | + PerformanceTimer perfTimer("entities"); | |
| 2168 | + _entities.update(); // update the models... | |
| 2170 | 2169 | } |
| 2171 | 2170 | |
| 2172 | 2171 | { |
| @@ -2210,9 +2209,16 @@ void Application::update(float deltaTime) { · 37 unmodified lines | ||
| 2210 | 2209 | // if it's been a while since our last query or the view has significantly changed then send a query, otherwise suppress it |
| 2211 | 2210 | if (queryIsDue || viewIsDifferentEnough) { |
| 2212 | 2211 | _lastQueriedTime = now; |
| 2213 | − queryOctree(NodeType::VoxelServer, PacketTypeVoxelQuery, _voxelServerJurisdictions); | |
| 2214 | − queryOctree(NodeType::ParticleServer, PacketTypeParticleQuery, _particleServerJurisdictions); | |
| 2215 | − queryOctree(NodeType::ModelServer, PacketTypeModelQuery, _modelServerJurisdictions); | |
| 2212 | + | |
| 2213 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { | |
| 2214 | + queryOctree(NodeType::VoxelServer, PacketTypeVoxelQuery, _voxelServerJurisdictions); | |
| 2215 | + } | |
| 2216 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Particles)) { | |
| 2217 | + queryOctree(NodeType::ParticleServer, PacketTypeParticleQuery, _particleServerJurisdictions); | |
| 2218 | + } | |
| 2219 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Models)) { | |
| 2220 | + queryOctree(NodeType::EntityServer, PacketTypeEntityQuery, _entityServerJurisdictions); | |
| 2221 | + } | |
| 2216 | 2222 | _lastQueriedViewFrustum = _viewFrustum; |
| 2217 | 2223 | } |
| 2218 | 2224 | } |
| @@ -2268,7 +2274,7 @@ int Application::sendNackPackets() { · 49 unmodified lines | ||
| 2268 | 2274 | if (node->getActiveSocket() && |
| 2269 | 2275 | ( node->getType() == NodeType::VoxelServer |
| 2270 | 2276 | || node->getType() == NodeType::ParticleServer |
| 2271 | − || node->getType() == NodeType::ModelServer) | |
| 2277 | + || node->getType() == NodeType::EntityServer) | |
| 2272 | 2278 | ) { |
| 2273 | 2279 | |
| 2274 | 2280 | QUuid nodeUUID = node->getUUID(); |
| @@ -2335,13 +2341,7 @@ int Application::sendNackPackets() { · 60 unmodified lines | ||
| 2335 | 2341 | |
| 2336 | 2342 | void Application::queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions) { |
| 2337 | 2343 | |
| 2338 | − // if voxels are disabled, then don't send this at all... | |
| 2339 | − if (!Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { | |
| 2340 | − return; | |
| 2341 | − } | |
| 2342 | − | |
| 2343 | 2344 | //qDebug() << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView(); |
| 2344 | − | |
| 2345 | 2345 | bool wantExtraDebugging = getLogger()->extraDebugging(); |
| 2346 | 2346 | |
| 2347 | 2347 | // These will be the same for all servers, so we can set them up once and then reuse for each server we send to. |
| @@ -2659,9 +2659,20 @@ void Application::updateShadowMap() { · 311 unmodified lines | ||
| 2659 | 2659 | glEnable(GL_POLYGON_OFFSET_FILL); |
| 2660 | 2660 | glPolygonOffset(1.1f, 4.0f); // magic numbers courtesy http://www.eecs.berkeley.edu/~ravir/6160/papers/shadowmaps.ppt |
| 2661 | 2661 | |
| 2662 | − _avatarManager.renderAvatars(Avatar::SHADOW_RENDER_MODE); | |
| 2663 | − _particles.render(OctreeRenderer::SHADOW_RENDER_MODE); | |
| 2664 | − _models.render(OctreeRenderer::SHADOW_RENDER_MODE); | |
| 2662 | + { | |
| 2663 | + PerformanceTimer perfTimer("avatarManager"); | |
| 2664 | + _avatarManager.renderAvatars(Avatar::SHADOW_RENDER_MODE); | |
| 2665 | + } | |
| 2666 | + | |
| 2667 | + { | |
| 2668 | + PerformanceTimer perfTimer("particles"); | |
| 2669 | + _particles.render(OctreeRenderer::SHADOW_RENDER_MODE); | |
| 2670 | + } | |
| 2671 | + | |
| 2672 | + { | |
| 2673 | + PerformanceTimer perfTimer("entities"); | |
| 2674 | + _entities.render(OctreeRenderer::SHADOW_RENDER_MODE); | |
| 2675 | + } | |
| 2665 | 2676 | |
| 2666 | 2677 | glDisable(GL_POLYGON_OFFSET_FILL); |
| 2667 | 2678 | |
| @@ -2858,10 +2869,10 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { · 190 unmodified lines | ||
| 2858 | 2869 | |
| 2859 | 2870 | // render models... |
| 2860 | 2871 | if (Menu::getInstance()->isOptionChecked(MenuOption::Models)) { |
| 2861 | − PerformanceTimer perfTimer("models"); | |
| 2872 | + PerformanceTimer perfTimer("entities"); | |
| 2862 | 2873 | PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), |
| 2863 | − "Application::displaySide() ... models..."); | |
| 2864 | − _models.render(); | |
| 2874 | + "Application::displaySide() ... entities..."); | |
| 2875 | + _entities.render(); | |
| 2865 | 2876 | } |
| 2866 | 2877 | |
| 2867 | 2878 | // render the ambient occlusion effect if enabled |
| @@ -3385,7 +3396,7 @@ void Application::domainChanged(const QString& domainHostname) { · 517 unmodified lines | ||
| 3385 | 3396 | _particles.clear(); |
| 3386 | 3397 | |
| 3387 | 3398 | // reset the model renderer |
| 3388 | − _models.clear(); | |
| 3399 | + _entities.clear(); | |
| 3389 | 3400 | |
| 3390 | 3401 | // reset the voxels renderer |
| 3391 | 3402 | _voxels.killLocalVoxels(); |
| @@ -3424,7 +3435,7 @@ void Application::nodeKilled(SharedNodePointer node) { · 32 unmodified lines | ||
| 3424 | 3435 | |
| 3425 | 3436 | _voxelEditSender.nodeKilled(node); |
| 3426 | 3437 | _particleEditSender.nodeKilled(node); |
| 3427 | − _modelEditSender.nodeKilled(node); | |
| 3438 | + _entityEditSender.nodeKilled(node); | |
| 3428 | 3439 | |
| 3429 | 3440 | if (node->getType() == NodeType::AudioMixer) { |
| 3430 | 3441 | QMetaObject::invokeMethod(&_audio, "audioMixerKilled"); |
| @@ -3504,16 +3515,16 @@ void Application::nodeKilled(SharedNodePointer node) { · 73 unmodified lines | ||
| 3504 | 3515 | } |
| 3505 | 3516 | _octreeSceneStatsLock.unlock(); |
| 3506 | 3517 | |
| 3507 | − } else if (node->getType() == NodeType::ModelServer) { | |
| 3518 | + } else if (node->getType() == NodeType::EntityServer) { | |
| 3508 | 3519 | |
| 3509 | 3520 | QUuid nodeUUID = node->getUUID(); |
| 3510 | 3521 | // see if this is the first we've heard of this node... |
| 3511 | − _modelServerJurisdictions.lockForRead(); | |
| 3512 | − if (_modelServerJurisdictions.find(nodeUUID) != _modelServerJurisdictions.end()) { | |
| 3513 | − unsigned char* rootCode = _modelServerJurisdictions[nodeUUID].getRootOctalCode(); | |
| 3522 | + _entityServerJurisdictions.lockForRead(); | |
| 3523 | + if (_entityServerJurisdictions.find(nodeUUID) != _entityServerJurisdictions.end()) { | |
| 3524 | + unsigned char* rootCode = _entityServerJurisdictions[nodeUUID].getRootOctalCode(); | |
| 3514 | 3525 | VoxelPositionSize rootDetails; |
| 3515 | 3526 | voxelDetailsForCode(rootCode, rootDetails); |
| 3516 | − _modelServerJurisdictions.unlock(); | |
| 3527 | + _entityServerJurisdictions.unlock(); | |
| 3517 | 3528 | |
| 3518 | 3529 | qDebug("model server going away...... v[%f, %f, %f, %f]", |
| 3519 | 3530 | rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); |
| @@ -3530,10 +3541,10 @@ void Application::nodeKilled(SharedNodePointer node) { · 10 unmodified lines | ||
| 3530 | 3541 | } |
| 3531 | 3542 | |
| 3532 | 3543 | // If the model server is going away, remove it from our jurisdiction map so we don't send voxels to a dead server |
| 3533 | − _modelServerJurisdictions.lockForWrite(); | |
| 3534 | − _modelServerJurisdictions.erase(_modelServerJurisdictions.find(nodeUUID)); | |
| 3544 | + _entityServerJurisdictions.lockForWrite(); | |
| 3545 | + _entityServerJurisdictions.erase(_entityServerJurisdictions.find(nodeUUID)); | |
| 3535 | 3546 | } |
| 3536 | − _modelServerJurisdictions.unlock(); | |
| 3547 | + _entityServerJurisdictions.unlock(); | |
| 3537 | 3548 | |
| 3538 | 3549 | // also clean up scene stats for that server |
| 3539 | 3550 | _octreeSceneStatsLock.lockForWrite(); |
| @@ -3599,8 +3610,8 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin · 59 unmodified lines | ||
| 3599 | 3610 | jurisdiction = &_particleServerJurisdictions; |
| 3600 | 3611 | serverType = "Particle"; |
| 3601 | 3612 | } else { |
| 3602 | − jurisdiction = &_modelServerJurisdictions; | |
| 3603 | − serverType = "Model"; | |
| 3613 | + jurisdiction = &_entityServerJurisdictions; | |
| 3614 | + serverType = "Entity"; | |
| 3604 | 3615 | } |
| 3605 | 3616 | |
| 3606 | 3617 | jurisdiction->lockForRead(); |
| @@ -3709,8 +3720,8 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript · 102 unmodified lines | ||
| 3709 | 3720 | scriptEngine->getParticlesScriptingInterface()->setPacketSender(&_particleEditSender); |
| 3710 | 3721 | scriptEngine->getParticlesScriptingInterface()->setParticleTree(_particles.getTree()); |
| 3711 | 3722 | |
| 3712 | − scriptEngine->getModelsScriptingInterface()->setPacketSender(&_modelEditSender); | |
| 3713 | − scriptEngine->getModelsScriptingInterface()->setModelTree(_models.getTree()); | |
| 3723 | + scriptEngine->getEntityScriptingInterface()->setPacketSender(&_entityEditSender); | |
| 3724 | + scriptEngine->getEntityScriptingInterface()->setEntityTree(_entities.getTree()); | |
| 3714 | 3725 | |
| 3715 | 3726 | // model has some custom types |
| 3716 | 3727 | Model::registerMetaTypes(scriptEngine); |