diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2640753267..e2778fd6a8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3752,6 +3752,9 @@ void Application::domainChanged(const QString& domainHostname) { _voxelServerJurisdictions.clear(); _octreeServerSceneStats.clear(); _particleServerJurisdictions.clear(); + + // reset the particle renderer + _particles.clear(); // reset our persist thread qDebug() << "Domain changed to" << domainHostname << ". Swapping persist cache."; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 878b3ea439..959c9272cf 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -182,7 +182,7 @@ public: ~Octree(); /// Your tree class must implement this to create the correct element type - virtual OctreeElement* createNewElement(unsigned char * octalCode = NULL) const = 0; + virtual OctreeElement* createNewElement(unsigned char * octalCode = NULL) = 0; // These methods will allow the OctreeServer to send your tree inbound edit packets of your // own definition. Implement these to allow your octree based server to support editing diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 969b49f303..240bd10f98 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -47,7 +47,7 @@ protected: // can only be constructed by derived implementation OctreeElement(); - virtual OctreeElement* createNewElement(unsigned char * octalCode = NULL) const = 0; + virtual OctreeElement* createNewElement(unsigned char * octalCode = NULL) = 0; public: virtual void init(unsigned char * octalCode); /// Your subclass must call init on construction. diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 63cef54c7d..7bbeb065d6 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -132,3 +132,12 @@ void OctreeRenderer::render() { _tree->unlock(); } } + +void OctreeRenderer::clear() { + if (_tree) { + _tree->lockForWrite(); + _tree->eraseAllOctreeElements(); + _tree->unlock(); + } +} + diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index a29e21462c..f321ed2e3e 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -58,6 +58,8 @@ public: static bool renderOperation(OctreeElement* element, void* extraData); + /// clears the tree + void clear(); protected: Octree* _tree; QUuid _dataSourceUUID; diff --git a/libraries/particles/src/ParticleTree.cpp b/libraries/particles/src/ParticleTree.cpp index 73e8dd6711..cd59e0e3a7 100644 --- a/libraries/particles/src/ParticleTree.cpp +++ b/libraries/particles/src/ParticleTree.cpp @@ -10,12 +10,12 @@ ParticleTree::ParticleTree(bool shouldReaverage) : Octree(shouldReaverage) { ParticleTreeElement* rootNode = createNewElement(); - rootNode->setTree(this); _rootNode = rootNode; } -ParticleTreeElement* ParticleTree::createNewElement(unsigned char * octalCode) const { +ParticleTreeElement* ParticleTree::createNewElement(unsigned char * octalCode) { ParticleTreeElement* newElement = new ParticleTreeElement(octalCode); + newElement->setTree(this); return newElement; } diff --git a/libraries/particles/src/ParticleTree.h b/libraries/particles/src/ParticleTree.h index 33e5d5fe75..2b7efbbe78 100644 --- a/libraries/particles/src/ParticleTree.h +++ b/libraries/particles/src/ParticleTree.h @@ -23,7 +23,7 @@ public: ParticleTree(bool shouldReaverage = false); /// Implements our type specific root element factory - virtual ParticleTreeElement* createNewElement(unsigned char * octalCode = NULL) const; + virtual ParticleTreeElement* createNewElement(unsigned char * octalCode = NULL); /// Type safe version of getRoot() ParticleTreeElement* getRoot() { return (ParticleTreeElement*)_rootNode; } diff --git a/libraries/particles/src/ParticleTreeElement.cpp b/libraries/particles/src/ParticleTreeElement.cpp index 7994909004..f767b56a49 100644 --- a/libraries/particles/src/ParticleTreeElement.cpp +++ b/libraries/particles/src/ParticleTreeElement.cpp @@ -25,7 +25,7 @@ ParticleTreeElement::~ParticleTreeElement() { // own type to our own tree. This means we should initialize that child with any tree and type // specific settings that our children must have. One example is out VoxelSystem, which // we know must match ours. -OctreeElement* ParticleTreeElement::createNewElement(unsigned char* octalCode) const { +OctreeElement* ParticleTreeElement::createNewElement(unsigned char* octalCode) { ParticleTreeElement* newChild = new ParticleTreeElement(octalCode); newChild->setTree(_myTree); return newChild; diff --git a/libraries/particles/src/ParticleTreeElement.h b/libraries/particles/src/ParticleTreeElement.h index 8493d59bb8..6d76594b53 100644 --- a/libraries/particles/src/ParticleTreeElement.h +++ b/libraries/particles/src/ParticleTreeElement.h @@ -31,7 +31,7 @@ class ParticleTreeElement : public OctreeElement { ParticleTreeElement(unsigned char* octalCode = NULL); - virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL) const; + virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL); public: virtual ~ParticleTreeElement(); diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index e55cc119ee..1a1f810661 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -24,7 +24,7 @@ VoxelTree::VoxelTree(bool shouldReaverage) : Octree(shouldReaverage) { _rootNode = createNewElement(); } -VoxelTreeElement* VoxelTree::createNewElement(unsigned char * octalCode) const { +VoxelTreeElement* VoxelTree::createNewElement(unsigned char * octalCode) { VoxelSystem* voxelSystem = NULL; if (_rootNode) { voxelSystem = ((VoxelTreeElement*)_rootNode)->getVoxelSystem(); diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index c48a3185a6..c30bc82aa8 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -30,7 +30,7 @@ public: VoxelTree(bool shouldReaverage = false); - virtual VoxelTreeElement* createNewElement(unsigned char * octalCode = NULL) const; + virtual VoxelTreeElement* createNewElement(unsigned char * octalCode = NULL); VoxelTreeElement* getRoot() { return (VoxelTreeElement*)_rootNode; } void deleteVoxelAt(float x, float y, float z, float s); diff --git a/libraries/voxels/src/VoxelTreeElement.cpp b/libraries/voxels/src/VoxelTreeElement.cpp index 557d401311..c98ed77b74 100644 --- a/libraries/voxels/src/VoxelTreeElement.cpp +++ b/libraries/voxels/src/VoxelTreeElement.cpp @@ -25,7 +25,7 @@ VoxelTreeElement::~VoxelTreeElement() { // own type to our own tree. This means we should initialize that child with any tree and type // specific settings that our children must have. One example is out VoxelSystem, which // we know must match ours. -OctreeElement* VoxelTreeElement::createNewElement(unsigned char* octalCode) const { +OctreeElement* VoxelTreeElement::createNewElement(unsigned char* octalCode) { VoxelTreeElement* newChild = new VoxelTreeElement(octalCode); newChild->setVoxelSystem(getVoxelSystem()); // our child is always part of our voxel system NULL ok return newChild; diff --git a/libraries/voxels/src/VoxelTreeElement.h b/libraries/voxels/src/VoxelTreeElement.h index 1eee7e4a5b..86732f4b66 100644 --- a/libraries/voxels/src/VoxelTreeElement.h +++ b/libraries/voxels/src/VoxelTreeElement.h @@ -31,7 +31,7 @@ class VoxelTreeElement : public OctreeElement { VoxelTreeElement(unsigned char* octalCode = NULL); - virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL) const; + virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL); public: virtual ~VoxelTreeElement();