diff --git a/simgear/scene/tgdb/TreeBin.cxx b/simgear/scene/tgdb/TreeBin.cxx index d2cf793c..5687df2a 100644 --- a/simgear/scene/tgdb/TreeBin.cxx +++ b/simgear/scene/tgdb/TreeBin.cxx @@ -151,14 +151,26 @@ Geometry* makeSharedTreeGeometry(int numQuads) return result; } -ref_ptr sharedTreeGeometry; +static std::mutex static_sharedGeometryMutex; +static ref_ptr sharedTreeGeometry; + +void clearSharedTreeGeometry() +{ + std::lock_guard g(static_sharedGeometryMutex); + sharedTreeGeometry = {}; +} Geometry* createTreeGeometry(float width, float height, int varieties) { - if (!sharedTreeGeometry) - sharedTreeGeometry = makeSharedTreeGeometry(1600); - Geometry* quadGeom = simgear::clone(sharedTreeGeometry.get(), - CopyOp::SHALLOW_COPY); + Geometry* quadGeom = nullptr; + { + std::lock_guard g(static_sharedGeometryMutex); + if (!sharedTreeGeometry) + sharedTreeGeometry = makeSharedTreeGeometry(1600); + quadGeom = simgear::clone(sharedTreeGeometry.get(), + CopyOp::SHALLOW_COPY); + } + Vec3Array* params = new Vec3Array; params->push_back(Vec3(width, height, (float)varieties)); quadGeom->setNormalArray(params); diff --git a/simgear/scene/tgdb/TreeBin.hxx b/simgear/scene/tgdb/TreeBin.hxx index 5f97d4f5..138c2e0b 100644 --- a/simgear/scene/tgdb/TreeBin.hxx +++ b/simgear/scene/tgdb/TreeBin.hxx @@ -35,11 +35,14 @@ namespace simgear { class TreeBin { public: - struct Tree { - SGVec3f position; - SGVec3f tnormal; - Tree(const SGVec3f& p, const SGVec3f& t) : position(p),tnormal(t) - { } + ~TreeBin() = default; + + struct Tree { + SGVec3f position; + SGVec3f tnormal; + Tree(const SGVec3f& p, const SGVec3f& t) : position(p), tnormal(t) + { + } }; typedef std::vector TreeList; @@ -55,19 +58,25 @@ public: { _trees.push_back(t); } void insert(const SGVec3f& p, const SGVec3f& tnorm) - {insert(Tree(p,tnorm));} + { + _trees.emplace_back(p, tnorm); + } unsigned getNumTrees() const { return _trees.size(); } + const Tree& getTree(unsigned i) const - { return _trees[i]; } + { + assert(i < _trees.size()); + return _trees.at(i); + } + TreeList _trees; - ~TreeBin() { - _trees.clear(); - } }; +void clearSharedTreeGeometry(); + typedef std::list SGTreeBinList; osg::Group* createForest(SGTreeBinList& forestList, const osg::Matrix& transform,