Sirikata
|
JSVisibleManager manages the data underlying visibles and presences in Emerson. More...
#include <JSVisibleManager.hpp>
JSVisibleManager manages the data underlying visibles and presences in Emerson.
For each visible, there isn't currently one canonical visible object in Emerson. Instead, we can create many of them on demand as we need them, pointing at the single, internal JSVisibleData. JSVisibleData is saved in the JSVisibleManager as a weak pointer so it can be cleaned up automatically when v8 cleans up all visibles pointing to the data. Visibles and presences maintain shared pointers to keep them alive while those objects need them, and their C++ data structures are cleaned up automatically when v8 collects the JavaScript objects.
JSVisibleDatas represent the current known state for a visible. Information could be coming from multiple ProxyObjects, or even none at all, e.g. if we found out about the visible via a message. JSVisibleData is created due to new ProxyObjects or due to createVisStruct calls (in that case containing empty information). Either of two things keep the JSVisibleData alive: living ProxyObjectPtrs (through reference count + shared_ptr) and existing v8 visible/presence objects (through shared_ptr to JSVisibleData). This setup allows us to trivially manage listening to ProxyObjects, always update the JSVisibleData as we get updates from ProxyObjects, and makes dealing with v8 garbage collection easy.
typedef boost::recursive_mutex Sirikata::JS::JSVisibleManager::RMutex |
typedef std::tr1::unordered_map<SpaceObjectReference, JSAggregateVisibleDataWPtr, SpaceObjectReference::Hasher > Sirikata::JS::JSVisibleManager::SporefProxyMap [private] |
typedef SporefProxyMap::iterator Sirikata::JS::JSVisibleManager::SporefProxyMapIter [private] |
typedef std::tr1::unordered_set<ProxyObjectPtr, ProxyObject::Hasher> Sirikata::JS::JSVisibleManager::TrackedObjectsMap [private] |
Sirikata::JS::JSVisibleManager::JSVisibleManager | ( | JSCtx * | ctx | ) |
Sirikata::JS::JSVisibleManager::~JSVisibleManager | ( | ) | [virtual] |
References clearVisibles().
void Sirikata::JS::JSVisibleManager::clearVisibles | ( | ) | [private] |
References iOnDestroyProxy(), mProxies, mTrackedObjects, and vmMtx.
Referenced by Sirikata::JS::EmersonScript::iStop(), and ~JSVisibleManager().
JSVisibleStruct * Sirikata::JS::JSVisibleManager::createVisStruct | ( | EmersonScript * | parent, |
const SpaceObjectReference & | whatsVisible, | ||
JSVisibleDataPtr | addParams = JSVisibleDataPtr() |
||
) |
Creates a new visible struct with sporef whatsVisible.
First checks if already have visible with sporef whatsVisible in mProxies. If do, creates new visible struct from weak pointer stored there. If do not, then checks if hosted object has any proxy objects with given sporef, if not, then tries to load from addParams. If addParams is null, then just creates a blank proxy data object with whatsVisible as its sporef.
References getOrCreateVisible(), mCtx, and vmMtx.
Referenced by Sirikata::JS::EmersonScript::createVisibleWeakPersistent(), Sirikata::JS::EmersonScript::findVisible(), Sirikata::JS::EmersonScript::iNotifyProximate(), Sirikata::JS::EmersonScript::iNotifyProximateGone(), Sirikata::JS::EmersonScript::presToVis(), and Sirikata::JS::EmersonScript::requestReset().
JSAggregateVisibleDataPtr Sirikata::JS::JSVisibleManager::getOrCreateVisible | ( | const SpaceObjectReference & | whatsVisible | ) |
References mProxies, and vmMtx.
Referenced by Sirikata::JS::JSPresenceStruct::connect(), createVisStruct(), iOnCreateProxy(), iOnDestroyProxy(), isVisible(), and iUpdatedProxy().
void Sirikata::JS::JSVisibleManager::iOnCreateProxy | ( | ProxyObjectPtr | p | ) | [private] |
References getOrCreateVisible(), mTrackedObjects, and vmMtx.
Referenced by Sirikata::JS::EmersonScript::iOnConnected(), and onCreateProxy().
void Sirikata::JS::JSVisibleManager::iOnDestroyProxy | ( | ProxyObjectPtr | p | ) | [protected] |
References getOrCreateVisible(), mTrackedObjects, and vmMtx.
Referenced by clearVisibles(), and onDestroyProxy().
bool Sirikata::JS::JSVisibleManager::isVisible | ( | const SpaceObjectReference & | sporef | ) |
References getOrCreateVisible(), and vmMtx.
Referenced by Sirikata::JS::JSPositionListener::getStillVisible(), and isVisibleV8().
v8::Handle< v8::Value > Sirikata::JS::JSVisibleManager::isVisibleV8 | ( | const SpaceObjectReference & | sporef | ) |
References isVisible(), and vmMtx.
void Sirikata::JS::JSVisibleManager::iUpdatedProxy | ( | ProxyObjectPtr | p | ) | [protected] |
References getOrCreateVisible(), and vmMtx.
Referenced by onSetIsAggregate(), onSetMesh(), onSetPhysics(), onSetScale(), and updateLocation().
void Sirikata::JS::JSVisibleManager::onCreateProxy | ( | ProxyObjectPtr | p | ) | [virtual] |
Implements Sirikata::ProxyCreationListener.
References iOnCreateProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::onDestroyProxy | ( | ProxyObjectPtr | p | ) | [virtual] |
Implements Sirikata::ProxyCreationListener.
References iOnDestroyProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::onSetIsAggregate | ( | ProxyObjectPtr | proxy, |
bool | isAggregate, | ||
const SpaceObjectReference & | sporef | ||
) | [virtual] |
Implements Sirikata::MeshListener.
References iUpdatedProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::onSetMesh | ( | ProxyObjectPtr | proxy, |
Transfer::URI const & | newMesh, | ||
const SpaceObjectReference & | sporef | ||
) | [virtual] |
Implements Sirikata::MeshListener.
References iUpdatedProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::onSetPhysics | ( | ProxyObjectPtr | proxy, |
const String & | newphy, | ||
const SpaceObjectReference & | sporef | ||
) | [virtual] |
Reimplemented from Sirikata::MeshListener.
References iUpdatedProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::onSetScale | ( | ProxyObjectPtr | proxy, |
float32 | newScale, | ||
const SpaceObjectReference & | sporef | ||
) | [virtual] |
Implements Sirikata::MeshListener.
References iUpdatedProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
void Sirikata::JS::JSVisibleManager::removeVisibleData | ( | JSVisibleData * | data | ) | [private, virtual] |
Implements Sirikata::JS::JSVisibleDataListener.
References Sirikata::JS::JSVisibleData::id(), mProxies, and vmMtx.
void Sirikata::JS::JSVisibleManager::updateLocation | ( | ProxyObjectPtr | proxy, |
const TimedMotionVector3f & | newLocation, | ||
const TimedMotionQuaternion & | newOrient, | ||
const AggregateBoundingInfo & | newBounds, | ||
const SpaceObjectReference & | sporef | ||
) | [virtual] |
Implements Sirikata::PositionListener.
References iUpdatedProxy(), mCtx, and Sirikata::JS::JSCtx::visManStrand.
friend class EmersonScript [friend] |
JSCtx* Sirikata::JS::JSVisibleManager::mCtx [private] |
Referenced by createVisStruct(), onCreateProxy(), onDestroyProxy(), onSetIsAggregate(), onSetMesh(), onSetPhysics(), onSetScale(), and updateLocation().
Referenced by clearVisibles(), getOrCreateVisible(), and removeVisibleData().
Referenced by clearVisibles(), iOnCreateProxy(), and iOnDestroyProxy().