diff options
Diffstat (limited to 'indra/newview/llviewerobject.cpp')
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 162 | 
1 files changed, 111 insertions, 51 deletions
| diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d0afa9d9de..741a9e6ec4 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2,31 +2,25 @@   * @file llviewerobject.cpp   * @brief Base class for viewer objects   * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - *  - * Copyright (c) 2001-2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * 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.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -46,6 +40,7 @@  #include "llfontgl.h"  #include "llframetimer.h"  #include "llinventory.h" +#include "llinventorydefines.h"  #include "llmaterialtable.h"  #include "llmutelist.h"  #include "llnamevalue.h" @@ -60,6 +55,7 @@  #include "llaudiosourcevo.h"  #include "llagent.h" +#include "llagentcamera.h"  #include "llbbox.h"  #include "llbox.h"  #include "llcylinder.h" @@ -77,6 +73,7 @@  #include "llviewerparceloverlay.h"  #include "llviewerpartsource.h"  #include "llviewerregion.h" +#include "llviewerstats.h"  #include "llviewertextureanim.h"  #include "llviewerwindow.h" // For getSpinAxis  #include "llvoavatar.h" @@ -133,7 +130,15 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco  	{  		if (id == gAgentID)  		{ -			res = new LLVOAvatarSelf(id, pcode, regionp); +			if (!gAgentAvatarp) +			{ +				gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp); +			} +			else  +			{ +				gAgentAvatarp->updateRegion(regionp); +			} +			res = gAgentAvatarp;  		}  		else  		{ @@ -222,7 +227,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe  	mClickAction(0),  	mAttachmentItemID(LLUUID::null)  { -	if(!is_global) +	if (!is_global)  	{  		llassert(mRegionp);  	} @@ -234,7 +239,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe  	mPositionRegion = LLVector3(0.f, 0.f, 0.f); -	if(!is_global) +	if (!is_global && mRegionp)  	{  		mPositionAgent = mRegionp->getOriginAgent();  	} @@ -376,11 +381,10 @@ void LLViewerObject::markDead()  		if (flagAnimSource())  		{ -			LLVOAvatar* avatarp = gAgent.getAvatarObject(); -			if (avatarp && !avatarp->isDead()) +			if (isAgentAvatarValid())  			{  				// stop motions associated with this object -				avatarp->stopMotionFromSource(mID); +				gAgentAvatarp->stopMotionFromSource(mID);  			}  		} @@ -753,7 +757,24 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  	// Coordinates of objects on simulators are region-local.  	U64 region_handle;  	mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle); -	mRegionp = LLWorld::getInstance()->getRegionFromHandle(region_handle); +	 +	{ +		LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle); +		if(regionp != mRegionp && regionp && mRegionp)//region cross +		{ +			//this is the redundant position and region update, but it is necessary in case the viewer misses the following  +			//position and region update messages from sim. +			//this redundant update should not cause any problems. +			LLVector3 delta_pos =  mRegionp->getOriginAgent() - regionp->getOriginAgent(); +			setPositionParent(getPosition() + delta_pos); //update to the new region position immediately. +			setRegion(regionp) ; //change the region. +		} +		else +		{ +			mRegionp = regionp ; +		} +	}	 +	  	if (!mRegionp)  	{  		U32 x, y; @@ -1823,7 +1844,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  		if (cdp)  		{  			F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); -			LLVector3 diff = getVelocity() * (0.5f*mTimeDilation*(gFrameDTClamped + ((F32)ping_delay)*0.001f));  +			LLVector3 diff = getVelocity() * ping_delay;   			new_pos_parent += diff;  		}  		else @@ -1890,6 +1911,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  			avatar->clampAttachmentPositions();  		} +		 +		// If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps +		if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) ) +		{ +			LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() ); +		}  	}  	if (new_rot != mLastRot @@ -2001,6 +2028,9 @@ BOOL LLViewerObject::isActive() const  BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { +	static LLFastTimer::DeclareTimer ftm("Viewer Object"); +	LLFastTimer t(ftm); +  	if (mDead)  	{  		// It's dead.  Don't update it. @@ -2166,8 +2196,8 @@ void LLViewerObject::deleteInventoryItem(const LLUUID& item_id)  {  	if(mInventory)  	{ -		InventoryObjectList::iterator it = mInventory->begin(); -		InventoryObjectList::iterator end = mInventory->end(); +		LLInventoryObject::object_list_t::iterator it = mInventory->begin(); +		LLInventoryObject::object_list_t::iterator end = mInventory->end();  		for( ; it != end; ++it )  		{  			if((*it)->getUUID() == item_id) @@ -2477,7 +2507,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)  		}  		else  		{ -			object->mInventory = new InventoryObjectList(); +			object->mInventory = new LLInventoryObject::object_list_t();  		}  		LLPointer<LLInventoryObject> obj;  		obj = new LLInventoryObject(object->mID, LLUUID::null, @@ -2533,7 +2563,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)  		}  		else  		{ -			mInventory = new InventoryObjectList; +			mInventory = new LLInventoryObject::object_list_t;  		}  		while(ifs.good())  		{ @@ -2666,8 +2696,8 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)  	LLInventoryObject* rv = NULL;  	if(mInventory)  	{ -		InventoryObjectList::iterator it = mInventory->begin(); -		InventoryObjectList::iterator end = mInventory->end(); +		LLInventoryObject::object_list_t::iterator it = mInventory->begin(); +		LLInventoryObject::object_list_t::iterator end = mInventory->end();  		for ( ; it != end; ++it)  		{  			if((*it)->getUUID() == item_id) @@ -2680,12 +2710,12 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)  	return rv;  } -void LLViewerObject::getInventoryContents(InventoryObjectList& objects) +void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)  {  	if(mInventory)  	{ -		InventoryObjectList::iterator it = mInventory->begin(); -		InventoryObjectList::iterator end = mInventory->end(); +		LLInventoryObject::object_list_t::iterator it = mInventory->begin(); +		LLInventoryObject::object_list_t::iterator end = mInventory->end();  		for( ; it != end; ++it)  		{  			if ((*it)->getType() != LLAssetType::AT_CATEGORY) @@ -2715,8 +2745,8 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass  	{  		LLViewerInventoryItem* item = NULL; -		InventoryObjectList::iterator it = mInventory->begin(); -		InventoryObjectList::iterator end = mInventory->end(); +		LLInventoryObject::object_list_t::iterator it = mInventory->begin(); +		LLInventoryObject::object_list_t::iterator end = mInventory->end();  		for( ; it != end; ++it)  		{  			LLInventoryObject* obj = *it; @@ -2754,7 +2784,7 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)  		return;  	} -	LLVector3 viewer_pos_agent = agent.getCameraPositionAgent(); +	LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent();  	LLVector3 pos_agent = getRenderPosition();  	F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX]; @@ -4026,7 +4056,8 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const  		avatar_parent = (LLViewerObject*)root_edit->getParent();  	} -	if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull()) +	if (avatar_parent && avatar_parent->isAvatar() && +		root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())  	{  		LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();  		position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); @@ -4077,8 +4108,8 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)  	S32 count = 0;  	if( mInventory )  	{ -		InventoryObjectList::const_iterator it = mInventory->begin(); -		InventoryObjectList::const_iterator end = mInventory->end(); +		LLInventoryObject::object_list_t::const_iterator it = mInventory->begin(); +		LLInventoryObject::object_list_t::const_iterator end = mInventory->end();  		for(  ; it != end ; ++it )  		{  			if( (*it)->getType() == type ) @@ -4714,7 +4745,7 @@ BOOL LLViewerObject::permYouOwner() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4751,7 +4782,7 @@ BOOL LLViewerObject::permOwnerModify() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  	{  			return TRUE; @@ -4775,7 +4806,7 @@ BOOL LLViewerObject::permModify() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  	{  			return TRUE; @@ -4799,7 +4830,7 @@ BOOL LLViewerObject::permCopy() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4823,7 +4854,7 @@ BOOL LLViewerObject::permMove() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4847,7 +4878,7 @@ BOOL LLViewerObject::permTransfer() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLViewerLogin::getInstance()->isInProductionGrid() +		if (!LLGridManager::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4915,7 +4946,11 @@ void LLViewerObject::setIncludeInSearch(bool include_in_search)  void LLViewerObject::setRegion(LLViewerRegion *regionp)  { -	llassert(regionp); +	if (!regionp) +	{ +		llwarns << "viewer object set region to NULL" << llendl; +	} +	  	mLatestRecvPacketID = 0;  	mRegionp = regionp; @@ -5192,3 +5227,28 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif  	return ;  } +const LLUUID &LLViewerObject::getAttachmentItemID() const +{ +	return mAttachmentItemID; +} + +void LLViewerObject::setAttachmentItemID(const LLUUID &id) +{ +	mAttachmentItemID = id; +} + +const LLUUID &LLViewerObject::extractAttachmentItemID() +{ +	LLUUID item_id = LLUUID::null; +	LLNameValue* item_id_nv = getNVPair("AttachItemID"); +	if( item_id_nv ) +	{ +		const char* s = item_id_nv->getString(); +		if( s ) +		{ +			item_id.set(s); +		} +	} +	setAttachmentItemID(item_id); +	return getAttachmentItemID(); +} | 
