]> git.mxchange.org Git - simgear.git/blob - simgear/scene/util/DeletionManager.cxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / util / DeletionManager.cxx
1 // DeletionManager.hxx -- defer deletions to a safe time
2 //
3 // Copyright (C) 2012  Tim Moore timoore33@gmail.com
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Library General Public
7 // License as published by the Free Software Foundation; either
8 // version 2 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 // Library General Public License for more details.
14 //
15 // You should have received a copy of the GNU Library General Public
16 // License along with this library; if not, write to the
17 // Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18 // Boston, MA  02110-1301, USA.
19
20 #include "DeletionManager.hxx"
21
22 #include <OpenThreads/ScopedLock>
23 #include <osg/Node>
24 #include "OsgSingleton.hxx"
25
26 namespace simgear
27 {
28 using namespace osg;
29
30 bool DeletionManager::handle(const osgGA::GUIEventAdapter& ea,
31                              osgGA::GUIActionAdapter&,
32                              osg::Object*, osg::NodeVisitor*)
33 {
34     if (ea.getEventType() == osgGA::GUIEventAdapter::FRAME)
35     {
36         OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
37         _staleObjects.resize(0);
38     }
39     return false;
40 }
41
42 void DeletionManager::addStaleObject(Referenced* obj)
43 {
44     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
45     _staleObjects.push_back(obj);
46 }
47
48 void DeletionManager::uninstall(Node* node)
49 {
50     node->removeEventCallback(instance());
51 }
52
53 void DeletionManager::install(Node* node)
54 {
55     node->addEventCallback(instance());
56 }
57
58 DeletionManager* DeletionManager::instance()
59 {
60     return SingletonRefPtr<DeletionManager>::instance();
61 }
62 }
63