diff options
Diffstat (limited to 'indra/newview/llviewerobjectlist.h')
-rw-r--r-- | indra/newview/llviewerobjectlist.h | 596 |
1 files changed, 298 insertions, 298 deletions
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index f9f39b2879..f0f236d6ae 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -1,298 +1,298 @@ -/**
- * @file llviewerobjectlist.h
- * @brief Description of LLViewerObjectList class.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLVIEWEROBJECTLIST_H
-#define LL_LLVIEWEROBJECTLIST_H
-
-#include <map>
-#include <set>
-
-// common includes
-#include "llstring.h"
-#include "lltrace.h"
-
-// project includes
-#include "llviewerobject.h"
-#include "lleventcoro.h"
-#include "llcoros.h"
-
-class LLCamera;
-class LLNetMap;
-class LLDebugBeacon;
-class LLVOCacheEntry;
-
-const U32 CLOSE_BIN_SIZE = 10;
-const U32 NUM_BINS = 128;
-
-// GL name = position in object list + GL_NAME_INDEX_OFFSET so that
-// we can have special numbers like zero.
-const U32 GL_NAME_LAND = 0;
-const U32 GL_NAME_PARCEL_WALL = 1;
-
-const U32 GL_NAME_INDEX_OFFSET = 10;
-
-class LLViewerObjectList
-{
-public:
- LLViewerObjectList();
- ~LLViewerObjectList();
-
- void destroy();
-
- // For internal use only. Does NOT take a local id, takes an index into
- // an internal dynamic array.
- inline LLViewerObject *getObject(const S32 index);
-
- inline LLViewerObject *findObject(const LLUUID &id);
- LLViewerObject *createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp, S32 flags = 0); // Create a viewer-side object
- LLViewerObject *createObjectFromCache(const LLPCode pcode, LLViewerRegion *regionp, const LLUUID &uuid, const U32 local_id);
- LLViewerObject *createObject(const LLPCode pcode, LLViewerRegion *regionp,
- const LLUUID &uuid, const U32 local_id, const LLHost &sender);
-
- LLViewerObject *replaceObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); // TomY: hack to switch VO instances on the fly
-
- bool killObject(LLViewerObject *objectp);
- void killObjects(LLViewerRegion *regionp); // Kill all objects owned by a particular region.
- void killAllObjects();
-
- void cleanDeadObjects(const bool use_timer = true); // Clean up the dead object list.
-
- // Simulator and viewer side object updates...
- void processUpdateCore(LLViewerObject* objectp, void** data, U32 block, const EObjectUpdateType update_type,
- LLDataPacker* dpp, bool justCreated, bool from_cache = false);
- LLViewerObject* processObjectUpdateFromCache(LLVOCacheEntry* entry, LLViewerRegion* regionp);
- void processObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type, bool compressed=false);
- void processCompressedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);
- void processCachedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);
- void updateApparentAngles(LLAgent &agent);
- void update(LLAgent &agent);
-
- void fetchObjectCosts();
- void fetchPhysicsFlags();
-
- void updateObjectCost(LLViewerObject* object);
- void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
- void onObjectCostFetchFailure(const LLUUID& object_id);
-
- void updatePhysicsFlags(const LLViewerObject* object);
- void onPhysicsFlagsFetchFailure(const LLUUID& object_id);
- void updatePhysicsShapeType(const LLUUID& object_id, S32 type);
- void updatePhysicsProperties(const LLUUID& object_id,
- F32 density,
- F32 friction,
- F32 restitution,
- F32 gravity_multiplier);
-
- void shiftObjects(const LLVector3 &offset);
- void repartitionObjects();
-
- bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
- void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
- void renderObjectsForMap(LLNetMap &netmap);
- void renderObjectBounds(const LLVector3 ¢er);
-
- void addDebugBeacon(const LLVector3 &pos_agent, const std::string &string,
- const LLColor4 &color=LLColor4(1.f, 0.f, 0.f, 0.5f),
- const LLColor4 &text_color=LLColor4(1.f, 1.f, 1.f, 1.f),
- S32 line_width = 1);
- void renderObjectBeacons();
- void resetObjectBeacons();
-
- void dirtyAllObjectInventory();
-
- void removeFromActiveList(LLViewerObject* objectp);
- void updateActive(LLViewerObject *objectp);
-
- void updateAvatarVisibility();
-
- inline S32 getNumObjects() { return (S32) mObjects.size(); }
- inline S32 getNumActiveObjects() { return (S32) mActiveObjects.size(); }
-
- void addToMap(LLViewerObject *objectp);
- void removeFromMap(LLViewerObject *objectp);
-
- void clearDebugText();
-
- ////////////////////////////////////////////
- //
- // Only accessed by markDead in LLViewerObject
- void cleanupReferences(LLViewerObject *objectp);
-
- S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value.
-
- S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); }
- S32 getOrphanCount() const { return mNumOrphans; }
- void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port);
- void findOrphans(LLViewerObject* objectp, U32 ip, U32 port);
-
-public:
- // Class for keeping track of orphaned objects
- class OrphanInfo
- {
- public:
- OrphanInfo();
- OrphanInfo(const U64 parent_info, const LLUUID child_info);
- bool operator==(const OrphanInfo &rhs) const;
- bool operator!=(const OrphanInfo &rhs) const;
- U64 mParentInfo;
- LLUUID mChildInfo;
- };
-
-
- U32 mCurBin; // Current bin we're working on...
-
- // Statistics data (see also LLViewerStats)
- S32 mNumNewObjects;
-
- // if we paused in the last frame
- // used to discount stats from this frame
- bool mWasPaused;
-
- static void getUUIDFromLocal(LLUUID &id,
- const U32 local_id,
- const U32 ip,
- const U32 port);
- static void setUUIDAndLocal(const LLUUID &id,
- const U32 local_id,
- const U32 ip,
- const U32 port); // Requires knowledge of message system info!
-
- static bool removeFromLocalIDTable(const LLViewerObject* objectp);
- // Used ONLY by the orphaned object code.
- static U64 getIndex(const U32 local_id, const U32 ip, const U32 port);
-
- S32 mNumUnknownUpdates;
- S32 mNumDeadObjectUpdates;
- S32 mNumDeadObjects;
-protected:
- std::vector<U64> mOrphanParents; // LocalID/ip,port of orphaned objects
- std::vector<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects
- S32 mNumOrphans;
-
- typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
-
- vobj_list_t mObjects;
- std::vector<LLPointer<LLViewerObject> > mActiveObjects;
-
- vobj_list_t mMapObjects;
-
- uuid_set_t mDeadObjects;
-
- std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
-
- //set of objects that need to update their cost
- uuid_set_t mStaleObjectCost;
- uuid_set_t mPendingObjectCost;
-
- //set of objects that need to update their physics flags
- uuid_set_t mStalePhysicsFlags;
- uuid_set_t mPendingPhysicsFlags;
-
- std::vector<LLDebugBeacon> mDebugBeacons;
-
- S32 mCurLazyUpdateIndex;
-
- static U32 sSimulatorMachineIndex;
- static std::map<U64, U32> sIPAndPortToIndex;
-
- static std::map<U64, LLUUID> sIndexAndLocalIDToUUID;
-
- friend class LLViewerObject;
-
-private:
- static void reportObjectCostFailure(LLSD &objectList);
- void fetchObjectCostsCoro(std::string url);
-
- static void reportPhysicsFlagFailure(LLSD &obejectList);
- void fetchPhisicsFlagsCoro(std::string url);
-
-};
-
-
-class LLDebugBeacon
-{
-public:
- ~LLDebugBeacon();
-
- LLVector3 mPositionAgent;
- std::string mString;
- LLColor4 mColor;
- LLColor4 mTextColor;
- S32 mLineWidth;
- LLPointer<class LLHUDObject> mHUDObject;
-};
-
-
-
-// Global object list
-extern LLViewerObjectList gObjectList;
-
-// Inlines
-/**
- * Note:
- * it will return NULL for offline avatar_id
- */
-inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
-{
- std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
- if(iter != mUUIDObjectMap.end())
- {
- return iter->second;
- }
- else
- {
- return NULL;
- }
-}
-
-inline LLViewerObject *LLViewerObjectList::getObject(const S32 index)
-{
- LLViewerObject *objectp;
- objectp = mObjects[index];
- if (objectp->isDead())
- {
- //LL_WARNS() << "Dead object " << objectp->mID << " in getObject" << LL_ENDL;
- return NULL;
- }
- return objectp;
-}
-
-inline void LLViewerObjectList::addToMap(LLViewerObject *objectp)
-{
- mMapObjects.push_back(objectp);
-}
-
-inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp)
-{
- std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mMapObjects.begin(), mMapObjects.end(), objectp);
- if (iter != mMapObjects.end())
- {
- mMapObjects.erase(iter);
- }
-}
-
-
-#endif // LL_VIEWER_OBJECT_LIST_H
+/** + * @file llviewerobjectlist.h + * @brief Description of LLViewerObjectList class. + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWEROBJECTLIST_H +#define LL_LLVIEWEROBJECTLIST_H + +#include <map> +#include <set> + +// common includes +#include "llstring.h" +#include "lltrace.h" + +// project includes +#include "llviewerobject.h" +#include "lleventcoro.h" +#include "llcoros.h" + +class LLCamera; +class LLNetMap; +class LLDebugBeacon; +class LLVOCacheEntry; + +const U32 CLOSE_BIN_SIZE = 10; +const U32 NUM_BINS = 128; + +// GL name = position in object list + GL_NAME_INDEX_OFFSET so that +// we can have special numbers like zero. +const U32 GL_NAME_LAND = 0; +const U32 GL_NAME_PARCEL_WALL = 1; + +const U32 GL_NAME_INDEX_OFFSET = 10; + +class LLViewerObjectList +{ +public: + LLViewerObjectList(); + ~LLViewerObjectList(); + + void destroy(); + + // For internal use only. Does NOT take a local id, takes an index into + // an internal dynamic array. + inline LLViewerObject *getObject(const S32 index); + + inline LLViewerObject *findObject(const LLUUID &id); + LLViewerObject *createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp, S32 flags = 0); // Create a viewer-side object + LLViewerObject *createObjectFromCache(const LLPCode pcode, LLViewerRegion *regionp, const LLUUID &uuid, const U32 local_id); + LLViewerObject *createObject(const LLPCode pcode, LLViewerRegion *regionp, + const LLUUID &uuid, const U32 local_id, const LLHost &sender); + + LLViewerObject *replaceObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); // TomY: hack to switch VO instances on the fly + + bool killObject(LLViewerObject *objectp); + void killObjects(LLViewerRegion *regionp); // Kill all objects owned by a particular region. + void killAllObjects(); + + void cleanDeadObjects(const bool use_timer = true); // Clean up the dead object list. + + // Simulator and viewer side object updates... + void processUpdateCore(LLViewerObject* objectp, void** data, U32 block, const EObjectUpdateType update_type, + LLDataPacker* dpp, bool justCreated, bool from_cache = false); + LLViewerObject* processObjectUpdateFromCache(LLVOCacheEntry* entry, LLViewerRegion* regionp); + void processObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type, bool compressed=false); + void processCompressedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type); + void processCachedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type); + void updateApparentAngles(LLAgent &agent); + void update(LLAgent &agent); + + void fetchObjectCosts(); + void fetchPhysicsFlags(); + + void updateObjectCost(LLViewerObject* object); + void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost); + void onObjectCostFetchFailure(const LLUUID& object_id); + + void updatePhysicsFlags(const LLViewerObject* object); + void onPhysicsFlagsFetchFailure(const LLUUID& object_id); + void updatePhysicsShapeType(const LLUUID& object_id, S32 type); + void updatePhysicsProperties(const LLUUID& object_id, + F32 density, + F32 friction, + F32 restitution, + F32 gravity_multiplier); + + void shiftObjects(const LLVector3 &offset); + void repartitionObjects(); + + bool hasMapObjectInRegion(LLViewerRegion* regionp) ; + void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ; + void renderObjectsForMap(LLNetMap &netmap); + void renderObjectBounds(const LLVector3 ¢er); + + void addDebugBeacon(const LLVector3 &pos_agent, const std::string &string, + const LLColor4 &color=LLColor4(1.f, 0.f, 0.f, 0.5f), + const LLColor4 &text_color=LLColor4(1.f, 1.f, 1.f, 1.f), + S32 line_width = 1); + void renderObjectBeacons(); + void resetObjectBeacons(); + + void dirtyAllObjectInventory(); + + void removeFromActiveList(LLViewerObject* objectp); + void updateActive(LLViewerObject *objectp); + + void updateAvatarVisibility(); + + inline S32 getNumObjects() { return (S32) mObjects.size(); } + inline S32 getNumActiveObjects() { return (S32) mActiveObjects.size(); } + + void addToMap(LLViewerObject *objectp); + void removeFromMap(LLViewerObject *objectp); + + void clearDebugText(); + + //////////////////////////////////////////// + // + // Only accessed by markDead in LLViewerObject + void cleanupReferences(LLViewerObject *objectp); + + S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value. + + S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); } + S32 getOrphanCount() const { return mNumOrphans; } + void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port); + void findOrphans(LLViewerObject* objectp, U32 ip, U32 port); + +public: + // Class for keeping track of orphaned objects + class OrphanInfo + { + public: + OrphanInfo(); + OrphanInfo(const U64 parent_info, const LLUUID child_info); + bool operator==(const OrphanInfo &rhs) const; + bool operator!=(const OrphanInfo &rhs) const; + U64 mParentInfo; + LLUUID mChildInfo; + }; + + + U32 mCurBin; // Current bin we're working on... + + // Statistics data (see also LLViewerStats) + S32 mNumNewObjects; + + // if we paused in the last frame + // used to discount stats from this frame + bool mWasPaused; + + static void getUUIDFromLocal(LLUUID &id, + const U32 local_id, + const U32 ip, + const U32 port); + static void setUUIDAndLocal(const LLUUID &id, + const U32 local_id, + const U32 ip, + const U32 port); // Requires knowledge of message system info! + + static bool removeFromLocalIDTable(const LLViewerObject* objectp); + // Used ONLY by the orphaned object code. + static U64 getIndex(const U32 local_id, const U32 ip, const U32 port); + + S32 mNumUnknownUpdates; + S32 mNumDeadObjectUpdates; + S32 mNumDeadObjects; +protected: + std::vector<U64> mOrphanParents; // LocalID/ip,port of orphaned objects + std::vector<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects + S32 mNumOrphans; + + typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t; + + vobj_list_t mObjects; + std::vector<LLPointer<LLViewerObject> > mActiveObjects; + + vobj_list_t mMapObjects; + + uuid_set_t mDeadObjects; + + std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap; + + //set of objects that need to update their cost + uuid_set_t mStaleObjectCost; + uuid_set_t mPendingObjectCost; + + //set of objects that need to update their physics flags + uuid_set_t mStalePhysicsFlags; + uuid_set_t mPendingPhysicsFlags; + + std::vector<LLDebugBeacon> mDebugBeacons; + + S32 mCurLazyUpdateIndex; + + static U32 sSimulatorMachineIndex; + static std::map<U64, U32> sIPAndPortToIndex; + + static std::map<U64, LLUUID> sIndexAndLocalIDToUUID; + + friend class LLViewerObject; + +private: + static void reportObjectCostFailure(LLSD &objectList); + void fetchObjectCostsCoro(std::string url); + + static void reportPhysicsFlagFailure(LLSD &obejectList); + void fetchPhisicsFlagsCoro(std::string url); + +}; + + +class LLDebugBeacon +{ +public: + ~LLDebugBeacon(); + + LLVector3 mPositionAgent; + std::string mString; + LLColor4 mColor; + LLColor4 mTextColor; + S32 mLineWidth; + LLPointer<class LLHUDObject> mHUDObject; +}; + + + +// Global object list +extern LLViewerObjectList gObjectList; + +// Inlines +/** + * Note: + * it will return NULL for offline avatar_id + */ +inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id) +{ + std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id); + if(iter != mUUIDObjectMap.end()) + { + return iter->second; + } + else + { + return NULL; + } +} + +inline LLViewerObject *LLViewerObjectList::getObject(const S32 index) +{ + LLViewerObject *objectp; + objectp = mObjects[index]; + if (objectp->isDead()) + { + //LL_WARNS() << "Dead object " << objectp->mID << " in getObject" << LL_ENDL; + return NULL; + } + return objectp; +} + +inline void LLViewerObjectList::addToMap(LLViewerObject *objectp) +{ + mMapObjects.push_back(objectp); +} + +inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp) +{ + std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mMapObjects.begin(), mMapObjects.end(), objectp); + if (iter != mMapObjects.end()) + { + mMapObjects.erase(iter); + } +} + + +#endif // LL_VIEWER_OBJECT_LIST_H |