diff options
Diffstat (limited to 'indra/newview')
218 files changed, 4936 insertions, 15855 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index dff2c04fbc..f85060a140 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -12,7 +12,7 @@ include(DragDrop)  include(EXPAT)  include(FMOD)  include(OPENAL) -include(FindOpenGL) +include(OpenGL)  include(Hunspell)  include(JsonCpp)  include(LLAudio) @@ -45,6 +45,7 @@ include(LLLogin)  include(VisualLeakDetector)  include(GLOD)  include(CMakeCopyIfDifferent) +include(LLAppearance)  if (NOT HAVOK_TPV)     # When using HAVOK_TPV, the library is precompiled, so no need for this @@ -66,7 +67,6 @@ include_directories(      ${LLINVENTORY_INCLUDE_DIRS}      ${LLMATH_INCLUDE_DIRS}      ${LLMESSAGE_INCLUDE_DIRS} -    ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}      ${LLPLUGIN_INCLUDE_DIRS}      ${LLPRIMITIVE_INCLUDE_DIRS}      ${LLRENDER_INCLUDE_DIRS} @@ -82,6 +82,13 @@ include_directories(      ${LIBS_PREBUILD_DIR}/include/hunspell      ${OPENAL_LIB_INCLUDE_DIRS}      ${LIBS_PREBUILT_DIR}/include/collada/1.4 +    ${LLAPPEARANCE_INCLUDE_DIRS} +    ) + +include_directories(SYSTEM +    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} +    ${LLXML_SYSTEM_INCLUDE_DIRS} +    ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}      )  set(viewer_SOURCE_FILES @@ -159,7 +166,6 @@ set(viewer_SOURCE_FILES      lldrawpooltree.cpp      lldrawpoolwater.cpp      lldrawpoolwlsky.cpp -    lldriverparam.cpp      lldynamictexture.cpp      llemote.cpp      llenvmanager.cpp @@ -320,7 +326,6 @@ set(viewer_SOURCE_FILES      lllistcontextmenu.cpp      lllistview.cpp      lllocalbitmaps.cpp -    lllocaltextureobject.cpp      lllocationhistory.cpp      lllocationinputctrl.cpp      lllogchat.cpp @@ -443,11 +448,10 @@ set(viewer_SOURCE_FILES      llpathfindingpathtool.cpp      llphysicsmotion.cpp      llphysicsshapebuilderutil.cpp +    llpipelinelistener.cpp      llplacesinventorybridge.cpp      llplacesinventorypanel.cpp      llpopupview.cpp -    llpolymesh.cpp -    llpolymorph.cpp      llpostcard.cpp      llpreview.cpp      llpreviewanim.cpp @@ -498,9 +502,6 @@ set(viewer_SOURCE_FILES      llsyswellwindow.cpp      llteleporthistory.cpp      llteleporthistorystorage.cpp -    lltexglobalcolor.cpp -    lltexlayer.cpp -    lltexlayerparams.cpp      lltextureatlas.cpp      lltextureatlasmanager.cpp      lltexturecache.cpp @@ -598,18 +599,18 @@ set(viewer_SOURCE_FILES      llviewershadermgr.cpp      llviewerstats.cpp      llviewerstatsrecorder.cpp +    llviewertexlayer.cpp      llviewertexteditor.cpp      llviewertexture.cpp      llviewertextureanim.cpp      llviewertexturelist.cpp      llviewerthrottle.cpp -    llviewervisualparam.cpp +    llviewerwearable.cpp      llviewerwindow.cpp      llviewerwindowlistener.cpp      llvlcomposition.cpp      llvlmanager.cpp      llvoavatar.cpp -    llvoavatardefines.cpp      llvoavatarself.cpp      llvocache.cpp      llvograss.cpp @@ -630,10 +631,8 @@ set(viewer_SOURCE_FILES      llwatchdog.cpp      llwaterparammanager.cpp      llwaterparamset.cpp -    llwearable.cpp      llwearableitemslist.cpp      llwearablelist.cpp -    llwearabletype.cpp      llweb.cpp      llwebprofile.cpp      llwebsharing.cpp @@ -736,7 +735,6 @@ set(viewer_HEADER_FILES      lldrawpooltree.h      lldrawpoolwater.h      lldrawpoolwlsky.h -    lldriverparam.h      lldynamictexture.h      llemote.h      llenvmanager.h @@ -897,7 +895,6 @@ set(viewer_HEADER_FILES      lllistcontextmenu.h      lllistview.h      lllocalbitmaps.h -    lllocaltextureobject.h      lllocationhistory.h      lllocationinputctrl.h      lllogchat.h @@ -1009,10 +1006,9 @@ set(viewer_HEADER_FILES      llpathfindingpathtool.h      llphysicsmotion.h      llphysicsshapebuilderutil.h +    llpipelinelistener.h      llplacesinventorybridge.h      llplacesinventorypanel.h -    llpolymesh.h -    llpolymorph.h      llpopupview.h      llpostcard.h      llpreview.h @@ -1066,9 +1062,6 @@ set(viewer_HEADER_FILES      lltable.h      llteleporthistory.h      llteleporthistorystorage.h -    lltexglobalcolor.h -    lltexlayer.h -    lltexlayerparams.h      lltextureatlas.h      lltextureatlasmanager.h      lltexturecache.h @@ -1167,18 +1160,18 @@ set(viewer_HEADER_FILES      llviewershadermgr.h      llviewerstats.h      llviewerstatsrecorder.h +    llviewertexlayer.h      llviewertexteditor.h      llviewertexture.h      llviewertextureanim.h      llviewertexturelist.h      llviewerthrottle.h -    llviewervisualparam.h +    llviewerwearable.h      llviewerwindow.h      llviewerwindowlistener.h      llvlcomposition.h      llvlmanager.h      llvoavatar.h -    llvoavatardefines.h      llvoavatarself.h      llvocache.h      llvograss.h @@ -1199,10 +1192,8 @@ set(viewer_HEADER_FILES      llwatchdog.h      llwaterparammanager.h      llwaterparamset.h -    llwearable.h      llwearableitemslist.h      llwearablelist.h -    llwearabletype.h      llweb.h      llwebprofile.h      llwebsharing.h @@ -1557,6 +1548,12 @@ add_executable(${VIEWER_BINARY_NAME}      ${viewer_SOURCE_FILES}      ) +if (SDL_FOUND) +  set_property(TARGET ${VIEWER_BINARY_NAME} +    PROPERTY COMPILE_DEFINITIONS LL_SDL=1 +    ) +endif (SDL_FOUND) +  # add package files  file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST       ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) @@ -1841,19 +1838,9 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLPHYSICS_LIBRARIES}      ${LLPHYSICSEXTENSIONS_LIBRARIES}      ${TCMALLOC_LIBRARIES} +    ${LLAPPEARANCE_LIBRARIES}      ) -if (USE_KDU) -    target_link_libraries(${VIEWER_BINARY_NAME} -        ${LLKDU_LIBRARIES} -        ${KDU_LIBRARY} -        ) -else (USE_KDU) -    target_link_libraries(${VIEWER_BINARY_NAME} -        ${LLIMAGEJ2COJ_LIBRARIES} -        ) -endif (USE_KDU) -  build_version(viewer)  set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 5c7cacedec..1802e14703 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@  CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.1.0.13828"; -CFBundleGetInfoString = "Second Life version 2.1.0.13828, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 3.4.1.264760"; +CFBundleGetInfoString = "Second Life version 3.4.1.264760, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index f7b11b217c..035d6cbe6c 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -60,7 +60,7 @@  		</dict>  	</array>  	<key>CFBundleVersion</key> -	<string>2.1.0.13828</string> +	<string>3.4.1.264760</string>  	<key>CSResourcesFileMapped</key>  	<true/>  </dict> diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index 64122bbb6c..64122bbb6c 100644..100755 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 199e4f459d..efb1ccc1cc 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -71,6 +71,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>AgentAppearanceServiceURL</key> +    <map> +      <key>Comment</key> +      <string>Current Session Agent Appearance Service URL</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map>      <key>AlertedUnsupportedHardware</key>      <map>        <key>Comment</key> @@ -1916,6 +1927,17 @@        <key>Value</key>        <string />      </map> +  <key>DebugAvatarAppearanceMessage</key> +  <map> +    <key>Comment</key> +    <string>Dump a bunch of XML files when handling appearance messages</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>  	<key>DebugAvatarRezTime</key>  	<map>  		<key>Comment</key> @@ -1938,6 +1960,17 @@      <key>Value</key>      <integer>1</integer>    </map> +  <key>DebugAvatarCompositeBaked</key> +  <map> +    <key>Comment</key> +    <string>Colorize avatar meshes based on baked/composite state.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>      <key>DebugBeaconLineWidth</key>      <map>        <key>Comment</key> @@ -8705,6 +8738,28 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>DisableAllRenderTypes</key> +    <map> +      <key>Comment</key> +      <string>Disables all rendering types.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>DisableAllRenderFeatures</key> +    <map> +      <key>Comment</key> +      <string>Disables all rendering features.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderHUDInSnapshot</key>      <map>        <key>Comment</key> @@ -13109,6 +13164,28 @@        <key>Value</key>        <integer>-1</integer>      </map> +    <key>MaxFPS</key> +    <map> +      <key>Comment</key> +      <string>Yield some time to the local host if we reach a threshold framerate.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>-1.0</integer> +    </map> +    <key>ForcePeriodicRenderingTime</key> +    <map> +      <key>Comment</key> +      <string>Periodically enable all rendering masks for a single frame.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>-1.0</integer> +    </map>      <key>ZoomDirect</key>      <map>        <key>Comment</key> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 99dbfcae51..2b090c4fa4 100644..100755 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -12291,6 +12291,17 @@ render_pass="bump">  	 <param_driver />      </param> +    <param +     id="11000" +     group="0" +     name="AppearanceMessage_Version" +     label="AppearanceMessage Version" +     value_default="0" +     value_min="0" +     value_max="255"> +	 <param_driver /> +    </param> +    </driver_parameters>    <morph_masks> diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 20936c6460..fa9ce703a8 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -117,18 +117,32 @@ export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}"  # Simply embedding $(<etc/gridargs.dat) into a command line treats each of  # Second, Life and Developer as separate args -- no good. We need bash to  # process quotes using eval. -# First read it without scanning, then scan that string. Break quoted words +# First, check if we have been instructed to skip reading in gridargs.dat: +skip_gridargs=false +argnum=0 +for ARG in "$@"; do +    if [ "--skip-gridargs" == "$ARG" ]; then +        skip_gridargs=true +    else +        ARGS[$argnum]="$ARG" +        argnum=$(($argnum+1)) +    fi +done + +# Second, read it without scanning, then scan that string. Break quoted words  # into a bash array. Note that if gridargs.dat is empty, or contains only  # whitespace, the resulting gridargs array will be empty -- zero entries --  # therefore "${gridargs[@]}" entirely vanishes from the command line below,  # just as we want. -eval gridargs=("$(<etc/gridargs.dat)") +if ! $skip_gridargs ; then +    eval gridargs=("$(<etc/gridargs.dat)") +fi  # Run the program.  # Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the  # command line. But DO quote "$@": preserve separate args as individually  # quoted. Similar remarks about the contents of gridargs. -$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "$@" +$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "${ARGS[@]}"  LL_RUN_ERR=$?  # Handle any resulting errors diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index b6fd7bc9c2..e15b4d071f 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -35,6 +35,7 @@  #include "llagentlistener.h"  #include "llagentwearables.h"  #include "llagentui.h" +#include "llappearancemgr.h"  #include "llanimationstates.h"  #include "llcallingcard.h"  #include "llcapabilitylistener.h" @@ -90,7 +91,7 @@  #include "llworldmap.h"  #include "stringize.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  extern LLMenuBarGL* gMenuBarView; @@ -807,6 +808,18 @@ void LLAgent::standUp()  } +void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) +{ +	llinfos << "called" << llendl; + +	if (isAgentAvatarValid() && +		!gAgentAvatarp->isUsingServerBakes() && +		(mRegionp->getCentralBakeVersion()>0)) +	{ +		LLAppearanceMgr::instance().requestServerAppearanceUpdate(); +	} +} +  //-----------------------------------------------------------------------------  // setRegion()  //----------------------------------------------------------------------------- @@ -902,6 +915,19 @@ void LLAgent::setRegion(LLViewerRegion *regionp)  	{  		LLEnvManagerNew::instance().onRegionCrossing();  	} + +	// If the newly entered region is using server bakes, and our +	// current appearance is non-baked, request appearance update from +	// server. +	if (mRegionp->capabilitiesReceived()) +	{ +		handleServerBakeRegionTransition(mRegionp->getRegionID()); +	} +	else +	{ +		// Need to handle via callback after caps arrive. +		mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); +	}  } @@ -1707,13 +1733,11 @@ void LLAgent::autoPilot(F32 *delta_yaw)  		*delta_yaw = yaw; -		// Compute when to start slowing down and when to stop -		F32 stop_distance = mAutoPilotStopDistance; +		// Compute when to start slowing down  		F32 slow_distance;  		if (getFlying())  		{  			slow_distance = llmax(6.f, mAutoPilotStopDistance + 5.f); -			stop_distance = llmax(2.f, mAutoPilotStopDistance);  		}  		else  		{ @@ -3626,7 +3650,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *  		return;  	} -	if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) +	if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance())  	{  		// ignore baked textures when in customize mode  		return; @@ -3650,7 +3674,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *  		if ((S32)texture_index < TEX_NUM_INDICES )  		{	 -			const LLVOAvatarDictionary::TextureEntry *texture_entry = LLVOAvatarDictionary::instance().getTexture((ETextureIndex)texture_index); +			const LLAvatarAppearanceDictionary::TextureEntry *texture_entry = LLAvatarAppearanceDictionary::instance().getTexture((ETextureIndex)texture_index);  			if (texture_entry)  			{  				EBakedTextureIndex baked_index = texture_entry->mBakedTextureIndex; @@ -4262,9 +4286,13 @@ void LLAgent::requestLeaveGodMode()  //-----------------------------------------------------------------------------  void LLAgent::sendAgentSetAppearance()  { -	if (!isAgentAvatarValid()) return; +	// FIXME DRANO - problems around new-style appearance in an old-style region. +	// - does this get called? +	// - need to change mUseServerBakes->FALSE in that case +	// - need to call processAvatarAppearance as if server had returned this result? +	// gAgentAvatarp->mUseServerBakes = FALSE; -	if (gAgentQueryManager.mNumPendingQueries > 0 && (isAgentAvatarValid() && gAgentAvatarp->isUsingBakedTextures()))  +	if (gAgentQueryManager.mNumPendingQueries > 0)   	{  		return;  	} @@ -4277,6 +4305,9 @@ void LLAgent::sendAgentSetAppearance()  	}  	gAgentAvatarp->sendAppearanceChangeMetrics(); + +	if (!isAgentAvatarValid() || (getRegion() && getRegion()->getCentralBakeVersion())) return; +  	LL_INFOS("Avatar") << gAgentAvatarp->avString() << "TAT: Sent AgentSetAppearance: " << gAgentAvatarp->getBakedStatusForPrintout() << LL_ENDL;  	//dumpAvatarTEs( "sendAgentSetAppearance()" ); @@ -4305,7 +4336,7 @@ void LLAgent::sendAgentSetAppearance()  	for(U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++ )  	{ -		const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); +		const ETextureIndex texture_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);  		// if we're not wearing a skirt, we don't need the texture to be baked  		if (texture_index == TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) @@ -4322,13 +4353,17 @@ void LLAgent::sendAgentSetAppearance()  	}  	// only update cache entries if we have all our baked textures + +	// FIXME DRANO need additional check for not in appearance editing +	// mode, if still using local composites need to set using local +	// composites to false, and update mesh textures.  	if (textures_current)  	{  		LL_INFOS("Avatar") << gAgentAvatarp->avString() << "TAT: Sending cached texture data" << LL_ENDL;  		for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  		{  			BOOL generate_valid_hash = TRUE; -			if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLVOAvatarDefines::EBakedTextureIndex)baked_index)) +			if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLAvatarAppearanceDefines::EBakedTextureIndex)baked_index))  			{  				generate_valid_hash = FALSE;  				LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "Not caching baked texture upload for " << (U32)baked_index << " due to being uploaded at low resolution." << LL_ENDL; @@ -4337,7 +4372,7 @@ void LLAgent::sendAgentSetAppearance()  			const LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index, generate_valid_hash);  			if (hash.notNull())  			{ -				ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index); +				ETextureIndex texture_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index);  				msg->nextBlockFast(_PREHASH_WearableData);  				msg->addUUIDFast(_PREHASH_CacheID, hash);  				msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 99904e118c..693c123851 100644..100755 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -33,7 +33,8 @@  #include "llagentdata.h" 			// gAgentID, gAgentSessionID  #include "llcharacter.h"  #include "llcoordframe.h"			// for mFrameAgent -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" +#include "llpermissionsflags.h"  #include <boost/function.hpp>  #include <boost/shared_ptr.hpp> @@ -609,6 +610,7 @@ private:  	void            handleTeleportFinished();  	void            handleTeleportFailed(); +	void			handleServerBakeRegionTransition(const LLUUID& region_id);  	//--------------------------------------------------------------------  	// Teleport State @@ -901,7 +903,7 @@ private:  	S32				mNumPendingQueries;  	S32				mWearablesCacheQueryID;  	U32				mUpdateSerialNum; -	S32		    	mActiveCacheQueries[LLVOAvatarDefines::BAKED_NUM_INDICES]; +	S32		    	mActiveCacheQueries[LLAvatarAppearanceDefines::BAKED_NUM_INDICES];  };  extern LLAgentQueryManager gAgentQueryManager; diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 751b73e1eb..f7b1ba44f0 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -49,7 +49,7 @@  #include "llwindow.h"  #include "llworld.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  extern LLMenuBarGL* gMenuBarView; @@ -593,7 +593,6 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance)  	abs_target_offset.abs();  	LLVector3 target_offset_dir = target_offset_origin; -	F32 object_radius = mFocusObject->getVObjRadius();  	BOOL target_outside_object_extents = FALSE; @@ -688,17 +687,6 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance)  	LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent()); -	// length projected orthogonal to target offset -	F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec(); - -	// calculate whether the target point would be "visible" if it were outside the bounding box -	// on the opposite of the splitting plane defined by object_split_axis; -	BOOL exterior_target_visible = FALSE; -	if (camera_offset_dist > object_radius) -	{ -		// target is visible from camera, so turn off fov zoom -		exterior_target_visible = TRUE; -	}  	F32 camera_offset_clip = camera_offset_object * object_split_axis;  	F32 target_offset_clip = target_offset_dir * object_split_axis; @@ -1078,8 +1066,8 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y)  	if (!isAgentAvatarValid()) return; -	LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot.getWorldRotation(); -	LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot.getWorldRotation(); +	LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot->getWorldRotation(); +	LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot->getWorldRotation();  	if 	((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) &&  		 (root_at * last_at_axis > 0.95f)) @@ -1432,7 +1420,7 @@ void LLAgentCamera::updateCamera()  			LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() +   			LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation();  		LLVector3 diff = mCameraPositionAgent - head_pos; -		diff = diff * ~gAgentAvatarp->mRoot.getWorldRotation(); +		diff = diff * ~gAgentAvatarp->mRoot->getWorldRotation();  		LLJoint* torso_joint = gAgentAvatarp->mTorsop;  		LLJoint* chest_joint = gAgentAvatarp->mChestp; @@ -1456,7 +1444,7 @@ void LLAgentCamera::updateCamera()  		gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff); -		gAgentAvatarp->mRoot.updateWorldMatrixChildren(); +		gAgentAvatarp->mRoot->updateWorldMatrixChildren();  		for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();   			 iter != gAgentAvatarp->mAttachmentPoints.end(); ) @@ -1657,7 +1645,6 @@ F32	LLAgentCamera::calcCameraFOVZoomFactor()  	else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar)  	{  		// don't FOV zoom on mostly transparent objects -		LLVector3 focus_offset = mFocusObjectOffset;  		F32 obj_min_dist = 0.f;  		calcCameraMinDistance(obj_min_dist);  		F32 current_distance = llmax(0.001f, camera_offset_dir.magVec()); @@ -1684,7 +1671,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)  	F32			camera_land_height;  	LLVector3d	frame_center_global = !isAgentAvatarValid() ?   		gAgent.getPositionGlobal() : -		gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); +		gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot->getWorldPosition());  	BOOL		isConstrained = FALSE;  	LLVector3d	head_offset; @@ -1819,7 +1806,6 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)  			// set the global camera position  			LLVector3d camera_offset; -			LLVector3 av_pos = !isAgentAvatarValid() ? LLVector3::zero : gAgentAvatarp->getRenderPosition();  			camera_offset.setVec( local_camera_offset );  			camera_position_global = frame_center_global + head_offset + camera_offset; @@ -2251,7 +2237,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)  //-----------------------------------------------------------------------------  void LLAgentCamera::changeCameraToCustomizeAvatar()  { -	if (LLViewerJoystick::getInstance()->getOverrideCamera()) +	if (LLViewerJoystick::getInstance()->getOverrideCamera() || !isAgentAvatarValid())  	{  		return;  	} @@ -2275,29 +2261,21 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()  		gFocusMgr.setKeyboardFocus( NULL );  		gFocusMgr.setMouseCapture( NULL ); -		LLVOAvatarSelf::onCustomizeStart(); +		// Remove any pitch or rotation from the avatar +		LLVector3 at = gAgent.getAtAxis(); +		at.mV[VZ] = 0.f; +		at.normalize(); +		gAgent.resetAxes(at); -		if (isAgentAvatarValid()) -		{ -			// Remove any pitch or rotation from the avatar -			LLVector3 at = gAgent.getAtAxis(); -			at.mV[VZ] = 0.f; -			at.normalize(); -			gAgent.resetAxes(at); +		gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); +		gAgent.setCustomAnim(TRUE); +		gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE); +		LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE); -			gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); -			gAgent.setCustomAnim(TRUE); -			gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE); -			LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE); - -			if (turn_motion) -			{ -				// delay camera animation long enough to play through turn animation -				setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP); -			} - -			gAgentAvatarp->invalidateAll(); -			gAgentAvatarp->updateMeshTextures(); +		if (turn_motion) +		{ +			// delay camera animation long enough to play through turn animation +			setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP);  		}  	} diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index e441f21f90..e2304e6db9 100644..100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -47,7 +47,7 @@  #include "lltooldraganddrop.h"  #include "llviewerregion.h"  #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h"  #include "llwearablelist.h"  #include <boost/scoped_ptr.hpp> @@ -56,7 +56,7 @@ LLAgentWearables gAgentWearables;  BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE; -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  /////////////////////////////////////////////////////////////////////////////// @@ -82,7 +82,7 @@ class LLWearAndEditCallback : public LLInventoryCallback  // wearable type stored in asset is some other value.  // Calling this function whenever a wearable is added to increase visibility if this problem  // turns up in other inventories. -void checkWearableAgainstInventory(LLWearable *wearable) +void checkWearableAgainstInventory(LLViewerWearable *wearable)  {  	if (wearable->getItemID().isNull())  		return; @@ -119,7 +119,7 @@ void LLAgentWearables::dump()  		llinfos << "Type: " << i << " count " << count << llendl;  		for (U32 j=0; j<count; j++)  		{ -			LLWearable* wearable = getWearable((LLWearableType::EType)i,j); +			LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)i,j);  			if (wearable == NULL)  			{  				llinfos << "    " << j << " NULL wearable" << llendl; @@ -159,6 +159,7 @@ struct LLAgentDumper  };  LLAgentWearables::LLAgentWearables() : +	LLWearableData(),  	mWearablesLoaded(FALSE)  ,	mCOFChangeInProgress(false)  { @@ -182,12 +183,11 @@ void LLAgentWearables::initClass()  }  void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar) -{  -	if (avatar) -	{ -		avatar->outputRezTiming("Sending wearables request"); -		sendAgentWearablesRequest(); -	} +{ +	llassert(avatar); +	avatar->outputRezTiming("Sending wearables request"); +	sendAgentWearablesRequest(); +	setAvatarAppearance(avatar);  }  // wearables @@ -213,7 +213,7 @@ LLAgentWearables::sendAgentWearablesUpdateCallback::~sendAgentWearablesUpdateCal   * @param todo Bitmask of actions to take on completion.   */  LLAgentWearables::addWearableToAgentInventoryCallback::addWearableToAgentInventoryCallback( -	LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLWearable* wearable, U32 todo) : +	LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLViewerWearable* wearable, U32 todo) :  	mType(type),  	mIndex(index),	  	mWearable(wearable), @@ -265,7 +265,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i  void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::EType type,  													   const U32 index,  													   const LLUUID& item_id, -													   LLWearable* wearable) +													   LLViewerWearable* wearable)  {  	llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl; @@ -312,7 +312,7 @@ void LLAgentWearables::sendAgentWearablesUpdate()  	{  		for (U32 index=0; index < getWearableCount((LLWearableType::EType)type); ++index)  		{ -			LLWearable* wearable = getWearable((LLWearableType::EType)type,index); +			LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)type,index);  			if (wearable)  			{  				if (wearable->getItemID().isNull()) @@ -354,7 +354,7 @@ void LLAgentWearables::sendAgentWearablesUpdate()  		U8 type_u8 = (U8)type;  		gMessageSystem->addU8Fast(_PREHASH_WearableType, type_u8); -		LLWearable* wearable = getWearable((LLWearableType::EType)type, 0); +		LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)type, 0);  		if (wearable)  		{  			//llinfos << "Sending wearable " << wearable->getName() << llendl; @@ -382,14 +382,14 @@ void LLAgentWearables::sendAgentWearablesUpdate()  void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update,  									const std::string new_name)  { -	LLWearable* old_wearable = getWearable(type, index); +	LLViewerWearable* old_wearable = getViewerWearable(type, index);  	if(!old_wearable) return;  	bool name_changed = !new_name.empty() && (new_name != old_wearable->getName());  	if (name_changed || old_wearable->isDirty() || old_wearable->isOldVersion())  	{  		LLUUID old_item_id = old_wearable->getItemID(); -		LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); -		new_wearable->setItemID(old_item_id); // should this be in LLWearable::copyDataFrom()? +		LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); +		new_wearable->setItemID(old_item_id); // should this be in LLViewerWearable::copyDataFrom()?  		setWearable(type,index,new_wearable);  		// old_wearable may still be referred to by other inventory items. Revert @@ -465,7 +465,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,  		llwarns << "LLAgent::saveWearableAs() not copyable." << llendl;  		return;  	} -	LLWearable* old_wearable = getWearable(type, index); +	LLViewerWearable* old_wearable = getViewerWearable(type, index);  	if (!old_wearable)  	{  		llwarns << "LLAgent::saveWearableAs() no old wearable." << llendl; @@ -480,7 +480,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,  	}  	std::string trunc_name(new_name);  	LLStringUtil::truncate(trunc_name, DB_INV_ITEM_NAME_STR_LEN); -	LLWearable* new_wearable = LLWearableList::instance().createCopy( +	LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(  		old_wearable,  		trunc_name);  	LLPointer<LLInventoryCallback> cb = @@ -518,7 +518,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,  void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index)  { -	LLWearable* wearable = getWearable(type, index); +	LLViewerWearable* wearable = getViewerWearable(type, index);  	llassert(wearable);  	if (wearable)  	{ @@ -553,13 +553,13 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string&  			LLUUID curr_item_id = getWearableItemID((LLWearableType::EType)i,j);  			if (curr_item_id == item_id)  			{ -				LLWearable* old_wearable = getWearable((LLWearableType::EType)i,j); +				LLViewerWearable* old_wearable = getViewerWearable((LLWearableType::EType)i,j);  				llassert(old_wearable);  				if (!old_wearable) continue;  				std::string old_name = old_wearable->getName();  				old_wearable->setName(new_name); -				LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); +				LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable);  				new_wearable->setItemID(item_id);  				LLInventoryItem* item = gInventory.getItem(item_id);  				if (item) @@ -640,14 +640,14 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::ETyp  	return item;  } -const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const +const LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const  {  	const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);  	for (S32 i=0; i < LLWearableType::WT_COUNT; i++)  	{  		for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)  		{ -			const LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); +			const LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j);  			if (curr_wearable && (curr_wearable->getItemID() == base_item_id))  			{  				return curr_wearable; @@ -657,14 +657,14 @@ const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)  	return NULL;  } -LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) +LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)  {  	const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);  	for (S32 i=0; i < LLWearableType::WT_COUNT; i++)  	{  		for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)  		{ -			LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); +			LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j);  			if (curr_wearable && (curr_wearable->getItemID() == base_item_id))  			{  				return curr_wearable; @@ -674,13 +674,13 @@ LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)  	return NULL;  } -LLWearable*	LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id)  +LLViewerWearable*	LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id)   {  	for (S32 i=0; i < LLWearableType::WT_COUNT; i++)  	{  		for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)  		{ -			LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); +			LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j);  			if (curr_wearable && (curr_wearable->getAssetID() == asset_id))  			{  				return curr_wearable; @@ -699,215 +699,55 @@ void LLAgentWearables::sendAgentWearablesRequest()  	gAgent.sendReliableMessage();  } -// static -BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type) -{ -	return (gAgentWearables.getWearableCount(type) > 0); -} - -LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) -{ -	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); -	if (wearable_iter == mWearableDatas.end()) -	{ -		return NULL; -	} -	wearableentry_vec_t& wearable_vec = wearable_iter->second; -	if (index>=wearable_vec.size()) -	{ -		return NULL; -	} -	else -	{ -		return wearable_vec[index]; -	} -} - -void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable) +LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/)  { - -	LLWearable *old_wearable = getWearable(type,index); -	if (!old_wearable) -	{ -		pushWearable(type,wearable); -		return; -	} -	 -	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); -	if (wearable_iter == mWearableDatas.end()) -	{ -		llwarns << "invalid type, type " << type << " index " << index << llendl;  -		return; -	} -	wearableentry_vec_t& wearable_vec = wearable_iter->second; -	if (index>=wearable_vec.size()) -	{ -		llwarns << "invalid index, type " << type << " index " << index << llendl;  -	} -	else -	{ -		wearable_vec[index] = wearable; -		old_wearable->setLabelUpdated(); -		wearableUpdated(wearable); -		checkWearableAgainstInventory(wearable); -	} +	return dynamic_cast<LLViewerWearable*> (getWearable(type, index));  } -U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable *wearable) +const LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) const  { -	if (wearable == NULL) -	{ -		// no null wearables please! -		llwarns << "Null wearable sent for type " << type << llendl; -		return MAX_CLOTHING_PER_TYPE; -	} -	if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE) -	{ -		mWearableDatas[type].push_back(wearable); -		wearableUpdated(wearable); -		checkWearableAgainstInventory(wearable); -		return mWearableDatas[type].size()-1; -	} -	return MAX_CLOTHING_PER_TYPE; +	return dynamic_cast<const LLViewerWearable*> (getWearable(type, index));  } -void LLAgentWearables::wearableUpdated(LLWearable *wearable) +// static +BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type)  { -	gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE); -	wearable->refreshName(); -	wearable->setLabelUpdated(); - -	wearable->pullCrossWearableValues(); - -	// Hack pt 2. If the wearable we just loaded has definition version 24, -	// then force a re-save of this wearable after slamming the version number to 22. -	// This number was incorrectly incremented for internal builds before release, and -	// this fix will ensure that the affected wearables are re-saved with the right version number. -	// the versions themselves are compatible. This code can be removed before release. -	if( wearable->getDefinitionVersion() == 24 ) -	{ -		wearable->setDefinitionVersion(22); -		U32 index = getWearableIndex(wearable); -		llinfos << "forcing werable type " << wearable->getType() << " to version 22 from 24" << llendl; -		saveWearable(wearable->getType(),index,TRUE); -	} - +	return (gAgentWearables.getWearableCount(type) > 0);  } -void LLAgentWearables::popWearable(LLWearable *wearable) +// virtual +void LLAgentWearables::wearableUpdated(LLWearable *wearable, BOOL removed)  { -	if (wearable == NULL) +	if (isAgentAvatarValid())  	{ -		// nothing to do here. move along. -		return; +		const BOOL upload_result = removed; +		gAgentAvatarp->wearableUpdated(wearable->getType(), upload_result);  	} -	U32 index = getWearableIndex(wearable); -	LLWearableType::EType type = wearable->getType(); +	LLWearableData::wearableUpdated(wearable, removed); -	if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type)) +	if (!removed)  	{ -		popWearable(type, index); -	} -} +		LLViewerWearable* viewer_wearable = dynamic_cast<LLViewerWearable*>(wearable); +		viewer_wearable->refreshName(); -void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index) -{ -	LLWearable *wearable = getWearable(type, index); -	if (wearable) -	{ -		mWearableDatas[type].erase(mWearableDatas[type].begin() + index); -		if (isAgentAvatarValid()) +		// Hack pt 2. If the wearable we just loaded has definition version 24, +		// then force a re-save of this wearable after slamming the version number to 22. +		// This number was incorrectly incremented for internal builds before release, and +		// this fix will ensure that the affected wearables are re-saved with the right version number. +		// the versions themselves are compatible. This code can be removed before release. +		if( wearable->getDefinitionVersion() == 24 )  		{ -		gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE); +			wearable->setDefinitionVersion(22); +			U32 index = getWearableIndex(wearable); +			llinfos << "forcing wearable type " << wearable->getType() << " to version 22 from 24" << llendl; +			saveWearable(wearable->getType(),index,TRUE);  		} -		wearable->setLabelUpdated(); -	} -} -U32	LLAgentWearables::getWearableIndex(const LLWearable *wearable) const -{ -	if (wearable == NULL) -	{ -		return MAX_CLOTHING_PER_TYPE; -	} - -	const LLWearableType::EType type = wearable->getType(); -	wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); -	if (wearable_iter == mWearableDatas.end()) -	{ -		llwarns << "tried to get wearable index with an invalid type!" << llendl; -		return MAX_CLOTHING_PER_TYPE; -	} -	const wearableentry_vec_t& wearable_vec = wearable_iter->second; -	for(U32 index = 0; index < wearable_vec.size(); index++) -	{ -		if (wearable_vec[index] == wearable) -		{ -			return index; -		} +		checkWearableAgainstInventory(viewer_wearable);  	} - -	return MAX_CLOTHING_PER_TYPE;  } -const LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) const -{ -	wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); -	if (wearable_iter == mWearableDatas.end()) -	{ -		return NULL; -	} -	const wearableentry_vec_t& wearable_vec = wearable_iter->second; -	if (index>=wearable_vec.size()) -	{ -		return NULL; -	} -	else -	{ -		return wearable_vec[index]; -	} -} - -LLWearable* LLAgentWearables::getTopWearable(const LLWearableType::EType type) -{ -	U32 count = getWearableCount(type); -	if ( count == 0) -	{ -		return NULL; -	} - -	return getWearable(type, count-1); -} - -LLWearable* LLAgentWearables::getBottomWearable(const LLWearableType::EType type) -{ -	if (getWearableCount(type) == 0) -	{ -		return NULL; -	} - -	return getWearable(type, 0); -} - -U32 LLAgentWearables::getWearableCount(const LLWearableType::EType type) const -{ -	wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); -	if (wearable_iter == mWearableDatas.end()) -	{ -		return 0; -	} -	const wearableentry_vec_t& wearable_vec = wearable_iter->second; -	return wearable_vec.size(); -} - -U32 LLAgentWearables::getWearableCount(const U32 tex_index) const -{ -	const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index); -	return getWearableCount(wearable_type); -} - -  BOOL LLAgentWearables::itemUpdatePending(const LLUUID& item_id) const  {  	return mItemsAwaitingWearableUpdate.find(item_id) != mItemsAwaitingWearableUpdate.end(); @@ -920,7 +760,7 @@ U32 LLAgentWearables::itemUpdatePendingCount() const  const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32 index) const  { -	const LLWearable *wearable = getWearable(type,index); +	const LLViewerWearable *wearable = getViewerWearable(type,index);  	if (wearable)  		return wearable->getItemID();  	else @@ -929,7 +769,7 @@ const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32  const LLUUID LLAgentWearables::getWearableAssetID(LLWearableType::EType type, U32 index) const  { -	const LLWearable *wearable = getWearable(type,index); +	const LLViewerWearable *wearable = getViewerWearable(type,index);  	if (wearable)  		return wearable->getAssetID();  	else @@ -1012,7 +852,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  			gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_AssetID, asset_id, i);  			if (asset_id.isNull())  			{ -				LLWearable::removeFromAvatar(type, FALSE); +				LLViewerWearable::removeFromAvatar(type, FALSE);  			}  			else  			{ @@ -1058,7 +898,7 @@ void LLAgentWearables::recoverMissingWearable(const LLWearableType::EType type,  	// Try to recover by replacing missing wearable with a new one.  	LLNotificationsUtil::add("ReplacedMissingWearable");  	lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) << " could not be downloaded.  Replaced inventory item with default wearable." << llendl; -	LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type); +	LLViewerWearable* new_wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);  	setWearable(type,index,new_wearable);  	//new_wearable->writeToAvatar(TRUE); @@ -1093,9 +933,9 @@ void LLAgentWearables::recoverMissingWearableDone()  	}  } -void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index) +void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLAvatarAppearanceDefines::ETextureIndex texture_type, U32 wearable_index)  { -	LLWearable* wearable = getWearable((LLWearableType::EType)wearable_type, wearable_index); +	LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)wearable_type, wearable_index);  	if (!wearable)  	{  		llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl; @@ -1128,7 +968,7 @@ public:  												mItemsToLink,  												link_waiter);  	} -	void addPendingWearable(LLWearable *wearable) +	void addPendingWearable(LLViewerWearable *wearable)  	{  		if (!wearable)  		{ @@ -1163,7 +1003,7 @@ public:  			LLWearableType::EType type = item->getWearableType();  			if (type < LLWearableType::WT_COUNT)  			{ -				LLWearable *wearable = mWearablesAwaitingItems[type]; +				LLViewerWearable *wearable = mWearablesAwaitingItems[type];  				if (wearable)  					wearable->setItemID(inv_item);  			} @@ -1176,7 +1016,7 @@ public:  private:  	LLInventoryModel::item_array_t mItemsToLink; -	std::vector<LLWearable*> mWearablesAwaitingItems; +	std::vector<LLViewerWearable*> mWearablesAwaitingItems;  };  void LLAgentWearables::createStandardWearables() @@ -1208,7 +1048,7 @@ void LLAgentWearables::createStandardWearables()  		if (create[i])  		{  			llassert(getWearableCount((LLWearableType::EType)i) == 0); -			LLWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i); +			LLViewerWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i, gAgentAvatarp);  			((OnWearableItemCreatedCB*)(&(*cb)))->addPendingWearable(wearable);  			// no need to update here...  			LLUUID category_id = LLUUID::null; @@ -1267,7 +1107,7 @@ void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)  void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb, -												   LLWearable* wearable, +												   LLViewerWearable* wearable,  												   const LLUUID& category_id,  												   BOOL notify)  { @@ -1305,7 +1145,7 @@ void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_  	}  	else  	{ -		LLWearable* old_wearable = getWearable(type,index); +		LLViewerWearable* old_wearable = getViewerWearable(type,index);  		if (old_wearable)  		{ @@ -1360,10 +1200,10 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo  	//LLAgentDumper dumper("removeWearable");  	if (do_remove_all)  	{ -		S32 max_entry = mWearableDatas[type].size()-1; +		S32 max_entry = getWearableCount(type)-1;  		for (S32 i=max_entry; i>=0; i--)  		{ -			LLWearable* old_wearable = getWearable(type,i); +			LLViewerWearable* old_wearable = getViewerWearable(type,i);  			//queryWearableCache(); // moved below  			if (old_wearable)  			{ @@ -1371,11 +1211,11 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo  				old_wearable->removeFromAvatar(TRUE);  			}  		} -		mWearableDatas[type].clear(); +		clearWearableType(type);  	}  	else  	{ -		LLWearable* old_wearable = getWearable(type, index); +		LLViewerWearable* old_wearable = getViewerWearable(type, index);  		//queryWearableCache(); // moved below  		if (old_wearable) @@ -1394,7 +1234,7 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo  // Assumes existing wearables are not dirty.  void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& items, -										 const LLDynamicArray< LLWearable* >& wearables, +										 const LLDynamicArray< LLViewerWearable* >& wearables,  										 BOOL remove)  {  	llinfos << "setWearableOutfit() start" << llendl; @@ -1419,7 +1259,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  	S32 i;  	for (i = 0; i < count; i++)  	{ -		LLWearable* new_wearable = wearables[i]; +		LLViewerWearable* new_wearable = wearables[i];  		LLPointer<LLInventoryItem> new_item = items[i];  		llassert(new_wearable); @@ -1439,8 +1279,8 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  			{  				pushWearable(type,new_wearable);  			} -			wearableUpdated(new_wearable); -			checkWearableAgainstInventory(new_wearable); +			const BOOL removed = FALSE; +			wearableUpdated(new_wearable, removed);  		}  	} @@ -1476,7 +1316,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  // User has picked "wear on avatar" from a menu. -void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append) +void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append)  {  	//LLAgentDumper dumper("setWearableItem");  	if (isWearingItem(new_item->getUUID())) @@ -1491,7 +1331,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne  	{  		// Remove old wearable, if any  		// MULTI_WEARABLE: hardwired to 0 -		LLWearable* old_wearable = getWearable(type,0); +		LLViewerWearable* old_wearable = getViewerWearable(type,0);  		if (old_wearable)  		{  			const LLUUID& old_item_id = old_wearable->getItemID(); @@ -1517,7 +1357,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne  }  // static  -bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable) +bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLViewerWearable* wearable)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); @@ -1553,16 +1393,17 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD&  // Called from setWearableItem() and onSetWearableDialog() to actually set the wearable.  // MULTI_WEARABLE: unify code after null objects are gone. -void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append) +void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append)  {  	const LLWearableType::EType type = new_wearable->getType();  	if (do_append && getWearableItemID(type,0).notNull())  	{  		new_wearable->setItemID(new_item->getUUID()); -		mWearableDatas[type].push_back(new_wearable); +		const bool trigger_updated = false; +		pushWearable(type, new_wearable, trigger_updated);  		llinfos << "Added additional wearable for type " << type -				<< " size is now " << mWearableDatas[type].size() << llendl; +				<< " size is now " << getWearableCount(type) << llendl;  		checkWearableAgainstInventory(new_wearable);  	}  	else @@ -1570,7 +1411,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n  		// Replace the old wearable with a new one.  		llassert(new_item->getAssetUUID() == new_wearable->getAssetID()); -		LLWearable *old_wearable = getWearable(type,0); +		LLViewerWearable *old_wearable = getViewerWearable(type,0);  		LLUUID old_item_id;  		if (old_wearable)  		{ @@ -1585,7 +1426,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n  			gInventory.notifyObservers();  		}  		llinfos << "Replaced current element 0 for type " << type -				<< " size is now " << mWearableDatas[type].size() << llendl; +				<< " size is now " << getWearableCount(type) << llendl;  	}  	//llinfos << "LLVOAvatar::setWearableItem()" << llendl; @@ -1597,7 +1438,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n  void LLAgentWearables::queryWearableCache()  { -	if (!areWearablesLoaded()) +	if (!areWearablesLoaded() || (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()))  	{  		return;  	} @@ -1626,7 +1467,7 @@ void LLAgentWearables::queryWearableCache()  			num_queries++;  			// *NOTE: make sure at least one request gets packed -			ETextureIndex te_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); +			ETextureIndex te_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);  			//llinfos << "Requesting texture for hash " << hash << " in baked texture slot " << baked_index << llendl;  			gMessageSystem->nextBlockFast(_PREHASH_WearableData); @@ -1652,46 +1493,14 @@ void LLAgentWearables::queryWearableCache()  	}  } -LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, -												 BOOL generate_valid_hash) // Set to false if you want to upload the baked texture w/o putting it in the cache +// virtual +void LLAgentWearables::invalidateBakedTextureHash(LLMD5& hash) const  { -	LLUUID hash_id; -	bool hash_computed = false; -	LLMD5 hash; -	const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); - -	for (U8 i=0; i < baked_dict->mWearables.size(); i++) +	// Add some garbage into the hash so that it becomes invalid. +	if (isAgentAvatarValid())  	{ -		const LLWearableType::EType baked_type = baked_dict->mWearables[i]; -		const U32 num_wearables = getWearableCount(baked_type); -		for (U32 index = 0; index < num_wearables; ++index) -		{ -			const LLWearable* wearable = getWearable(baked_type,index); -			if (wearable) -			{ -				LLUUID asset_id = wearable->getAssetID(); -				hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); -				hash_computed = true; -			} -		} +		hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES);  	} -	if (hash_computed) -	{ -		hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES); - -		// Add some garbage into the hash so that it becomes invalid. -		if (!generate_valid_hash) -		{ -			if (isAgentAvatarValid()) -			{ -				hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES); -			} -		} -		hash.finalize(); -		hash.raw_digest(hash_id.mData); -	} - -	return hash_id;  }  // User has picked "remove from avatar" from a menu. @@ -1715,7 +1524,7 @@ void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &ty  	}  } -// Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to +// Combines userRemoveMulipleAttachments() and userAttachMultipleAttachments() logic to  // get attachments into desired state with minimal number of adds/removes.  void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array)  { @@ -1811,31 +1620,6 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo  	gMessageSystem->sendReliable(gAgent.getRegionHost());  } -void LLAgentWearables::userRemoveAllAttachments() -{ -	if (!isAgentAvatarValid()) return; - -	llvo_vec_t objects_to_remove; -	 -	for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();  -		 iter != gAgentAvatarp->mAttachmentPoints.end();) -	{ -		LLVOAvatar::attachment_map_t::iterator curiter = iter++; -		LLViewerJointAttachment* attachment = curiter->second; -		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -			 attachment_iter != attachment->mAttachedObjects.end(); -			 ++attachment_iter) -		{ -			LLViewerObject *attached_object = (*attachment_iter); -			if (attached_object) -			{ -				objects_to_remove.push_back(attached_object); -			} -		} -	} -	userRemoveMultipleAttachments(objects_to_remove); -} -  void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array)  {  	// Build a compound message to send all the objects that need to be rezzed. @@ -1900,7 +1684,7 @@ void LLAgentWearables::checkWearablesLoaded() const  // Returns false if the given wearable is already topmost/bottommost  // (depending on closer_to_body parameter). -bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body) +bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body) const  {  	const LLWearable* wearable = getWearableFromItemID(item_id);  	if (!wearable) return false; @@ -1928,7 +1712,7 @@ void LLAgentWearables::updateWearablesLoaded()  	}  } -bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const +bool LLAgentWearables::canWearableBeRemoved(const LLViewerWearable* wearable) const  {  	if (!wearable) return false; @@ -1943,7 +1727,7 @@ void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)  	{  		for (S32 count = 0; count < (S32)getWearableCount((LLWearableType::EType)type); ++count)  		{ -			LLWearable *wearable = getWearable((LLWearableType::EType)type,count); +			LLViewerWearable *wearable = getViewerWearable((LLWearableType::EType)type,count);  			llassert(wearable);  			if (wearable)  			{ @@ -1958,28 +1742,39 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos  	if (!item) return false;  	if (!item->isWearableType()) return false; -	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType()); -	if (wearable_iter == mWearableDatas.end()) return false; - -	wearableentry_vec_t& wearable_vec = wearable_iter->second; -	if (wearable_vec.empty()) return false; +	LLWearableType::EType type = item->getWearableType(); +	U32 wearable_count = getWearableCount(type); +	if (0 == wearable_count) return false;  	const LLUUID& asset_id = item->getAssetUUID();  	//nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body) -	if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false; -	if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false; +	if (closer_to_body) +	{ +		LLViewerWearable* bottom_wearable = dynamic_cast<LLViewerWearable*>( getBottomWearable(type) ); +		if (bottom_wearable->getAssetID() == asset_id) +		{ +			return false; +		} +	} +	else // !closer_to_body +	{ +		LLViewerWearable* top_wearable = dynamic_cast<LLViewerWearable*>( getTopWearable(type) ); +		if (top_wearable->getAssetID() == asset_id) +		{ +			return false; +		} +	} -	for (U32 i = 0; i < wearable_vec.size(); ++i) +	for (U32 i = 0; i < wearable_count; ++i)  	{ -		LLWearable* wearable = wearable_vec[i]; +		LLViewerWearable* wearable = getViewerWearable(type, i);  		if (!wearable) continue;  		if (wearable->getAssetID() != asset_id) continue;  		//swapping wearables  		U32 swap_i = closer_to_body ? i-1 : i+1; -		wearable_vec[i] = wearable_vec[swap_i]; -		wearable_vec[swap_i] = wearable; +		swapWearables(type, i, swap_i);  		return true;  	} @@ -1991,7 +1786,7 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con  {  	if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return; -	LLWearable* wearable = LLWearableList::instance().createNewWearable(type); +	LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);  	LLAssetType::EType asset_type = wearable->getAssetType();  	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;  	LLPointer<LLInventoryCallback> cb = wear ? new LLWearAndEditCallback : NULL; @@ -2024,7 +1819,7 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)  		return;  	} -	LLWearable* wearable = gAgentWearables.getWearableFromItemID(item_id); +	LLViewerWearable* wearable = gAgentWearables.getWearableFromItemID(item_id);  	if (!wearable)  	{  		llwarns << "Cannot get wearable" << llendl; diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 5932be21c6..a60fbc969b 100644..100755 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -36,16 +36,16 @@  // newview  #include "llinventorymodel.h"  #include "llviewerinventory.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" +#include "llwearabledata.h"  class LLInventoryItem;  class LLVOAvatarSelf; -class LLWearable; +class LLViewerWearable;  class LLInitialWearablesFetch;  class LLViewerObject; -class LLTexLayerTemplate; -class LLAgentWearables : public LLInitClass<LLAgentWearables> +class LLAgentWearables : public LLInitClass<LLAgentWearables>, public LLWearableData  {  	//--------------------------------------------------------------------  	// Constructors / destructors / Initializers @@ -79,10 +79,10 @@ public:  	bool			isCOFChangeInProgress() const { return mCOFChangeInProgress; }  	void			updateWearablesLoaded();  	void			checkWearablesLoaded() const; -	bool			canMoveWearable(const LLUUID& item_id, bool closer_to_body); +	bool			canMoveWearable(const LLUUID& item_id, bool closer_to_body) const;  	// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1. -	bool			canWearableBeRemoved(const LLWearable* wearable) const; +	bool			canWearableBeRemoved(const LLViewerWearable* wearable) const;  	void			animateAllWearableParams(F32 delta, BOOL upload_bake); @@ -92,52 +92,38 @@ public:  public:  	const LLUUID		getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const;  	const LLUUID		getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const; -	const LLWearable*	getWearableFromItemID(const LLUUID& item_id) const; -	LLWearable*	getWearableFromItemID(const LLUUID& item_id); -	LLWearable*	getWearableFromAssetID(const LLUUID& asset_id); +	const LLViewerWearable*	getWearableFromItemID(const LLUUID& item_id) const; +	LLViewerWearable*	getWearableFromItemID(const LLUUID& item_id); +	LLViewerWearable*	getWearableFromAssetID(const LLUUID& asset_id); +	LLViewerWearable*		getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/);  +	const LLViewerWearable*	getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) const;  	LLInventoryItem*	getWearableInventoryItem(LLWearableType::EType type, U32 index /*= 0*/);  	static BOOL			selfHasWearable(LLWearableType::EType type); -	LLWearable*			getWearable(const LLWearableType::EType type, U32 index /*= 0*/);  -	const LLWearable* 	getWearable(const LLWearableType::EType type, U32 index /*= 0*/) const; -	LLWearable*		getTopWearable(const LLWearableType::EType type); -	LLWearable*		getBottomWearable(const LLWearableType::EType type); -	U32				getWearableCount(const LLWearableType::EType type) const; -	U32				getWearableCount(const U32 tex_index) const; - -	static const U32 MAX_CLOTHING_PER_TYPE = 5;  -  	//--------------------------------------------------------------------  	// Setters  	//-------------------------------------------------------------------- -  private: -	// Low-level data structure setter - public access is via setWearableItem, etc. -	void 			setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable); -	U32 			pushWearable(const LLWearableType::EType type, LLWearable *wearable); -	void			wearableUpdated(LLWearable *wearable); -	void 			popWearable(LLWearable *wearable); -	void			popWearable(const LLWearableType::EType type, U32 index); -	 +	/*virtual*/void	wearableUpdated(LLWearable *wearable, BOOL removed);  public: -	void			setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false); -	void			setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove); +	void			setWearableItem(LLInventoryItem* new_item, LLViewerWearable* wearable, bool do_append = false); +	void			setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLViewerWearable* >& wearables, BOOL remove);  	void			setWearableName(const LLUUID& item_id, const std::string& new_name); -	void			addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index); -	U32				getWearableIndex(const LLWearable *wearable) const; +	// *TODO: Move this into llappearance/LLWearableData ? +	void			addLocalTextureObject(const LLWearableType::EType wearable_type, const LLAvatarAppearanceDefines::ETextureIndex texture_type, U32 wearable_index);  protected: -	void			setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false); -	static bool		onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable); +	void			setWearableFinal(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append = false); +	static bool		onSetWearableDialog(const LLSD& notification, const LLSD& response, LLViewerWearable* wearable);  	void			addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb, -												LLWearable* wearable,  +												LLViewerWearable* wearable,   												const LLUUID& category_id = LLUUID::null,  												BOOL notify = TRUE);  	void 			addWearabletoAgentInventoryDone(const LLWearableType::EType type,  													const U32 index,  													const LLUUID& item_id, -													LLWearable* wearable); +													LLViewerWearable* wearable);  	void			recoverMissingWearable(const LLWearableType::EType type, U32 index /*= 0*/);  	void			recoverMissingWearableDone(); @@ -172,15 +158,14 @@ protected:  public:  	// Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant)  	static void		processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data); -	LLUUID			computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, -											BOOL generate_valid_hash = TRUE);  protected: +	/*virtual*/ void	invalidateBakedTextureHash(LLMD5& hash) const;  	void			sendAgentWearablesUpdate();  	void			sendAgentWearablesRequest();  	void			queryWearableCache();  	void 			updateServer(); -	static void		onInitialWearableAssetArrived(LLWearable* wearable, void* userdata); +	static void		onInitialWearableAssetArrived(LLViewerWearable* wearable, void* userdata);  	//--------------------------------------------------------------------  	// Outfits @@ -215,7 +200,6 @@ public:  	static void 	userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);  	static void		userRemoveMultipleAttachments(llvo_vec_t& llvo_array); -	static void		userRemoveAllAttachments();  	static void		userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array);  	BOOL			itemUpdatePending(const LLUUID& item_id) const; @@ -245,10 +229,6 @@ private:  	// Member variables  	//--------------------------------------------------------------------  private: -	typedef std::vector<LLWearable*> wearableentry_vec_t; // all wearables of a certain type (EG all shirts) -	typedef std::map<LLWearableType::EType, wearableentry_vec_t> wearableentry_map_t;	// wearable "categories" arranged by wearable type -	wearableentry_map_t mWearableDatas; -  	static BOOL		mInitialWearablesUpdateReceived;  	BOOL			mWearablesLoaded;  	std::set<LLUUID>	mItemsAwaitingWearableUpdate; @@ -289,13 +269,13 @@ private:  		addWearableToAgentInventoryCallback(LLPointer<LLRefCount> cb,  											LLWearableType::EType type,  											U32 index, -											LLWearable* wearable, +											LLViewerWearable* wearable,  											U32 todo = CALL_NONE);  		virtual void fire(const LLUUID& inv_item);  	private:  		LLWearableType::EType mType;  		U32 mIndex; -		LLWearable* mWearable; +		LLViewerWearable* mWearable;  		U32 mTodo;  		LLPointer<LLRefCount> mCB;  	}; diff --git a/indra/newview/llappearance.h b/indra/newview/llappearance.h index a28b77b1fc..05dfac4e42 100644 --- a/indra/newview/llappearance.h +++ b/indra/newview/llappearance.h @@ -38,14 +38,14 @@ public:  	void	addParam( S32 id, F32 value )				{ mParamMap[id] = value; }  	F32		getParam( S32 id, F32 defval )				{ return get_if_there(mParamMap, id, defval ); } -	void	addTexture( S32 te, const LLUUID& uuid )	{ if( te < LLVOAvatarDefines::TEX_NUM_INDICES ) mTextures[te] = uuid; } -	const LLUUID& getTexture( S32 te )					{ return ( te < LLVOAvatarDefines::TEX_NUM_INDICES ) ? mTextures[te] : LLUUID::null; } +	void	addTexture( S32 te, const LLUUID& uuid )	{ if( te < LLAvatarAppearanceDefines::TEX_NUM_INDICES ) mTextures[te] = uuid; } +	const LLUUID& getTexture( S32 te )					{ return ( te < LLAvatarAppearanceDefines::TEX_NUM_INDICES ) ? mTextures[te] : LLUUID::null; } -	void	clear()										{ mParamMap.clear(); for( S32 i=0; i<LLVOAvatarDefines::TEX_NUM_INDICES; i++ ) mTextures[i].setNull(); } +	void	clear()										{ mParamMap.clear(); for( S32 i=0; i<LLAvatarAppearanceDefines::TEX_NUM_INDICES; i++ ) mTextures[i].setNull(); }  	typedef std::map<S32, F32> param_map_t;  	param_map_t mParamMap; -	LLUUID	mTextures[LLVOAvatarDefines::TEX_NUM_INDICES]; +	LLUUID	mTextures[LLAvatarAppearanceDefines::TEX_NUM_INDICES];  };  #endif  // LL_LLAPPEARANCE_H diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 06a9892c7e..79106318a4 100644..100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -155,6 +155,121 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string  	}  } +// Shim between inventory callback and boost function +typedef boost::function<void(const LLUUID&)> inventory_func_type; + +class LLBoostFuncInventoryCallback: public LLInventoryCallback +{ +public: + +	LLBoostFuncInventoryCallback(const inventory_func_type& func): +		mFunc(func) +	{ +	} + +	void fire(const LLUUID& item_id) +	{ +		mFunc(item_id); +	} + +private: +	inventory_func_type mFunc; +}; + +LLPointer<LLInventoryCallback> make_inventory_func_callback(const inventory_func_type& func) +{ +	return new LLBoostFuncInventoryCallback(func);  +} + +void report_fire(const LLUUID& item_id) +{ +	llinfos << item_id << llendl; +} + +class LLInventoryCopyMgr: public LLEventTimer  +{ +public: +	LLInventoryCopyMgr(LLInventoryModel::item_array_t& src_items, const LLUUID& dst_cat_id, +					   bool append, const std::string& phase): +		mDstCatID(dst_cat_id), +		mAppend(append), +		mTrackingPhase(phase), +		LLEventTimer(5.0) +	{ +		for (LLInventoryModel::item_array_t::const_iterator it = src_items.begin(); +			 it != src_items.end(); +			 ++it) +		{ +			LLViewerInventoryItem* item = *it; +			mSrcTimes[item->getUUID()] = LLTimer(); +			requestCopy(item->getUUID()); +		} +		if (!mTrackingPhase.empty()) +		{ +			selfStartPhase(mTrackingPhase); +		} +	} + +	void requestCopy(const LLUUID& item_id) +	{ +		LLViewerInventoryItem *item = gInventory.getItem(item_id); +		if (!item) +		{ +			llwarns << "requestCopy item not found " << item_id << llendl; +			return; +		} +		copy_inventory_item( +			gAgent.getID(), +			item->getPermissions().getOwner(), +			item->getUUID(), +			mDstCatID, +			std::string(), +			make_inventory_func_callback(boost::bind(&LLInventoryCopyMgr::onCopy,this,item->getUUID(),_1)) +			); +	} +				 +	void onCopy(const LLUUID& src_id, const LLUUID& dst_id) +	{ +		LL_DEBUGS("Avatar") << "copied, src_id " << src_id << " to dst_id " << dst_id << " after " << mSrcTimes[src_id].getElapsedTimeF32() << " seconds" << llendl; +		mSrcTimes.erase(src_id); +		if (mSrcTimes.empty()) +		{ +			onCompletion(); +		} +	} + +	void onCompletion() +	{ +		llinfos << "done" << llendl; +		if (!mTrackingPhase.empty()) +		{ +			selfStopPhase(mTrackingPhase); +		} +		LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mDstCatID), mAppend); +	} +	 +	// virtual +	// Will be deleted after returning true - only safe to do this if all callbacks have fired. +	BOOL tick() +	{ +		bool all_done = mSrcTimes.empty(); + +		if (!all_done) +		{ +			llwarns << "possible hang in copy, waiting on " << mSrcTimes.size() << " items" << llendl; +			// TODO possibly add retry logic here. + +		} +		return all_done; +	} + +private: +	std::string mTrackingPhase; +	std::map<LLUUID,LLTimer> mSrcTimes; +	LLUUID mDstCatID; +	bool mAppend; +}; +  class LLWearInventoryCategoryCallback : public LLInventoryCallback  {  public: @@ -278,7 +393,7 @@ struct LLFoundData  	std::string mName;  	LLAssetType::EType mAssetType;  	LLWearableType::EType mWearableType; -	LLWearable* mWearable; +	LLViewerWearable* mWearable;  	bool mIsReplacement;  }; @@ -302,7 +417,7 @@ public:  	void recoverMissingWearable(LLWearableType::EType type);  	void clearCOFLinksForMissingWearables(); -	void onWearableAssetFetch(LLWearable *wearable); +	void onWearableAssetFetch(LLViewerWearable *wearable);  	void onAllComplete();  	typedef std::list<LLFoundData> found_list_t; @@ -328,7 +443,7 @@ private:  	typedef std::set<LLWearableHoldingPattern*> type_set_hp;  	static type_set_hp sActiveHoldingPatterns;  	bool mIsMostRecent; -	std::set<LLWearable*> mLateArrivals; +	std::set<LLViewerWearable*> mLateArrivals;  	bool mIsAllComplete;  }; @@ -562,7 +677,7 @@ bool LLWearableHoldingPattern::pollFetchCompletion()  class RecoveredItemLinkCB: public LLInventoryCallback  {  public: -	RecoveredItemLinkCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): +	RecoveredItemLinkCB(LLWearableType::EType type, LLViewerWearable *wearable, LLWearableHoldingPattern* holder):  		mHolder(holder),  		mWearable(wearable),  		mType(type) @@ -610,14 +725,14 @@ public:  	}  private:  	LLWearableHoldingPattern* mHolder; -	LLWearable *mWearable; +	LLViewerWearable *mWearable;  	LLWearableType::EType mType;  };  class RecoveredItemCB: public LLInventoryCallback  {  public: -	RecoveredItemCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): +	RecoveredItemCB(LLWearableType::EType type, LLViewerWearable *wearable, LLWearableHoldingPattern* holder):  		mHolder(holder),  		mWearable(wearable),  		mType(type) @@ -650,7 +765,7 @@ public:  	}  private:  	LLWearableHoldingPattern* mHolder; -	LLWearable *mWearable; +	LLViewerWearable *mWearable;  	LLWearableType::EType mType;  }; @@ -666,7 +781,7 @@ void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type  	LLNotificationsUtil::add("ReplacedMissingWearable");  	lldebugs << "Wearable " << LLWearableType::getTypeLabel(type)  			 << " could not be downloaded.  Replaced inventory item with default wearable." << llendl; -	LLWearable* wearable = LLWearableList::instance().createNewWearable(type); +	LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);  	// Add a new one in the lost and found folder.  	const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); @@ -699,7 +814,7 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()  		{  			// Wearable link that was never resolved; remove links to it from COF  			LL_INFOS("Avatar") << self_av_string() << "removing link for unresolved item " << data.mItemID.asString() << LL_ENDL; -			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); +			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID);  		}  	}  } @@ -773,11 +888,11 @@ void LLWearableHoldingPattern::handleLateArrivals()  		 iter != getFoundList().end(); ++iter)  	{  		LLFoundData& data = *iter; -		for (std::set<LLWearable*>::iterator wear_it = mLateArrivals.begin(); +		for (std::set<LLViewerWearable*>::iterator wear_it = mLateArrivals.begin();  			 wear_it != mLateArrivals.end();  			 ++wear_it)  		{ -			LLWearable *wearable = *wear_it; +			LLViewerWearable *wearable = *wear_it;  			if(wearable->getAssetID() == data.mAssetID)  			{ @@ -813,7 +928,7 @@ void LLWearableHoldingPattern::handleLateArrivals()  		if (data.mWearable && data.mIsReplacement &&  			replaced_types.find(data.mWearableType) != replaced_types.end())  		{ -			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); +			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID);  			std::list<LLFoundData>::iterator clobber_ator = iter;  			++iter;  			getFoundList().erase(clobber_ator); @@ -837,7 +952,7 @@ void LLWearableHoldingPattern::resetTime(F32 timeout)  	mWaitTime.setTimerExpirySec(timeout);  } -void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable) +void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)  {  	if (!isMostRecent())  	{ @@ -888,7 +1003,7 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)  	}  } -static void onWearableAssetFetch(LLWearable* wearable, void* data) +static void onWearableAssetFetch(LLViewerWearable* wearable, void* data)  {  	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;  	holder->onWearableAssetFetch(wearable); @@ -927,6 +1042,18 @@ const LLUUID LLAppearanceMgr::getCOF() const  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  } +S32 LLAppearanceMgr::getCOFVersion() const +{ +	LLViewerInventoryCategory *cof = gInventory.getCategory(getCOF()); +	if (cof) +	{ +		return cof->getVersion(); +	} +	else +	{ +		return LLViewerInventoryCategory::VERSION_UNKNOWN; +	} +}  const LLViewerInventoryItem* LLAppearanceMgr::getBaseOutfitLink()  { @@ -1041,7 +1168,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  			if ((replace && wearable_count != 0) ||  				(wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) )  			{ -				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); +				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1));  			}  			addCOFItemLink(item_to_wear, do_update, cb);  		}  @@ -1051,7 +1178,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  		// Remove the existing wearables of the same type.  		// Remove existing body parts anyway because we must not be able to wear e.g. two skins. -		removeCOFLinksOfType(item_to_wear->getWearableType(), false); +		removeCOFLinksOfType(item_to_wear->getWearableType());  		addCOFItemLink(item_to_wear, do_update, cb);  		break; @@ -1149,11 +1276,13 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id)  	LLInventoryModel::item_array_t::const_iterator it = items.begin();  	const LLInventoryModel::item_array_t::const_iterator it_end = items.end(); +	uuid_vec_t uuids_to_remove;  	for( ; it_end != it; ++it)  	{  		LLViewerInventoryItem* item = *it; -		removeItemFromAvatar(item->getUUID()); +		uuids_to_remove.push_back(item->getUUID());  	} +	removeItemsFromAvatar(uuids_to_remove);  }  // Create a copy of src_id + contents as a subfolder of dst_id. @@ -1577,7 +1706,7 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo  {  	lldebugs << "updateAgentWearables()" << llendl;  	LLInventoryItem::item_array_t items; -	LLDynamicArray< LLWearable* > wearables; +	LLDynamicArray< LLViewerWearable* > wearables;  	// For each wearable type, find the wearables of that type.  	for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ ) @@ -1586,7 +1715,7 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo  			 iter != holder->getFoundList().end(); ++iter)  		{  			LLFoundData& data = *iter; -			LLWearable* wearable = data.mWearable; +			LLViewerWearable* wearable = data.mWearable;  			if( wearable && ((S32)wearable->getType() == i) )  			{  				LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID); @@ -1732,6 +1861,15 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)  	// the saved outfit stored as a folder link  	updateIsDirty(); +	// Send server request for appearance update +	if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) +	{ +		requestServerAppearanceUpdate(); +	} +	// DRANO really should wait for the appearance message to set this. +	// verify that deleting this line doesn't break anything. +	gAgentAvatarp->setIsUsingServerBakes(gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()); +	  	//dumpCat(getCOF(),"COF, start");  	bool follow_folder_links = true; @@ -1822,6 +1960,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)  		// Fetch the wearables about to be worn.  		LLWearableList::instance().getAsset(found.mAssetID,  											found.mName, +											gAgentAvatarp,  											found.mAssetType,  											onWearableAssetFetch,  											(void*)holder); @@ -1956,22 +2095,10 @@ void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool ap  			pid,  			LLFolderType::FT_NONE,  			name); -		LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(new_cat_id, append); -		it = items->begin(); -		for(; it < end; ++it) -		{ -			item = *it; -			if(item) -			{ -				copy_inventory_item( -					gAgent.getID(), -					item->getPermissions().getOwner(), -					item->getUUID(), -					new_cat_id, -					std::string(), -					cb); -			} -		} + +		// Create a CopyMgr that will copy items, manage its own destruction +		new LLInventoryCopyMgr(*items, new_cat_id, append, std::string("wear_inventory_category_callback")); +  		// BAP fixes a lag in display of created dir.  		gInventory.notifyObservers();  	} @@ -1988,7 +2115,12 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego  	// Avoid unintentionally overwriting old wearables.  We have to do  	// this up front to avoid having to deal with the case of multiple  	// wearables being dirty. -	if(!category) return; +	if (!category) return; + +	if ( !LLInventoryCallbackManager::is_instantiated() ) +	{ +		return; +	}  	LL_INFOS("Avatar") << self_av_string() << "wearInventoryCategoryOnAvatar '" << category->getName()  			 << "'" << LL_ENDL; @@ -2196,7 +2328,62 @@ void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update  #endif  } -void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) +void LLAppearanceMgr::removeAllClothesFromAvatar() +{ +	// Fetch worn clothes (i.e. the ones in COF). +	LLInventoryModel::item_array_t clothing_items; +	LLInventoryModel::cat_array_t dummy; +	LLIsType is_clothing(LLAssetType::AT_CLOTHING); +	gInventory.collectDescendentsIf(getCOF(), +									dummy, +									clothing_items, +									LLInventoryModel::EXCLUDE_TRASH, +									is_clothing, +									false); +	uuid_vec_t item_ids; +	for (LLInventoryModel::item_array_t::iterator it = clothing_items.begin(); +		it != clothing_items.end(); ++it) +	{ +		item_ids.push_back((*it).get()->getLinkedUUID()); +	} + +	// Take them off by removing from COF. +	removeItemsFromAvatar(item_ids); +} + +void LLAppearanceMgr::removeAllAttachmentsFromAvatar() +{ +	if (!isAgentAvatarValid()) return; + +	LLAgentWearables::llvo_vec_t objects_to_remove; +	 +	for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();  +		 iter != gAgentAvatarp->mAttachmentPoints.end();) +	{ +		LLVOAvatar::attachment_map_t::iterator curiter = iter++; +		LLViewerJointAttachment* attachment = curiter->second; +		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +			 attachment_iter != attachment->mAttachedObjects.end(); +			 ++attachment_iter) +		{ +			LLViewerObject *attached_object = (*attachment_iter); +			if (attached_object) +			{ +				objects_to_remove.push_back(attached_object); +			} +		} +	} +	uuid_vec_t ids_to_remove; +	for (LLAgentWearables::llvo_vec_t::iterator it = objects_to_remove.begin(); +		 it != objects_to_remove.end(); +		 ++it) +	{ +		ids_to_remove.push_back((*it)->getAttachmentItemID()); +	} +	removeItemsFromAvatar(ids_to_remove); +} + +void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id)  {  	gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -2214,13 +2401,9 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)  			gInventory.purgeObject(item->getUUID());  		}  	} -	if (do_update) -	{ -		LLAppearanceMgr::updateAppearanceFromCOF(); -	}  } -void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_update) +void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type)  {  	LLFindWearablesOfType filter_wearables_of_type(type);  	LLInventoryModel::cat_array_t cats; @@ -2236,11 +2419,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_u  			gInventory.purgeObject(item->getUUID());  		}  	} - -	if (do_update) -	{ -		updateAppearanceFromCOF(); -	}  }  bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) @@ -2583,8 +2761,129 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base  	if (inventory_changed) gInventory.notifyObservers();  } +// This is intended for use with HTTP Clients/Responders, but is not +// specifically coupled with those classes. +class LLHTTPRetryPolicy: public LLThreadSafeRefCount +{ +public: +	LLHTTPRetryPolicy() {} +	virtual ~LLHTTPRetryPolicy() {} +	virtual bool shouldRetry(U32 status, F32& seconds_to_wait) = 0; +}; +// Example of simplest possible policy, not necessarily recommended. +class LLAlwaysRetryImmediatelyPolicy: public LLHTTPRetryPolicy +{ +public: +	LLAlwaysRetryImmediatelyPolicy() {} +	bool shouldRetry(U32 status, F32& seconds_to_wait) +	{ +		seconds_to_wait = 0.0; +		return true; +	} +}; +// Very general policy with geometric back-off after failures, +// up to a maximum delay, and maximum number of retries. +class LLAdaptiveRetryPolicy: public LLHTTPRetryPolicy +{ +public: +	LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries): +		mMinDelay(min_delay), +		mMaxDelay(max_delay), +		mBackoffFactor(backoff_factor), +		mMaxRetries(max_retries), +		mDelay(min_delay), +		mRetryCount(0) +	{ +	} + +	bool shouldRetry(U32 status, F32& seconds_to_wait) +	{ +		seconds_to_wait = mDelay; +		mDelay = llclamp(mDelay*mBackoffFactor,mMinDelay,mMaxDelay); +		mRetryCount++; +		return (mRetryCount<=mMaxRetries); +	} + +private: +	F32 mMinDelay; // delay never less than this value +	F32 mMaxDelay; // delay never exceeds this value +	F32 mBackoffFactor; // delay increases by this factor after each retry, up to mMaxDelay. +	U32 mMaxRetries; // maximum number of times shouldRetry will return true. +	F32 mDelay; // current delay. +	U32 mRetryCount; // number of times shouldRetry has been called. +}; + +class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::Responder +{ +public: +	RequestAgentUpdateAppearanceResponder() +	{ +		mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 16.0, 2.0, 5); +	} + +	virtual ~RequestAgentUpdateAppearanceResponder() +	{ +	} + +	// Successful completion. +	/* virtual */ void result(const LLSD& content) +	{ +		llinfos << "request OK" << llendl; +	} + +	// Error +	/*virtual*/ void error(U32 status, const std::string& reason) +	{ +		llwarns << "appearance update request failed, status: " << status << " reason: " << reason << llendl; +		F32 seconds_to_wait; +		if (mRetryPolicy->shouldRetry(status,seconds_to_wait)) +		{ +			llinfos << "retrying" << llendl; +			doAfterInterval(boost::bind(&LLAppearanceMgr::requestServerAppearanceUpdate, +										LLAppearanceMgr::getInstance(), +										LLCurl::ResponderPtr(this)), +							seconds_to_wait); +		} +		else +		{ +			llwarns << "giving up after too many retries" << llendl; +		} +	}	 + +	LLPointer<LLHTTPRetryPolicy> mRetryPolicy; +}; + +void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr) +{ +	if (!gAgent.getRegion()) +	{ +		llwarns << "Region not set, cannot request server appearance update" << llendl; +	} +	if (gAgent.getRegion()->getCentralBakeVersion()==0) +	{ +		llwarns << "Region does not support baking" << llendl; +	} +	std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance");	 +	if (url.empty()) +	{ +		llwarns << "No cap for UpdateAvatarAppearance." << llendl; +		return; +	} +	 +	LLSD body; +	S32 cof_version = getCOFVersion(); +	body["cof_version"] = cof_version; +	//LLCurl::ResponderPtr responder_ptr; +	if (!responder_ptr.get()) +	{ +		responder_ptr = new RequestAgentUpdateAppearanceResponder; +	} +	LLHTTPClient::post(url, body, responder_ptr); +	llassert(cof_version >= mLastUpdateRequestCOFVersion); +	mLastUpdateRequestCOFVersion = cof_version; +}  class LLShowCreatedOutfit: public LLInventoryCallback  { @@ -2661,33 +2960,26 @@ void LLAppearanceMgr::wearBaseOutfit()  	updateCOF(base_outfit_id);  } -void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)  { -	LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove); -	if (!item_to_remove) return; - -	switch (item_to_remove->getType()) +	if (ids_to_remove.empty())  	{ -		case LLAssetType::AT_CLOTHING: -			if (get_is_item_worn(id_to_remove)) -			{ -				//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future -				LLWearableBridge::removeItemFromAvatar(item_to_remove); -			} -			break; -		case LLAssetType::AT_OBJECT: -			LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID()); -		default: -			break; +		llwarns << "called with empty list, nothing to do" << llendl;  	} +	for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) +	{ +		const LLUUID& id_to_remove = *it; +		const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove); +		removeCOFItemLinks(linked_item_id); +	} +	updateAppearanceFromCOF(); +} -	// *HACK: Force to remove garbage from COF. -	// Unworn links or objects can't be processed by existed removing functionality -	// since it is not designed for such cases. As example attachment object can't be removed -	// since sever don't sends message _PREHASH_KillObject in that case. -	// Also we can't check is link was successfully removed from COF since in case -	// deleting attachment link removing performs asynchronously in process_kill_object callback. -	removeCOFItemLinks(id_to_remove,false); +void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +{ +	LLUUID linked_item_id = gInventory.getLinkedItemID(id_to_remove); +	removeCOFItemLinks(linked_item_id); +	updateAppearanceFromCOF();  }  bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) @@ -2796,7 +3088,8 @@ LLAppearanceMgr::LLAppearanceMgr():  	mAttachmentInvLinkEnabled(false),  	mOutfitIsDirty(false),  	mOutfitLocked(false), -	mIsInUpdateAppearanceFromCOF(false) +	mIsInUpdateAppearanceFromCOF(false), +	mLastUpdateRequestCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)  {  	LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); @@ -2860,7 +3153,7 @@ void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)  	   if (mAttachmentInvLinkEnabled)  	   { -		   LLAppearanceMgr::removeCOFItemLinks(item_id, false); +		   LLAppearanceMgr::removeCOFItemLinks(item_id);  	   }  	   else  	   { diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c1d561781d..01ed66711c 100644..100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -35,7 +35,6 @@  #include "llinventoryobserver.h"  #include "llviewerinventory.h" -class LLWearable;  class LLWearableHoldingPattern;  class LLInventoryCallback;  class LLOutfitUnLockTimer; @@ -93,6 +92,9 @@ public:  	// Find the Current Outfit folder.  	const LLUUID getCOF() const; +	S32 getCOFVersion() const; + +	S32 mLastUpdateRequestCOFVersion;  	// Finds the folder link to the currently worn outfit  	const LLViewerInventoryItem *getBaseOutfitLink(); @@ -130,8 +132,10 @@ public:  	void addCOFItemLink(const LLInventoryItem *item, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL);  	// Remove COF entries -	void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true); -	void removeCOFLinksOfType(LLWearableType::EType type, bool do_update = true); +	void removeCOFItemLinks(const LLUUID& item_id); +	void removeCOFLinksOfType(LLWearableType::EType type); +	void removeAllClothesFromAvatar(); +	void removeAllAttachmentsFromAvatar();  	// Add COF link to ensemble folder.  	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); @@ -162,6 +166,7 @@ public:  	bool updateBaseOutfit();  	//Remove clothing or detach an object from the agent (a bodypart cannot be removed) +	void removeItemsFromAvatar(const uuid_vec_t& item_ids);  	void removeItemFromAvatar(const LLUUID& item_id); @@ -182,6 +187,8 @@ public:  	bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; } +	void requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr = NULL); +  protected:  	LLAppearanceMgr();  	~LLAppearanceMgr(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 30f82926f1..077e66ecf5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -637,7 +637,6 @@ LLAppViewer::LLAppViewer() :  	mForceGraphicsDetail(false),  	mQuitRequested(false),  	mLogoutRequestSent(false), -	mYieldTime(-1),  	mMainloopTimeout(NULL),  	mAgentRegionLastAlive(false),  	mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)), @@ -670,6 +669,15 @@ LLAppViewer::~LLAppViewer()  	removeMarkerFile();  } +class LLUITranslationBridge : public LLTranslationBridge +{ +public: +	virtual std::string getString(const std::string &xml_desc) +	{ +		return LLTrans::getString(xml_desc); +	} +}; +  bool LLAppViewer::init()  {	  	// @@ -681,6 +689,10 @@ bool LLAppViewer::init()  	//  	LLFastTimer::reset(); +	// initialize LLWearableType translation bridge. +	// Memory will be cleaned up in ::cleanupClass() +	LLWearableType::initClass(new LLUITranslationBridge()); +  	// initialize SSE options  	LLVector4a::initClass(); @@ -777,7 +789,7 @@ bool LLAppViewer::init()  	LLUI::initClass(settings_map,  		LLUIImageList::getInstance(),  		ui_audio_callback, -		&LLUI::sGLScaleFactor); +		&LLUI::getScaleFactor());  	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;  	// NOW LLUI::getLanguage() should work. gDirUtilp must know the language @@ -1215,7 +1227,7 @@ bool LLAppViewer::mainLoop()  	LLVoiceChannel::initClass();  	LLVoiceClient::getInstance()->init(gServicePump);  	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); -	LLTimer frameTimer,idleTimer; +	LLTimer frameTimer,idleTimer,periodicRenderingTimer;  	LLTimer debugTime;  	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());  	joystick->setNeedsReset(true); @@ -1227,6 +1239,8 @@ bool LLAppViewer::mainLoop()      // point of posting.      LLSD newFrame; +	BOOL restore_rendering_masks = FALSE; +  	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;  	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;  	//LLPrivateMemoryPoolTester::destroy() ; @@ -1244,6 +1258,28 @@ bool LLAppViewer::mainLoop()  		try  		{ +			// Check if we need to restore rendering masks. +			if (restore_rendering_masks) +			{ +				gPipeline.popRenderDebugFeatureMask(); +				gPipeline.popRenderTypeMask(); +			} +			// Check if we need to temporarily enable rendering. +			F32 periodic_rendering = gSavedSettings.getF32("ForcePeriodicRenderingTime"); +			if (periodic_rendering > F_APPROXIMATELY_ZERO && periodicRenderingTimer.getElapsedTimeF64() > periodic_rendering) +			{ +				periodicRenderingTimer.reset(); +				restore_rendering_masks = TRUE; +				gPipeline.pushRenderTypeMask(); +				gPipeline.pushRenderDebugFeatureMask(); +				gPipeline.setAllRenderTypes(); +				gPipeline.setAllRenderDebugFeatures(); +			} +			else +			{ +				restore_rendering_masks = FALSE; +			} +  			pingMainloopTimeout("Main:MiscNativeWindowEvents");  			if (gViewerWindow) @@ -1291,11 +1327,11 @@ bool LLAppViewer::mainLoop()  				// Scan keyboard for movement keys.  Command keys and typing  				// are handled by windows callbacks.  Don't do this until we're  				// done initializing.  JC -				if ((gHeadlessClient || gViewerWindow->getWindow()->getVisible()) +				if (gViewerWindow->getWindow()->getVisible()  					&& gViewerWindow->getActive()  					&& !gViewerWindow->getWindow()->getMinimized()  					&& LLStartUp::getStartupState() == STATE_STARTED -					&& (gHeadlessClient || !gViewerWindow->getShowProgress()) +					&& !gViewerWindow->getShowProgress()  					&& !gFocusMgr.focusLocked())  				{  					LLMemType mjk(LLMemType::MTYPE_JOY_KEY); @@ -1343,8 +1379,7 @@ bool LLAppViewer::mainLoop()  				}  				// Render scene. -				// *TODO: Should we run display() even during gHeadlessClient?  DK 2011-02-18 -				if (!LLApp::isExiting() && !gHeadlessClient) +				if (!LLApp::isExiting())  				{  					pingMainloopTimeout("Main:Display");  					gGLActive = TRUE; @@ -1366,10 +1401,11 @@ bool LLAppViewer::mainLoop()  				LLFastTimer t2(FTM_SLEEP);  				// yield some time to the os based on command line option -				if(mYieldTime >= 0) +				S32 yield_time = gSavedSettings.getS32("YieldTime"); +				if(yield_time >= 0)  				{  					LLFastTimer t(FTM_YIELD); -					ms_sleep(mYieldTime); +					ms_sleep(yield_time);  				}  				// yield cooperatively when not running as foreground window @@ -1481,6 +1517,26 @@ bool LLAppViewer::mainLoop()  				{  					gFrameStalls++;  				} + +				// Limit FPS +				F32 max_fps = gSavedSettings.getF32("MaxFPS"); +				// Only limit FPS when we are actually rendering something.  Otherwise +				// logins, logouts and teleports take much longer to complete. +				if (max_fps > F_APPROXIMATELY_ZERO &&  +					LLStartUp::getStartupState() == STATE_STARTED && +					!gTeleportDisplay && +					!logoutRequestSent()) +				{ +					// Sleep a while to limit frame rate. +					F32 min_frame_time = 1.f / max_fps; +					S32 milliseconds_to_sleep = llclamp((S32)((min_frame_time - frameTimer.getElapsedTimeF64()) * 1000.f), 0, 1000); +					if (milliseconds_to_sleep > 0) +					{ +						LLFastTimer t(FTM_YIELD); +						ms_sleep(milliseconds_to_sleep); +					} +				} +  				frameTimer.reset();  				resumeMainloopTimeout(); @@ -1761,6 +1817,8 @@ bool LLAppViewer::cleanup()  	llinfos << "Cleaning up Objects" << llendflush;  	LLViewerObject::cleanupVOClasses(); + +	LLAvatarAppearance::cleanupClass();  	LLPostProcess::cleanupClass(); @@ -2001,6 +2059,8 @@ bool LLAppViewer::cleanup()  	llinfos << "Cleaning up LLProxy." << llendl;  	LLProxy::cleanupClass(); +	LLWearableType::cleanupClass(); +  	LLMainLoopRepeater::instance().stop();  	//release all private memory pools. @@ -2602,8 +2662,6 @@ bool LLAppViewer::initConfiguration()  		}  	} -    mYieldTime = gSavedSettings.getS32("YieldTime"); -  	// Read skin/branding settings if specified.  	//if (! gDirUtilp->getSkinDir().empty() )  	//{ @@ -2994,9 +3052,6 @@ bool LLAppViewer::initWindow()  {  	LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL; -	// store setting in a global for easy access and modification -	gHeadlessClient = gSavedSettings.getBOOL("HeadlessClient"); -  	// always start windowed  	BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7a474f9122..8a6163bade 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -258,7 +258,6 @@ private:      bool mQuitRequested;				// User wants to quit, may have modified documents open.      bool mLogoutRequestSent;			// Disconnect message sent to simulator, no longer safe to send messages to the sim. -    S32 mYieldTime;  	struct SettingsFiles* mSettingsLocationList;  	LLWatchdogTimeout* mMainloopTimeout; diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 7b2c536f5a..694bbdfb67 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -48,8 +48,8 @@  #include "llviewercontrol.h"  #include "llviewerobjectlist.h"  #include "llviewermenufile.h" +#include "llviewertexlayer.h"  #include "llviewerwindow.h" -#include "lltexlayer.h"  #include "lltrans.h"  // library includes @@ -456,7 +456,7 @@ LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,  LLSendTexLayerResponder::~LLSendTexLayerResponder()  { -	// mBakedUploadData is normally deleted by calls to LLTexLayerSetBuffer::onTextureUploadComplete() below +	// mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below  	if (mBakedUploadData)  	{	// ...but delete it in the case where uploadComplete() is never called  		delete mBakedUploadData; @@ -477,12 +477,12 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)  	if (result == "complete"  		&& mBakedUploadData != NULL)  	{	// Invoke  -		LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE); +		LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE);  		mBakedUploadData = NULL;	// deleted in onTextureUploadComplete()  	}  	else  	{	// Invoke the original callback with an error result -		LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); +		LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);  		mBakedUploadData = NULL;	// deleted in onTextureUploadComplete()  	}  } @@ -492,7 +492,7 @@ void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)  	llinfos << "status: " << statusNum << " reason: " << reason << llendl;  	// Invoke the original callback with an error result -	LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); +	LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);  	mBakedUploadData = NULL;	// deleted in onTextureUploadComplete()  } diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index b539ac38ed..76f10e2d56 100755 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -37,6 +37,8 @@  #include "lluictrlfactory.h"  #include "llagentdata.h"  #include "llimfloater.h" +#include "llviewertexture.h" +#include "llavatarappearancedefines.h"  // library includes  #include "llavatarnamecache.h" diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp index e5a9be0203..459123a5d8 100644 --- a/indra/newview/llbuycurrencyhtml.cpp +++ b/indra/newview/llbuycurrencyhtml.cpp @@ -61,6 +61,10 @@ public:  		if ( params.size() >= 3 )  		{  			result_code = params[ 2 ].asInteger(); +			if ( result_code != 0 ) +			{ +				LL_WARNS("LLBuyCurrency") << "Received nonzero result code: " << result_code << LL_ENDL ; +			}  		};  		// open the legacy XUI based currency floater diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp index 357a6582d1..79ec43dfe9 100644..100755 --- a/indra/newview/llcallbacklist.cpp +++ b/indra/newview/llcallbacklist.cpp @@ -27,6 +27,7 @@  #include "llviewerprecompiledheaders.h"  #include "llcallbacklist.h" +#include "lleventtimer.h"  // Library includes  #include "llerror.h" @@ -180,6 +181,54 @@ void doOnIdleRepeating(bool_func_t callable)  	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);  } +class NullaryFuncEventTimer: public LLEventTimer +{ +public: +	NullaryFuncEventTimer(nullary_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} + +private: +	BOOL tick() +	{ +		mCallable(); +		return TRUE; +	} + +	nullary_func_t mCallable; +}; + +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds) +{ +	new NullaryFuncEventTimer(callable, seconds); +} + +class BoolFuncEventTimer: public LLEventTimer +{ +public: +	BoolFuncEventTimer(bool_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} +private: +	BOOL tick() +	{ +		return mCallable(); +	} + +	bool_func_t mCallable; +}; + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds) +{ +	new BoolFuncEventTimer(callable, seconds); +} +  #ifdef _DEBUG  void test1(void *data) diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h index 97f3bfd9ee..0516c9cdb4 100644 --- a/indra/newview/llcallbacklist.h +++ b/indra/newview/llcallbacklist.h @@ -61,6 +61,12 @@ void doOnIdleOneTime(nullary_func_t callable);  // Repeatedly call a callable in idle loop until it returns true.  void doOnIdleRepeating(bool_func_t callable); +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds); + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds); +  extern LLCallbackList gIdleCallbacks;  #endif diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index e9c7a3fa03..e86d6930e8 100644..100755 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -139,8 +139,7 @@ protected:  	{  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -		registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); +		registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		return createFromFile("menu_cof_attachment.xml");  	} @@ -173,9 +172,8 @@ protected:  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;  		LLUUID selected_id = mUUIDs.back(); -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -		registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); +		registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id));  		registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));  		registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id)); diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 5b942f283a..87fd47cb2c 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -242,7 +242,7 @@ void LLColorSwatchCtrl::draw()  		if (!mFallbackImageName.empty())  		{  			LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE,  -				LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +				LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  			if( fallback_image->getComponents() == 4 )  			{	  				gl_rect_2d_checkerboard( interior ); diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 4f5f9e22b6..4588424474 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -161,18 +161,6 @@ BOOL LLFloaterScriptQueue::start()  {  	std::string buffer; -	LLSelectMgr *mgr = LLSelectMgr::getInstance(); -	LLObjectSelectionHandle selectHandle = mgr->getSelection(); -	U32 n_objects = 0; -	if (gSavedSettings.getBOOL("EditLinkedParts")) -	{ -		n_objects = selectHandle->getObjectCount(); -	} -	else -	{ -		n_objects = selectHandle->getRootObjectCount(); -	} -  	LLStringUtil::format_map_t args;  	args["[START]"] = mStartString;  	args["[COUNT]"] = llformat ("%d", mObjectIDs.count()); diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 1e03582a29..d7d9f82910 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -327,6 +327,8 @@ BOOL LLDirPicker::getDir(std::string* filename)  		return FALSE;  	} +#if !LL_MESA_HEADLESS +  	if (mFilePicker)  	{  		GtkWindow* picker = mFilePicker->buildFilePicker(false, true, @@ -340,6 +342,8 @@ BOOL LLDirPicker::getDir(std::string* filename)  		   return (!mFilePicker->getFirstFile().empty());  		}  	} +#endif // !LL_MESA_HEADLESS +  	return FALSE;  } diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 4894d63e13..541403850c 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -503,7 +503,6 @@ F32 LLDrawable::updateXform(BOOL undamped)  	//scaling  	LLVector3 target_scale = mVObjp->getScale();  	LLVector3 old_scale = mCurrentScale; -	LLVector3 dest_scale = target_scale;  	// Damping  	F32 dist_squared = 0.f; @@ -1225,7 +1224,6 @@ LLCamera LLSpatialBridge::transformCamera(LLCamera& camera)  	LLCamera ret = camera;  	LLXformMatrix* mat = mDrawable->getXform();  	LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix(); -	LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());  	LLVector3 delta = ret.getOrigin() - center;  	LLQuaternion rot = ~mat->getRotation(); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index a264eae302..74633e4e42 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -153,7 +153,7 @@ void LLStandardBumpmap::addstandard()  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mLabel = label;  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage =   			LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));	 -		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLGLTexture::BOOST_BUMP) ;  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL );  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ;  		LLStandardBumpmap::sStandardBumpmapCount++; @@ -1075,7 +1075,7 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText  			src_image->getHeight() != bump->getHeight())// ||  			//(LLPipeline::sRenderDeferred && bump->getComponents() != 4))  		{ -			src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; +			src_image->setBoostLevel(LLGLTexture::BOOST_BUMP) ;  			src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );  			src_image->forceToSaveRawImage(0) ;  		} diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 9bc32fddbd..809f34bdff 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -69,7 +69,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :  	sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");  	sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");  	mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",  -													TRUE, LLViewerTexture::BOOST_UI,  +													TRUE, LLGLTexture::BOOST_UI,   													LLViewerTexture::FETCHED_TEXTURE,  													format, int_format,  													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); @@ -78,7 +78,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :  	mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);  	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",  -													TRUE, LLViewerTexture::BOOST_UI,  +													TRUE, LLGLTexture::BOOST_UI,   													LLViewerTexture::FETCHED_TEXTURE,  													format, int_format,  													LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); @@ -86,7 +86,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :  	//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());  	m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); -	mTexturep->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); +	mTexturep->setBoostLevel(LLGLTexture::BOOST_TERRAIN);  	//gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  } @@ -170,7 +170,7 @@ void LLDrawPoolTerrain::render(S32 pass)  	LLVLComposition *compp = regionp->getComposition();  	for (S32 i = 0; i < 4; i++)  	{ -		compp->mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); +		compp->mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN);  		compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area  	} diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 4f6eaa5a5b..26890bd75f 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -66,11 +66,11 @@ LLVector3 LLDrawPoolWater::sLightDir;  LLDrawPoolWater::LLDrawPoolWater() :  	LLFacePool(POOL_WATER)  { -	mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLGLTexture::BOOST_UI);  	gGL.getTexUnit(0)->bind(mHBTex[0]) ;  	mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP); -	mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLGLTexture::BOOST_UI);  	gGL.getTexUnit(0)->bind(mHBTex[1]);  	mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp deleted file mode 100644 index 885cae1737..0000000000 --- a/indra/newview/lldriverparam.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/**  - * @file lldriverparam.cpp - * @brief A visual parameter that drives (controls) other visual parameters. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lldriverparam.h" - -#include "llfasttimer.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llagent.h" -#include "llwearable.h" -#include "llagentwearables.h" - -//----------------------------------------------------------------------------- -// LLDriverParamInfo -//----------------------------------------------------------------------------- - -LLDriverParamInfo::LLDriverParamInfo() -{ -} - -BOOL LLDriverParamInfo::parseXml(LLXmlTreeNode* node) -{ -	llassert( node->hasName( "param" ) && node->getChildByName( "param_driver" ) ); - -	if( !LLViewerVisualParamInfo::parseXml( node )) -		return FALSE; - -	LLXmlTreeNode* param_driver_node = node->getChildByName( "param_driver" ); -	if( !param_driver_node ) -		return FALSE; - -	for (LLXmlTreeNode* child = param_driver_node->getChildByName( "driven" ); -		 child; -		 child = param_driver_node->getNextNamedChild()) -	{ -		S32 driven_id; -		static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id"); -		if( child->getFastAttributeS32( id_string, driven_id ) ) -		{ -			F32 min1 = mMinWeight; -			F32 max1 = mMaxWeight; -			F32 max2 = max1; -			F32 min2 = max1; - -			//	driven    ________							// -			//	^        /|       |\						// -			//	|       / |       | \						// -			//	|      /  |       |  \						// -			//	|     /   |       |   \						// -			//	|    /    |       |    \					// -			//-------|----|-------|----|-------> driver		// -			//  | min1   max1    max2  min2 - -			static LLStdStringHandle min1_string = LLXmlTree::addAttributeString("min1"); -			child->getFastAttributeF32( min1_string, min1 ); // optional -			static LLStdStringHandle max1_string = LLXmlTree::addAttributeString("max1"); -			child->getFastAttributeF32( max1_string, max1 ); // optional -			static LLStdStringHandle max2_string = LLXmlTree::addAttributeString("max2"); -			child->getFastAttributeF32( max2_string, max2 ); // optional -			static LLStdStringHandle min2_string = LLXmlTree::addAttributeString("min2"); -			child->getFastAttributeF32( min2_string, min2 ); // optional - -			// Push these on the front of the deque, so that we can construct -			// them in order later (faster) -			mDrivenInfoList.push_front( LLDrivenEntryInfo( driven_id, min1, max1, max2, min2 ) ); -		} -		else -		{ -			llerrs << "<driven> Unable to resolve driven parameter: " << driven_id << llendl; -			return FALSE; -		} -	} -	return TRUE; -} - -//virtual  -void LLDriverParamInfo::toStream(std::ostream &out) -{ -	LLViewerVisualParamInfo::toStream(out); -	out << "driver" << "\t"; -	out << mDrivenInfoList.size() << "\t"; -	for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++) -	{ -		LLDrivenEntryInfo driven = *iter; -		out << driven.mDrivenID << "\t"; -	} - -	out << std::endl; - -	if(isAgentAvatarValid()) -	{ -		for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++) -		{ -			LLDrivenEntryInfo driven = *iter; -			LLViewerVisualParam *param = (LLViewerVisualParam*)gAgentAvatarp->getVisualParam(driven.mDrivenID); -			if (param) -			{ -				param->getInfo()->toStream(out); -				if (param->getWearableType() != mWearableType) -				{ -					if(param->getCrossWearable()) -					{ -						out << "cross-wearable" << "\t"; -					} -					else -					{ -						out << "ERROR!" << "\t"; -					} -				} -				else -				{ -					out << "valid" << "\t"; -				} -			} -			else -			{ -				llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl; -			} -			out << std::endl; -		} -	} -} - -//----------------------------------------------------------------------------- -// LLDriverParam -//----------------------------------------------------------------------------- - -LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) :  -	mCurrentDistortionParam( NULL ),  -	mAvatarp(avatarp),  -	mWearablep(NULL) -{ -	mDefaultVec.clear(); -} - -LLDriverParam::LLDriverParam(LLWearable *wearablep) :  -	mCurrentDistortionParam( NULL ),  -	mAvatarp(NULL),  -	mWearablep(wearablep) -{ -	mDefaultVec.clear(); -} - -LLDriverParam::~LLDriverParam() -{ -} - -BOOL LLDriverParam::setInfo(LLDriverParamInfo *info) -{ -	llassert(mInfo == NULL); -	if (info->mID < 0) -		return FALSE; -	mInfo = info; -	mID = info->mID; - -	setWeight(getDefaultWeight(), FALSE ); - -	return TRUE; -} - -void LLDriverParam::setWearable(LLWearable *wearablep) -{ -	if (wearablep) -	{ -		mWearablep = wearablep; -		mAvatarp = NULL; -	} -} - -void LLDriverParam::setAvatar(LLVOAvatar *avatarp) -{ -	if (avatarp) -	{ -		mWearablep = NULL; -		mAvatarp = avatarp; -	} -} - -/*virtual*/ LLViewerVisualParam* LLDriverParam::cloneParam(LLWearable* wearable) const -{ -	LLDriverParam *new_param; -	if (wearable) -	{ -		new_param = new LLDriverParam(wearable); -	} -	else -	{ -		if (mWearablep) -		{ -			new_param = new LLDriverParam(mWearablep); -		} -		else -		{ -			new_param = new LLDriverParam(mAvatarp); -		} -	} -	*new_param = *this; -	return new_param; -} - -#if 0 // obsolete -BOOL LLDriverParam::parseData(LLXmlTreeNode* node) -{ -	LLDriverParamInfo* info = new LLDriverParamInfo; - -	info->parseXml(node); -	if (!setInfo(info)) -	{ -		delete info; -		return FALSE; -	} -	return TRUE; -} -#endif - -void LLDriverParam::setWeight(F32 weight, BOOL upload_bake) -{ -	F32 min_weight = getMinWeight(); -	F32 max_weight = getMaxWeight(); -	if (mIsAnimating) -	{ -		// allow overshoot when animating -		mCurWeight = weight; -	} -	else -	{ -		mCurWeight = llclamp(weight, min_weight, max_weight); -	} - -	//	driven    ________ -	//	^        /|       |\       ^ -	//	|       / |       | \      | -	//	|      /  |       |  \     | -	//	|     /   |       |   \    | -	//	|    /    |       |    \   | -	//-------|----|-------|----|-------> driver -	//  | min1   max1    max2  min2 - -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		LLDrivenEntryInfo* info = driven->mInfo; -		 -		F32 driven_weight = 0.f; -		F32 driven_min = driven->mParam->getMinWeight(); -		F32 driven_max = driven->mParam->getMaxWeight(); - -		if (mIsAnimating) -		{ -			// driven param doesn't interpolate (textures, for example) -			if (!driven->mParam->getAnimating()) -			{ -				continue; -			} -			if( mCurWeight < info->mMin1 ) -			{ -				if (info->mMin1 == min_weight) -				{ -					if (info->mMin1 == info->mMax1) -					{ -						driven_weight = driven_max; -					} -					else -					{ -						//up slope extrapolation -						F32 t = (mCurWeight - info->mMin1) / (info->mMax1 - info->mMin1 ); -						driven_weight = driven_min + t * (driven_max - driven_min); -					} -				} -				else -				{ -					driven_weight = driven_min; -				} -				 -				setDrivenWeight(driven,driven_weight,upload_bake); -				continue; -			} -			else  -			if ( mCurWeight > info->mMin2 ) -			{ -				if (info->mMin2 == max_weight) -				{ -					if (info->mMin2 == info->mMax2) -					{ -						driven_weight = driven_max; -					} -					else -					{ -						//down slope extrapolation					 -						F32 t = (mCurWeight - info->mMax2) / (info->mMin2 - info->mMax2 ); -						driven_weight = driven_max + t * (driven_min - driven_max); -					} -				} -				else -				{ -					driven_weight = driven_min; -				} - -				setDrivenWeight(driven,driven_weight,upload_bake); -				continue; -			} -		} - -		driven_weight = getDrivenWeight(driven, mCurWeight); -		setDrivenWeight(driven,driven_weight,upload_bake); -	} -} - -F32	LLDriverParam::getTotalDistortion() -{ -	F32 sum = 0.f; -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		sum += driven->mParam->getTotalDistortion(); -	} - -	return sum;  -} - -const LLVector4a	&LLDriverParam::getAvgDistortion()	 -{ -	// It's not actually correct to take the average of averages, but it good enough here. -	LLVector4a sum; -	sum.clear(); -	S32 count = 0; -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		sum.add(driven->mParam->getAvgDistortion()); -		count++; -	} -	sum.mul( 1.f/(F32)count); - -	mDefaultVec = sum; -	return mDefaultVec;  -} - -F32	LLDriverParam::getMaxDistortion()  -{ -	F32 max = 0.f; -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		F32 param_max = driven->mParam->getMaxDistortion(); -		if( param_max > max ) -		{ -			max = param_max; -		} -	} - -	return max;  -} - - -LLVector4a	LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) -{ -	LLVector4a sum; -	sum.clear(); -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		sum.add(driven->mParam->getVertexDistortion( index, poly_mesh )); -	} -	return sum; -} - -const LLVector4a*	LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ -	mCurrentDistortionParam = NULL; -	const LLVector4a* v = NULL; -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		v = driven->mParam->getFirstDistortion( index, poly_mesh ); -		if( v ) -		{ -			mCurrentDistortionParam = driven->mParam; -			break; -		} -	} - -	return v; -}; - -const LLVector4a*	LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ -	llassert( mCurrentDistortionParam ); -	if( !mCurrentDistortionParam ) -	{ -		return NULL; -	} - -	LLDrivenEntry* driven = NULL; -	entry_list_t::iterator iter; -	 -	// Set mDriven iteration to the right point -	for( iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		driven = &(*iter); -		if( driven->mParam == mCurrentDistortionParam ) -		{ -			break; -		} -	} - -	llassert(driven); -	if (!driven) -	{ -		return NULL; // shouldn't happen, but... -	} - -	// We're already in the middle of a param's distortions, so get the next one. -	const LLVector4a* v = driven->mParam->getNextDistortion( index, poly_mesh ); -	if( (!v) && (iter != mDriven.end()) ) -	{ -		// This param is finished, so start the next param.  It might not have any -		// distortions, though, so we have to loop to find the next param that does. -		for( iter++; iter != mDriven.end(); iter++ ) -		{ -			driven = &(*iter); -			v = driven->mParam->getFirstDistortion( index, poly_mesh ); -			if( v ) -			{ -				mCurrentDistortionParam = driven->mParam; -				break; -			} -		} -	} - -	return v; -}; - -//----------------------------------------------------------------------------- -// setAnimationTarget() -//----------------------------------------------------------------------------- -void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake ) -{ -	LLVisualParam::setAnimationTarget(target_value, upload_bake); - -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		F32 driven_weight = getDrivenWeight(driven, mTargetWeight); - -		// this isn't normally necessary, as driver params handle interpolation of their driven params -		// but texture params need to know to assume their final value at beginning of interpolation -		driven->mParam->setAnimationTarget(driven_weight, upload_bake); -	} -} - -//----------------------------------------------------------------------------- -// stopAnimating() -//----------------------------------------------------------------------------- -void LLDriverParam::stopAnimating(BOOL upload_bake) -{ -	LLVisualParam::stopAnimating(upload_bake); - -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		driven->mParam->setAnimating(FALSE); -	} -} - -/*virtual*/  -BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params) -{ -	BOOL success = TRUE; -	LLDriverParamInfo::entry_info_list_t::iterator iter; -	for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); ++iter) -	{ -		LLDrivenEntryInfo *driven_info = &(*iter); -		S32 driven_id = driven_info->mDrivenID; - -		// check for already existing links. Do not overwrite. -		BOOL found = FALSE; -		for (entry_list_t::iterator driven_iter = mDriven.begin(); driven_iter != mDriven.end() && !found; ++driven_iter) -		{ -			if (driven_iter->mInfo->mDrivenID == driven_id) -			{ -				found = TRUE; -			} -		} - -		if (!found) -		{ -			LLViewerVisualParam* param = (LLViewerVisualParam*)mapper(driven_id); -			bool push = param && (!only_cross_params || param->getCrossWearable()); -			if (push) -			{ -				mDriven.push_back(LLDrivenEntry( param, driven_info )); -			} -			else -			{ -				success = FALSE; -			} -		} -	} -	 -	return success;	 -} - -void LLDriverParam::resetDrivenParams() -{ -	mDriven.clear(); -	mDriven.reserve(getInfo()->mDrivenInfoList.size()); -} - -void LLDriverParam::updateCrossDrivenParams(LLWearableType::EType driven_type) -{ -	bool needs_update = (getWearableType()==driven_type); - -	// if the driver has a driven entry for the passed-in wearable type, we need to refresh the value -	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) -	{ -		LLDrivenEntry* driven = &(*iter); -		if (driven && driven->mParam && driven->mParam->getCrossWearable() && driven->mParam->getWearableType() == driven_type) -		{ -			needs_update = true; -		} -	} - - -	if (needs_update) -	{ -		LLWearableType::EType driver_type = (LLWearableType::EType)getWearableType(); -		 -		// If we've gotten here, we've added a new wearable of type "type" -		// Thus this wearable needs to get updates from the driver wearable. -		// The call to setVisualParamWeight seems redundant, but is necessary -		// as the number of driven wearables has changed since the last update. -Nyx -		LLWearable *wearable = gAgentWearables.getTopWearable(driver_type); -		if (wearable) -		{ -			wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false); -		} -	} -} - - -//----------------------------------------------------------------------------- -// getDrivenWeight() -//----------------------------------------------------------------------------- -F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight) -{ -	F32 min_weight = getMinWeight(); -	F32 max_weight = getMaxWeight(); -	const LLDrivenEntryInfo* info = driven->mInfo; - -	F32 driven_weight = 0.f; -	F32 driven_min = driven->mParam->getMinWeight(); -	F32 driven_max = driven->mParam->getMaxWeight(); - -	if( input_weight <= info->mMin1 ) -	{ -		if( info->mMin1 == info->mMax1 &&  -			info->mMin1 <= min_weight) -		{ -			driven_weight = driven_max; -		} -		else -		{ -			driven_weight = driven_min; -		} -	} -	else -	if( input_weight <= info->mMax1 ) -	{ -		F32 t = (input_weight - info->mMin1) / (info->mMax1 - info->mMin1 ); -		driven_weight = driven_min + t * (driven_max - driven_min); -	} -	else -	if( input_weight <= info->mMax2 ) -	{ -		driven_weight = driven_max; -	} -	else -	if( input_weight <= info->mMin2 ) -	{ -		F32 t = (input_weight - info->mMax2) / (info->mMin2 - info->mMax2 ); -		driven_weight = driven_max + t * (driven_min - driven_max); -	} -	else -	{ -		if (info->mMax2 >= max_weight) -		{ -			driven_weight = driven_max; -		} -		else -		{ -			driven_weight = driven_min; -		} -	} - -	return driven_weight; -} - -void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake) -{ -	if(isAgentAvatarValid() && -	   mWearablep &&  -	   driven->mParam->getCrossWearable() && -	   mWearablep->isOnTop()) -	{ -		// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values -		gAgentAvatarp->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); -	} -	else -	{ -		driven->mParam->setWeight( driven_weight, upload_bake ); -	} -} diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h deleted file mode 100644 index c0976d1d43..0000000000 --- a/indra/newview/lldriverparam.h +++ /dev/null @@ -1,138 +0,0 @@ -/**  - * @file lldriverparam.h - * @brief A visual parameter that drives (controls) other visual parameters. - * - * $LicenseInfo:firstyear=2002&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_LLDRIVERPARAM_H -#define LL_LLDRIVERPARAM_H - -#include "llviewervisualparam.h" -#include "llwearabletype.h" - -class LLPhysicsMotion; -class LLVOAvatar; -class LLWearable; - -//----------------------------------------------------------------------------- - -struct LLDrivenEntryInfo -{ -	LLDrivenEntryInfo( S32 id, F32 min1, F32 max1, F32 max2, F32 min2 ) -		: mDrivenID( id ), mMin1( min1 ), mMax1( max1 ), mMax2( max2 ), mMin2( min2 ) {} -	S32					mDrivenID; -	F32					mMin1; -	F32					mMax1; -	F32					mMax2; -	F32					mMin2; -}; - -struct LLDrivenEntry -{ -	LLDrivenEntry( LLViewerVisualParam* param, LLDrivenEntryInfo *info ) -		: mParam( param ), mInfo( info ) {} -	LLViewerVisualParam* mParam; -	LLDrivenEntryInfo*	 mInfo; -}; - -//----------------------------------------------------------------------------- - -class LLDriverParamInfo : public LLViewerVisualParamInfo -{ -	friend class LLDriverParam; -public: -	LLDriverParamInfo(); -	/*virtual*/ ~LLDriverParamInfo() {}; -	 -	/*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -	/*virtual*/ void toStream(std::ostream &out);	 - -protected: -	typedef std::deque<LLDrivenEntryInfo> entry_info_list_t; -	entry_info_list_t mDrivenInfoList; -}; - -//----------------------------------------------------------------------------- - -class LLDriverParam : public LLViewerVisualParam -{ -	friend class LLPhysicsMotion; // physics motion needs to access driven params directly. -public: -	LLDriverParam(LLVOAvatar *avatarp); -	LLDriverParam(LLWearable *wearablep); -	~LLDriverParam(); - -	void* operator new(size_t size) -	{ -		return ll_aligned_malloc_16(size); -	} - -	void operator delete(void* ptr) -	{ -		ll_aligned_free_16(ptr); -	} - -	// Special: These functions are overridden by child classes -	LLDriverParamInfo*		getInfo() const { return (LLDriverParamInfo*)mInfo; } -	//   This sets mInfo and calls initialization functions -	BOOL					setInfo(LLDriverParamInfo *info); - -	void					setWearable(LLWearable *wearablep); -	void					setAvatar(LLVOAvatar *avatarp); -	void					updateCrossDrivenParams(LLWearableType::EType driven_type); - -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node); -	/*virtual*/ void				apply( ESex sex ) {} // apply is called separately for each driven param. -	/*virtual*/ void				setWeight(F32 weight, BOOL upload_bake); -	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL upload_bake ); -	/*virtual*/ void				stopAnimating(BOOL upload_bake); -	/*virtual*/ BOOL				linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params); -	/*virtual*/ void				resetDrivenParams(); -	 -	// LLViewerVisualParam Virtual functions -	/*virtual*/ F32					getTotalDistortion(); -	/*virtual*/ const LLVector4a&	getAvgDistortion(); -	/*virtual*/ F32					getMaxDistortion(); -	/*virtual*/ LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *poly_mesh); -	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh); -	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); - -protected: -	F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight); -	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake); - - -	LLVector4a	mDefaultVec; // temp holder -	typedef std::vector<LLDrivenEntry> entry_list_t; -	entry_list_t mDriven; -	LLViewerVisualParam* mCurrentDistortionParam; -	// Backlink only; don't make this an LLPointer. -	LLVOAvatar* mAvatarp; -	LLWearable* mWearablep; -}; - -#endif  // LL_LLDRIVERPARAM_H diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index fa42b157a7..29ad4f34d2 100644..100755 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -107,7 +107,7 @@ void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum  	{  		setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);  	} -	createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX); +	createGLTexture(0, raw_image, 0, TRUE, LLGLTexture::DYNAMIC_TEX);  	setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP);  	mGLTexturep->setGLTextureCreated(false);  } diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h index c51e7d1e1a..d287ae6eeb 100644 --- a/indra/newview/lldynamictexture.h +++ b/indra/newview/lldynamictexture.h @@ -72,8 +72,8 @@ public:  	/*virtual*/ S8 getType() const ; -	S32			getOriginX()	{ return mOrigin.mX; } -	S32			getOriginY()	{ return mOrigin.mY; } +	S32			getOriginX() const	{ return mOrigin.mX; } +	S32			getOriginY() const	{ return mOrigin.mY; }  	S32			getSize()		{ return mFullWidth * mFullHeight * mComponents; } diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 7ed22d68f6..0faa888398 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -65,12 +65,12 @@ void LLEstateInfoModel::sendEstateInfo()  	}  } -bool LLEstateInfoModel::getUseFixedSun()			const {	return mFlags & REGION_FLAGS_SUN_FIXED;				} -bool LLEstateInfoModel::getIsExternallyVisible()	const {	return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE;	} -bool LLEstateInfoModel::getAllowDirectTeleport()	const {	return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT;	} -bool LLEstateInfoModel::getDenyAnonymous()			const {	return mFlags & REGION_FLAGS_DENY_ANONYMOUS; 		} -bool LLEstateInfoModel::getDenyAgeUnverified()		const {	return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED;	} -bool LLEstateInfoModel::getAllowVoiceChat()			const {	return mFlags & REGION_FLAGS_ALLOW_VOICE;			} +bool LLEstateInfoModel::getUseFixedSun()			const {	return getFlag(REGION_FLAGS_SUN_FIXED);				} +bool LLEstateInfoModel::getIsExternallyVisible()	const {	return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE);	} +bool LLEstateInfoModel::getAllowDirectTeleport()	const {	return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT);	} +bool LLEstateInfoModel::getDenyAnonymous()			const {	return getFlag(REGION_FLAGS_DENY_ANONYMOUS); 		} +bool LLEstateInfoModel::getDenyAgeUnverified()		const {	return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED);	} +bool LLEstateInfoModel::getAllowVoiceChat()			const {	return getFlag(REGION_FLAGS_ALLOW_VOICE);			}  void LLEstateInfoModel::setUseFixedSun(bool val)			{ setFlag(REGION_FLAGS_SUN_FIXED, 				val);	}  void LLEstateInfoModel::setIsExternallyVisible(bool val)	{ setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE,		val);	} @@ -199,18 +199,6 @@ void LLEstateInfoModel::commitEstateInfoDataserver()  	gAgent.sendMessage();  } -void LLEstateInfoModel::setFlag(U32 flag, bool val) -{ -	if (val) -	{ -		mFlags |= flag; -	} -	else -	{ -		mFlags &= ~flag; -	} -} -  std::string LLEstateInfoModel::getInfoDump()  {  	LLSD dump; diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 56391eda91..538f2f7c75 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -85,19 +85,38 @@ protected:  private:  	bool commitEstateInfoCaps();  	void commitEstateInfoDataserver(); -	U32  getFlags() const { return mFlags; } -	void setFlag(U32 flag, bool val); +	inline bool getFlag(U64 flag) const; +	inline void setFlag(U64 flag, bool val); +	U64  getFlags() const { return mFlags; }  	std::string getInfoDump();  	// estate info  	std::string	mName;			/// estate name  	LLUUID		mOwnerID;		/// estate owner id  	U32			mID;			/// estate id -	U32			mFlags;			/// estate flags +	U64			mFlags;			/// estate flags  	F32			mSunHour;		/// estate sun hour  	update_signal_t mUpdateSignal; /// emitted when we receive update from sim  	update_signal_t mCommitSignal; /// emitted when our update gets applied to sim  }; +inline bool LLEstateInfoModel::getFlag(U64 flag) const +{ +	return ((mFlags & flag) != 0); +} + +inline void LLEstateInfoModel::setFlag(U64 flag, bool val) +{ +	if (val) +	{ +		mFlags |= flag; +	} +	else +	{ +		mFlags &= ~flag; +	} +} + +  #endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 605cb81c10..cc0ed26ea9 100755..100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -561,8 +561,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)  /* removed in lieu of raycast uv detection  void LLFace::renderSelectedUV()  { -	LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLViewerTexture::BOOST_UI); -	LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLViewerTexture::BOOST_UI); +	LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLGLTexture::BOOST_UI); +	LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLGLTexture::BOOST_UI);  	LLGLSUVSelect object_select; diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 9664aa7dbe..04ed362719 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -369,7 +369,7 @@ void LLFastTimerView::draw()  	S32 left, top, right, bottom;  	S32 x, y, barw, barh, dx, dy; -	S32 texth, textw; +	S32 texth;  	LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("Rounded_Square");  	// Draw the window background @@ -410,7 +410,6 @@ void LLFastTimerView::draw()  		tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]);  		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); -		textw = LLFontGL::getFontMonospace()->getWidth(tdesc);  		x = xleft, y -= (texth + 2);  		tdesc = llformat("Justification = %s [CTRL-Click to toggle]",centerdesc[mDisplayCenter]); @@ -537,8 +536,6 @@ void LLFastTimerView::draw()  			y -= (texth + 2); -			textw = dx + LLFontGL::getFontMonospace()->getWidth(idp->getName()) + 40; -  			if (idp->getCollapsed())   			{  				it.skipDescendants(); diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 4bf5b26b3b..d13f85baa2 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -1103,6 +1103,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer  GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context)  { +#ifndef LL_MESA_HEADLESS  	if (LLWindowSDL::ll_try_gtk_init())  	{  		GtkWidget *win = NULL; @@ -1174,6 +1175,9 @@ GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::stri  	{  		return NULL;  	} +#else +	return NULL; +#endif //LL_MESA_HEADLESS  }  static void add_common_filters_to_gtkchooser(GtkFileFilter *gfilter, @@ -1473,7 +1477,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename  	return FALSE;  } -BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) +BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )  {  	// if local file browsing is turned off, return without opening dialog  	// (Even though this is a stub, I think we still should not return anything at all) @@ -1494,7 +1498,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )  	default: break;  	}  	mFiles.push_back(filename); -	llinfos << "getOpenFile: Will try to open file: " << hackyfilename << llendl; +	llinfos << "getOpenFile: Will try to open file: " << filename << llendl;  	return TRUE;  } diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index 28d195d5e9..5a28bf9277 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -270,9 +270,6 @@ void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale)  	mSection[0].mVelocity.setVec(0,0,0);  	mSection[0].mAxisRotation.setQuat(begin_rot,0,0,1); -	LLVector3 parentSectionPosition = mSection[0].mPosition; -	LLVector3 last_direction = mSection[0].mDirection; -  	remapSections(mSection, mInitializedRes, mSection, mSimulateRes);  	mInitializedRes = mSimulateRes; diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 2939d31087..3c40e2d4bc 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -38,6 +38,7 @@  #include "message.h"  #include "llagent.h" +#include "llassetstorage.h"  #include "llcombobox.h"  #include "llestateinfomodel.h"  #include "llmimetypes.h" diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index 4e10b4fc2c..048837acfe 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -32,12 +32,13 @@  #include "llagent.h"  #include "llagentwearables.h" +#include "llviewerwearable.h"  #include "lltexturectrl.h"  #include "lluictrlfactory.h"  #include "llviewerobjectlist.h"  #include "llvoavatarself.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  LLFloaterAvatarTextures::LLFloaterAvatarTextures(const LLSD& id)    : LLFloater(id), @@ -53,7 +54,7 @@ BOOL LLFloaterAvatarTextures::postBuild()  {  	for (U32 i=0; i < TEX_NUM_INDICES; i++)  	{ -		const std::string tex_name = LLVOAvatarDictionary::getInstance()->getTexture(ETextureIndex(i))->mName; +		const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(ETextureIndex(i))->mName;  		mTextures[i] = getChild<LLTextureCtrl>(tex_name);  	}  	mTitle = getTitle(); @@ -75,13 +76,13 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,  								 ETextureIndex te)  {  	LLUUID id = IMG_DEFAULT_AVATAR; -	const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture(te); +	const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture(te);  	if (tex_entry->mIsLocalTexture)  	{  		if (avatarp->isSelf())  		{  			const LLWearableType::EType wearable_type = tex_entry->mWearableType; -			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); +			LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, 0);  			if (wearable)  			{  				LLLocalTextureObject *lto = wearable->getLocalTextureObject(te); @@ -163,17 +164,17 @@ void LLFloaterAvatarTextures::onClickDump(void* data)  			const LLTextureEntry* te = avatarp->getTE(i);  			if (!te) continue; -			const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)(i)); +			const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)(i));  			if (!tex_entry)  				continue;  			if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))  			{  				LLUUID id = IMG_DEFAULT_AVATAR; -				LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i); +				LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType((ETextureIndex)i);  				if (avatarp->isSelf())  				{ -					LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); +					LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, 0);  					if (wearable)  					{  						LLLocalTextureObject *lto = wearable->getLocalTextureObject(i); diff --git a/indra/newview/llfloateravatartextures.h b/indra/newview/llfloateravatartextures.h index 85ff545855..02474a10e1 100644 --- a/indra/newview/llfloateravatartextures.h +++ b/indra/newview/llfloateravatartextures.h @@ -30,7 +30,7 @@  #include "llfloater.h"  #include "lluuid.h"  #include "llstring.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h"  class LLTextureCtrl; @@ -51,7 +51,7 @@ private:  private:  	LLUUID	mID;  	std::string mTitle; -	LLTextureCtrl* mTextures[LLVOAvatarDefines::TEX_NUM_INDICES]; +	LLTextureCtrl* mTextures[LLAvatarAppearanceDefines::TEX_NUM_INDICES];  };  #endif diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index bca4b5e447..07fe5233f4 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -40,6 +40,7 @@  #include "llcheckboxctrl.h"  #include "llinventorydefines.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "llinventorymodel.h"	// for gInventory  #include "llfirstuse.h"  #include "llfloaterreg.h" diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 8223e89b64..42857b2aa2 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -538,7 +538,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -551,7 +551,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index 62848586cd..f2deb6a805 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -1102,12 +1102,12 @@ BOOL	LLPreviewAnimation::render()  	gGL.flush(); -	LLVector3 target_pos = avatarp->mRoot.getWorldPosition(); +	LLVector3 target_pos = avatarp->mRoot->getWorldPosition();  	LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *   		LLQuaternion(mCameraYaw, LLVector3::z_axis); -	LLQuaternion av_rot = avatarp->mRoot.getWorldRotation() * camera_rot; +	LLQuaternion av_rot = avatarp->mRoot->getWorldRotation() * camera_rot;  	LLViewerCamera::getInstance()->setOriginAndLookAt(  		target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + mCameraOffset) * av_rot),		// camera  		LLVector3::z_axis,																	// up diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index fb905eae11..ab56b8e3d6 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -164,9 +164,9 @@ LLFloaterGodTools::~LLFloaterGodTools()  } -U32 LLFloaterGodTools::computeRegionFlags() const +U64 LLFloaterGodTools::computeRegionFlags() const  { -	U32 flags = gAgent.getRegion()->getRegionFlags(); +	U64 flags = gAgent.getRegion()->getRegionFlags();  	if (mPanelRegionTools) flags = mPanelRegionTools->computeRegionFlags(flags);  	if (mPanelObjectTools) flags = mPanelObjectTools->computeRegionFlags(flags);  	return flags; @@ -210,7 +210,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)  	if (!msg) return;  	//const S32 SIM_NAME_BUF = 256; -	U32 region_flags; +	U64 region_flags;  	U8 sim_access;  	U8 agent_limit;  	std::string sim_name; @@ -231,13 +231,23 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)  	msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, sim_name);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, parent_estate_id); -	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, region_flags);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, sim_access);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, agent_limit);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, object_bonus_factor);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, billable_factor);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height); +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		region_flags = flags; +	} +  	if (host != gAgent.getRegionHost())  	{  		// Update is for a different region than the one we're in. @@ -341,6 +351,7 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo()  		LLMessageSystem *msg = gMessageSystem;  		LLPanelRegionTools *rtool = god_tools->mPanelRegionTools; +		U64 region_flags = computeRegionFlags();  		msg->newMessage("GodUpdateRegionInfo");  		msg->nextBlockFast(_PREHASH_AgentData);  		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -349,11 +360,14 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo()  		msg->addStringFast(_PREHASH_SimName, rtool->getSimName());  		msg->addU32Fast(_PREHASH_EstateID, rtool->getEstateID());  		msg->addU32Fast(_PREHASH_ParentEstateID, rtool->getParentEstateID()); -		msg->addU32Fast(_PREHASH_RegionFlags, computeRegionFlags()); +		// Legacy flags +		msg->addU32Fast(_PREHASH_RegionFlags, U32(region_flags));  		msg->addF32Fast(_PREHASH_BillableFactor, rtool->getBillableFactor());  		msg->addS32Fast(_PREHASH_PricePerMeter, rtool->getPricePerMeter());  		msg->addS32Fast(_PREHASH_RedirectGridX, rtool->getRedirectGridX());  		msg->addS32Fast(_PREHASH_RedirectGridY, rtool->getRedirectGridY()); +		msg->nextBlockFast(_PREHASH_RegionInfo2); +		msg->addU64Fast(_PREHASH_RegionFlagsExtended, region_flags);  		gAgent.sendReliableMessage();  	} @@ -434,7 +448,7 @@ LLPanelRegionTools::~LLPanelRegionTools()  	// base class will take care of everything  } -U32 LLPanelRegionTools::computeRegionFlags(U32 flags) const +U64 LLPanelRegionTools::computeRegionFlags(U64 flags) const  {  	flags &= getRegionFlagsMask();  	flags |= getRegionFlags(); @@ -562,9 +576,9 @@ S32 LLPanelRegionTools::getGridPosY() const  	return getChild<LLUICtrl>("gridposy")->getValue().asInteger();  } -U32 LLPanelRegionTools::getRegionFlags() const +U64 LLPanelRegionTools::getRegionFlags() const  { -	U32 flags = 0x0; +	U64 flags = 0x0;  	flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean()    					? set_prelude_flags(flags)  					: unset_prelude_flags(flags); @@ -601,9 +615,9 @@ U32 LLPanelRegionTools::getRegionFlags() const  	return flags;  } -U32 LLPanelRegionTools::getRegionFlagsMask() const +U64 LLPanelRegionTools::getRegionFlagsMask() const  { -	U32 flags = 0xffffffff; +	U64 flags = 0xFFFFFFFFFFFFFFFFULL;  	flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean()  				? set_prelude_flags(flags)  				: unset_prelude_flags(flags); @@ -684,7 +698,7 @@ void LLPanelRegionTools::setParentEstateID(U32 id)  	getChild<LLUICtrl>("parentestate")->setValue((S32)id);  } -void LLPanelRegionTools::setCheckFlags(U32 flags) +void LLPanelRegionTools::setCheckFlags(U64 flags)  {  	getChild<LLUICtrl>("check prelude")->setValue(is_prelude(flags) ? TRUE : FALSE);  	getChild<LLUICtrl>("check fixed sun")->setValue(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE); @@ -943,7 +957,7 @@ void LLPanelObjectTools::refresh()  } -U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const +U64 LLPanelObjectTools::computeRegionFlags(U64 flags) const  {  	if (getChild<LLUICtrl>("disable scripts")->getValue().asBoolean())  	{ @@ -973,7 +987,7 @@ U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const  } -void LLPanelObjectTools::setCheckFlags(U32 flags) +void LLPanelObjectTools::setCheckFlags(U64 flags)  {  	getChild<LLUICtrl>("disable scripts")->setValue(flags & REGION_FLAGS_SKIP_SCRIPTS ? TRUE : FALSE);  	getChild<LLUICtrl>("disable collisions")->setValue(flags & REGION_FLAGS_SKIP_COLLISIONS ? TRUE : FALSE); diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index 1aa8b838fb..cbaeee7051 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -98,7 +98,7 @@ private:  	~LLFloaterGodTools();  protected: -	U32 computeRegionFlags() const; +	U64 computeRegionFlags() const;  protected: @@ -147,8 +147,8 @@ public:  	const std::string getSimName() const;  	U32 getEstateID() const;  	U32 getParentEstateID() const; -	U32 getRegionFlags() const; -	U32 getRegionFlagsMask() const; +	U64 getRegionFlags() const; +	U64 getRegionFlagsMask() const;  	F32 getBillableFactor() const;  	S32 getPricePerMeter() const;  	S32 getGridPosX() const; @@ -160,7 +160,7 @@ public:  	void setSimName(const std::string& name);  	void setEstateID(U32 id);  	void setParentEstateID(U32 id); -	void setCheckFlags(U32 flags); +	void setCheckFlags(U64 flags);  	void setBillableFactor(F32 billable_factor);  	void setPricePerMeter(S32 price);  	void setGridPosX(S32 pos); @@ -168,7 +168,7 @@ public:  	void setRedirectGridX(S32 pos);  	void setRedirectGridY(S32 pos); -	U32 computeRegionFlags(U32 initial_flags) const; +	U64 computeRegionFlags(U64 initial_flags) const;  	void clearAllWidgets();  	void enableAllWidgets(); @@ -218,10 +218,10 @@ public:  	/*virtual*/ void refresh();  	void setTargetAvatar(const LLUUID& target_id); -	U32 computeRegionFlags(U32 initial_flags) const; +	U64 computeRegionFlags(U64 initial_flags) const;  	void clearAllWidgets();  	void enableAllWidgets(); -	void setCheckFlags(U32 flags); +	void setCheckFlags(U64 flags);  	void onChangeAnything();  	void onApplyChanges(); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 6b2492d927..3b472a2862 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -593,7 +593,7 @@ S8 LLImagePreviewAvatar::getType() const  void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male)   {  -	mTargetJoint = mDummyAvatar->mRoot.findJoint(joint_name); +	mTargetJoint = mDummyAvatar->mRoot->findJoint(joint_name);  	// clear out existing test mesh  	if (mTargetMesh)  	{ @@ -612,9 +612,9 @@ void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const  		mDummyAvatar->updateVisualParams();  		mDummyAvatar->updateGeometry(mDummyAvatar->mDrawable);  	} -	mDummyAvatar->mRoot.setVisible(FALSE, TRUE); +	mDummyAvatar->mRoot->setVisible(FALSE, TRUE); -	mTargetMesh = (LLViewerJointMesh*)mDummyAvatar->mRoot.findJoint(mesh_name); +	mTargetMesh = dynamic_cast<LLViewerJointMesh*>(mDummyAvatar->mRoot->findJoint(mesh_name));  	mTargetMesh->setTestTexture(mTextureName);  	mTargetMesh->setVisible(TRUE, FALSE);  	mCameraDistance = distance; @@ -631,7 +631,7 @@ void LLImagePreviewAvatar::clearPreviewTexture(const std::string& mesh_name)  {  	if (mDummyAvatar)  	{ -		LLViewerJointMesh *mesh = (LLViewerJointMesh*)mDummyAvatar->mRoot.findJoint(mesh_name); +		LLViewerJointMesh *mesh = dynamic_cast<LLViewerJointMesh*>(mDummyAvatar->mRoot->findJoint(mesh_name));  		// clear out existing test mesh  		if (mesh)  		{ diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 55f3d548ec..ce95d8bacf 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -557,7 +557,7 @@ void LLPanelLandGeneral::refresh()  		BOOL is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus());  		BOOL region_xfer = FALSE;  		if(regionp -		   && !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)) +		   && !(regionp->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)))  		{  			region_xfer = TRUE;  		} @@ -2117,7 +2117,7 @@ void LLPanelLandOptions::refreshSearch()  			LLViewerParcelMgr::isParcelModifiableByAgent(  				parcel, GP_LAND_CHANGE_IDENTITY)  			&& region -			&& !(region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH); +			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));  	// There is a bug with this panel whereby the Show Directory bit can be   	// slammed off by the Region based on an override.  Since this data is cached @@ -2866,7 +2866,7 @@ void LLPanelLandCovenant::refresh()  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -2879,7 +2879,7 @@ void LLPanelLandCovenant::refresh()  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index a071f338ba..35d306c6c0 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -746,7 +746,6 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)  void LLFloaterModelPreview::draw()  {  	LLFloater::draw(); -	LLRect r = getRect();  	mModelPreview->update(); @@ -1670,7 +1669,6 @@ bool LLModelLoader::doLoadModel()  						//If no skeleton, do a breadth-first search to get at specific joints  						bool rootNode = false; -						bool skeletonWithNoRootNode = false;  						//Need to test for a skeleton that does not have a root node  						//This occurs when your instance controller does not have an associated scene  @@ -1681,10 +1679,6 @@ bool LLModelLoader::doLoadModel()  							{  								rootNode = true;  							} -							else  -							{ -								skeletonWithNoRootNode = true; -							}  						}  						if ( !pSkeleton || !rootNode ) @@ -2488,7 +2482,7 @@ void LLModelLoader::loadTextures()  				if(!material.mDiffuseMapFilename.empty())  				{  					material.mDiffuseMap =  -						LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW); +						LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLGLTexture::BOOST_PREVIEW);  					material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);  					material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);  					mNumOfFetchingTextures++ ; @@ -4977,16 +4971,9 @@ BOOL LLModelPreview::render()  	bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean();	  	bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean(); -	bool resetJoints = false;  	if ( upload_joints != mLastJointUpdate )  	{ -		if ( mLastJointUpdate ) -		{ -			resetJoints = true; -		} -  		mLastJointUpdate = upload_joints; -  	}  	for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index fe29bb38c7..a36021f971 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -318,7 +318,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	// extract message  	std::string sim_name;  	std::string sim_type = LLTrans::getString("land_type_unknown"); -	U32 region_flags; +	U64 region_flags;  	U8 agent_limit;  	F32 object_bonus_factor;  	U8 sim_access; @@ -328,7 +328,6 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	BOOL use_estate_sun;  	F32 sun_hour;  	msg->getString("RegionInfo", "SimName", sim_name); -	msg->getU32("RegionInfo", "RegionFlags", region_flags);  	msg->getU8("RegionInfo", "MaxAgents", agent_limit);  	msg->getF32("RegionInfo", "ObjectBonusFactor", object_bonus_factor);  	msg->getU8("RegionInfo", "SimAccess", sim_access); @@ -347,6 +346,17 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  		LLTrans::findString(sim_type, sim_type); // try localizing sim product name  	} +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64("RegionInfo3", "RegionFlagsExtended", region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32("RegionInfo", "RegionFlags", flags); +		region_flags = flags; +	} +  	// GENERAL PANEL  	panel = tab->getChild<LLPanel>("General");  	panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name)); @@ -378,9 +388,9 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel = tab->getChild<LLPanel>("Debug");  	panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name) ); -	panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_SCRIPTS)) ); -	panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_COLLISIONS)) ); -	panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_PHYSICS)) ); +	panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_SCRIPTS) ? TRUE : FALSE )) ); +	panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_COLLISIONS) ? TRUE : FALSE )) ); +	panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_PHYSICS) ? TRUE : FALSE )) );  	panel->setCtrlsEnabled(allow_modify);  	// TERRAIN PANEL @@ -2276,7 +2286,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -2289,7 +2299,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 3ec1e372eb..86bd15b217 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -110,9 +110,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)  // static  void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)  { -	U32 region_flags; -	msg->getU32("RegionInfo", "RegionFlags", region_flags); -	  	if ( LLFloaterReg::instanceVisible("reporter") )  	{  		LLNotificationsUtil::add("HelpReportAbuseEmailLL"); @@ -768,8 +765,8 @@ void LLFloaterReporter::takeScreenshot()  	// store in the image list so it doesn't try to fetch from the server  	LLPointer<LLViewerFetchedTexture> image_in_list =  -		LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE); -	image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerTexture::OTHER); +		LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE); +	image_in_list->createGLTexture(0, raw, 0, TRUE, LLGLTexture::OTHER);  	// the texture picker then uses that texture  	LLTexturePicker* texture = getChild<LLTextureCtrl>("screenshot"); @@ -816,12 +813,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,  		return;  	} -	EReportType report_type = UNKNOWN_REPORT; -	if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION) -	{ -		report_type = COMPLAINT_REPORT; -	} -	else  +	if (data->mPreferredLocation != LLResourceData::INVALID_LOCATION)  	{  		llwarns << "Unknown report type : " << data->mPreferredLocation << llendl;  	} diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index b691db1049..c987dbb4fb 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -105,7 +105,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:  	if (objectp)  	{ -		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); +		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLGLTexture::BOOST_UI));  		floater_label = llformat("%s(%.0f, %.0f, %.0f)",  						user_name.c_str(),  						objectp->getPositionRegion().mV[VX], diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 5385977d95..3c966a073f 100644..100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -32,6 +32,8 @@  // newview includes  #include "llsidetraypanelcontainer.h"  #include "lltransientfloatermgr.h" +#include "llpaneloutfitedit.h" +#include "llsidepanelappearance.h"  //static  const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel"); @@ -54,6 +56,26 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key)  	getChild<LLPanel>(sMainPanelName)->onOpen(key);  } +void LLFloaterSidePanelContainer::onClickCloseBtn() +{ +	llinfos << "close clicked" << llendl; + +	LLPanelOutfitEdit* panel_outfit_edit = +		dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); +	if (panel_outfit_edit && panel_outfit_edit->getVisible()) +	{ +		LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); +		if (parent == this) +		{ +			LLSidepanelAppearance* panel_appearance = +				dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); +			panel_appearance->showOutfitsInventoryPanel(); +		} +	} + +	LLFloater::onClickCloseBtn(); +} +  LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)  {  	LLView* view = findChildView(panel_name, true); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 10d85867ce..491723471f 100644..100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,6 +51,8 @@ public:  	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ void onClickCloseBtn(); +  	LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);  	static void showPanel(const std::string& floater_name, const LLSD& key); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 15e0b89f6c..0106a1615d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -855,7 +855,6 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID)  		LLPanel* panel = LLUICtrlFactory::create<LLPanel>(panel_params);	// create a new panel  		panel->buildFromFile(path);										// build it -		LLRect new_size = panel->getRect();								// get its rectangle  		panel->setOrigin(2,2);											// reset its origin point so it's not offset by -left or other XUI attributes  		(*floaterp)->setTitle(path);									// use the file name as its title, since panels have no guaranteed meaningful name attribute  		panel->setUseBoundingRect(TRUE);								// enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements) diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 8e540a0cc8..30de0ef664 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -888,7 +888,6 @@ void LLFolderView::commitRename( const LLSD& data )  void LLFolderView::draw()  { -	static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", LLColor4::white);  	if (mDebugFilters)  	{  		std::string current_filter_string = llformat("Current Filter: %d, Least Filter: %d, Auto-accept Filter: %d", @@ -1506,12 +1505,6 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  		LLMenuGL::sMenuContainer->hideMenus();  	} -	LLView *item = NULL; -	if (getChildCount() > 0) -	{ -		item = *(getChildList()->begin()); -	} -  	switch( key )  	{  	case KEY_F2: @@ -2034,7 +2027,6 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr  	{  		LLRect local_rect = item->getLocalRect();  		LLRect item_scrolled_rect; // item position relative to display area of scroller -		LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();  		S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();   		S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();  diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 66ca76bfb0..05fd9640c8 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -337,7 +337,7 @@ void LLGestureMgr::deactivateGesture(const LLUUID& item_id)  	gAgent.sendReliableMessage(); -	LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id, false); +	LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id);  	notifyObservers();  } diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 1208c9378e..60fa53f491 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -79,10 +79,10 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)  	S32 top =	llmax(y, mDragStartY);  	S32 bottom =llmin(y, mDragStartY); -	left = llround((F32) left * LLUI::sGLScaleFactor.mV[VX]); -	right = llround((F32) right * LLUI::sGLScaleFactor.mV[VX]); -	top = llround((F32) top * LLUI::sGLScaleFactor.mV[VY]); -	bottom = llround((F32) bottom * LLUI::sGLScaleFactor.mV[VY]); +	left = llround((F32) left * LLUI::getScaleFactor().mV[VX]); +	right = llround((F32) right * LLUI::getScaleFactor().mV[VX]); +	top = llround((F32) top * LLUI::getScaleFactor().mV[VY]); +	bottom = llround((F32) bottom * LLUI::getScaleFactor().mV[VY]);  	F32 old_far_plane = LLViewerCamera::getInstance()->getFar();  	F32 old_near_plane = LLViewerCamera::getInstance()->getNear(); diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp index 2f9810775b..97f72b020c 100644 --- a/indra/newview/llgroupiconctrl.cpp +++ b/indra/newview/llgroupiconctrl.cpp @@ -29,6 +29,7 @@  #include "llgroupiconctrl.h"  #include "llagent.h" +#include "llviewertexture.h"  /*  #include "llavatarconstants.h"  #include "llcallingcard.h" // for LLAvatarTracker diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index bc3b220dc0..9dde65ceb6 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -636,7 +636,7 @@ bool LLHUDEffectLookAt::calcTargetPosition()  			}  			else  			{ -				target_rot = target_av->mRoot.getWorldRotation(); +				target_rot = target_av->mRoot->getWorldRotation();  			}  		}  		else // target obj is not an avatar diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 579b6008ae..3c6bcd9829 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -186,11 +186,8 @@ void LLHUDText::renderText()  		LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);  	} -	LLVector2 border_scale_vec((F32)border_width / (F32)imagep->getTextureWidth(), (F32)border_height / (F32)imagep->getTextureHeight());  	LLVector3 width_vec = mWidth * x_pixel_vec;  	LLVector3 height_vec = mHeight * y_pixel_vec; -	LLVector3 scaled_border_width = (F32)llfloor(border_scale * (F32)border_width) * x_pixel_vec; -	LLVector3 scaled_border_height = (F32)llfloor(border_scale * (F32)border_height) * y_pixel_vec;  	mRadius = (width_vec + height_vec).magVec() * 0.5f; @@ -440,7 +437,7 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset)  	LLVector3 x_pixel_vec;  	LLVector3 y_pixel_vec;  	LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); -	LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); +//	LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec);  //	if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen)  //	{  //		// bubble off-screen, so find a spot for it along screen edge diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4000570872..57373704ef 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2674,7 +2674,6 @@ void LLIMMgr::inviteToSession(  	// voice invite question is different from default only for group call (EXT-7118)  	std::string question_type = "VoiceInviteQuestionDefault"; -	BOOL ad_hoc_invite = FALSE;  	BOOL voice_invite = FALSE;  	bool is_linden = LLMuteList::getInstance()->isLinden(caller_name); @@ -2697,13 +2696,11 @@ void LLIMMgr::inviteToSession(  		//else it's an ad-hoc  		//and a voice ad-hoc  		notify_box_type = "VoiceInviteAdHoc"; -		ad_hoc_invite = TRUE;  		voice_invite = TRUE;  	}  	else if ( inv_type == INVITATION_TYPE_IMMEDIATE )  	{  		notify_box_type = "InviteAdHoc"; -		ad_hoc_invite = TRUE;  	}  	LLSD payload; @@ -3269,10 +3266,9 @@ public:  			}  			std::string buffer = saved + message; -			BOOL is_this_agent = FALSE;  			if(from_id == gAgentID)  			{ -				is_this_agent = TRUE; +				return;  			}  			gIMMgr->addMessage(  				session_id, diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 14a228df1c..1e9e370395 100644..100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -50,6 +50,7 @@  #include "llclipboard.h"  #include "llinventorydefines.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "llinventorymodel.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llinventorypanel.h" @@ -110,8 +111,6 @@ void dec_busy_count()  }  // Function declarations -void remove_inventory_category_from_avatar(LLInventoryCategory* category); -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);  bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);  bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id); @@ -1512,7 +1511,7 @@ LLUIImagePtr LLItemBridge::getIcon() const  										mIsLink);  	} -	return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT); +	return LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT);  }  PermissionMask LLItemBridge::getPermissionMask() const @@ -2515,7 +2514,6 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  	if(drop && accept)  	{  		it = inventory_objects.begin(); -		LLInventoryObject::object_list_t::iterator first_it = inventory_objects.begin();  		LLMoveInv* move_inv = new LLMoveInv;  		move_inv->mObjectID = object_id;  		move_inv->mCategoryID = category_id; @@ -2799,7 +2797,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		LLViewerInventoryCategory* cat = getCategory();  		if(!cat) return; -		remove_inventory_category_from_avatar ( cat ); +		LLAppearanceMgr::instance().takeOffOutfit( cat->getLinkedUUID() );  		return;  	}  	else if ("purge" == action) @@ -5110,11 +5108,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)  	}  	else if (isRemoveAction(action))  	{ -		LLInventoryItem* item = gInventory.getItem(mUUID); -		if(item) -		{ -			LLVOAvatarSelf::detachAttachmentIntoInventory(item->getLinkedUUID()); -		} +		LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);  	}  	else LLItemBridge::performAction(model, action);  } @@ -5406,120 +5400,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,  	mInvType = inv_type;  } -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ -	if(!category) return; -	lldebugs << "remove_inventory_category_from_avatar( " << category->getName() -			 << " )" << llendl; - - -	if (gAgentCamera.cameraCustomizeAvatar()) -	{ -		// switching to outfit editor should automagically save any currently edited wearable -		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); -	} - -	remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); -} - -struct OnRemoveStruct -{ -	LLUUID mUUID; -	OnRemoveStruct(const LLUUID& uuid): -		mUUID(uuid) -	{ -	} -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - -	// Find all the wearables that are in the category's subtree. -	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; -	if(proceed) -	{ -		LLInventoryModel::cat_array_t cat_array; -		LLInventoryModel::item_array_t item_array; -		LLFindWearables is_wearable; -		gInventory.collectDescendentsIf(category_id, -										cat_array, -										item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_wearable); -		S32 i; -		S32 wearable_count = item_array.count(); - -		LLInventoryModel::cat_array_t	obj_cat_array; -		LLInventoryModel::item_array_t	obj_item_array; -		LLIsType is_object( LLAssetType::AT_OBJECT ); -		gInventory.collectDescendentsIf(category_id, -										obj_cat_array, -										obj_item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_object); -		S32 obj_count = obj_item_array.count(); - -		// Find all gestures in this folder -		LLInventoryModel::cat_array_t	gest_cat_array; -		LLInventoryModel::item_array_t	gest_item_array; -		LLIsType is_gesture( LLAssetType::AT_GESTURE ); -		gInventory.collectDescendentsIf(category_id, -										gest_cat_array, -										gest_item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_gesture); -		S32 gest_count = gest_item_array.count(); - -		if (wearable_count > 0)	//Loop through wearables.  If worn, remove. -		{ -			for(i = 0; i  < wearable_count; ++i) -			{ -				LLViewerInventoryItem *item = item_array.get(i); -				if (item->getType() == LLAssetType::AT_BODYPART) -					continue; -				if (gAgent.isTeen() && item->isWearableType() && -					(item->getWearableType() == LLWearableType::WT_UNDERPANTS || item->getWearableType() == LLWearableType::WT_UNDERSHIRT)) -					continue; -				if (get_is_item_worn(item->getUUID())) -				{ -					LLWearableList::instance().getAsset(item->getAssetUUID(), -														item->getName(), -														item->getType(), -														LLWearableBridge::onRemoveFromAvatarArrived, -														new OnRemoveStruct(item->getLinkedUUID())); -				} -			} -		} - -		if (obj_count > 0) -		{ -			for(i = 0; i  < obj_count; ++i) -			{ -				LLViewerInventoryItem *obj_item = obj_item_array.get(i); -				if (get_is_item_worn(obj_item->getUUID())) -				{ -					LLVOAvatarSelf::detachAttachmentIntoInventory(obj_item->getLinkedUUID()); -				} -			} -		} - -		if (gest_count > 0) -		{ -			for(i = 0; i  < gest_count; ++i) -			{ -				LLViewerInventoryItem *gest_item = gest_item_array.get(i); -				if (get_is_item_worn(gest_item->getUUID())) -				{ -					LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() ); -					gInventory.updateItem( gest_item ); -					gInventory.notifyObservers(); -				} - -			} -		} -	} -} -  BOOL LLWearableBridge::renameItem(const std::string& new_name)  {  	if (get_is_item_worn(mUUID)) @@ -5729,7 +5609,7 @@ void LLWearableBridge::wearAddOnAvatar()  }  // static -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +void LLWearableBridge::onWearOnAvatarArrived( LLViewerWearable* wearable, void* userdata )  {  	LLUUID* item_id = (LLUUID*) userdata;  	if(wearable) @@ -5755,7 +5635,7 @@ void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userda  // static  // BAP remove the "add" code path once everything is fully COF-ified. -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +void LLWearableBridge::onWearAddOnAvatarArrived( LLViewerWearable* wearable, void* userdata )  {  	LLUUID* item_id = (LLUUID*) userdata;  	if(wearable) @@ -5815,95 +5695,12 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)  	return FALSE;  } -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ -	LLWearableBridge* self = (LLWearableBridge*)user_data; -	if(!self) return; -	if(get_is_item_worn(self->mUUID)) -	{ -		LLViewerInventoryItem* item = self->getItem(); -		if (item) -		{ -			LLUUID parent_id = item->getParentUUID(); -			LLWearableList::instance().getAsset(item->getAssetUUID(), -												item->getName(), -												item->getType(), -												onRemoveFromAvatarArrived, -												new OnRemoveStruct(LLUUID(self->mUUID))); -		} -	} -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, -												 void* userdata) -{ -	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; -	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); -	if(wearable) -	{ -		if( get_is_item_worn( item_id ) ) -		{ -			LLWearableType::EType type = wearable->getType(); - -			if( !(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES ) ) //&& -				//!((!gAgent.isTeen()) && ( type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT )) ) -			{ -				bool do_remove_all = false; -				U32 index = gAgentWearables.getWearableIndex(wearable); -				gAgentWearables.removeWearable( type, do_remove_all, index ); -			} -		} -	} - -	// Find and remove this item from the COF. -	LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); -	gInventory.notifyObservers(); - -	delete on_remove_struct; -} - -// static -void LLWearableBridge::removeAllClothesFromAvatar() -{ -	// Fetch worn clothes (i.e. the ones in COF). -	LLInventoryModel::item_array_t clothing_items; -	LLInventoryModel::cat_array_t dummy; -	LLIsType is_clothing(LLAssetType::AT_CLOTHING); -	gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), -									dummy, -									clothing_items, -									LLInventoryModel::EXCLUDE_TRASH, -									is_clothing, -									false); - -	// Take them off by removing from COF. -	for (LLInventoryModel::item_array_t::const_iterator it = clothing_items.begin(); it != clothing_items.end(); ++it) -	{ -		LLAppearanceMgr::instance().removeItemFromAvatar((*it)->getUUID()); -	} -} - -// static -void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item) -{ -	if (item) -	{ -		LLWearableList::instance().getAsset(item->getAssetUUID(), -											item->getName(), -											item->getType(), -											LLWearableBridge::onRemoveFromAvatarArrived, -											new OnRemoveStruct(item->getUUID())); -	} -} -  void LLWearableBridge::removeFromAvatar()  { +	llwarns << "safe to remove?" << llendl;  	if (get_is_item_worn(mUUID))  	{ -		LLViewerInventoryItem* item = getItem(); -		removeItemFromAvatar(item); +		LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);  	}  } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 118430efe1..f439c45dd3 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -33,7 +33,7 @@  #include "llinventorymodel.h"  #include "llinventoryobserver.h"  #include "llviewercontrol.h" -#include "llwearable.h" +#include "llviewerwearable.h"  class LLInventoryFilter;  class LLInventoryPanel; @@ -487,10 +487,10 @@ public:  	static void		onWearOnAvatar( void* userdata );	// Access to wearOnAvatar() from menu  	static BOOL		canWearOnAvatar( void* userdata ); -	static void		onWearOnAvatarArrived( LLWearable* wearable, void* userdata ); +	static void		onWearOnAvatarArrived( LLViewerWearable* wearable, void* userdata );  	void			wearOnAvatar(); -	static void		onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ); +	static void		onWearAddOnAvatarArrived( LLViewerWearable* wearable, void* userdata );  	void			wearAddOnAvatar();  	static BOOL		canEditOnAvatar( void* userdata );	// Access to editOnAvatar() from menu @@ -498,9 +498,6 @@ public:  	void			editOnAvatar();  	static BOOL		canRemoveFromAvatar( void* userdata ); -	static void		onRemoveFromAvatar( void* userdata ); -	static void		onRemoveFromAvatarArrived( LLWearable* wearable, 	void* userdata ); -	static void 	removeItemFromAvatar(LLViewerInventoryItem *item);  	static void 	removeAllClothesFromAvatar();  	void			removeFromAvatar();  protected: diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 34734d57c5..02a2475cfd 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -25,6 +25,8 @@   */  #include "llviewerprecompiledheaders.h" + +#include "linden_common.h"  #include "llinventoryicon.h"  #include "lldictionary.h" @@ -41,7 +43,7 @@ struct IconEntry : public LLDictionaryEntry  };  class LLIconDictionary : public LLSingleton<LLIconDictionary>, -						 public LLDictionary<LLInventoryIcon::EIconName, IconEntry> +						 public LLDictionary<LLInventoryType::EIconName, IconEntry>  {  public:  	LLIconDictionary(); @@ -49,48 +51,48 @@ public:  LLIconDictionary::LLIconDictionary()  { -	addEntry(LLInventoryIcon::ICONNAME_TEXTURE, 				new IconEntry("Inv_Texture")); -	addEntry(LLInventoryIcon::ICONNAME_SOUND, 					new IconEntry("Inv_Sound")); -	addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, 		new IconEntry("Inv_CallingCard")); -	addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, 	new IconEntry("Inv_CallingCard")); -	addEntry(LLInventoryIcon::ICONNAME_LANDMARK, 				new IconEntry("Inv_Landmark")); -	addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, 		new IconEntry("Inv_Landmark")); -	addEntry(LLInventoryIcon::ICONNAME_SCRIPT, 					new IconEntry("Inv_Script")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING, 				new IconEntry("Inv_Clothing")); -	addEntry(LLInventoryIcon::ICONNAME_OBJECT, 					new IconEntry("Inv_Object")); -	addEntry(LLInventoryIcon::ICONNAME_OBJECT_MULTI, 			new IconEntry("Inv_Object_Multi")); -	addEntry(LLInventoryIcon::ICONNAME_NOTECARD, 				new IconEntry("Inv_Notecard")); -	addEntry(LLInventoryIcon::ICONNAME_BODYPART, 				new IconEntry("Inv_Skin")); -	addEntry(LLInventoryIcon::ICONNAME_SNAPSHOT, 				new IconEntry("Inv_Snapshot")); - -	addEntry(LLInventoryIcon::ICONNAME_BODYPART_SHAPE, 			new IconEntry("Inv_BodyShape")); -	addEntry(LLInventoryIcon::ICONNAME_BODYPART_SKIN, 			new IconEntry("Inv_Skin")); -	addEntry(LLInventoryIcon::ICONNAME_BODYPART_HAIR, 			new IconEntry("Inv_Hair")); -	addEntry(LLInventoryIcon::ICONNAME_BODYPART_EYES, 			new IconEntry("Inv_Eye")); - -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, 			new IconEntry("Inv_Shirt")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PANTS, 			new IconEntry("Inv_Pants")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHOES, 			new IconEntry("Inv_Shoe")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, 			new IconEntry("Inv_Socks")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_JACKET, 		new IconEntry("Inv_Jacket")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, 		new IconEntry("Inv_Gloves")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, 	new IconEntry("Inv_Undershirt")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, 	new IconEntry("Inv_Underpants")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, 			new IconEntry("Inv_Skirt")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, 			new IconEntry("Inv_Alpha")); -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, 		new IconEntry("Inv_Tattoo")); -	addEntry(LLInventoryIcon::ICONNAME_ANIMATION, 				new IconEntry("Inv_Animation")); -	addEntry(LLInventoryIcon::ICONNAME_GESTURE, 				new IconEntry("Inv_Gesture")); - -	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, 		new IconEntry("Inv_Physics")); - -	addEntry(LLInventoryIcon::ICONNAME_LINKITEM, 				new IconEntry("Inv_LinkItem")); -	addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, 				new IconEntry("Inv_LinkFolder")); -	addEntry(LLInventoryIcon::ICONNAME_MESH,	 				new IconEntry("Inv_Mesh")); - -	addEntry(LLInventoryIcon::ICONNAME_INVALID, 				new IconEntry("Inv_Invalid")); - -	addEntry(LLInventoryIcon::ICONNAME_NONE, 					new IconEntry("NONE")); +	addEntry(LLInventoryType::ICONNAME_TEXTURE, 				new IconEntry("Inv_Texture")); +	addEntry(LLInventoryType::ICONNAME_SOUND, 					new IconEntry("Inv_Sound")); +	addEntry(LLInventoryType::ICONNAME_CALLINGCARD_ONLINE, 		new IconEntry("Inv_CallingCard")); +	addEntry(LLInventoryType::ICONNAME_CALLINGCARD_OFFLINE, 	new IconEntry("Inv_CallingCard")); +	addEntry(LLInventoryType::ICONNAME_LANDMARK, 				new IconEntry("Inv_Landmark")); +	addEntry(LLInventoryType::ICONNAME_LANDMARK_VISITED, 		new IconEntry("Inv_Landmark")); +	addEntry(LLInventoryType::ICONNAME_SCRIPT, 					new IconEntry("Inv_Script")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING, 				new IconEntry("Inv_Clothing")); +	addEntry(LLInventoryType::ICONNAME_OBJECT, 					new IconEntry("Inv_Object")); +	addEntry(LLInventoryType::ICONNAME_OBJECT_MULTI, 			new IconEntry("Inv_Object_Multi")); +	addEntry(LLInventoryType::ICONNAME_NOTECARD, 				new IconEntry("Inv_Notecard")); +	addEntry(LLInventoryType::ICONNAME_BODYPART, 				new IconEntry("Inv_Skin")); +	addEntry(LLInventoryType::ICONNAME_SNAPSHOT, 				new IconEntry("Inv_Snapshot")); + +	addEntry(LLInventoryType::ICONNAME_BODYPART_SHAPE, 			new IconEntry("Inv_BodyShape")); +	addEntry(LLInventoryType::ICONNAME_BODYPART_SKIN, 			new IconEntry("Inv_Skin")); +	addEntry(LLInventoryType::ICONNAME_BODYPART_HAIR, 			new IconEntry("Inv_Hair")); +	addEntry(LLInventoryType::ICONNAME_BODYPART_EYES, 			new IconEntry("Inv_Eye")); + +	addEntry(LLInventoryType::ICONNAME_CLOTHING_SHIRT, 			new IconEntry("Inv_Shirt")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_PANTS, 			new IconEntry("Inv_Pants")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_SHOES, 			new IconEntry("Inv_Shoe")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_SOCKS, 			new IconEntry("Inv_Socks")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_JACKET, 		new IconEntry("Inv_Jacket")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_GLOVES, 		new IconEntry("Inv_Gloves")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_UNDERSHIRT, 	new IconEntry("Inv_Undershirt")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_UNDERPANTS, 	new IconEntry("Inv_Underpants")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_SKIRT, 			new IconEntry("Inv_Skirt")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_ALPHA, 			new IconEntry("Inv_Alpha")); +	addEntry(LLInventoryType::ICONNAME_CLOTHING_TATTOO, 		new IconEntry("Inv_Tattoo")); +	addEntry(LLInventoryType::ICONNAME_ANIMATION, 				new IconEntry("Inv_Animation")); +	addEntry(LLInventoryType::ICONNAME_GESTURE, 				new IconEntry("Inv_Gesture")); + +	addEntry(LLInventoryType::ICONNAME_CLOTHING_PHYSICS, 		new IconEntry("Inv_Physics")); + +	addEntry(LLInventoryType::ICONNAME_LINKITEM, 				new IconEntry("Inv_LinkItem")); +	addEntry(LLInventoryType::ICONNAME_LINKFOLDER, 				new IconEntry("Inv_LinkFolder")); +	addEntry(LLInventoryType::ICONNAME_MESH,	 				new IconEntry("Inv_Mesh")); + +	addEntry(LLInventoryType::ICONNAME_INVALID, 				new IconEntry("Inv_Invalid")); + +	addEntry(LLInventoryType::ICONNAME_NONE, 					new IconEntry("NONE"));  }  LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type, @@ -102,7 +104,7 @@ LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type,  	return LLUI::getUIImage(icon_name);  } -LLUIImagePtr LLInventoryIcon::getIcon(EIconName idx) +LLUIImagePtr LLInventoryIcon::getIcon(LLInventoryType::EIconName idx)  {  	return LLUI::getUIImage(getIconName(idx));  } @@ -112,56 +114,56 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,  												U32 misc_flag,  												BOOL item_is_multi)  { -	EIconName idx = ICONNAME_OBJECT; +	LLInventoryType::EIconName idx = LLInventoryType::ICONNAME_OBJECT;  	if (item_is_multi)  	{ -		idx = ICONNAME_OBJECT_MULTI; +		idx = LLInventoryType::ICONNAME_OBJECT_MULTI;  		return getIconName(idx);  	}  	switch(asset_type)  	{  		case LLAssetType::AT_TEXTURE: -			idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? ICONNAME_SNAPSHOT : ICONNAME_TEXTURE; +			idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? LLInventoryType::ICONNAME_SNAPSHOT : LLInventoryType::ICONNAME_TEXTURE;  			break;  		case LLAssetType::AT_SOUND: -			idx = ICONNAME_SOUND; +			idx = LLInventoryType::ICONNAME_SOUND;  			break;  		case LLAssetType::AT_CALLINGCARD: -			idx = (misc_flag != 0) ? ICONNAME_CALLINGCARD_ONLINE : ICONNAME_CALLINGCARD_OFFLINE; +			idx = (misc_flag != 0) ? LLInventoryType::ICONNAME_CALLINGCARD_ONLINE : LLInventoryType::ICONNAME_CALLINGCARD_OFFLINE;  			break;  		case LLAssetType::AT_LANDMARK: -			idx = (misc_flag != 0) ? ICONNAME_LANDMARK_VISITED : ICONNAME_LANDMARK; +			idx = (misc_flag != 0) ? LLInventoryType::ICONNAME_LANDMARK_VISITED : LLInventoryType::ICONNAME_LANDMARK;  			break;  		case LLAssetType::AT_SCRIPT:  		case LLAssetType::AT_LSL_TEXT:  		case LLAssetType::AT_LSL_BYTECODE: -			idx = ICONNAME_SCRIPT; +			idx = LLInventoryType::ICONNAME_SCRIPT;  			break;  		case LLAssetType::AT_CLOTHING:  		case LLAssetType::AT_BODYPART:  			idx = assignWearableIcon(misc_flag);  			break;  		case LLAssetType::AT_NOTECARD: -			idx = ICONNAME_NOTECARD; +			idx = LLInventoryType::ICONNAME_NOTECARD;  			break;  		case LLAssetType::AT_ANIMATION: -			idx = ICONNAME_ANIMATION; +			idx = LLInventoryType::ICONNAME_ANIMATION;  			break;  		case LLAssetType::AT_GESTURE: -			idx = ICONNAME_GESTURE; +			idx = LLInventoryType::ICONNAME_GESTURE;  			break;  		case LLAssetType::AT_LINK: -			idx = ICONNAME_LINKITEM; +			idx = LLInventoryType::ICONNAME_LINKITEM;  			break;  		case LLAssetType::AT_LINK_FOLDER: -			idx = ICONNAME_LINKFOLDER; +			idx = LLInventoryType::ICONNAME_LINKFOLDER;  			break;  		case LLAssetType::AT_OBJECT: -			idx = ICONNAME_OBJECT; +			idx = LLInventoryType::ICONNAME_OBJECT;  			break;  		case LLAssetType::AT_MESH: -			idx = ICONNAME_MESH; +			idx = LLInventoryType::ICONNAME_MESH;  		default:  			break;  	} @@ -170,13 +172,13 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,  } -const std::string& LLInventoryIcon::getIconName(EIconName idx) +const std::string& LLInventoryIcon::getIconName(LLInventoryType::EIconName idx)  {  	const IconEntry *entry = LLIconDictionary::instance().lookup(idx);  	return entry->mName;  } -LLInventoryIcon::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag) +LLInventoryType::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag)  {  	const LLWearableType::EType wearable_type = LLWearableType::EType(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & misc_flag);  	return LLWearableType::getIconName(wearable_type); diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h index c7e2998a20..659448143d 100644 --- a/indra/newview/llinventoryicon.h +++ b/indra/newview/llinventoryicon.h @@ -35,66 +35,20 @@  class LLInventoryIcon  {  public: -	enum EIconName -	{ -		ICONNAME_TEXTURE, -		ICONNAME_SOUND, -		ICONNAME_CALLINGCARD_ONLINE, -		ICONNAME_CALLINGCARD_OFFLINE, -		ICONNAME_LANDMARK, -		ICONNAME_LANDMARK_VISITED, -		ICONNAME_SCRIPT, -		ICONNAME_CLOTHING, -		ICONNAME_OBJECT, -		ICONNAME_OBJECT_MULTI, -		ICONNAME_NOTECARD, -		ICONNAME_BODYPART, -		ICONNAME_SNAPSHOT, -		 -		ICONNAME_BODYPART_SHAPE, -		ICONNAME_BODYPART_SKIN, -		ICONNAME_BODYPART_HAIR, -		ICONNAME_BODYPART_EYES, -		ICONNAME_CLOTHING_SHIRT, -		ICONNAME_CLOTHING_PANTS, -		ICONNAME_CLOTHING_SHOES, -		ICONNAME_CLOTHING_SOCKS, -		ICONNAME_CLOTHING_JACKET, -		ICONNAME_CLOTHING_GLOVES, -		ICONNAME_CLOTHING_UNDERSHIRT, -		ICONNAME_CLOTHING_UNDERPANTS, -		ICONNAME_CLOTHING_SKIRT, -		ICONNAME_CLOTHING_ALPHA, -		ICONNAME_CLOTHING_TATTOO, - -		ICONNAME_ANIMATION, -		ICONNAME_GESTURE, - -		ICONNAME_CLOTHING_PHYSICS, -		 -		ICONNAME_LINKITEM, -		ICONNAME_LINKFOLDER, -		ICONNAME_MESH, - -		ICONNAME_INVALID, -		ICONNAME_COUNT, -		ICONNAME_NONE = -1 -	}; -  	static const std::string& getIconName(LLAssetType::EType asset_type,  										  LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE,  										  U32 misc_flag = 0, // different meanings depending on item type  										  BOOL item_is_multi = FALSE); -	static const std::string& getIconName(EIconName idx); +	static const std::string& getIconName(LLInventoryType::EIconName idx);  	static LLUIImagePtr getIcon(LLAssetType::EType asset_type,  								LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE,  								U32 misc_flag = 0, // different meanings depending on item type  								BOOL item_is_multi = FALSE); -	static LLUIImagePtr getIcon(EIconName idx); +	static LLUIImagePtr getIcon(LLInventoryType::EIconName idx);  protected: -	static EIconName assignWearableIcon(U32 misc_flag); +	static LLInventoryType::EIconName assignWearableIcon(U32 misc_flag);  };  #endif // LL_LLINVENTORYICON_H diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 3e0849a795..26041767fd 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -37,6 +37,7 @@  #include "lltextutil.h"  // newview +#include "llinventoryicon.h"  #include "llinventorymodel.h"  #include "llviewerinventory.h" diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 6e23d7c701..ac1f40b486 100644..100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1354,7 +1354,6 @@ void  LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)  	item_array_t items;  	update_map_t update;  	S32 count = content["items"].size(); -	bool all_one_folder = true;  	LLUUID folder_id;  	// Does this loop ever execute more than once?  	for(S32 i = 0; i < count; ++i) @@ -1387,10 +1386,6 @@ void  LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)  		{  			folder_id = titem->getParentUUID();  		} -		else -		{ -			all_one_folder = false; -		}  	}  	U32 changes = 0x0; @@ -2478,7 +2473,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)  	item_array_t items;  	update_map_t update;  	S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); -	bool all_one_folder = true;  	LLUUID folder_id;  	// Does this loop ever execute more than once?  	for(S32 i = 0; i < count; ++i) @@ -2510,10 +2504,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)  		{  			folder_id = titem->getParentUUID();  		} -		else -		{ -			all_one_folder = false; -		}  	}  	if(account)  	{ diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index f4d0110b0f..eb92902de9 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -183,7 +183,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)  void LLInventoryModelBackgroundFetch::backgroundFetch()  { -	if (mBackgroundFetchActive && gAgent.getRegion()) +	if (mBackgroundFetchActive && gAgent.getRegion() && gAgent.getRegion()->capabilitiesReceived())  	{  		// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.  		if (gSavedSettings.getBOOL("UseHTTPInventory"))  diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 05c81957c6..dabb9bb69f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -402,8 +402,6 @@ void LLInventoryPanel::modelChanged(U32 mask)  	static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");  	LLFastTimer t2(FTM_REFRESH); -	bool handled = false; -  	if (!mViewsInitialized) return;  	const LLInventoryModel* model = getModel(); @@ -429,7 +427,6 @@ void LLInventoryPanel::modelChanged(U32 mask)  		// Empty out the display name for relabel.  		if (mask & LLInventoryObserver::LABEL)  		{ -			handled = true;  			if (view_item)  			{  				// Request refresh on this item (also flags for filtering) @@ -448,7 +445,6 @@ void LLInventoryPanel::modelChanged(U32 mask)  		// Destroy and regenerate the UI.  		if (mask & LLInventoryObserver::REBUILD)  		{ -			handled = true;  			if (model_item && view_item)  			{  				view_item->destroyView(); @@ -488,8 +484,6 @@ void LLInventoryPanel::modelChanged(U32 mask)  					LLInventoryObserver::ADD |  					LLInventoryObserver::REMOVE))  		{ -			handled = true; -  			//////////////////////////////  			// ADD Operation  			// Item exists in memory but a UI element hasn't been created for it. diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 97ba5b634a..48f784838c 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -53,7 +53,7 @@  #include "llviewerobject.h"  #include "llface.h"  #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h"  #include "llagentwearables.h"  #include "lltexlayerparams.h"  #include "llvovolume.h" @@ -438,7 +438,7 @@ void LLLocalBitmap::updateUserPrims(LLUUID old_id, LLUUID new_id)  					if (face && face->getTexture() && face->getTexture()->getID() == old_id)  					{  						object->setTEImage(face_iter, LLViewerTextureManager::getFetchedTexture -							(new_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +							(new_id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  						update_obj = true;  					} @@ -481,7 +481,7 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp  	U32 count = gAgentWearables.getWearableCount(type);  	for(U32 wearable_iter = 0; wearable_iter < count; wearable_iter++)  	{ -		LLWearable* wearable = gAgentWearables.getWearable(type, wearable_iter); +		LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, wearable_iter);  		if (wearable)  		{  			std::vector<LLLocalTextureObject*> texture_list = wearable->getLocalTextureListSeq(); @@ -493,11 +493,11 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp  				if (lto && lto->getID() == old_id)  				{  					U32 local_texlayer_index = 0; /* can't keep that as static const, gives errors, so i'm leaving this var here */ -					LLVOAvatarDefines::EBakedTextureIndex baked_texind = +					LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind =  						lto->getTexLayer(local_texlayer_index)->getTexLayerSet()->getBakedTexIndex(); -					LLVOAvatarDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind); -					if (reg_texind != LLVOAvatarDefines::TEX_NUM_INDICES) +					LLAvatarAppearanceDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind); +					if (reg_texind != LLAvatarAppearanceDefines::TEX_NUM_INDICES)  					{  						U32 index = gAgentWearables.getWearableIndex(wearable);  						gAgentAvatarp->setLocalTexture(reg_texind, gTextureList.getImage(new_id), FALSE, index); @@ -513,10 +513,10 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp  	}  } -LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( -	LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind) +LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex( +	LLWearableType::EType type, LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind)  { -	LLVOAvatarDefines::ETextureIndex result = LLVOAvatarDefines::TEX_NUM_INDICES; // using as a default/fail return. +	LLAvatarAppearanceDefines::ETextureIndex result = LLAvatarAppearanceDefines::TEX_NUM_INDICES; // using as a default/fail return.  	switch(type)  	{ @@ -524,32 +524,32 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		{  			switch(baked_texind)  			{ -				case LLVOAvatarDefines::BAKED_EYES: +				case LLAvatarAppearanceDefines::BAKED_EYES:  				{ -					result = LLVOAvatarDefines::TEX_EYES_ALPHA; +					result = LLAvatarAppearanceDefines::TEX_EYES_ALPHA;  					break;  				} -				case LLVOAvatarDefines::BAKED_HAIR: +				case LLAvatarAppearanceDefines::BAKED_HAIR:  				{ -					result = LLVOAvatarDefines::TEX_HAIR_ALPHA; +					result = LLAvatarAppearanceDefines::TEX_HAIR_ALPHA;  					break;  				} -				case LLVOAvatarDefines::BAKED_HEAD: +				case LLAvatarAppearanceDefines::BAKED_HEAD:  				{ -					result = LLVOAvatarDefines::TEX_HEAD_ALPHA; +					result = LLAvatarAppearanceDefines::TEX_HEAD_ALPHA;  					break;  				} -				case LLVOAvatarDefines::BAKED_LOWER: +				case LLAvatarAppearanceDefines::BAKED_LOWER:  				{ -					result = LLVOAvatarDefines::TEX_LOWER_ALPHA; +					result = LLAvatarAppearanceDefines::TEX_LOWER_ALPHA;  					break;  				} -				case LLVOAvatarDefines::BAKED_UPPER: +				case LLAvatarAppearanceDefines::BAKED_UPPER:  				{ -					result = LLVOAvatarDefines::TEX_UPPER_ALPHA; +					result = LLAvatarAppearanceDefines::TEX_UPPER_ALPHA;  					break;  				} @@ -565,9 +565,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_EYES:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_EYES) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_EYES)  			{ -				result = LLVOAvatarDefines::TEX_EYES_IRIS; +				result = LLAvatarAppearanceDefines::TEX_EYES_IRIS;  			}  			break; @@ -575,9 +575,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_GLOVES:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER)  			{ -				result = LLVOAvatarDefines::TEX_UPPER_GLOVES; +				result = LLAvatarAppearanceDefines::TEX_UPPER_GLOVES;  			}  			break; @@ -585,13 +585,13 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_JACKET:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER)  			{ -				result = LLVOAvatarDefines::TEX_LOWER_JACKET; +				result = LLAvatarAppearanceDefines::TEX_LOWER_JACKET;  			} -			else if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) +			else if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER)  			{ -				result = LLVOAvatarDefines::TEX_UPPER_JACKET; +				result = LLAvatarAppearanceDefines::TEX_UPPER_JACKET;  			}  			break; @@ -599,9 +599,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_PANTS:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER)  			{ -				result = LLVOAvatarDefines::TEX_LOWER_PANTS; +				result = LLAvatarAppearanceDefines::TEX_LOWER_PANTS;  			}  			break; @@ -609,9 +609,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_SHIRT:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER)  			{ -				result = LLVOAvatarDefines::TEX_UPPER_SHIRT; +				result = LLAvatarAppearanceDefines::TEX_UPPER_SHIRT;  			}  			break; @@ -619,9 +619,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_SHOES:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER)  			{ -				result = LLVOAvatarDefines::TEX_LOWER_SHOES; +				result = LLAvatarAppearanceDefines::TEX_LOWER_SHOES;  			}  			break; @@ -631,20 +631,20 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		{  			switch(baked_texind)  			{ -				case LLVOAvatarDefines::BAKED_HEAD: +				case LLAvatarAppearanceDefines::BAKED_HEAD:  				{ -					result = LLVOAvatarDefines::TEX_HEAD_BODYPAINT; +					result = LLAvatarAppearanceDefines::TEX_HEAD_BODYPAINT;  					break;  				} -				case LLVOAvatarDefines::BAKED_LOWER: +				case LLAvatarAppearanceDefines::BAKED_LOWER:  				{ -					result = LLVOAvatarDefines::TEX_LOWER_BODYPAINT; +					result = LLAvatarAppearanceDefines::TEX_LOWER_BODYPAINT;  					break;  				} -				case LLVOAvatarDefines::BAKED_UPPER: +				case LLAvatarAppearanceDefines::BAKED_UPPER:  				{ -					result = LLVOAvatarDefines::TEX_UPPER_BODYPAINT; +					result = LLAvatarAppearanceDefines::TEX_UPPER_BODYPAINT;  					break;  				} @@ -659,9 +659,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_SKIRT:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_SKIRT) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_SKIRT)  			{ -				result = LLVOAvatarDefines::TEX_SKIRT; +				result = LLAvatarAppearanceDefines::TEX_SKIRT;  			}  			break; @@ -669,9 +669,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_SOCKS:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER)  			{ -				result = LLVOAvatarDefines::TEX_LOWER_SOCKS; +				result = LLAvatarAppearanceDefines::TEX_LOWER_SOCKS;  			}  			break; @@ -681,20 +681,20 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		{  			switch(baked_texind)  			{ -				case LLVOAvatarDefines::BAKED_HEAD: +				case LLAvatarAppearanceDefines::BAKED_HEAD:  				{ -					result = LLVOAvatarDefines::TEX_HEAD_TATTOO; +					result = LLAvatarAppearanceDefines::TEX_HEAD_TATTOO;  					break;  				} -				case LLVOAvatarDefines::BAKED_LOWER: +				case LLAvatarAppearanceDefines::BAKED_LOWER:  				{ -					result = LLVOAvatarDefines::TEX_LOWER_TATTOO; +					result = LLAvatarAppearanceDefines::TEX_LOWER_TATTOO;  					break;  				} -				case LLVOAvatarDefines::BAKED_UPPER: +				case LLAvatarAppearanceDefines::BAKED_UPPER:  				{ -					result = LLVOAvatarDefines::TEX_UPPER_TATTOO; +					result = LLAvatarAppearanceDefines::TEX_UPPER_TATTOO;  					break;  				} @@ -709,9 +709,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_UNDERPANTS:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER)  			{ -				result = LLVOAvatarDefines::TEX_LOWER_UNDERPANTS; +				result = LLAvatarAppearanceDefines::TEX_LOWER_UNDERPANTS;  			}  			break; @@ -719,9 +719,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(  		case LLWearableType::WT_UNDERSHIRT:  		{ -			if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) +			if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER)  			{ -				result = LLVOAvatarDefines::TEX_UPPER_UNDERSHIRT; +				result = LLAvatarAppearanceDefines::TEX_UPPER_UNDERSHIRT;  			}  			break; diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index 7a23c7ef6e..580b6dfa7e 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -28,11 +28,14 @@  #ifndef LL_LOCALBITMAPS_H  #define LL_LOCALBITMAPS_H +#include "llavatarappearancedefines.h"  #include "lleventtimer.h" +#include "llimage.h" +#include "llpointer.h"  #include "llwearabletype.h" -#include "llvoavatardefines.h"  class LLScrollListCtrl; +class LLViewerObject;  class LLLocalBitmap  { @@ -63,7 +66,7 @@ class LLLocalBitmap  		void updateUserPrims(LLUUID old_id, LLUUID new_id);  		void updateUserSculpts(LLUUID old_id, LLUUID new_id);  		void updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type); -		LLVOAvatarDefines::ETextureIndex getTexIndex(LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind); +		LLAvatarAppearanceDefines::ETextureIndex getTexIndex(LLWearableType::EType type, LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind);  	private: /* private enums */  		enum ELinkStatus diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp deleted file mode 100644 index 07ec0fab95..0000000000 --- a/indra/newview/lllocaltextureobject.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/**  - * @file lllocaltextureobject.cpp - * - * $LicenseInfo:firstyear=2009&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lllocaltextureobject.h" - -#include "lltexlayer.h" -#include "llviewertexture.h" -#include "lltextureentry.h" -#include "lluuid.h" -#include "llwearable.h" - - -LLLocalTextureObject::LLLocalTextureObject() : -	mIsBakedReady(FALSE), -	mDiscard(MAX_DISCARD_LEVEL+1) -{ -	mImage = NULL; -} - -LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id) : -	mIsBakedReady(FALSE), -	mDiscard(MAX_DISCARD_LEVEL+1) -{ -	mImage = image; -	gGL.getTexUnit(0)->bind(mImage); -	mID = id; -} - -LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) : -	mImage(lto.mImage), -	mID(lto.mID), -	mIsBakedReady(lto.mIsBakedReady), -	mDiscard(lto.mDiscard) -{ -	U32 num_layers = lto.getNumTexLayers(); -	mTexLayers.reserve(num_layers); -	for (U32 index = 0; index < num_layers; index++) -	{ -		LLTexLayer* original_layer = lto.getTexLayer(index); -		if (!original_layer) -		{ -			llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl; -			continue; -		} - -		LLTexLayer* new_layer = new LLTexLayer(*original_layer); -		new_layer->setLTO(this); -		mTexLayers.push_back(new_layer); -	} -} - -LLLocalTextureObject::~LLLocalTextureObject() -{ -} - -LLViewerFetchedTexture* LLLocalTextureObject::getImage() const -{ -	return mImage; -} - -LLTexLayer* LLLocalTextureObject::getTexLayer(U32 index) const -{ -	if (index >= getNumTexLayers()) -	{ -		return NULL; -	} - -	return mTexLayers[index]; -} - -LLTexLayer* LLLocalTextureObject::getTexLayer(const std::string &name) -{ -	for( tex_layer_vec_t::iterator iter = mTexLayers.begin(); iter != mTexLayers.end(); iter++) -	{ -		LLTexLayer *layer = *iter; -		if (layer->getName().compare(name) == 0) -		{ -			return layer; -		} -	} - -	return NULL; -} - -U32 LLLocalTextureObject::getNumTexLayers() const -{ -	return mTexLayers.size(); -} - -LLUUID LLLocalTextureObject::getID() const -{ -	return mID; -} - -S32 LLLocalTextureObject::getDiscard() const -{ -	return mDiscard; -} - -BOOL LLLocalTextureObject::getBakedReady() const -{ -	return mIsBakedReady; -} - -void LLLocalTextureObject::setImage(LLViewerFetchedTexture* new_image) -{ -	mImage = new_image; -} - -BOOL LLLocalTextureObject::setTexLayer(LLTexLayer *new_tex_layer, U32 index) -{ -	if (index >= getNumTexLayers() ) -	{ -		return FALSE; -	} - -	if (new_tex_layer == NULL) -	{ -		return removeTexLayer(index); -	} - -	LLTexLayer *layer = new LLTexLayer(*new_tex_layer); -	layer->setLTO(this); - -	if (mTexLayers[index]) -	{ -		delete mTexLayers[index]; -	} -	mTexLayers[index] = layer; - -	return TRUE; -} - -BOOL LLLocalTextureObject::addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable) -{ -	if (new_tex_layer == NULL) -	{ -		return FALSE; -	} - -	LLTexLayer *layer = new LLTexLayer(*new_tex_layer, wearable); -	layer->setLTO(this); -	mTexLayers.push_back(layer); -	return TRUE; -} - -BOOL LLLocalTextureObject::addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable) -{ -	if (new_tex_layer == NULL) -	{ -		return FALSE; -	} - -	LLTexLayer *layer = new LLTexLayer(*new_tex_layer, this, wearable); -	layer->setLTO(this); -	mTexLayers.push_back(layer); -	return TRUE; -} - -BOOL LLLocalTextureObject::removeTexLayer(U32 index) -{ -	if (index >= getNumTexLayers()) -	{ -		return FALSE; -	} -	tex_layer_vec_t::iterator iter = mTexLayers.begin(); -	iter += index; - -	delete *iter; -	mTexLayers.erase(iter); -	return TRUE; -} - -void LLLocalTextureObject::setID(LLUUID new_id) -{ -	mID = new_id; -} - -void LLLocalTextureObject::setDiscard(S32 new_discard) -{ -	mDiscard = new_discard; -} - -void LLLocalTextureObject::setBakedReady(BOOL ready) -{ -	mIsBakedReady = ready; -} - diff --git a/indra/newview/lllocaltextureobject.h b/indra/newview/lllocaltextureobject.h deleted file mode 100644 index b9bfc5472f..0000000000 --- a/indra/newview/lllocaltextureobject.h +++ /dev/null @@ -1,87 +0,0 @@ -/**  - * @file lllocaltextureobject.h - * @brief LLLocalTextureObject class header file - * - * $LicenseInfo:firstyear=2009&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_LOCALTEXTUREOBJECT_H -#define LL_LOCALTEXTUREOBJECT_H - -#include <boost/shared_ptr.hpp> - -#include "llviewertexture.h" - -class LLUUID; -class LLTexLayer; -class LLTextureEntry; -class LLTexLayerTemplate; -class LLWearable; - -// Stores all relevant information for a single texture  -// assumed to have ownership of all objects referred to -  -// will delete objects when being replaced or if object is destroyed. -class LLLocalTextureObject -{ -public: -	LLLocalTextureObject(); -	LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id); -	LLLocalTextureObject(const LLLocalTextureObject& lto); -	~LLLocalTextureObject(); - -	LLViewerFetchedTexture* getImage() const; -	LLTexLayer* getTexLayer(U32 index) const; -	LLTexLayer* getTexLayer(const std::string &name); -	U32 		getNumTexLayers() const; -	LLUUID		getID() const; -	S32			getDiscard() const; -	BOOL		getBakedReady() const; - -	void setImage(LLViewerFetchedTexture* new_image); -	BOOL setTexLayer(LLTexLayer *new_tex_layer, U32 index); -	BOOL addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable); -	BOOL addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable); -	BOOL removeTexLayer(U32 index); - -	void setID(LLUUID new_id); -	void setDiscard(S32 new_discard); -	void setBakedReady(BOOL ready); - -protected: - -private: - -	LLPointer<LLViewerFetchedTexture>  			mImage; -	// NOTE: LLLocalTextureObject should be the exclusive owner of mTexEntry and mTexLayer -	// using shared pointers here only for smart assignment & cleanup -	// do NOT create new shared pointers to these objects, or keep pointers to them around -	typedef std::vector<LLTexLayer*> tex_layer_vec_t; -	tex_layer_vec_t mTexLayers; - -	LLUUID			mID; - -	BOOL mIsBakedReady; -	S32 mDiscard; -}; - - #endif // LL_LOCALTEXTUREOBJECT_H - diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d9d70b50e..5022dba934 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -1217,11 +1217,11 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  	case SCRIPTS_ICON:  	{  		LLViewerRegion* region = gAgent.getRegion(); -		if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsStopped");  		} -		else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) +		else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsNotRunning");  		} diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 826e8d560a..d79f1040bb 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1689,7 +1689,6 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y )  		return;  	} -	LLQuaternion object_rot = first_object->getRenderRotation();  	LLVector3 rotation_center = gAgent.getPosAgentFromGlobal(mRotationCenter);  	LLVector3 mouse_dir_x;  	LLVector3 mouse_dir_y; diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 00a0bf8894..ae0884ac5d 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -1191,9 +1191,6 @@ void LLManipScale::dragFace( S32 x, S32 y )  		mInSnapRegime = FALSE;  	} -	BOOL send_scale_update = FALSE; -	BOOL send_position_update = FALSE; -  	LLVector3 dir_agent;  	if( part_dir_local.mV[VX] )  	{ @@ -1210,8 +1207,6 @@ void LLManipScale::dragFace( S32 x, S32 y )  	stretchFace(   		projected_vec(drag_start_dir_f, dir_agent) + drag_start_center_agent,  		projected_vec(drag_delta, dir_agent)); -	send_position_update = TRUE; -	send_scale_update = TRUE;  	mDragPointGlobal = drag_point_global;  } diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 362308c176..b62db70ec8 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -485,7 +485,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  	}  	// Throttle updates to 10 per second. -	BOOL send_update = FALSE;  	LLVector3		axis_f;  	LLVector3d		axis_d; @@ -702,11 +701,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  				LLVector3 old_position_local = object->getPosition();  				LLVector3 new_position_local = selectNode->mSavedPositionLocal + (clamped_relative_move_f * objWorldRotation); -				// move and clamp root object first, before adjusting children -				if (new_position_local != old_position_local) -				{ -					send_update = TRUE; -				}  				//RN: I forget, but we need to do this because of snapping which doesn't often result  				// in position changes even when the mouse moves  				object->setPosition(new_position_local); @@ -716,8 +710,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  				if (selectNode->mIndividualSelection)  				{ -					send_update = FALSE; -		  					// counter-translate child objects if we are moving the root as an individual  					object->resetChildrenPosition(old_position_local - new_position_local, TRUE) ;					  				} @@ -753,7 +745,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  				}  				// PR: Only update if changed -				LLVector3d old_position_global = object->getPositionGlobal();  				LLVector3 old_position_agent = object->getPositionAgent();  				LLVector3 new_position_agent = gAgent.getPosAgentFromGlobal(new_position_global);  				if (object->isRootEdit()) @@ -775,11 +766,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  				{  					// counter-translate child objects if we are moving the root as an individual  					object->resetChildrenPosition(old_position_agent - new_position_agent, TRUE) ;					 -					send_update = FALSE; -				} -				else if (old_position_global != new_position_global) -				{ -					send_update = TRUE;  				}  			}  			selectNode->mLastPositionLocal  = object->getPosition(); @@ -1310,7 +1296,6 @@ void LLManipTranslate::renderSnapGuides()  					// add in off-axis offset  					tick_start += (mSnapOffsetAxis * mSnapOffsetMeters); -					BOOL is_sub_tick = FALSE;  					F32 tick_scale = 1.f;  					for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  					{ @@ -1319,7 +1304,6 @@ void LLManipTranslate::renderSnapGuides()  							break;  						}  						tick_scale *= 0.7f; -						is_sub_tick = TRUE;  					}  // 					S32 num_ticks_to_fade = is_sub_tick ? num_ticks_per_side / 2 : num_ticks_per_side; @@ -1542,7 +1526,6 @@ void LLManipTranslate::renderSnapGuides()  		float a = line_alpha; -		LLColor4 col = LLUIColorTable::instance().getColor("SilhouetteChildColor");  		{  			//draw grid behind objects  			LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 99b4707158..2075aeed63 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -119,8 +119,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]); -		S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]); +		S32 screen_width = llround((F32)getRect().getWidth() * LLUI::getScaleFactor().mV[VX]); +		S32 screen_height = llround((F32)getRect().getHeight() * LLUI::getScaleFactor().mV[VY]);  		setTextureSize(screen_width, screen_height);  	} @@ -469,8 +469,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )  {  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); -		S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); +		S32 screen_width = llround((F32)width * LLUI::getScaleFactor().mV[VX]); +		S32 screen_height = llround((F32)height * LLUI::getScaleFactor().mV[VY]);  		// when floater is minimized, these sizes are negative  		if ( screen_height > 0 && screen_width > 0 ) @@ -667,7 +667,7 @@ bool LLMediaCtrl::ensureMediaSourceExists()  			mMediaSource->addObserver( this );  			mMediaSource->setBackgroundColor( getBackgroundColor() );  			mMediaSource->setTrustedBrowser(mTrusted); -			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); +			mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );  			if(mClearCache)  			{ @@ -750,7 +750,7 @@ void LLMediaCtrl::draw()  	{  		gGL.pushUIMatrix();  		{ -			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); +			mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );  			// scale texture to fit the space using texture coords  			gGL.getTexUnit(0)->bind(media_texture); @@ -864,14 +864,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  		coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL();  	} -	x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]); +	x = llround((F32)x * LLUI::getScaleFactor().mV[VX]);  	if ( ! coords_opengl )  	{ -		y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]); +		y = llround((F32)(y) * LLUI::getScaleFactor().mV[VY]);  	}  	else  	{ -		y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]); +		y = llround((F32)(getRect().getHeight() - y) * LLUI::getScaleFactor().mV[VY]);  	};  } diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index ba0a590910..32da18f0b3 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3088,6 +3088,7 @@ void LLPhysicsDecomp::doDecomposition()  		param_map[params[i].mName] = params+i;  	} +	U32 ret = LLCD_OK;  	//set parameter values  	for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)  	{ @@ -3101,7 +3102,6 @@ void LLPhysicsDecomp::doDecomposition()  			continue;  		} -		U32 ret = LLCD_OK;  		if (param->mType == LLCDParam::LLCD_FLOAT)  		{ @@ -3120,8 +3120,6 @@ void LLPhysicsDecomp::doDecomposition()  	mCurRequest->setStatusMessage("Executing."); -	LLCDResult ret = LLCD_OK; -	  	if (LLConvexDecomposition::getInstance() != NULL)  	{  		ret = LLConvexDecomposition::getInstance()->executeStage(stage); diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp index eaa044cb59..252d1b78ea 100644 --- a/indra/newview/llmorphview.cpp +++ b/indra/newview/llmorphview.cpp @@ -99,8 +99,6 @@ void	LLMorphView::initialize()  //-----------------------------------------------------------------------------  void	LLMorphView::shutdown()  { -	LLVOAvatarSelf::onCustomizeEnd(); -  	if (isAgentAvatarValid())  	{  		gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE ); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 1bda7640bd..dea90b9042 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -150,7 +150,7 @@ void LLNetMap::draw()  	static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white);  	static LLUIColor map_avatar_friend_color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white);  	static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); -	static LLUIColor map_track_disabled_color = LLUIColorTable::instance().getColor("MapTrackDisabledColor", LLColor4::white); +	//static LLUIColor map_track_disabled_color = LLUIColorTable::instance().getColor("MapTrackDisabledColor", LLColor4::white);  	static LLUIColor map_frustum_color = LLUIColorTable::instance().getColor("MapFrustumColor", LLColor4::white);  	static LLUIColor map_frustum_rotating_color = LLUIColorTable::instance().getColor("MapFrustumRotatingColor", LLColor4::white); diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 6889b98ab1..862e4be203 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -55,6 +55,7 @@  #include "lltrans.h"  #include "llscrollcontainer.h"  #include "llstatusbar.h" +#include "llviewertexture.h"  const S32 MINIMUM_PRICE_FOR_LISTING = 50;	// L$ diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 77e1487f38..1a427338e5 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -78,8 +78,6 @@ const char* LLPanelContents::PERMS_ANYONE_CONTROL_KEY = "perms_anyone_control";  BOOL LLPanelContents::postBuild()  { -	LLRect rect = this->getRect(); -  	setMouseOpaque(FALSE);  	childSetAction("button new script",&LLPanelContents::onClickNewScript, this); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index d42056ef9d..43344fd60e 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -28,7 +28,7 @@  #include "llpaneleditwearable.h"  #include "llpanel.h" -#include "llwearable.h" +#include "llviewerwearable.h"  #include "lluictrl.h"  #include "llscrollingpanellist.h"  #include "llvisualparam.h" @@ -104,7 +104,7 @@ enum ESubpart {          SUBPART_PHYSICS_ADVANCED,   }; -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  typedef std::vector<ESubpart> subpart_vec_t; @@ -762,11 +762,11 @@ BOOL LLPanelEditWearable::postBuild()          mWearablePtr = NULL; -        configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); -        configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); -        configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); -        configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); -        configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); +        configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); +        configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); +        configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); +        configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); +        configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible");          // configure tab expanded callbacks          for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) @@ -865,7 +865,7 @@ void LLPanelEditWearable::setVisible(BOOL visible)          LLPanel::setVisible(visible);  } -void LLPanelEditWearable::setWearable(LLWearable *wearable, BOOL disable_camera_switch) +void LLPanelEditWearable::setWearable(LLViewerWearable *wearable, BOOL disable_camera_switch)  {          showWearable(mWearablePtr, FALSE, disable_camera_switch);          mWearablePtr = wearable; @@ -922,7 +922,7 @@ void LLPanelEditWearable::onCommitSexChange()          }          bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; -        LLWearable*     wearable = gAgentWearables.getWearable(type, index); +        LLViewerWearable*     wearable = gAgentWearables.getViewerWearable(type, index);          if (wearable)          {                  wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); @@ -1007,13 +1007,11 @@ void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type)                  return;          bool is_modifiable = false; -        bool is_copyable   = false;          if(mWearableItem)          {                  const LLPermissions& perm = mWearableItem->getPermissions();                  is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); -                is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());          }          if (is_modifiable) @@ -1044,7 +1042,7 @@ void LLPanelEditWearable::saveChanges(bool force_save_as)          if (force_save_as)          {                  // the name of the wearable has changed, re-save wearable with new name -                LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); +                LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID());                  gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE);                  mNameEditor->setText(mWearableItem->getName());          } @@ -1069,7 +1067,7 @@ void LLPanelEditWearable::revertChanges()          gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE);  } -void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch) +void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, BOOL show, BOOL disable_camera_switch)  {          if (!wearable)          { @@ -1440,12 +1438,11 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value          {                  panel_list->clearPanels();                  value_map_t::iterator end = sorted_params.end(); -                S32 height = 0;                  for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it)                  {                          LLPanel::Params p;                          p.name("LLScrollingPanelParam"); -                        LLWearable *wearable = this->getWearable(); +                        LLViewerWearable *wearable = this->getWearable();                          LLScrollingPanelParamBase *panel_param = NULL;                          if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics.  Should generalize this later.                          { @@ -1455,7 +1452,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value                          {                                  panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);                          } -                        height = panel_list->addPanel( panel_param ); +                        panel_list->addPanel( panel_param );                  }          }  } @@ -1505,7 +1502,7 @@ void LLPanelEditWearable::updateVerbs()          }  } -void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name) +void LLPanelEditWearable::configureAlphaCheckbox(LLAvatarAppearanceDefines::ETextureIndex te, const std::string& name)  {          LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);          checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); @@ -1513,7 +1510,7 @@ void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureInde          mAlphaCheckbox2Index[name] = te;  } -void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te) +void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te)  {          if (!checkbox_ctrl) return;          if (!getWearable()) return; @@ -1557,7 +1554,7 @@ void LLPanelEditWearable::updateAlphaCheckboxes()          for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();                  iter != mAlphaCheckbox2Index.end(); ++iter )          { -                LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; +                LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)iter->second;                  LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);                  if (ctrl)                  { @@ -1575,7 +1572,7 @@ void LLPanelEditWearable::initPreviousAlphaTextures()          initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);  } -void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te) +void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLAvatarAppearanceDefines::ETextureIndex te)  {          LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);          if (lto) diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 692a7ce90f..309d512e23 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -30,12 +30,12 @@  #include "llpanel.h"  #include "llscrollingpanellist.h"  #include "llmodaldialog.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h"  #include "llwearabletype.h"  class LLAccordionCtrl;  class LLCheckBoxCtrl; -class LLWearable; +class LLViewerWearable;  class LLTextBox;  class LLViewerInventoryItem;  class LLViewerVisualParam; @@ -58,8 +58,8 @@ public:  	// changes camera angle to default for selected subpart  	void				changeCamera(U8 subpart); -	LLWearable* 		getWearable() { return mWearablePtr; } -	void				setWearable(LLWearable *wearable, BOOL disable_camera_switch = FALSE); +	LLViewerWearable*	getWearable() { return mWearablePtr; } +	void				setWearable(LLViewerWearable *wearable, BOOL disable_camera_switch = FALSE);  	void				saveChanges(bool force_save_as = false);  	void				revertChanges(); @@ -80,7 +80,7 @@ public:  private:  	typedef std::map<F32, LLViewerVisualParam*> value_map_t; -	void				showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE); +	void				showWearable(LLViewerWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE);  	void				updateScrollingPanelUI();  	LLPanel*			getPanel(LLWearableType::EType type);  	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group); @@ -95,11 +95,11 @@ private:  	void				updateTypeSpecificControls(LLWearableType::EType type);  	//alpha mask checkboxes -	void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name); -	void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te); +	void configureAlphaCheckbox(LLAvatarAppearanceDefines::ETextureIndex te, const std::string& name); +	void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te);  	void updateAlphaCheckboxes();  	void initPreviousAlphaTextures(); -	void initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te); +	void initPreviousAlphaTextureEntry(LLAvatarAppearanceDefines::ETextureIndex te);  	// callback for HeightUnits parameter.  	bool changeHeightUnits(const LLSD& new_value); @@ -115,7 +115,7 @@ private:  	void setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel);  	// the pointer to the wearable we're editing. NULL means we're not editing a wearable. -	LLWearable *mWearablePtr; +	LLViewerWearable *mWearablePtr;  	LLViewerInventoryItem* mWearableItem;  	// these are constant no matter what wearable we're editing @@ -165,10 +165,10 @@ private:  	LLPanel *mPanelTattoo;  	LLPanel *mPanelPhysics; -	typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t; +	typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t;  	string_texture_index_map_t mAlphaCheckbox2Index; -	typedef std::map<LLVOAvatarDefines::ETextureIndex, LLUUID> s32_uuid_map_t; +	typedef std::map<LLAvatarAppearanceDefines::ETextureIndex, LLUUID> s32_uuid_map_t;  	s32_uuid_map_t mPreviousAlphaTexture;  }; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 202be9671b..445c0d811f 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -84,7 +84,6 @@ BOOL	LLPanelFace::postBuild()  	childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this);  	childSetAction("button align",&LLPanelFace::onClickAutoFix,this); -	LLRect	rect = this->getRect();  	LLTextureCtrl*	mTextureCtrl;  	LLColorSwatchCtrl*	mColorSwatch; diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 37755fb851..c927aeacb3 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -1383,13 +1383,11 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  	S32 cur_land_tax;  	S32 cur_group_tax;  	S32 cur_parcel_dir_fee; -	S32 cur_total_tax;  	S32 proj_object_tax;  	S32 proj_light_tax;  	S32 proj_land_tax;  	S32 proj_group_tax;  	S32 proj_parcel_dir_fee; -	S32 proj_total_tax;  	S32	non_exempt_members;  	msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_IntervalDays, interval_days ); @@ -1413,8 +1411,6 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  	msg->getStringFast(_PREHASH_MoneyData, _PREHASH_LastTaxDate, last_stipend_date);  	msg->getStringFast(_PREHASH_MoneyData, _PREHASH_TaxDate, next_stipend_date); -	cur_total_tax = cur_object_tax + cur_light_tax + cur_land_tax + cur_group_tax +  cur_parcel_dir_fee; -	proj_total_tax = proj_object_tax + proj_light_tax + proj_land_tax + proj_group_tax + proj_parcel_dir_fee;  	if (interval_days != mImplementationp->mIntervalLength ||   		current_interval != mImplementationp->mCurrentInterval) diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 31c0e3d01a..9a3ea0774b 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -35,6 +35,7 @@  #include "llviewerinventory.h"  #include "llinventorydefines.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "llinventorymodel.h"  #include "llfloaterinventory.h"  #include "llagent.h" diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 04c1a86f69..5321ebc777 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -166,7 +166,7 @@ void LLPanelLandInfo::refresh()  		getChildView("button abandon land")->setEnabled(owner_release || manager_releaseable || gAgent.isGodlike());  		// only mainland sims are subdividable by owner -		if (regionp->getRegionFlags() && REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (regionp->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			getChildView("button subdivide land")->setEnabled(owner_divide || manager_divideable || gAgent.isGodlike());  		} diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index c57746ec00..5c9b968ac9 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -209,24 +209,6 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)  		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));  	} -	S32 region_x; -	S32 region_y; -	S32 region_z; - -	// If the region position is zero, grab position from the global -	if(mPosRegion.isExactlyZero()) -	{ -		region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS; -		region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS; -		region_z = llround(parcel_data.global_z); -	} -	else -	{ -		region_x = llround(mPosRegion.mV[VX]); -		region_y = llround(mPosRegion.mV[VY]); -		region_z = llround(mPosRegion.mV[VZ]); -	} -  	LLSD info;  	info["update_verbs"] = true;  	info["global_x"] = parcel_data.global_x; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index d87b565b32..25ef9a3d6a 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -439,10 +439,9 @@ void LLPanelObject::getState( )  	mCtrlRotY->setEnabled( enable_rotate );  	mCtrlRotZ->setEnabled( enable_rotate ); -	BOOL owners_identical;  	LLUUID owner_id;  	std::string owner_name; -	owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); +	LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);  	// BUG? Check for all objects being editable?  	S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 1ca24f3031..7c3425d71b 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -47,6 +47,7 @@  #include "llfolderview.h"  #include "llinventorybridge.h"  #include "llinventorydefines.h" +#include "llinventoryicon.h"  #include "llinventoryfilter.h"  #include "llinventoryfunctions.h"  #include "llpreviewanim.h" diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 51ab7649a4..bc6ae35fda 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -365,10 +365,8 @@ void LLPanelPermissions::refresh()  	// Update creator text field  	getChildView("Creator:")->setEnabled(TRUE); -	BOOL creators_identical;  	std::string creator_name; -	creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, -																	  creator_name); +	LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, creator_name);  	getChild<LLUICtrl>("Creator Name")->setValue(creator_name);  	getChildView("Creator Name")->setEnabled(TRUE); diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index ce8057eead..884de65dd8 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -572,7 +572,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			mSubdivideText->setText(getString("can_change"));  		} @@ -580,7 +580,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		{  			mSubdivideText->setText(getString("can_not_change"));  		} -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			mResaleText->setText(getString("can_not_resell"));  		} diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 280cc11179..fbd86df1f3 100644 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -415,11 +415,11 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)  	case SCRIPTS_ICON:  	{  		LLViewerRegion* region = gAgent.getRegion(); -		if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsStopped");  		} -		else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) +		else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsNotRunning");  		} diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 13b746dbab..02d363d795 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -252,10 +252,9 @@ void LLPanelVolume::getState( )  		return;  	} -	BOOL owners_identical;  	LLUUID owner_id;  	std::string owner_name; -	owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); +	LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);  	// BUG? Check for all objects being editable?  	BOOL editable = root_objectp->permModify() && !root_objectp->isPermanentEnforced(); diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 3b9934d4be..aa3ed22bee 100644..100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -77,11 +77,7 @@ private:  	{  		uuid_vec_t selected_uuids;  		mPanelWearing->getSelectedItemsUUIDs(selected_uuids); - -		for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) -		{ -				LLAppearanceMgr::instance().removeItemFromAvatar(*it); -		} +		LLAppearanceMgr::instance().removeItemsFromAvatar(selected_uuids);  	}  	LLToggleableMenu*		mMenu; @@ -97,12 +93,11 @@ protected:  	{  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -  		registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); -		registrar.add("Wearing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); -		registrar.add("Wearing.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); - +		registrar.add("Wearing.TakeOff", +					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); +		registrar.add("Wearing.Detach",  +					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");  		updateMenuItemsVisibility(menu); diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index cb6989c9dd..3ee0746412 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -166,7 +166,7 @@ protected:  		} -        void setParamValue(LLViewerVisualParam *param, +        void setParamValue(const LLViewerVisualParam *param,                             const F32 new_value_local,                                                     F32 behavior_maxeffect); @@ -428,14 +428,13 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world)  F32 LLPhysicsMotion::calculateVelocity_local()  {  	const F32 world_to_model_scale = 100.0f; -        LLJoint *joint = mJointState->getJoint(); -        const LLVector3 position_world = joint->getWorldPosition(); -        const LLQuaternion rotation_world = joint->getWorldRotation(); -        const LLVector3 last_position_world = mPosition_world; +	LLJoint *joint = mJointState->getJoint(); +	const LLVector3 position_world = joint->getWorldPosition(); +	const LLVector3 last_position_world = mPosition_world;  	const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; -        const LLVector3 velocity_world = positionchange_world; -        const F32 velocity_local = toLocal(velocity_world); -        return velocity_local; +	const LLVector3 velocity_world = positionchange_world; +	const F32 velocity_local = toLocal(velocity_world); +	return velocity_local;  }  F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) @@ -673,12 +672,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)  								 0,  								 FALSE);  			} -			for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); -			     iter != driver_param->mDriven.end(); -			     ++iter) +			S32 num_driven = driver_param->getDrivenParamsCount(); +			for (S32 i = 0; i < num_driven; ++i)  			{ -				LLDrivenEntry &entry = (*iter); -				LLViewerVisualParam *driven_param = entry.mParam; +				const LLViewerVisualParam *driven_param = driver_param->getDrivenParam(i);  				setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);  			}  		} @@ -758,7 +755,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)  }  // Range of new_value_local is assumed to be [0 , 1] normalized. -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, +void LLPhysicsMotion::setParamValue(const LLViewerVisualParam *param,                                      F32 new_value_normalized,  				    F32 behavior_maxeffect)  { diff --git a/indra/newview/llpipelinelistener.cpp b/indra/newview/llpipelinelistener.cpp new file mode 100644 index 0000000000..20759239bf --- /dev/null +++ b/indra/newview/llpipelinelistener.cpp @@ -0,0 +1,216 @@ +/** + * @file   llpipelinelistener.h + * @author Don Kjer + * @date   2012-07-09 + * @brief  Implementation for LLPipelineListener + *  + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2012, 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$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" + +#include "llpipelinelistener.h" + +#include "pipeline.h" +#include "stringize.h" +#include <sstream> +#include "llviewermenu.h" + + +namespace { +	// Render Types +	void toggle_render_types_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["types"].beginArray(); +			iter != request["types"].endArray(); +			++iter) +		{ +			U32 render_type = render_type_from_string( iter->asString() ); +			if ( render_type != 0 ) +			{ +				LLPipeline::toggleRenderTypeControl( (void*) render_type ); +			} +		} +	} + +	void has_render_type_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 render_type = render_type_from_string( request["type"].asString() ); +		if ( render_type != 0 ) +		{ +			response["value"] = LLPipeline::hasRenderTypeControl( (void*) render_type ); +		} +		else +		{ +			response.error(STRINGIZE("unknown type '" << request["type"].asString() << "'")); +		} +	} + +	void disable_all_render_types_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderTypes(); +	} + +	void enable_all_render_types_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderTypes(); +	} + +	// Render Features +	void toggle_render_features_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["features"].beginArray(); +			iter != request["features"].endArray(); +			++iter) +		{ +			U32 render_feature = feature_from_string( iter->asString() ); +			if ( render_feature != 0 ) +			{ +				LLPipeline::toggleRenderDebugControl( (void*) render_feature ); +			} +		} +	} + +	void has_render_feature_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 render_feature = feature_from_string( request["feature"].asString() ); +		if ( render_feature != 0 ) +		{ +			response["value"] = gPipeline.hasRenderDebugFeatureMask(render_feature); +		} +		else +		{ +			response.error(STRINGIZE("unknown feature '" << request["feature"].asString() << "'")); +		} +	} + +	void disable_all_render_features_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderDebugFeatures(); +	} + +	void enable_all_render_features_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderDebugFeatures(); +	} + +	// Render Info Displays +	void toggle_info_displays_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["displays"].beginArray(); +			iter != request["displays"].endArray(); +			++iter) +		{ +			U32 info_display = info_display_from_string( iter->asString() ); +			if ( info_display != 0 ) +			{ +				LLPipeline::toggleRenderDebug( (void*) info_display ); +			} +		} +	} + +	void has_info_display_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 info_display = info_display_from_string( request["display"].asString() ); +		if ( info_display != 0 ) +		{ +			response["value"] = gPipeline.hasRenderDebugMask(info_display); +		} +		else +		{ +			response.error(STRINGIZE("unknown display '" << request["display"].asString() << "'")); +		} +	} + +	void disable_all_info_displays_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderDebugDisplays(); +	} + +	void enable_all_info_displays_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderDebugDisplays(); +	} + +} + + +LLPipelineListener::LLPipelineListener(): +	LLEventAPI("LLPipeline", +			   "API to te rendering pipeline.") +{ +	// Render Types +	add("toggleRenderTypes", +		"Toggle rendering [\"types\"]:\n" +		"See: llviewermenu.cpp:render_type_from_string for list of available types.", +		&toggle_render_types_wrapper); +	add("hasRenderType", +		"Check if rendering [\"type\"] is enabled:\n" +		"See: llviewermenu.cpp:render_type_from_string for list of available types.", +		&has_render_type_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderTypes", +		"Turn off all rendering types.", +		&disable_all_render_types_wrapper); +	add("enableAllRenderTypes", +		"Turn on all rendering types.", +		&enable_all_render_types_wrapper); + +	// Render Features +	add("toggleRenderFeatures", +		"Toggle rendering [\"features\"]:\n" +		"See: llviewermenu.cpp:feature_from_string for list of available features.", +		&toggle_render_features_wrapper); +	add("hasRenderFeature", +		"Check if rendering [\"feature\"] is enabled:\n" +		"See: llviewermenu.cpp:render_feature_from_string for list of available features.", +		&has_render_feature_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderFeatures", +		"Turn off all rendering features.", +		&disable_all_render_features_wrapper); +	add("enableAllRenderFeatures", +		"Turn on all rendering features.", +		&enable_all_render_features_wrapper); + +	// Render Info Displays +	add("toggleRenderInfoDisplays", +		"Toggle info [\"displays\"]:\n" +		"See: llviewermenu.cpp:info_display_from_string for list of available displays.", +		&toggle_info_displays_wrapper); +	add("hasRenderInfoDisplay", +		"Check if info [\"display\"] is enabled:\n" +		"See: llviewermenu.cpp:info_display_from_string for list of available displays.", +		&has_info_display_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderInfoDisplays", +		"Turn off all info displays.", +		&disable_all_info_displays_wrapper); +	add("enableAllRenderInfoDisplays", +		"Turn on all info displays.", +		&enable_all_info_displays_wrapper); +} + diff --git a/indra/newview/llpipelinelistener.h b/indra/newview/llpipelinelistener.h new file mode 100644 index 0000000000..da1898e57b --- /dev/null +++ b/indra/newview/llpipelinelistener.h @@ -0,0 +1,41 @@ +/** + * @file   llpipelinelistener.h + * @author Don Kjer + * @date   2012-07-09 + * @brief  Wrap subset of LLPipeline API in event API + *  + * $LicenseInfo:firstyear=2012&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$ + */ + +#if ! defined(LL_LLPIPELINELISTENER_H) +#define LL_LLPIPELINELISTENER_H + +#include "lleventapi.h" + +/// Listen on an LLEventPump with specified name for LLPipeline request events. +class LLPipelineListener: public LLEventAPI +{ +public: +	LLPipelineListener(); +}; + +#endif /* ! defined(LL_LLPIPELINELISTENER_H) */ diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp deleted file mode 100644 index 9902d047e4..0000000000 --- a/indra/newview/llpolymesh.cpp +++ /dev/null @@ -1,1297 +0,0 @@ -/**  - * @file llpolymesh.cpp - * @brief Implementation of LLPolyMesh 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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llfasttimer.h" -#include "llmemory.h" - -#include "llviewercontrol.h" -#include "llxmltree.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "lldir.h" -#include "llvolume.h" -#include "llendianswizzle.h" - -#include "llpolymesh.h" - -#define HEADER_ASCII "Linden Mesh 1.0" -#define HEADER_BINARY "Linden Binary Mesh 1.0" - -extern LLControlGroup gSavedSettings;                           // read only - -LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, -					     const std::string &name); -LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, -					     const LLVector3 &direction, -					     const std::string &name); -LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, -                                            F32 scale, -                                            const std::string &name); - -//----------------------------------------------------------------------------- -// Global table of loaded LLPolyMeshes -//----------------------------------------------------------------------------- -LLPolyMesh::LLPolyMeshSharedDataTable LLPolyMesh::sGlobalSharedMeshList; - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData() -//----------------------------------------------------------------------------- -LLPolyMeshSharedData::LLPolyMeshSharedData() -{ -        mNumVertices = 0; -        mBaseCoords = NULL; -        mBaseNormals = NULL; -        mBaseBinormals = NULL; -        mTexCoords = NULL; -        mDetailTexCoords = NULL; -        mWeights = NULL; -        mHasWeights = FALSE; -        mHasDetailTexCoords = FALSE; - -        mNumFaces = 0; -        mFaces = NULL; - -        mNumJointNames = 0; -        mJointNames = NULL; - -        mTriangleIndices = NULL; -        mNumTriangleIndices = 0; - -        mReferenceData = NULL; - -        mLastIndexOffset = -1; -} - -//----------------------------------------------------------------------------- -// ~LLPolyMeshSharedData() -//----------------------------------------------------------------------------- -LLPolyMeshSharedData::~LLPolyMeshSharedData() -{ -        freeMeshData(); -        for_each(mMorphData.begin(), mMorphData.end(), DeletePointer()); -        mMorphData.clear(); -} - -//----------------------------------------------------------------------------- -// setupLOD() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data) -{ -        mReferenceData = reference_data; - -        if (reference_data) -        { -                mBaseCoords = reference_data->mBaseCoords; -                mBaseNormals = reference_data->mBaseNormals; -                mBaseBinormals = reference_data->mBaseBinormals; -                mTexCoords = reference_data->mTexCoords; -                mDetailTexCoords = reference_data->mDetailTexCoords; -                mWeights = reference_data->mWeights; -                mHasWeights = reference_data->mHasWeights; -                mHasDetailTexCoords = reference_data->mHasDetailTexCoords; -        } -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::freeMeshData() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::freeMeshData() -{ -        if (!mReferenceData) -        { -                mNumVertices = 0; - -                ll_aligned_free_16(mBaseCoords); -                mBaseCoords = NULL; - -                ll_aligned_free_16(mBaseNormals); -                mBaseNormals = NULL; - -                ll_aligned_free_16(mBaseBinormals); -                mBaseBinormals = NULL; - -                ll_aligned_free_16(mTexCoords); -                mTexCoords = NULL; - -                ll_aligned_free_16(mDetailTexCoords); -                mDetailTexCoords = NULL; - -                ll_aligned_free_16(mWeights); -                mWeights = NULL; -        } - -        mNumFaces = 0; -        delete [] mFaces; -        mFaces = NULL; - -        mNumJointNames = 0; -        delete [] mJointNames; -        mJointNames = NULL; - -        delete [] mTriangleIndices; -        mTriangleIndices = NULL; - -//      mVertFaceMap.deleteAllData(); -} - -// compate_int is used by the qsort function to sort the index array -int compare_int(const void *a, const void *b); - -//----------------------------------------------------------------------------- -// genIndices() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::genIndices(S32 index_offset) -{ -        if (index_offset == mLastIndexOffset) -        { -                return; -        } - -        delete []mTriangleIndices; -        mTriangleIndices = new U32[mNumTriangleIndices]; - -        S32 cur_index = 0; -        for (S32 i = 0; i < mNumFaces; i++) -        { -                mTriangleIndices[cur_index] = mFaces[i][0] + index_offset; -                cur_index++; -                mTriangleIndices[cur_index] = mFaces[i][1] + index_offset; -                cur_index++; -                mTriangleIndices[cur_index] = mFaces[i][2] + index_offset; -                cur_index++; -        } - -        mLastIndexOffset = index_offset; -} - -//-------------------------------------------------------------------- -// LLPolyMeshSharedData::getNumKB() -//-------------------------------------------------------------------- -U32 LLPolyMeshSharedData::getNumKB() -{ -        U32 num_kb = sizeof(LLPolyMesh); - -        if (!isLOD()) -        { -                num_kb += mNumVertices * -                        ( sizeof(LLVector3) +   // coords -                          sizeof(LLVector3) +             // normals -                          sizeof(LLVector2) );    // texCoords -        } - -        if (mHasDetailTexCoords && !isLOD()) -        { -                num_kb += mNumVertices * sizeof(LLVector2);     // detailTexCoords -        } - -        if (mHasWeights && !isLOD()) -        { -                num_kb += mNumVertices * sizeof(float);         // weights -        } - -        num_kb += mNumFaces * sizeof(LLPolyFace);       // faces - -        num_kb /= 1024; -        return num_kb; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateVertexData() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices ) -{ -        U32 i; -        mBaseCoords = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); -        mBaseNormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); -        mBaseBinormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); -        mTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2)); -        mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2)); -        mWeights = (F32*) ll_aligned_malloc_16(numVertices*sizeof(F32)); -        for (i = 0; i < numVertices; i++) -        { -			mBaseCoords[i].clear(); -			mBaseNormals[i].clear(); -			mBaseBinormals[i].clear(); -			mTexCoords[i].clear(); -			mWeights[i] = 0.f; -        } -        mNumVertices = numVertices; -        return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateFaceData() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces ) -{ -        mFaces = new LLPolyFace[ numFaces ]; -        mNumFaces = numFaces; -        mNumTriangleIndices = mNumFaces * 3; -        return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateJointNames() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames ) -{ -        mJointNames = new std::string[ numJointNames ]; -        mNumJointNames = numJointNames; -        return TRUE; -} - -//-------------------------------------------------------------------- -// LLPolyMeshSharedData::loadMesh() -//-------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) -{ -        //------------------------------------------------------------------------- -        // Open the file -        //------------------------------------------------------------------------- -        if(fileName.empty()) -        { -                llerrs << "Filename is Empty!" << llendl; -                return FALSE; -        } -        LLFILE* fp = LLFile::fopen(fileName, "rb");                     /*Flawfinder: ignore*/ -        if (!fp) -        { -                llerrs << "can't open: " << fileName << llendl; -                return FALSE; -        } - -        //------------------------------------------------------------------------- -        // Read a chunk -        //------------------------------------------------------------------------- -        char header[128];               /*Flawfinder: ignore*/ -        if (fread(header, sizeof(char), 128, fp) != 128) -        { -                llwarns << "Short read" << llendl; -        } - -        //------------------------------------------------------------------------- -        // Check for proper binary header -        //------------------------------------------------------------------------- -        BOOL status = FALSE; -        if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 )       /*Flawfinder: ignore*/ -        { -                lldebugs << "Loading " << fileName << llendl; - -                //---------------------------------------------------------------- -                // File Header (seek past it) -                //---------------------------------------------------------------- -                fseek(fp, 24, SEEK_SET); - -                //---------------------------------------------------------------- -                // HasWeights -                //---------------------------------------------------------------- -                U8 hasWeights; -                size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp); -                if (numRead != 1) -                { -                        llerrs << "can't read HasWeights flag from " << fileName << llendl; -                        return FALSE; -                } -                if (!isLOD()) -                { -                        mHasWeights = (hasWeights==0) ? FALSE : TRUE; -                } - -                //---------------------------------------------------------------- -                // HasDetailTexCoords -                //---------------------------------------------------------------- -                U8 hasDetailTexCoords; -                numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp); -                if (numRead != 1) -                { -                        llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; -                        return FALSE; -                } - -                //---------------------------------------------------------------- -                // Position -                //---------------------------------------------------------------- -                LLVector3 position; -                numRead = fread(position.mV, sizeof(float), 3, fp); -                llendianswizzle(position.mV, sizeof(float), 3); -                if (numRead != 3) -                { -                        llerrs << "can't read Position from " << fileName << llendl; -                        return FALSE; -                } -                setPosition( position ); - -                //---------------------------------------------------------------- -                // Rotation -                //---------------------------------------------------------------- -                LLVector3 rotationAngles; -                numRead = fread(rotationAngles.mV, sizeof(float), 3, fp); -                llendianswizzle(rotationAngles.mV, sizeof(float), 3); -                if (numRead != 3) -                { -                        llerrs << "can't read RotationAngles from " << fileName << llendl; -                        return FALSE; -                } - -                U8 rotationOrder; -                numRead = fread(&rotationOrder, sizeof(U8), 1, fp); - -                if (numRead != 1) -                { -                        llerrs << "can't read RotationOrder from " << fileName << llendl; -                        return FALSE; -                } - -                rotationOrder = 0; - -                setRotation( mayaQ(     rotationAngles.mV[0], -                                        rotationAngles.mV[1], -                                        rotationAngles.mV[2], -                                        (LLQuaternion::Order)rotationOrder ) ); - -                //---------------------------------------------------------------- -                // Scale -                //---------------------------------------------------------------- -                LLVector3 scale; -                numRead = fread(scale.mV, sizeof(float), 3, fp); -                llendianswizzle(scale.mV, sizeof(float), 3); -                if (numRead != 3) -                { -                        llerrs << "can't read Scale from " << fileName << llendl; -                        return FALSE; -                } -                setScale( scale ); - -                //------------------------------------------------------------------------- -                // Release any existing mesh geometry -                //------------------------------------------------------------------------- -                freeMeshData(); - -                U16 numVertices = 0; - -                //---------------------------------------------------------------- -                // NumVertices -                //---------------------------------------------------------------- -                if (!isLOD()) -                { -                        numRead = fread(&numVertices, sizeof(U16), 1, fp); -                        llendianswizzle(&numVertices, sizeof(U16), 1); -                        if (numRead != 1) -                        { -                                llerrs << "can't read NumVertices from " << fileName << llendl; -                                return FALSE; -                        } - -                        allocateVertexData( numVertices );       - -						for (U16 i = 0; i < numVertices; ++i) -						{ -							//---------------------------------------------------------------- -							// Coords -							//---------------------------------------------------------------- -							numRead = fread(&mBaseCoords[i], sizeof(float), 3, fp); -							llendianswizzle(&mBaseCoords[i], sizeof(float), 3); -							if (numRead != 3) -							{ -									llerrs << "can't read Coordinates from " << fileName << llendl; -									return FALSE; -							} -						} - -						for (U16 i = 0; i < numVertices; ++i) -						{ -							//---------------------------------------------------------------- -							// Normals -							//---------------------------------------------------------------- -							numRead = fread(&mBaseNormals[i], sizeof(float), 3, fp); -							llendianswizzle(&mBaseNormals[i], sizeof(float), 3); -							if (numRead != 3) -							{ -									llerrs << " can't read Normals from " << fileName << llendl; -									return FALSE; -							} -						} - -						for (U16 i = 0; i < numVertices; ++i) -						{ -							//---------------------------------------------------------------- -							// Binormals -							//---------------------------------------------------------------- -							numRead = fread(&mBaseBinormals[i], sizeof(float), 3, fp); -							llendianswizzle(&mBaseBinormals[i], sizeof(float), 3); -							if (numRead != 3) -							{ -									llerrs << " can't read Binormals from " << fileName << llendl; -									return FALSE; -							} -						} - -                        //---------------------------------------------------------------- -                        // TexCoords -                        //---------------------------------------------------------------- -                        numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp); -                        llendianswizzle(mTexCoords, sizeof(float), 2*numVertices); -                        if (numRead != numVertices) -                        { -                                llerrs << "can't read TexCoords from " << fileName << llendl; -                                return FALSE; -                        } - -                        //---------------------------------------------------------------- -                        // DetailTexCoords -                        //---------------------------------------------------------------- -                        if (mHasDetailTexCoords) -                        { -                                numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp); -                                llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices); -                                if (numRead != numVertices) -                                { -                                        llerrs << "can't read DetailTexCoords from " << fileName << llendl; -                                        return FALSE; -                                } -                        } - -                        //---------------------------------------------------------------- -                        // Weights -                        //---------------------------------------------------------------- -                        if (mHasWeights) -                        { -                                numRead = fread(mWeights, sizeof(float), numVertices, fp); -                                llendianswizzle(mWeights, sizeof(float), numVertices); -                                if (numRead != numVertices) -                                { -                                        llerrs << "can't read Weights from " << fileName << llendl; -                                        return FALSE; -                                } -                        } -                } - -                //---------------------------------------------------------------- -                // NumFaces -                //---------------------------------------------------------------- -                U16 numFaces; -                numRead = fread(&numFaces, sizeof(U16), 1, fp); -                llendianswizzle(&numFaces, sizeof(U16), 1); -                if (numRead != 1) -                { -                        llerrs << "can't read NumFaces from " << fileName << llendl; -                        return FALSE; -                } -                allocateFaceData( numFaces ); - - -                //---------------------------------------------------------------- -                // Faces -                //---------------------------------------------------------------- -                U32 i; -                U32 numTris = 0; -                for (i = 0; i < numFaces; i++) -                { -                        S16 face[3]; -                        numRead = fread(face, sizeof(U16), 3, fp); -                        llendianswizzle(face, sizeof(U16), 3); -                        if (numRead != 3) -                        { -                                llerrs << "can't read Face[" << i << "] from " << fileName << llendl; -                                return FALSE; -                        } -                        if (mReferenceData) -                        { -                                llassert(face[0] < mReferenceData->mNumVertices); -                                llassert(face[1] < mReferenceData->mNumVertices); -                                llassert(face[2] < mReferenceData->mNumVertices); -                        } -                         -                        if (isLOD()) -                        { -                                // store largest index in case of LODs -                                for (S32 j = 0; j < 3; j++) -                                { -                                        if (face[j] > mNumVertices - 1) -                                        { -                                                mNumVertices = face[j] + 1; -                                        } -                                } -                        } -                        mFaces[i][0] = face[0]; -                        mFaces[i][1] = face[1]; -                        mFaces[i][2] = face[2]; - -//                      S32 j; -//                      for(j = 0; j < 3; j++) -//                      { -//                              LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]); -//                              if (!face_list) -//                              { -//                                      face_list = new LLDynamicArray<S32>; -//                                      mVertFaceMap.addData(face[j], face_list); -//                              } -//                              face_list->put(i); -//                      } - -                        numTris++; -                } - -                lldebugs << "verts: " << numVertices  -                         << ", faces: "   << numFaces -                         << ", tris: "    << numTris -                         << llendl; - -                //---------------------------------------------------------------- -                // NumSkinJoints -                //---------------------------------------------------------------- -                if (!isLOD()) -                { -                        U16 numSkinJoints = 0; -                        if ( mHasWeights ) -                        { -                                numRead = fread(&numSkinJoints, sizeof(U16), 1, fp); -                                llendianswizzle(&numSkinJoints, sizeof(U16), 1); -                                if (numRead != 1) -                                { -                                        llerrs << "can't read NumSkinJoints from " << fileName << llendl; -                                        return FALSE; -                                } -                                allocateJointNames( numSkinJoints ); -                        } - -                        //---------------------------------------------------------------- -                        // SkinJoints -                        //---------------------------------------------------------------- -                        for (i=0; i < numSkinJoints; i++) -                        { -                                char jointName[64+1]; -                                numRead = fread(jointName, sizeof(jointName)-1, 1, fp); -                                jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination -                                if (numRead != 1) -                                { -                                        llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; -                                        return FALSE; -                                } - -                                std::string *jn = &mJointNames[i]; -                                *jn = jointName; -                        } - -                        //------------------------------------------------------------------------- -                        // look for morph section -                        //------------------------------------------------------------------------- -                        char morphName[64+1]; -                        morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination -                        while(fread(&morphName, sizeof(char), 64, fp) == 64) -                        { -                                if (!strcmp(morphName, "End Morphs")) -                                { -                                        // we reached the end of the morphs -                                        break; -                                } -                                LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName)); - -                                BOOL result = morph_data->loadBinary(fp, this); - -                                if (!result) -                                { -                                        delete morph_data; -                                        continue; -                                } - -                                mMorphData.insert(morph_data); - -                                if (!strcmp(morphName, "Breast_Female_Cleavage")) -                                { -                                        mMorphData.insert(clone_morph_param_cleavage(morph_data, -                                                                                     .75f, -                                                                                     "Breast_Physics_LeftRight_Driven")); -                                } - -                                if (!strcmp(morphName, "Breast_Female_Cleavage")) -                                { -                                        mMorphData.insert(clone_morph_param_duplicate(morph_data, -										      "Breast_Physics_InOut_Driven")); -                                } -                                if (!strcmp(morphName, "Breast_Gravity")) -                                { -                                        mMorphData.insert(clone_morph_param_duplicate(morph_data, -										      "Breast_Physics_UpDown_Driven")); -                                } - -                                if (!strcmp(morphName, "Big_Belly_Torso")) -                                { -                                        mMorphData.insert(clone_morph_param_direction(morph_data, -										      LLVector3(0,0,0.05f), -										      "Belly_Physics_Torso_UpDown_Driven")); -                                } - -                                if (!strcmp(morphName, "Big_Belly_Legs")) -                                { -                                        mMorphData.insert(clone_morph_param_direction(morph_data, -										      LLVector3(0,0,0.05f), -										      "Belly_Physics_Legs_UpDown_Driven")); -                                } - -                                if (!strcmp(morphName, "skirt_belly")) -                                { -                                        mMorphData.insert(clone_morph_param_direction(morph_data, -										      LLVector3(0,0,0.05f), -										      "Belly_Physics_Skirt_UpDown_Driven")); -                                } - -                                if (!strcmp(morphName, "Small_Butt")) -                                { -                                        mMorphData.insert(clone_morph_param_direction(morph_data, -										      LLVector3(0,0,0.05f), -										      "Butt_Physics_UpDown_Driven")); -                                } -                                if (!strcmp(morphName, "Small_Butt")) -                                { -                                        mMorphData.insert(clone_morph_param_direction(morph_data, -										      LLVector3(0,0.03f,0), -										      "Butt_Physics_LeftRight_Driven")); -                                } -                        } - -                        S32 numRemaps; -                        if (fread(&numRemaps, sizeof(S32), 1, fp) == 1) -                        { -                                llendianswizzle(&numRemaps, sizeof(S32), 1); -                                for (S32 i = 0; i < numRemaps; i++) -                                { -                                        S32 remapSrc; -                                        S32 remapDst; -                                        if (fread(&remapSrc, sizeof(S32), 1, fp) != 1) -                                        { -                                                llerrs << "can't read source vertex in vertex remap data" << llendl; -                                                break; -                                        } -                                        if (fread(&remapDst, sizeof(S32), 1, fp) != 1) -                                        { -                                                llerrs << "can't read destination vertex in vertex remap data" << llendl; -                                                break; -                                        } -                                        llendianswizzle(&remapSrc, sizeof(S32), 1); -                                        llendianswizzle(&remapDst, sizeof(S32), 1); - -                                        mSharedVerts[remapSrc] = remapDst; -                                } -                        } -                } - -                status = TRUE; -        } -        else -        { -                llerrs << "invalid mesh file header: " << fileName << llendl; -                status = FALSE; -        } - -        if (0 == mNumJointNames) -        { -                allocateJointNames(1); -        } - -        fclose( fp ); - -        return status; -} - -//----------------------------------------------------------------------------- -// getSharedVert() -//----------------------------------------------------------------------------- -const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert) -{ -        if (mSharedVerts.count(vert) > 0) -        { -                return &mSharedVerts[vert]; -        } -        return NULL; -} - -//----------------------------------------------------------------------------- -// getUV() -//----------------------------------------------------------------------------- -const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index) -{ -        // TODO: convert all index variables to S32 -        llassert((S32)index < mNumVertices); - -        return mTexCoords[index]; -} - -//----------------------------------------------------------------------------- -// LLPolyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh) -{        -	LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); - -	llassert(shared_data); - -	mSharedData = shared_data; -	mReferenceMesh = reference_mesh; -	mAvatarp = NULL; -	mVertexData = NULL; - -	mCurVertexCount = 0; -	mFaceIndexCount = 0; -	mFaceIndexOffset = 0; -	mFaceVertexCount = 0; -	mFaceVertexOffset = 0; - -	if (shared_data->isLOD() && reference_mesh) -	{ -		mCoords = reference_mesh->mCoords; -		mNormals = reference_mesh->mNormals; -		mScaledNormals = reference_mesh->mScaledNormals; -		mBinormals = reference_mesh->mBinormals; -		mScaledBinormals = reference_mesh->mScaledBinormals; -		mTexCoords = reference_mesh->mTexCoords; -		mClothingWeights = reference_mesh->mClothingWeights; -	} -	else -	{ -		// Allocate memory without initializing every vector -		// NOTE: This makes asusmptions about the size of LLVector[234] -		S32 nverts = mSharedData->mNumVertices; -		//make sure it's an even number of verts for alignment -		nverts += nverts%2; -		S32 nfloats = nverts * ( -					4 + //coords -					4 + //normals -					4 + //weights -					2 + //coords -					4 + //scaled normals -					4 + //binormals -					4); //scaled binormals - -		//use 16 byte aligned vertex data to make LLPolyMesh SSE friendly -		mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4); -		S32 offset = 0; -		mCoords				= 	(LLVector4a*)(mVertexData + offset); offset += 4*nverts; -		mNormals			=	(LLVector4a*)(mVertexData + offset); offset += 4*nverts; -		mClothingWeights	= 	(LLVector4a*)(mVertexData + offset); offset += 4*nverts; -		mTexCoords			= 	(LLVector2*)(mVertexData + offset);  offset += 2*nverts; -		mScaledNormals		=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts; -		mBinormals			=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts; -		mScaledBinormals	=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts;  -		initializeForMorph(); -	} -} - - -//----------------------------------------------------------------------------- -// ~LLPolyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh::~LLPolyMesh() -{ -        S32 i; -        for (i = 0; i < mJointRenderData.count(); i++) -        { -                delete mJointRenderData[i]; -                mJointRenderData[i] = NULL; -        } - -		ll_aligned_free_16(mVertexData); - -} - - -//----------------------------------------------------------------------------- -// LLPolyMesh::getMesh() -//----------------------------------------------------------------------------- -LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_mesh) -{ -        //------------------------------------------------------------------------- -        // search for an existing mesh by this name -        //------------------------------------------------------------------------- -        LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL); -        if (meshSharedData) -        { -//              llinfos << "Polymesh " << name << " found in global mesh table." << llendl; -                LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh); -                return poly_mesh; -        } - -        //------------------------------------------------------------------------- -        // if not found, create a new one, add it to the list -        //------------------------------------------------------------------------- -        std::string full_path; -        full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name); - -        LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData(); -        if (reference_mesh) -        { -                mesh_data->setupLOD(reference_mesh->getSharedData()); -        } -        if ( ! mesh_data->loadMesh( full_path ) ) -        { -                delete mesh_data; -                return NULL; -        } - -        LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh); - -//      llinfos << "Polymesh " << name << " added to global mesh table." << llendl; -        sGlobalSharedMeshList[name] = poly_mesh->mSharedData; - -        return poly_mesh; -} - -//----------------------------------------------------------------------------- -// LLPolyMesh::freeAllMeshes() -//----------------------------------------------------------------------------- -void LLPolyMesh::freeAllMeshes() -{ -        // delete each item in the global lists -        for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer()); -        sGlobalSharedMeshList.clear(); -} - -LLPolyMeshSharedData *LLPolyMesh::getSharedData() const -{ -        return mSharedData; -} - - -//-------------------------------------------------------------------- -// LLPolyMesh::dumpDiagInfo() -//-------------------------------------------------------------------- -void LLPolyMesh::dumpDiagInfo() -{ -        // keep track of totals -        U32 total_verts = 0; -        U32 total_faces = 0; -        U32 total_kb = 0; - -        std::string buf; - -        llinfos << "-----------------------------------------------------" << llendl; -        llinfos << "       Global PolyMesh Table (DEBUG only)" << llendl; -        llinfos << "   Verts    Faces  Mem(KB) Name" << llendl; -        llinfos << "-----------------------------------------------------" << llendl; - -        // print each loaded mesh, and it's memory usage -        for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin(); -            iter != sGlobalSharedMeshList.end(); ++iter) -        { -                const std::string& mesh_name = iter->first; -                LLPolyMeshSharedData* mesh = iter->second; - -                S32 num_verts = mesh->mNumVertices; -                S32 num_faces = mesh->mNumFaces; -                U32 num_kb = mesh->getNumKB(); - -                buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str()); -                llinfos << buf << llendl; - -                total_verts += num_verts; -                total_faces += num_faces; -                total_kb += num_kb; -        } - -        llinfos << "-----------------------------------------------------" << llendl; -        buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); -        llinfos << buf << llendl; -        llinfos << "-----------------------------------------------------" << llendl; -} - -//----------------------------------------------------------------------------- -// getWritableCoords() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableCoords() -{ -        return mCoords; -} - -//----------------------------------------------------------------------------- -// getWritableNormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableNormals() -{ -        return mNormals; -} - -//----------------------------------------------------------------------------- -// getWritableBinormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableBinormals() -{ -        return mBinormals; -} - - -//----------------------------------------------------------------------------- -// getWritableClothingWeights() -//----------------------------------------------------------------------------- -LLVector4a       *LLPolyMesh::getWritableClothingWeights() -{ -        return mClothingWeights; -} - -//----------------------------------------------------------------------------- -// getWritableTexCoords() -//----------------------------------------------------------------------------- -LLVector2       *LLPolyMesh::getWritableTexCoords() -{ -        return mTexCoords; -} - -//----------------------------------------------------------------------------- -// getScaledNormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getScaledNormals() -{ -        return mScaledNormals; -} - -//----------------------------------------------------------------------------- -// getScaledBinormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getScaledBinormals() -{ -        return mScaledBinormals; -} - - -//----------------------------------------------------------------------------- -// initializeForMorph() -//----------------------------------------------------------------------------- -void LLPolyMesh::initializeForMorph() -{ -    LLVector4a::memcpyNonAliased16((F32*) mCoords, (F32*) mSharedData->mBaseCoords, sizeof(LLVector4a) * mSharedData->mNumVertices); -	LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); -	LLVector4a::memcpyNonAliased16((F32*) mScaledNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); -	LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); -	LLVector4a::memcpyNonAliased16((F32*) mScaledBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); -	LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) mSharedData->mTexCoords, sizeof(LLVector2) * (mSharedData->mNumVertices + mSharedData->mNumVertices%2)); - -	for (U32 i = 0; i < mSharedData->mNumVertices; ++i) -	{ -		mClothingWeights[i].clear(); -	} -} - -//----------------------------------------------------------------------------- -// getMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData*        LLPolyMesh::getMorphData(const std::string& morph_name) -{ -        if (!mSharedData) -                return NULL; -        for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin(); -             iter != mSharedData->mMorphData.end(); ++iter) -        { -                LLPolyMorphData *morph_data = *iter; -                if (morph_data->getName() == morph_name) -                { -                        return morph_data; -                } -        } -        return NULL; -} - -//----------------------------------------------------------------------------- -// removeMorphData() -//----------------------------------------------------------------------------- -// // erasing but not deleting seems bad, but fortunately we don't actually use this... -// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target) -// { -//      if (!mSharedData) -//              return; -//      mSharedData->mMorphData.erase(morph_target); -// } - -//----------------------------------------------------------------------------- -// deleteAllMorphData() -//----------------------------------------------------------------------------- -// void LLPolyMesh::deleteAllMorphData() -// { -//      if (!mSharedData) -//              return; - -//      for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer()); -//      mSharedData->mMorphData.clear(); -// } - -//----------------------------------------------------------------------------- -// getWritableWeights() -//----------------------------------------------------------------------------- -F32*    LLPolyMesh::getWritableWeights() const -{ -        return mSharedData->mWeights; -} - -//----------------------------------------------------------------------------- -// LLPolySkeletalDistortionInfo() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortionInfo::LLPolySkeletalDistortionInfo() -{ -} - -BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node) -{ -        llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) ); -         -        if (!LLViewerVisualParamInfo::parseXml(node)) -                return FALSE; - -        LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); - -        if (NULL == skeletalParam) -        { -                llwarns << "Failed to getChildByName(\"param_skeleton\")" -                        << llendl; -                return FALSE; -        } - -        for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) -        { -                if (bone->hasName("bone")) -                { -                        std::string name; -                        LLVector3 scale; -                        LLVector3 pos; -                        BOOL haspos = FALSE; -                         -                        static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -                        if (!bone->getFastAttributeString(name_string, name)) -                        { -                                llwarns << "No bone name specified for skeletal param." << llendl; -                                continue; -                        } - -                        static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); -                        if (!bone->getFastAttributeVector3(scale_string, scale)) -                        { -                                llwarns << "No scale specified for bone " << name << "." << llendl; -                                continue; -                        } - -                        // optional offset deformation (translation) -                        static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset"); -                        if (bone->getFastAttributeVector3(offset_string, pos)) -                        { -                                haspos = TRUE; -                        } -                        mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos)); -                } -                else -                { -                        llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl; -                        continue; -                } -        } -        return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolySkeletalDistortion() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp) -{ -        mAvatar = avatarp; -        mDefaultVec.splat(0.001f); -} - -//----------------------------------------------------------------------------- -// ~LLPolySkeletalDistortion() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortion::~LLPolySkeletalDistortion() -{ -} - -BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info) -{ -        llassert(mInfo == NULL); -        if (info->mID < 0) -                return FALSE; -        mInfo = info; -        mID = info->mID; -        setWeight(getDefaultWeight(), FALSE ); - -        LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter; -        for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++) -        { -                LLPolySkeletalBoneInfo *bone_info = &(*iter); -                LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName); -                if (!joint) -                { -                        llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl; -                        continue; -                } - -                if (mJointScales.find(joint) != mJointScales.end()) -                { -                        llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl; -                } - -                // store it -                mJointScales[joint] = bone_info->mScaleDeformation; - -                // apply to children that need to inherit it -                for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin(); -                     iter != joint->mChildren.end(); ++iter) -                { -                        LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); -                        if (child_joint->inheritScale()) -                        { -                                LLVector3 childDeformation = LLVector3(child_joint->getScale()); -                                childDeformation.scaleVec(bone_info->mScaleDeformation); -                                mJointScales[child_joint] = childDeformation; -                        } -                } - -                if (bone_info->mHasPositionDeformation) -                { -                        if (mJointOffsets.find(joint) != mJointOffsets.end()) -                        { -                                llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl; -                        } -                        mJointOffsets[joint] = bone_info->mPositionDeformation; -                } -        } -        return TRUE; -} - -/*virtual*/ LLViewerVisualParam* LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const -{ -        LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar); -        *new_param = *this; -        return new_param; -} - -//----------------------------------------------------------------------------- -// apply() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_POLYSKELETAL_DISTORTION_APPLY("Skeletal Distortion"); - -void LLPolySkeletalDistortion::apply( ESex avatar_sex ) -{ -	LLFastTimer t(FTM_POLYSKELETAL_DISTORTION_APPLY); - -        F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight(); - -        LLJoint* joint; -        joint_vec_map_t::iterator iter; - -        for (iter = mJointScales.begin(); -             iter != mJointScales.end(); -             iter++) -        { -                joint = iter->first; -                LLVector3 newScale = joint->getScale(); -                LLVector3 scaleDelta = iter->second; -                newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta); -                joint->setScale(newScale); -        } - -        for (iter = mJointOffsets.begin(); -             iter != mJointOffsets.end(); -             iter++) -        { -                joint = iter->first; -                LLVector3 newPosition = joint->getPosition(); -                LLVector3 positionDelta = iter->second; -                newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta); -                joint->setPosition(newPosition); -        } - -        if (mLastWeight != mCurWeight && !mIsAnimating) -        { -                mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1); -        } -        mLastWeight = mCurWeight; -} - - -LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, -					     const std::string &name) -{ -        LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); -        cloned_morph_data->mName = name; -        for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) -        { -                cloned_morph_data->mCoords[v] = src_data->mCoords[v]; -                cloned_morph_data->mNormals[v] = src_data->mNormals[v]; -                cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]; -        } -        return cloned_morph_data; -} - -LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, -					     const LLVector3 &direction, -					     const std::string &name) -{ -        LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); -        cloned_morph_data->mName = name; -		LLVector4a dir; -		dir.load3(direction.mV); - -        for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) -        { -                cloned_morph_data->mCoords[v] = dir; -                cloned_morph_data->mNormals[v].clear(); -                cloned_morph_data->mBinormals[v].clear(); -        } -        return cloned_morph_data; -} - -LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, -                                            F32 scale, -                                            const std::string &name) -{ -        LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); -        cloned_morph_data->mName = name; - -		LLVector4a sc; -		sc.splat(scale); - -		LLVector4a nsc; -		nsc.set(scale, -scale, scale, scale); - -        for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) -        { -            if (cloned_morph_data->mCoords[v][1] < 0) -            { -                cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],nsc); -				cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v],nsc); -				cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],nsc); -			} -			else -			{ -				cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],sc); -				cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v], sc); -				cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],sc); -			} -        } -        return cloned_morph_data; -} - -// End diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h deleted file mode 100644 index 850171d169..0000000000 --- a/indra/newview/llpolymesh.h +++ /dev/null @@ -1,448 +0,0 @@ -/**  - * @file llpolymesh.h - * @brief Implementation of LLPolyMesh 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_LLPOLYMESH_H -#define LL_LLPOLYMESH_H - -#include <string> -#include <map> -#include "llstl.h" - -#include "v3math.h" -#include "v2math.h" -#include "llquaternion.h" -#include "llpolymorph.h" -#include "lljoint.h" -//#include "lldarray.h" - -class LLSkinJoint; -class LLVOAvatar; -class LLWearable; - -//#define USE_STRIPS	// Use tri-strips for rendering. - -//----------------------------------------------------------------------------- -// LLPolyFace -// A set of 4 vertex indices. -// An LLPolyFace can represent either a triangle or quad. -// If the last index is -1, it's a triangle. -//----------------------------------------------------------------------------- -typedef S32 LLPolyFace[3]; - -//struct PrimitiveGroup; - -//----------------------------------------------------------------------------- -// LLPolyMesh -// A polyhedra consisting of any number of triangles and quads. -// All instances contain a set of faces, and optionally may include -// faces grouped into named face sets. -//----------------------------------------------------------------------------- -class LLPolyMorphTarget; - -class LLPolyMeshSharedData -{ -	friend class LLPolyMesh; -private: -	// transform data -	LLVector3				mPosition; -	LLQuaternion			mRotation; -	LLVector3				mScale; -							 -	// vertex data			 -	S32						mNumVertices; -	LLVector4a				*mBaseCoords; -	LLVector4a				*mBaseNormals; -	LLVector4a				*mBaseBinormals; -	LLVector2				*mTexCoords; -	LLVector2				*mDetailTexCoords; -	F32						*mWeights; -	 -	BOOL					mHasWeights; -	BOOL					mHasDetailTexCoords; - -	// face data			 -	S32						mNumFaces; -	LLPolyFace				*mFaces; -							 -	// face set data		 -	U32						mNumJointNames; -	std::string*			mJointNames; - -	// morph targets -	typedef std::set<LLPolyMorphData*> morphdata_list_t; -	morphdata_list_t			mMorphData; - -	std::map<S32, S32> 			mSharedVerts; -	 -	LLPolyMeshSharedData*		mReferenceData; -	S32							mLastIndexOffset; - -public: -	// Temporarily... -	// Triangle indices -	U32				mNumTriangleIndices; -	U32				*mTriangleIndices; - -public: -	LLPolyMeshSharedData(); -	~LLPolyMeshSharedData(); - -private: -	void setupLOD(LLPolyMeshSharedData* reference_data); - -	// Frees all mesh memory resources  -	void freeMeshData(); - -	void setPosition( const LLVector3 &pos ) { 	mPosition = pos; } -	void setRotation( const LLQuaternion &rot ) { mRotation = rot; } -	void setScale( const LLVector3 &scale ) { mScale = scale; } - -	BOOL allocateVertexData( U32 numVertices ); - -	BOOL allocateFaceData( U32 numFaces ); - -	BOOL allocateJointNames( U32 numJointNames ); - -	// Retrieve the number of KB of memory used by this instance -	U32 getNumKB(); - -	// Load mesh data from file -	BOOL loadMesh( const std::string& fileName ); - -public: -	void genIndices(S32 offset); - -	const LLVector2 &getUVs(U32 index); - -	const S32	*getSharedVert(S32 vert); - -	BOOL isLOD() { return (mReferenceData != NULL); } -}; - - -class LLJointRenderData -{ -public: -	LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {} -	~LLJointRenderData(){} - -	const LLMatrix4*		mWorldMatrix; -	LLSkinJoint*			mSkinJoint; -}; - - -class LLPolyMesh -{ -public: -	 -	// Constructor -	LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh); - -	// Destructor  -	~LLPolyMesh(); - -	// Requests a mesh by name. -	// If the mesh already exists in the global mesh table, it is returned, -	// otherwise it is loaded from file, added to the table, and returned. -	static LLPolyMesh *getMesh( const std::string &name, LLPolyMesh* reference_mesh = NULL); - -	// Frees all loaded meshes. -	// This should only be called once you know there are no outstanding -	// references to these objects.  Generally, upon exit of the application. -	static void freeAllMeshes(); - -	//-------------------------------------------------------------------- -	// Transform Data Access -	//-------------------------------------------------------------------- -	// Get position -	const LLVector3 &getPosition() {  -		llassert (mSharedData); -		return mSharedData->mPosition;  -	} - -	// Get rotation -	const LLQuaternion &getRotation() {  -		llassert (mSharedData); -		return mSharedData->mRotation;  -	} - -	// Get scale -	const LLVector3 &getScale() {  -		llassert (mSharedData); -		return mSharedData->mScale;  -	} - -	//-------------------------------------------------------------------- -	// Vertex Data Access -	//-------------------------------------------------------------------- -	// Get number of vertices -	U32 getNumVertices() {  -		llassert (mSharedData); -		return mSharedData->mNumVertices;  -	} - -	// Returns whether or not the mesh has detail texture coords -	BOOL hasDetailTexCoords() {  -		llassert (mSharedData); -		return mSharedData->mHasDetailTexCoords;  -	} - -	// Returns whether or not the mesh has vertex weights -	BOOL hasWeights() const{  -		llassert (mSharedData); -		return mSharedData->mHasWeights;  -	} - -	// Get coords -	const LLVector4a	*getCoords() const{ -		return mCoords; -	} - -	// non const version -	LLVector4a *getWritableCoords(); - -	// Get normals -	const LLVector4a	*getNormals() const{  -		return mNormals;  -	} - -	// Get normals -	const LLVector4a	*getBinormals() const{  -		return mBinormals;  -	} - -	// Get base mesh normals -	const LLVector4a *getBaseNormals() const{ -		llassert(mSharedData); -		return mSharedData->mBaseNormals; -	} - -	// Get base mesh normals -	const LLVector4a *getBaseBinormals() const{ -		llassert(mSharedData); -		return mSharedData->mBaseBinormals; -	} - -	// intermediate morphed normals and output normals -	LLVector4a *getWritableNormals(); -	LLVector4a *getScaledNormals(); - -	LLVector4a *getWritableBinormals(); -	LLVector4a *getScaledBinormals(); - -	// Get texCoords -	const LLVector2	*getTexCoords() const {  -		return mTexCoords;  -	} - -	// non const version -	LLVector2 *getWritableTexCoords(); - -	// Get detailTexCoords -	const LLVector2	*getDetailTexCoords() const {  -		llassert (mSharedData); -		return mSharedData->mDetailTexCoords;  -	} - -	// Get weights -	const F32 *getWeights() const { -		llassert (mSharedData); -		return mSharedData->mWeights; -	} - -	F32			*getWritableWeights() const; - -	LLVector4a	*getWritableClothingWeights(); - -	const LLVector4a		*getClothingWeights() -	{ -		return mClothingWeights;	 -	} - -	//-------------------------------------------------------------------- -	// Face Data Access -	//-------------------------------------------------------------------- -	// Get number of faces -	S32 getNumFaces() {  -		llassert (mSharedData); -		return mSharedData->mNumFaces;  -	} - -	// Get faces -	LLPolyFace *getFaces() {  -		llassert (mSharedData); -		return mSharedData->mFaces; -	} - -	U32 getNumJointNames() {  -		llassert (mSharedData); -		return mSharedData->mNumJointNames;  -	} - -	std::string *getJointNames() {  -		llassert (mSharedData); -		return mSharedData->mJointNames; -	} - -	LLPolyMorphData*	getMorphData(const std::string& morph_name); -// 	void	removeMorphData(LLPolyMorphData *morph_target); -// 	void	deleteAllMorphData(); - -	LLPolyMeshSharedData *getSharedData() const; -	LLPolyMesh *getReferenceMesh() { return mReferenceMesh ? mReferenceMesh : this; } - -	// Get indices -	U32*	getIndices() { return mSharedData ? mSharedData->mTriangleIndices : NULL; } - -	BOOL	isLOD() { return mSharedData && mSharedData->isLOD(); } - -	void setAvatar(LLVOAvatar* avatarp) { mAvatarp = avatarp; } -	LLVOAvatar* getAvatar() { return mAvatarp; } - -	LLDynamicArray<LLJointRenderData*>	mJointRenderData; - -	U32				mFaceVertexOffset; -	U32				mFaceVertexCount; -	U32				mFaceIndexOffset; -	U32				mFaceIndexCount; -	U32				mCurVertexCount; -private: -	void initializeForMorph(); - -	// Dumps diagnostic information about the global mesh table -	static void dumpDiagInfo(); - -protected: -	// mesh data shared across all instances of a given mesh -	LLPolyMeshSharedData	*mSharedData; -	// Single array of floats for allocation / deletion -	F32						*mVertexData; -	// deformed vertices (resulting from application of morph targets) -	LLVector4a				*mCoords; -	// deformed normals (resulting from application of morph targets) -	LLVector4a				*mScaledNormals; -	// output normals (after normalization) -	LLVector4a				*mNormals; -	// deformed binormals (resulting from application of morph targets) -	LLVector4a				*mScaledBinormals; -	// output binormals (after normalization) -	LLVector4a				*mBinormals; -	// weight values that mark verts as clothing/skin -	LLVector4a				*mClothingWeights; -	// output texture coordinates -	LLVector2				*mTexCoords; -	 -	LLPolyMesh				*mReferenceMesh; - -	// global mesh list -	typedef std::map<std::string, LLPolyMeshSharedData*> LLPolyMeshSharedDataTable;  -	static LLPolyMeshSharedDataTable sGlobalSharedMeshList; - -	// Backlink only; don't make this an LLPointer. -	LLVOAvatar* mAvatarp; -}; - -//----------------------------------------------------------------------------- -// LLPolySkeletalDeformationInfo -// Shared information for LLPolySkeletalDeformations -//----------------------------------------------------------------------------- -struct LLPolySkeletalBoneInfo -{ -	LLPolySkeletalBoneInfo(std::string &name, LLVector3 &scale, LLVector3 &pos, BOOL haspos) -		: mBoneName(name), -		  mScaleDeformation(scale), -		  mPositionDeformation(pos), -		  mHasPositionDeformation(haspos) {} -	std::string mBoneName; -	LLVector3 mScaleDeformation; -	LLVector3 mPositionDeformation; -	BOOL mHasPositionDeformation; -}; - -class LLPolySkeletalDistortionInfo : public LLViewerVisualParamInfo -{ -	friend class LLPolySkeletalDistortion; -public: -	LLPolySkeletalDistortionInfo(); -	/*virtual*/ ~LLPolySkeletalDistortionInfo() {}; -	 -	/*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -protected: -	typedef std::vector<LLPolySkeletalBoneInfo> bone_info_list_t; -	bone_info_list_t mBoneInfoList; -}; - -//----------------------------------------------------------------------------- -// LLPolySkeletalDeformation -// A set of joint scale data for deforming the avatar mesh -//----------------------------------------------------------------------------- -class LLPolySkeletalDistortion : public LLViewerVisualParam -{ -public: -	LLPolySkeletalDistortion(LLVOAvatar *avatarp); -	~LLPolySkeletalDistortion(); - -	void* operator new(size_t size) -	{ -		return ll_aligned_malloc_16(size); -	} - -	void operator delete(void* ptr) -	{ -		ll_aligned_free_16(ptr); -	} - -	// Special: These functions are overridden by child classes -	LLPolySkeletalDistortionInfo*	getInfo() const { return (LLPolySkeletalDistortionInfo*)mInfo; } -	//   This sets mInfo and calls initialization functions -	BOOL							setInfo(LLPolySkeletalDistortionInfo *info); - -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node); -	/*virtual*/ void				apply( ESex sex ); -	 -	// LLViewerVisualParam Virtual functions -	/*virtual*/ F32					getTotalDistortion() { return 0.1f; } -	/*virtual*/ const LLVector4a&	getAvgDistortion()	{ return mDefaultVec; } -	/*virtual*/ F32					getMaxDistortion() { return 0.1f; } -	/*virtual*/ LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector4a(0.001f, 0.001f, 0.001f);} -	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;}; -	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;}; - -protected: -	typedef std::map<LLJoint*, LLVector3> joint_vec_map_t; -	joint_vec_map_t mJointScales; -	joint_vec_map_t mJointOffsets; -	LLVector4a	mDefaultVec; -	// Backlink only; don't make this an LLPointer. -	LLVOAvatar *mAvatar; -}; - -#endif // LL_LLPOLYMESH_H - diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp deleted file mode 100644 index bd96608641..0000000000 --- a/indra/newview/llpolymorph.cpp +++ /dev/null @@ -1,783 +0,0 @@ -/**  - * @file llpolymorph.cpp - * @brief Implementation of LLPolyMesh 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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llpolymorph.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "llxmltree.h" -#include "llendianswizzle.h" - -//#include "../tools/imdebug/imdebug.h" - -const F32 NORMAL_SOFTEN_FACTOR = 0.65f; - -//----------------------------------------------------------------------------- -// LLPolyMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData::LLPolyMorphData(const std::string& morph_name) -	: mName(morph_name) -{ -	mNumIndices = 0; -	mCurrentIndex = 0; -	mTotalDistortion = 0.f; -	mAvgDistortion.clear(); -	mMaxDistortion = 0.f; -	mVertexIndices = NULL; -	mCoords = NULL; -	mNormals = NULL; -	mBinormals = NULL; -	mTexCoords = NULL; - -	mMesh = NULL; -} - -LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) : -	mName(rhs.mName), -	mNumIndices(rhs.mNumIndices), -	mTotalDistortion(rhs.mTotalDistortion), -	mAvgDistortion(rhs.mAvgDistortion), -	mMaxDistortion(rhs.mMaxDistortion), -	mVertexIndices(NULL), -	mCoords(NULL), -	mNormals(NULL), -	mBinormals(NULL), -	mTexCoords(NULL) -{ -	const S32 numVertices = mNumIndices; - -	mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mTexCoords = new LLVector2[numVertices]; -	mVertexIndices = new U32[numVertices]; -	 -	for (S32 v=0; v < numVertices; v++) -	{ -		mCoords[v] = rhs.mCoords[v]; -		mNormals[v] = rhs.mNormals[v]; -		mBinormals[v] = rhs.mBinormals[v]; -		mTexCoords[v] = rhs.mTexCoords[v]; -		mVertexIndices[v] = rhs.mVertexIndices[v]; -	} -} - -//----------------------------------------------------------------------------- -// ~LLPolyMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData::~LLPolyMorphData() -{ -	freeData(); -} - -//----------------------------------------------------------------------------- -// loadBinary() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh) -{ -	S32 numVertices; -	S32 numRead; - -	numRead = fread(&numVertices, sizeof(S32), 1, fp); -	llendianswizzle(&numVertices, sizeof(S32), 1); -	if (numRead != 1) -	{ -		llwarns << "Can't read number of morph target vertices" << llendl; -		return FALSE; -	} - -	//------------------------------------------------------------------------- -	// free any existing data -	//------------------------------------------------------------------------- -	freeData(); - -	//------------------------------------------------------------------------- -	// allocate vertices -	//------------------------------------------------------------------------- -	mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a))); -	mTexCoords = new LLVector2[numVertices]; -	// Actually, we are allocating more space than we need for the skiplist -	mVertexIndices = new U32[numVertices]; -	mNumIndices = 0; -	mTotalDistortion = 0.f; -	mMaxDistortion = 0.f; -	mAvgDistortion.clear(); -	mMesh = mesh; - -	//------------------------------------------------------------------------- -	// read vertices -	//------------------------------------------------------------------------- -	for(S32 v = 0; v < numVertices; v++) -	{ -		numRead = fread(&mVertexIndices[v], sizeof(U32), 1, fp); -		llendianswizzle(&mVertexIndices[v], sizeof(U32), 1); -		if (numRead != 1) -		{ -			llwarns << "Can't read morph target vertex number" << llendl; -			return FALSE; -		} - -		if (mVertexIndices[v] > 10000) -		{ -			llerrs << "Bad morph index: " << mVertexIndices[v] << llendl; -		} - - -		numRead = fread(&mCoords[v], sizeof(F32), 3, fp); -		llendianswizzle(&mCoords[v], sizeof(F32), 3); -		if (numRead != 3) -		{ -			llwarns << "Can't read morph target vertex coordinates" << llendl; -			return FALSE; -		} - -		F32 magnitude = mCoords[v].getLength3().getF32(); -		 -		mTotalDistortion += magnitude; -		LLVector4a t; -		t.setAbs(mCoords[v]); -		mAvgDistortion.add(t); -		 -		if (magnitude > mMaxDistortion) -		{ -			mMaxDistortion = magnitude; -		} - -		numRead = fread(&mNormals[v], sizeof(F32), 3, fp); -		llendianswizzle(&mNormals[v], sizeof(F32), 3); -		if (numRead != 3) -		{ -			llwarns << "Can't read morph target normal" << llendl; -			return FALSE; -		} - -		numRead = fread(&mBinormals[v], sizeof(F32), 3, fp); -		llendianswizzle(&mBinormals[v], sizeof(F32), 3); -		if (numRead != 3) -		{ -			llwarns << "Can't read morph target binormal" << llendl; -			return FALSE; -		} - - -		numRead = fread(&mTexCoords[v].mV, sizeof(F32), 2, fp); -		llendianswizzle(&mTexCoords[v].mV, sizeof(F32), 2); -		if (numRead != 2) -		{ -			llwarns << "Can't read morph target uv" << llendl; -			return FALSE; -		} - -		mNumIndices++; -	} - -	mAvgDistortion.mul(1.f/(F32)mNumIndices); -	mAvgDistortion.normalize3fast(); - -	return TRUE; -} - -//----------------------------------------------------------------------------- -// freeData() -//----------------------------------------------------------------------------- -void LLPolyMorphData::freeData() -{ -	if (mCoords != NULL) -	{ -		ll_aligned_free_16(mCoords); -		mCoords = NULL; -	} - -	if (mNormals != NULL) -	{ -		ll_aligned_free_16(mNormals); -		mNormals = NULL; -	} - -	if (mBinormals != NULL) -	{ -		ll_aligned_free_16(mBinormals); -		mBinormals = NULL; -	} - -	if (mTexCoords != NULL) -	{ -		delete [] mTexCoords; -		mTexCoords = NULL; -	} - -	if (mVertexIndices != NULL) -	{ -		delete [] mVertexIndices; -		mVertexIndices = NULL; -	} -} - -//----------------------------------------------------------------------------- -// LLPolyMorphTargetInfo() -//----------------------------------------------------------------------------- -LLPolyMorphTargetInfo::LLPolyMorphTargetInfo() -	: mIsClothingMorph(FALSE) -{ -} - -BOOL LLPolyMorphTargetInfo::parseXml(LLXmlTreeNode* node) -{ -	llassert( node->hasName( "param" ) && node->getChildByName( "param_morph" ) ); - -	if (!LLViewerVisualParamInfo::parseXml(node)) -		return FALSE; - -	// Get mixed-case name -	static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -	if( !node->getFastAttributeString( name_string, mMorphName ) ) -	{ -		llwarns << "Avatar file: <param> is missing name attribute" << llendl; -		return FALSE;  // Continue, ignoring this tag -	} - -	static LLStdStringHandle clothing_morph_string = LLXmlTree::addAttributeString("clothing_morph"); -	node->getFastAttributeBOOL(clothing_morph_string, mIsClothingMorph); - -	LLXmlTreeNode *paramNode = node->getChildByName("param_morph"); - -        if (NULL == paramNode) -        { -                llwarns << "Failed to getChildByName(\"param_morph\")" -                        << llendl; -                return FALSE; -        } - -	for (LLXmlTreeNode* child_node = paramNode->getFirstChild(); -		 child_node; -		 child_node = paramNode->getNextChild()) -	{ -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -		if (child_node->hasName("volume_morph")) -		{ -			std::string volume_name; -			if (child_node->getFastAttributeString(name_string, volume_name)) -			{ -				LLVector3 scale; -				static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); -				child_node->getFastAttributeVector3(scale_string, scale); -				 -				LLVector3 pos; -				static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos"); -				child_node->getFastAttributeVector3(pos_string, pos); - -				mVolumeInfoList.push_back(LLPolyVolumeMorphInfo(volume_name,scale,pos)); -			} -		} -	} -	 -	return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget() -//----------------------------------------------------------------------------- -LLPolyMorphTarget::LLPolyMorphTarget(LLPolyMesh *poly_mesh) -	: mMorphData(NULL), mMesh(poly_mesh), -	  mVertMask(NULL), -	  mLastSex(SEX_FEMALE), -	  mNumMorphMasksPending(0) -{ -} - -//----------------------------------------------------------------------------- -// ~LLPolyMorphTarget() -//----------------------------------------------------------------------------- -LLPolyMorphTarget::~LLPolyMorphTarget() -{ -	if (mVertMask) -	{ -		delete mVertMask; -	} -} - -//----------------------------------------------------------------------------- -// setInfo() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info) -{ -	llassert(mInfo == NULL); -	if (info->mID < 0) -		return FALSE; -	mInfo = info; -	mID = info->mID; -	setWeight(getDefaultWeight(), FALSE ); - -	LLVOAvatar* avatarp = mMesh->getAvatar(); -	LLPolyMorphTargetInfo::volume_info_list_t::iterator iter; -	for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++) -	{ -		LLPolyVolumeMorphInfo *volume_info = &(*iter); -		for (S32 i = 0; i < avatarp->mNumCollisionVolumes; i++) -		{ -			if (avatarp->mCollisionVolumes[i].getName() == volume_info->mName) -			{ -				mVolumeMorphs.push_back(LLPolyVolumeMorph(&avatarp->mCollisionVolumes[i], -														  volume_info->mScale, -														  volume_info->mPos)); -				break; -			} -		} -	} - -	std::string morph_param_name = getInfo()->mMorphName; -	 -	mMorphData = mMesh->getMorphData(morph_param_name); -	if (!mMorphData) -	{ -		const std::string driven_tag = "_Driven"; -		U32 pos = morph_param_name.find(driven_tag); -		if (pos > 0) -		{ -			morph_param_name = morph_param_name.substr(0,pos); -			mMorphData = mMesh->getMorphData(morph_param_name); -		} -	} -	if (!mMorphData) -	{ -		llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl; -		return FALSE;  // Continue, ignoring this tag -	} -	return TRUE; -} - -/*virtual*/ LLViewerVisualParam* LLPolyMorphTarget::cloneParam(LLWearable* wearable) const -{ -	LLPolyMorphTarget *new_param = new LLPolyMorphTarget(mMesh); -	*new_param = *this; -	return new_param; -} - -#if 0 // obsolete -//----------------------------------------------------------------------------- -// parseData() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphTarget::parseData(LLXmlTreeNode* node) -{ -	LLPolyMorphTargetInfo* info = new LLPolyMorphTargetInfo; - -	info->parseXml(node); -	if (!setInfo(info)) -	{ -		delete info; -		return FALSE; -	} -	return TRUE; -} -#endif - -//----------------------------------------------------------------------------- -// getVertexDistortion() -//----------------------------------------------------------------------------- -LLVector4a LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh) -{ -	if (!mMorphData || mMesh != mesh) return LLVector4a::getZero(); - -	for(U32 index = 0; index < mMorphData->mNumIndices; index++) -	{ -		if (mMorphData->mVertexIndices[index] == (U32)requested_index) -		{ -			return mMorphData->mCoords[index]; -		} -	} - -	return LLVector4a::getZero(); -} - -//----------------------------------------------------------------------------- -// getFirstDistortion() -//----------------------------------------------------------------------------- -const LLVector4a *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ -	if (!mMorphData) return &LLVector4a::getZero(); - -	LLVector4a* resultVec; -	mMorphData->mCurrentIndex = 0; -	if (mMorphData->mNumIndices) -	{ -		resultVec = &mMorphData->mCoords[mMorphData->mCurrentIndex]; -		if (index != NULL) -		{ -			*index = mMorphData->mVertexIndices[mMorphData->mCurrentIndex]; -		} -		if (poly_mesh != NULL) -		{ -			*poly_mesh = mMesh; -		} - -		return resultVec; -	} -	return NULL; -} - -//----------------------------------------------------------------------------- -// getNextDistortion() -//----------------------------------------------------------------------------- -const LLVector4a *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ -	if (!mMorphData) return &LLVector4a::getZero(); - -	LLVector4a* resultVec; -	mMorphData->mCurrentIndex++; -	if (mMorphData->mCurrentIndex < mMorphData->mNumIndices) -	{ -		resultVec = &mMorphData->mCoords[mMorphData->mCurrentIndex]; -		if (index != NULL) -		{ -			*index = mMorphData->mVertexIndices[mMorphData->mCurrentIndex]; -		} -		if (poly_mesh != NULL) -		{ -			*poly_mesh = mMesh; -		} -		return resultVec; -	} -	return NULL; -} - -//----------------------------------------------------------------------------- -// getTotalDistortion() -//----------------------------------------------------------------------------- -F32	LLPolyMorphTarget::getTotalDistortion()  -{  -	if (mMorphData)  -	{ -		return mMorphData->mTotalDistortion;  -	} -	else  -	{ -		return 0.f; -	} -} - -//----------------------------------------------------------------------------- -// getAvgDistortion() -//----------------------------------------------------------------------------- -const LLVector4a& LLPolyMorphTarget::getAvgDistortion()	 -{ -	if (mMorphData)  -	{ -		return mMorphData->mAvgDistortion;  -	} -	else  -	{ -		return LLVector4a::getZero(); -	} -} - -//----------------------------------------------------------------------------- -// getMaxDistortion() -//----------------------------------------------------------------------------- -F32	LLPolyMorphTarget::getMaxDistortion()  -{ -	if (mMorphData)  -	{ -		return mMorphData->mMaxDistortion;  -	} -	else -	{ -		return 0.f; -	} -} - -//----------------------------------------------------------------------------- -// apply() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_APPLY_MORPH_TARGET("Apply Morph"); - -void LLPolyMorphTarget::apply( ESex avatar_sex ) -{ -	if (!mMorphData || mNumMorphMasksPending > 0) -	{ -		return; -	} - -	LLFastTimer t(FTM_APPLY_MORPH_TARGET); - -	mLastSex = avatar_sex; - -	// Check for NaN condition (NaN is detected if a variable doesn't equal itself. -	if (mCurWeight != mCurWeight) -	{ -		mCurWeight = 0.0; -	} -	if (mLastWeight != mLastWeight) -	{ -		mLastWeight = mCurWeight+.001; -	} - -	// perform differential update of morph -	F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight); -	// store last weight -	mLastWeight += delta_weight; - -	if (delta_weight != 0.f) -	{ -		llassert(!mMesh->isLOD()); -		LLVector4a *coords = mMesh->getWritableCoords(); - -		LLVector4a *scaled_normals = mMesh->getScaledNormals(); -		LLVector4a *normals = mMesh->getWritableNormals(); - -		LLVector4a *scaled_binormals = mMesh->getScaledBinormals(); -		LLVector4a *binormals = mMesh->getWritableBinormals(); - -		LLVector4a *clothing_weights = mMesh->getWritableClothingWeights(); -		LLVector2 *tex_coords = mMesh->getWritableTexCoords(); - -		F32 *maskWeightArray = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL; - -		for(U32 vert_index_morph = 0; vert_index_morph < mMorphData->mNumIndices; vert_index_morph++) -		{ -			S32 vert_index_mesh = mMorphData->mVertexIndices[vert_index_morph]; - -			F32 maskWeight = 1.f; -			if (maskWeightArray) -			{ -				maskWeight = maskWeightArray[vert_index_morph]; -			} - - -			LLVector4a pos = mMorphData->mCoords[vert_index_morph]; -			pos.mul(delta_weight*maskWeight); -			coords[vert_index_mesh].add(pos); - -			if (getInfo()->mIsClothingMorph && clothing_weights) -			{ -				LLVector4a clothing_offset = mMorphData->mCoords[vert_index_morph]; -				clothing_offset.mul(delta_weight * maskWeight); -				LLVector4a* clothing_weight = &clothing_weights[vert_index_mesh]; -				clothing_weight->add(clothing_offset); -				clothing_weight->getF32ptr()[VW] = maskWeight; -			} - -			// calculate new normals based on half angles -			LLVector4a norm = mMorphData->mNormals[vert_index_morph]; -			norm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR); -			scaled_normals[vert_index_mesh].add(norm); -			norm = scaled_normals[vert_index_mesh]; -			norm.normalize3fast(); -			normals[vert_index_mesh] = norm; - -			// calculate new binormals -			LLVector4a binorm = mMorphData->mBinormals[vert_index_morph]; -			binorm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR); -			scaled_binormals[vert_index_mesh].add(binorm); -			LLVector4a tangent; -			tangent.setCross3(scaled_binormals[vert_index_mesh], norm); -			LLVector4a& normalized_binormal = binormals[vert_index_mesh]; -			normalized_binormal.setCross3(norm, tangent);  -			normalized_binormal.normalize3fast(); -			 -			tex_coords[vert_index_mesh] += mMorphData->mTexCoords[vert_index_morph] * delta_weight * maskWeight; -		} - -		// now apply volume changes -		for( volume_list_t::iterator iter = mVolumeMorphs.begin(); iter != mVolumeMorphs.end(); iter++ ) -		{ -			LLPolyVolumeMorph* volume_morph = &(*iter); -			LLVector3 scale_delta = volume_morph->mScale * delta_weight; -			LLVector3 pos_delta = volume_morph->mPos * delta_weight; -			 -			volume_morph->mVolume->setScale(volume_morph->mVolume->getScale() + scale_delta); -			volume_morph->mVolume->setPosition(volume_morph->mVolume->getPosition() + pos_delta); -		} -	} - -	if (mNext) -	{ -		mNext->apply(avatar_sex); -	} -} - -//----------------------------------------------------------------------------- -// applyMask() -//----------------------------------------------------------------------------- -void	LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert) -{ -	LLVector4a *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL; - -	if (!mVertMask) -	{ -		mVertMask = new LLPolyVertexMask(mMorphData); -		mNumMorphMasksPending--; -	} -	else -	{ -		// remove effect of previous mask -		F32 *maskWeights = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL; - -		if (maskWeights) -		{ -			LLVector4a *coords = mMesh->getWritableCoords(); -			LLVector4a *scaled_normals = mMesh->getScaledNormals(); -			LLVector4a *scaled_binormals = mMesh->getScaledBinormals(); -			LLVector2 *tex_coords = mMesh->getWritableTexCoords(); - -			LLVector4Logical clothing_mask; -			clothing_mask.clear(); -			clothing_mask.setElement<0>(); -			clothing_mask.setElement<1>(); -			clothing_mask.setElement<2>(); - - -			for(U32 vert = 0; vert < mMorphData->mNumIndices; vert++) -			{ -				F32 lastMaskWeight = mLastWeight * maskWeights[vert]; -				S32 out_vert = mMorphData->mVertexIndices[vert]; - -				// remove effect of existing masked morph -				LLVector4a t; -				t = mMorphData->mCoords[vert]; -				t.mul(lastMaskWeight); -				coords[out_vert].sub(t); - -				t = mMorphData->mNormals[vert]; -				t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR); -				scaled_normals[out_vert].sub(t); - -				t = mMorphData->mBinormals[vert]; -				t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR); -				scaled_binormals[out_vert].sub(t); - -				tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight; - -				if (clothing_weights) -				{ -					LLVector4a clothing_offset = mMorphData->mCoords[vert]; -					clothing_offset.mul(lastMaskWeight); -					LLVector4a* clothing_weight = &clothing_weights[out_vert]; -					LLVector4a t; -					t.setSub(*clothing_weight, clothing_offset); -					clothing_weight->setSelectWithMask(clothing_mask, t, *clothing_weight); -				} -			} -		} -	} - -	// set last weight to 0, since we've removed the effect of this morph -	mLastWeight = 0.f; - -	mVertMask->generateMask(maskTextureData, width, height, num_components, invert, clothing_weights); - -	apply(mLastSex); -} - - -//----------------------------------------------------------------------------- -// LLPolyVertexMask() -//----------------------------------------------------------------------------- -LLPolyVertexMask::LLPolyVertexMask(LLPolyMorphData* morph_data) -{ -	mWeights = new F32[morph_data->mNumIndices]; -	mMorphData = morph_data; -	mWeightsGenerated = FALSE; -} - -//----------------------------------------------------------------------------- -// ~LLPolyVertexMask() -//----------------------------------------------------------------------------- -LLPolyVertexMask::~LLPolyVertexMask() -{ -	delete[] mWeights; -} - -//----------------------------------------------------------------------------- -// generateMask() -//----------------------------------------------------------------------------- -void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights) -{ -// RN debug output that uses Image Debugger (http://www.cs.unc.edu/~baxter/projects/imdebug/) -//	BOOL debugImg = FALSE;  -//	if (debugImg) -//	{ -//		if (invert) -//		{ -//			imdebug("lum rbga=rgba b=8 w=%d h=%d *-1 %p", width, height, maskTextureData); -//		} -//		else -//		{ -//			imdebug("lum rbga=rgba b=8 w=%d h=%d %p", width, height, maskTextureData); -//		} -//	} -	for (U32 index = 0; index < mMorphData->mNumIndices; index++) -	{ -		S32 vertIndex = mMorphData->mVertexIndices[index]; -		const S32 *sharedVertIndex = mMorphData->mMesh->getSharedVert(vertIndex); -		LLVector2 uvCoords; - -		if (sharedVertIndex) -		{ -			uvCoords = mMorphData->mMesh->getUVs(*sharedVertIndex); -		} -		else -		{ -			uvCoords = mMorphData->mMesh->getUVs(vertIndex); -		} -		U32 s = llclamp((U32)(uvCoords.mV[VX] * (F32)(width - 1)), (U32)0, (U32)width - 1); -		U32 t = llclamp((U32)(uvCoords.mV[VY] * (F32)(height - 1)), (U32)0, (U32)height - 1); -		 -		mWeights[index] = ((F32) maskTextureData[((t * width + s) * num_components) + (num_components - 1)]) / 255.f; -		 -		if (invert)  -		{ -			mWeights[index] = 1.f - mWeights[index]; -		} - -		// now apply step function -		// mWeights[index] = mWeights[index] > 0.95f ? 1.f : 0.f; - -		if (clothing_weights) -		{ -			clothing_weights[vertIndex].getF32ptr()[VW] = mWeights[index]; -		} -	} -	mWeightsGenerated = TRUE; -} - -//----------------------------------------------------------------------------- -// getMaskForMorphIndex() -//----------------------------------------------------------------------------- -F32* LLPolyVertexMask::getMorphMaskWeights() -{ -	if (!mWeightsGenerated) -	{ -		return NULL; -	} -	 -	return mWeights; -} diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h deleted file mode 100644 index 678599d7e1..0000000000 --- a/indra/newview/llpolymorph.h +++ /dev/null @@ -1,195 +0,0 @@ -/**  - * @file llpolymorph.h - * @brief Implementation of LLPolyMesh 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_LLPOLYMORPH_H -#define LL_LLPOLYMORPH_H - -#include <string> -#include <vector> - -#include "llviewervisualparam.h" - -class LLPolyMeshSharedData; -class LLVOAvatar; -class LLVector2; -class LLViewerJointCollisionVolume; -class LLWearable; - -//----------------------------------------------------------------------------- -// LLPolyMorphData() -//----------------------------------------------------------------------------- -class LLPolyMorphData -{ -public: -	LLPolyMorphData(const std::string& morph_name); -	~LLPolyMorphData(); -	LLPolyMorphData(const LLPolyMorphData &rhs); - -	void* operator new(size_t size) -	{ -		return ll_aligned_malloc_16(size); -	} - -	void operator delete(void* ptr) -	{ -		ll_aligned_free_16(ptr); -	} - -	BOOL			loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh); -	const std::string& getName() { return mName; } - -public: -	std::string			mName; - -	// morphology -	U32					mNumIndices; -	U32*				mVertexIndices; -	U32					mCurrentIndex; -	LLVector4a*			mCoords; -	LLVector4a*			mNormals; -	LLVector4a*			mBinormals; -	LLVector2*			mTexCoords; - -	F32					mTotalDistortion;	// vertex distortion summed over entire morph -	F32					mMaxDistortion;		// maximum single vertex distortion in a given morph -	LLVector4a			mAvgDistortion;		// average vertex distortion, to infer directionality of the morph -	LLPolyMeshSharedData*	mMesh; - -private: -	void freeData(); -}; - -//----------------------------------------------------------------------------- -// LLPolyVertexMask() -//----------------------------------------------------------------------------- -class LLPolyVertexMask -{ -public: -	LLPolyVertexMask(LLPolyMorphData* morph_data); -	~LLPolyVertexMask(); - -	void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights); -	F32* getMorphMaskWeights(); - - -protected: -	F32*		mWeights; -	LLPolyMorphData *mMorphData; -	BOOL			mWeightsGenerated; - -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget Data structs -//----------------------------------------------------------------------------- -struct LLPolyVolumeMorphInfo -{ -	LLPolyVolumeMorphInfo(std::string &name, LLVector3 &scale, LLVector3 &pos) -		: mName(name), mScale(scale), mPos(pos) {}; - -	std::string						mName; -	LLVector3						mScale; -	LLVector3						mPos; -}; - -struct LLPolyVolumeMorph -{ -	LLPolyVolumeMorph(LLViewerJointCollisionVolume* volume, LLVector3 scale, LLVector3 pos) -		: mVolume(volume), mScale(scale), mPos(pos) {}; - -	LLViewerJointCollisionVolume*	mVolume; -	LLVector3						mScale; -	LLVector3						mPos; -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTargetInfo -// Shared information for LLPolyMorphTargets -//----------------------------------------------------------------------------- -class LLPolyMorphTargetInfo : public LLViewerVisualParamInfo -{ -	friend class LLPolyMorphTarget; -public: -	LLPolyMorphTargetInfo(); -	/*virtual*/ ~LLPolyMorphTargetInfo() {}; -	 -	/*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -protected: -	std::string		mMorphName; -	BOOL			mIsClothingMorph; -	typedef std::vector<LLPolyVolumeMorphInfo> volume_info_list_t; -	volume_info_list_t mVolumeInfoList;	 -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget -// A set of vertex data associated with morph target. -// These morph targets must be topologically consistent with a given Polymesh -// (share face sets) -//----------------------------------------------------------------------------- -class LLPolyMorphTarget : public LLViewerVisualParam -{ -public: -	LLPolyMorphTarget(LLPolyMesh *poly_mesh); -	~LLPolyMorphTarget(); - -	// Special: These functions are overridden by child classes -	LLPolyMorphTargetInfo*	getInfo() const { return (LLPolyMorphTargetInfo*)mInfo; } -	//   This sets mInfo and calls initialization functions -	BOOL					setInfo(LLPolyMorphTargetInfo *info); - -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node); -	/*virtual*/ void				apply( ESex sex ); -	 -	// LLViewerVisualParam Virtual functions -	/*virtual*/ F32					getTotalDistortion(); -	/*virtual*/ const LLVector4a&	getAvgDistortion(); -	/*virtual*/ F32					getMaxDistortion(); -	/*virtual*/ LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *poly_mesh); -	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh); -	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); - -	void	applyMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert); -	void	addPendingMorphMask() { mNumMorphMasksPending++; } - -protected: -	LLPolyMorphData*				mMorphData; -	LLPolyMesh*						mMesh; -	LLPolyVertexMask *				mVertMask; -	ESex							mLastSex; -	// number of morph masks that haven't been generated, must be 0 before this morph is applied -	BOOL							mNumMorphMasksPending;	 - -	typedef std::vector<LLPolyVolumeMorph> volume_list_t; -	volume_list_t 					mVolumeMorphs; - -}; - -#endif // LL_LLPOLYMORPH_H diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp index 4f2d6da7e5..aebe636f59 100644 --- a/indra/newview/llpostcard.cpp +++ b/indra/newview/llpostcard.cpp @@ -35,6 +35,7 @@  #include "message.h"  #include "llagent.h" +#include "llassetstorage.h"  #include "llassetuploadresponders.h"  /////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 3ff5a05d81..3784208e37 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -70,7 +70,7 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)  	  mAspectRatio(0.f),  	  mPreviewToSave(FALSE),  	  mImage(NULL), -	  mImageOldBoostLevel(LLViewerTexture::BOOST_NONE) +	  mImageOldBoostLevel(LLGLTexture::BOOST_NONE)  {  	updateImageID();  	if (key.has("save_as")) @@ -468,9 +468,9 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata)  void LLPreviewTexture::loadAsset()  { -	mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	mImageOldBoostLevel = mImage->getBoostLevel(); -	mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); +	mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW);  	mImage->forceToSaveRawImage(0) ;  	mAssetStatus = PREVIEW_ASSET_LOADING;  	mUpdateDimensions = TRUE; diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp index 698c4f9bb9..590e246482 100644 --- a/indra/newview/llregioninfomodel.cpp +++ b/indra/newview/llregioninfomodel.cpp @@ -119,7 +119,7 @@ void LLRegionInfoModel::sendRegionTerrain(const LLUUID& invoice) const  bool LLRegionInfoModel::getUseFixedSun() const  { -	return mRegionFlags & REGION_FLAGS_SUN_FIXED; +	return ((mRegionFlags & REGION_FLAGS_SUN_FIXED) != 0);  }  void LLRegionInfoModel::setUseFixedSun(bool fixed) @@ -141,7 +141,6 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)  	msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID); -	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor); @@ -159,6 +158,17 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)  	msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);  	LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL; +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, mRegionFlags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		mRegionFlags = flags; +	} +  	// the only reasonable way to decide if we actually have any data is to  	// check to see if any of these fields have nonzero sizes  	if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 || diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h index 89efd82767..d22a0de463 100644 --- a/indra/newview/llregioninfomodel.h +++ b/indra/newview/llregioninfomodel.h @@ -52,7 +52,7 @@ public:  	U8			mSimAccess;  	U8			mAgentLimit; -	U32			mRegionFlags; +	U64			mRegionFlags;  	U32			mEstateID;  	U32			mParentEstateID; diff --git a/indra/newview/llsaveoutfitcombobtn.cpp b/indra/newview/llsaveoutfitcombobtn.cpp index cbad85cfd3..59137f4ef7 100644 --- a/indra/newview/llsaveoutfitcombobtn.cpp +++ b/indra/newview/llsaveoutfitcombobtn.cpp @@ -31,6 +31,8 @@  #include "llsidepanelappearance.h"  #include "llsaveoutfitcombobtn.h"  #include "llviewermenu.h" +#include "llagent.h" +#include "llviewerregion.h"  static const std::string SAVE_BTN("save_btn");  static const std::string SAVE_FLYOUT_BTN("save_flyout_btn"); @@ -76,8 +78,12 @@ void LLSaveOutfitComboBtn::saveOutfit(bool as_new)  	if (panel_outfits_inventory)  	{  		panel_outfits_inventory->onSave(); +	}  +	 +    if ( gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) +	{ +		LLAppearanceMgr::instance().requestServerAppearanceUpdate();  	} -  	//*TODO how to get to know when base outfit is updated or new outfit is created?  } diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index d2280ea089..a58c5dfbf0 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -713,7 +713,6 @@ void LLScreenChannel::showToastsTop()  	LLRect	toast_rect;	  	S32		top = channel_rect.mTop; -	S32		toast_margin = 0;  	std::vector<ToastElem>::reverse_iterator it;  	updateRect(); @@ -736,7 +735,7 @@ void LLScreenChannel::showToastsTop()  			}  			top = toast->getRect().mBottom - toast->getTopPad(); -			toast_margin = gSavedSettings.getS32("ToastGap"); +			gSavedSettings.getS32("ToastGap");  		}  		LLToast* toast = it->getToast(); diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 05b82ba967..a7e24b86b1 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -267,7 +267,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )  				&& new_percent < slider->getMaxValue())  			{  				mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE); -				mWearable->writeToAvatar(); +				mWearable->writeToAvatar(gAgentAvatarp);  				gAgentAvatarp->updateVisualParams();  				slider->setValue( weightToPercent( new_weight ) ); @@ -300,7 +300,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata )  				&& new_percent < slider->getMaxValue())  			{  				self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); -				self->mWearable->writeToAvatar(); +				self->mWearable->writeToAvatar(gAgentAvatarp);  				slider->setValue( self->weightToPercent( new_weight ) );  			}  		} @@ -334,7 +334,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )  					&& new_percent < slider->getMaxValue())  				{  					self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); -					self->mWearable->writeToAvatar(); +					self->mWearable->writeToAvatar(gAgentAvatarp);  					slider->setValue( self->weightToPercent( new_weight ) );  				}  			} diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp index 62e3039d2f..8e083ddb6c 100644 --- a/indra/newview/llscrollingpanelparambase.cpp +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -94,7 +94,7 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata)  	if (current_weight != new_weight )  	{  		self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); -		self->mWearable->writeToAvatar(); +		self->mWearable->writeToAvatar(gAgentAvatarp);  		gAgentAvatarp->updateVisualParams();  	}  } diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 30400a4c6a..928d26646b 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -1239,7 +1239,6 @@ void LLSecAPIBasicHandler::_readProtectedData()  									llifstream::binary);  	if (!protected_data_stream.fail()) { -		int offset;  		U8 salt[STORE_SALT_SIZE];  		U8 buffer[BUFFER_READ_SIZE];  		U8 decrypted_buffer[BUFFER_READ_SIZE]; @@ -1250,7 +1249,6 @@ void LLSecAPIBasicHandler::_readProtectedData()  		// read in the salt and key  		protected_data_stream.read((char *)salt, STORE_SALT_SIZE); -		offset = 0;  		if (protected_data_stream.gcount() < STORE_SALT_SIZE)  		{  			throw LLProtectedDataException("Config file too short."); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index c3c37141ed..047bd2f7f3 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1182,7 +1182,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  	if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())  	{  		//LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject()); -		LLBBox bbox = mSavedSelectionBBox;  		mGridOrigin = mSavedSelectionBBox.getCenterAgent();  		mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f; @@ -1200,7 +1199,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  	else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull())  	{  		mGridRotation = first_grid_object->getRenderRotation(); -		LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();  		LLVector4a min_extents(F32_MAX);  		LLVector4a max_extents(-F32_MAX); @@ -1608,7 +1606,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  				// Texture picker defaults aren't inventory items  				// * Don't need to worry about permissions for them  				// * Can just apply the texture and be done with it. -				objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +				objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  			}  			return true;  		} @@ -1774,7 +1772,7 @@ BOOL LLSelectMgr::selectionRevertTextures()  					}  					else  					{ -						object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +						object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  					}  				}  			} @@ -5198,7 +5196,7 @@ void LLSelectMgr::updateSilhouettes()  	if (!mSilhouetteImagep)  	{ -		mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI); +		mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLGLTexture::BOOST_UI);  	}  	mHighlightedObjects->cleanupNodes(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 853656905c..8c4a05b116 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -47,7 +47,7 @@  #include "llviewercontrol.h"  #include "llviewerregion.h"  #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h"  static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); @@ -198,7 +198,7 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)  		if (is_outfit_edit_visible || is_wearable_edit_visible)  		{ -			const LLWearable *wearable_ptr = mEditWearable->getWearable(); +			const LLViewerWearable *wearable_ptr = mEditWearable->getWearable();  			if (!wearable_ptr)  			{  				llwarns << "Visibility change to invalid wearable" << llendl; @@ -206,12 +206,9 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)  			}  			// Disable camera switch is currently just for WT_PHYSICS type since we don't want to freeze the avatar  			// when editing its physics. -			const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()); -			if (!gAgentCamera.cameraCustomizeAvatar() &&  -				!disable_camera_motion && -				gSavedSettings.getBOOL("AppearanceCameraMovement")) +			if (!gAgentCamera.cameraCustomizeAvatar())  			{ -				gAgentCamera.changeCameraToCustomizeAvatar(); +				LLVOAvatarSelf::onCustomizeStart(LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()));  			}  			if (is_wearable_edit_visible)  			{ @@ -283,7 +280,7 @@ void LLSidepanelAppearance::onEditAppearanceButtonClicked()  {  	if (gAgentWearables.areWearablesLoaded())  	{ -		gAgentCamera.changeCameraToCustomizeAvatar(); +		LLVOAvatarSelf::onCustomizeStart();  	}  } @@ -329,7 +326,7 @@ void LLSidepanelAppearance::showOutfitEditPanel()  	toggleOutfitEditPanel(TRUE);  } -void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/, BOOL disable_camera_switch) +void LLSidepanelAppearance::showWearableEditPanel(LLViewerWearable *wearable /* = NULL*/, BOOL disable_camera_switch)  {  	toggleMyOutfitsPanel(FALSE);  	toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode @@ -371,19 +368,18 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  	if (visible)  	{  		mOutfitEdit->onOpen(LLSD()); -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) -		{ -			gAgentCamera.changeCameraToCustomizeAvatar(); -		} +		LLVOAvatarSelf::onCustomizeStart(disable_camera_switch);  	} -	else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) +	else   	{ -		gAgentCamera.changeCameraToDefault(); -		gAgentCamera.resetView(); +		if (!disable_camera_switch)   // if we're just switching between outfit and wearable editing, don't end customization. +		{ +			LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch); +		}  	}  } -void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable, BOOL disable_camera_switch) +void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearable *wearable, BOOL disable_camera_switch)  {  	if (!mEditWearable || mEditWearable->getVisible() == visible)  	{ @@ -393,7 +389,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	if (!wearable)  	{ -		wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0); +		wearable = gAgentWearables.getViewerWearable(LLWearableType::WT_SHAPE, 0);  	}  	if (!wearable)  	{ @@ -405,10 +401,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	if (visible)  	{ -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) -		{ -			gAgentCamera.changeCameraToCustomizeAvatar(); -		} +		LLVOAvatarSelf::onCustomizeStart(disable_camera_switch);  		mEditWearable->setWearable(wearable, disable_camera_switch);  		mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency  	} @@ -416,10 +409,9 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	{  		// Save changes if closing.  		mEditWearable->saveChanges(); -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) +		if (!disable_camera_switch)   // if we're just switching between outfit and wearable editing, don't end customization.  		{ -			gAgentCamera.changeCameraToDefault(); -			gAgentCamera.resetView(); +			LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch);  		}  	}  } @@ -453,7 +445,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)  }  //static -void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch) +void LLSidepanelAppearance::editWearable(LLViewerWearable *wearable, LLView *data, BOOL disable_camera_switch)  {  	LLFloaterSidePanelContainer::showPanel("appearance", LLSD()); diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 6dd3520266..32bbb8a776 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -36,7 +36,7 @@  class LLFilterEditor;  class LLCurrentlyWornFetchObserver;  class LLPanelEditWearable; -class LLWearable; +class LLViewerWearable;  class LLPanelOutfitsInventory;  class LLSidepanelAppearance : public LLPanel @@ -51,7 +51,7 @@ public:  	void refreshCurrentOutfitName(const std::string& name = ""); -	static void editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE); +	static void editWearable(LLViewerWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE);  	void fetchInventory();  	void inventoryFetched(); @@ -59,7 +59,7 @@ public:  	void showOutfitsInventoryPanel();  	void showOutfitEditPanel(); -	void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE); +	void showWearableEditPanel(LLViewerWearable *wearable = NULL, BOOL disable_camera_switch = FALSE);  	void setWearablesLoading(bool val);  	void showDefaultSubpart();  	void updateScrollingPanelList(); @@ -74,7 +74,7 @@ private:  	void toggleMyOutfitsPanel(BOOL visible);  	void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE); -	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); +	void toggleWearableEditPanel(BOOL visible, LLViewerWearable* wearable = NULL, BOOL disable_camera_switch = FALSE);  	LLFilterEditor*			mFilterEditor;  	LLPanelOutfitsInventory* mPanelOutfitsInventory; diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index c351b1a128..95e173ef3e 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -368,10 +368,8 @@ void LLSidepanelTaskInfo::refresh()  	// Update creator text field  	getChildView("Creator:")->setEnabled(TRUE); -	BOOL creators_identical;  	std::string creator_name; -	creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, -																	  creator_name); +	LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, creator_name);  	getChild<LLUICtrl>("Creator Name")->setValue(creator_name);  	getChildView("Creator Name")->setEnabled(TRUE); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 2083afdcf5..122a01ebcb 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3576,9 +3576,9 @@ void renderTexturePriority(LLDrawable* drawable)  		drawBox(center, size);  		/*S32 boost = imagep->getBoostLevel(); -		if (boost>LLViewerTexture::BOOST_NONE) +		if (boost>LLGLTexture::BOOST_NONE)  		{ -			F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1); +			F32 t = (F32) boost / (F32) (LLGLTexture::BOOST_MAX_LEVEL-1);  			LLVector4 col = lerp(boost_cold, boost_hot, t);  			LLGLEnable blend_on(GL_BLEND);  			gGL.blendFunc(GL_SRC_ALPHA, GL_ONE); @@ -4030,7 +4030,7 @@ void renderAgentTarget(LLVOAvatar* avatar)  	{  		renderCrossHairs(avatar->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f));  		renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f)); -		renderCrossHairs(avatar->mRoot.getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f)); +		renderCrossHairs(avatar->mRoot->getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f));  		renderCrossHairs(avatar->mPelvisp->getWorldPosition(), 0.2f, LLColor4(0, 0, 1, 0.8f));  	}  } @@ -4094,9 +4094,6 @@ public:  			return;  		} -		LLVector4a nodeCenter = group->mBounds[0]; -		LLVector4a octCenter = group->mOctreeNode->getCenter(); -  		group->rebuildGeom();  		group->rebuildMesh(); @@ -4573,9 +4570,6 @@ public:  	virtual bool check(LLDrawable* drawable)  	{	 -		LLVector3 local_start = mStart; -		LLVector3 local_end = mEnd; -  		if (!drawable || !gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())  		{  			return false; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 07d2f1ad6f..1c7c6450c7 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -350,7 +350,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)  		LLUUID speaker_id = speaker_it->first;  		LLSpeaker* speakerp = speaker_it->second; -		speaker_map_t::iterator  cur_speaker_it = speaker_it++; +		speaker_it++;  		if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))  		{ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3d1fd74ba6..0bc56166bb 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -316,7 +316,6 @@ bool idle_startup()  	const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");  	static LLTimer timeout; -	static S32 timeout_count = 0;  	static LLTimer login_time; @@ -332,7 +331,6 @@ bool idle_startup()  	// last location by default  	static S32  agent_location_id = START_LOCATION_ID_LAST; -	static S32  location_which = START_LOCATION_ID_LAST;  	static bool show_connect_box = true; @@ -744,8 +742,6 @@ bool idle_startup()  		gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); -		timeout_count = 0; -  		// Login screen needs menus for preferences, but we can enter  		// this startup phase more than once.  		if (gLoginMenuBarView == NULL) @@ -772,10 +768,6 @@ bool idle_startup()  				gUserCredential = gLoginHandler.initializeLoginInfo();                   				display_startup();  			}      -			if (gHeadlessClient) -			{ -				LL_WARNS("AppInit") << "Waiting at connection box in headless client.  Did you mean to add autologin params?" << LL_ENDL; -			}  			// Make sure the process dialog doesn't hide things  			display_startup();  			gViewerWindow->setShowProgress(FALSE); @@ -986,15 +978,12 @@ bool idle_startup()  		  {  		  case LLSLURL::LOCATION:  		    agent_location_id = START_LOCATION_ID_URL; -		    location_which = START_LOCATION_ID_LAST;  		    break;  		  case LLSLURL::LAST_LOCATION:  		    agent_location_id = START_LOCATION_ID_LAST; -		    location_which = START_LOCATION_ID_LAST;  		    break;  		  default:  		    agent_location_id = START_LOCATION_ID_HOME; -		    location_which = START_LOCATION_ID_HOME;  		    break;  		  } @@ -1247,6 +1236,9 @@ bool idle_startup()  		LLPostProcess::initClass();  		display_startup(); +		LLAvatarAppearance::initClass(); +		display_startup(); +  		LLViewerObject::initVOClasses();  		display_startup(); @@ -3449,6 +3441,14 @@ bool process_login_success_response()  	} +	// set the location of the Agent Appearance service, from which we can request +	// avatar baked textures if they are supported by the current region +	std::string agent_appearance_url = response["agent_appearance_service"]; +	if (!agent_appearance_url.empty()) +	{ +		gSavedSettings.setString("AgentAppearanceServiceURL", agent_appearance_url); +	} +  	// Set the location of the snapshot sharing config endpoint  	std::string snapshot_config_url = response["snapshot_config_url"];  	if(!snapshot_config_url.empty()) @@ -3493,13 +3493,6 @@ bool process_login_success_response()  void transition_back_to_login_panel(const std::string& emsg)  { -	if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin")) -	{ -		LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL; -		LL_WARNS("AppInit") << emsg << LL_ENDL; -		exit(0); -	} -  	// Bounce back to the login screen.  	reset_login(); // calls LLStartUp::setStartupState( STATE_LOGIN_SHOW );  	gSavedSettings.setBOOL("AutoLogin", FALSE); diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index f64a72a616..dad253ffc3 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -1249,8 +1249,6 @@ BOOL LLSurface::generateWaterTexture(const F32 x, const F32 y,  		y_end = tex_width;  	} -	LLVector3d origin_global = from_region_handle(getRegion()->getHandle()); -  	// OK, for now, just have the composition value equal the height at the point.  	LLVector3 location;  	LLColor4U coloru; diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp deleted file mode 100644 index ebe5ccd6c0..0000000000 --- a/indra/newview/lltexglobalcolor.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/**  - * @file lltexlayerglobalcolor.cpp - * @brief Color for texture layers. - * - * $LicenseInfo:firstyear=2008&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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llagent.h" -#include "lltexlayer.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "lltexglobalcolor.h" - -//----------------------------------------------------------------------------- -// LLTexGlobalColor -//----------------------------------------------------------------------------- - -LLTexGlobalColor::LLTexGlobalColor(LLVOAvatar* avatar)  -	: -	mAvatar(avatar), -	mInfo(NULL) -{ -} - -LLTexGlobalColor::~LLTexGlobalColor() -{ -	// mParamColorList are LLViewerVisualParam's and get deleted with ~LLCharacter() -	//std::for_each(mParamColorList.begin(), mParamColorList.end(), DeletePointer()); -} - -BOOL LLTexGlobalColor::setInfo(LLTexGlobalColorInfo *info) -{ -	llassert(mInfo == NULL); -	mInfo = info; -	//mID = info->mID; // No ID - -	mParamGlobalColorList.reserve(mInfo->mParamColorInfoList.size()); -	for (param_color_info_list_t::iterator iter = mInfo->mParamColorInfoList.begin();  -		 iter != mInfo->mParamColorInfoList.end();  -		 iter++) -	{ -		LLTexParamGlobalColor* param_color = new LLTexParamGlobalColor(this); -		if (!param_color->setInfo(*iter, TRUE)) -		{ -			mInfo = NULL; -			return FALSE; -		} -		mParamGlobalColorList.push_back(param_color); -	} -	 -	return TRUE; -} - -LLColor4 LLTexGlobalColor::getColor() const -{ -	// Sum of color params -	if (mParamGlobalColorList.empty()) -		return LLColor4(1.f, 1.f, 1.f, 1.f); - -	LLColor4 net_color(0.f, 0.f, 0.f, 0.f); -	LLTexLayer::calculateTexLayerColor(mParamGlobalColorList, net_color); -	return net_color; -} - -const std::string& LLTexGlobalColor::getName() const -{  -	return mInfo->mName;  -} - -//----------------------------------------------------------------------------- -// LLTexParamGlobalColor -//----------------------------------------------------------------------------- -LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color) : -	LLTexLayerParamColor(tex_global_color->getAvatar()), -	mTexGlobalColor(tex_global_color) -{ -} - -/*virtual*/ LLViewerVisualParam* LLTexParamGlobalColor::cloneParam(LLWearable* wearable) const -{ -	LLTexParamGlobalColor *new_param = new LLTexParamGlobalColor(mTexGlobalColor); -	*new_param = *this; -	return new_param; -} - -void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake) -{ -	mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake); -} - -//----------------------------------------------------------------------------- -// LLTexGlobalColorInfo -//----------------------------------------------------------------------------- - -LLTexGlobalColorInfo::LLTexGlobalColorInfo() -{ -} - - -LLTexGlobalColorInfo::~LLTexGlobalColorInfo() -{ -	for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); -} - -BOOL LLTexGlobalColorInfo::parseXml(LLXmlTreeNode* node) -{ -	// name attribute -	static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -	if (!node->getFastAttributeString(name_string, mName)) -	{ -		llwarns << "<global_color> element is missing name attribute." << llendl; -		return FALSE; -	} -	// <param> sub-element -	for (LLXmlTreeNode* child = node->getChildByName("param"); -		 child; -		 child = node->getNextNamedChild()) -	{ -		if (child->getChildByName("param_color")) -		{ -			// <param><param_color/></param> -			LLTexLayerParamColorInfo* info = new LLTexLayerParamColorInfo(); -			if (!info->parseXml(child)) -			{ -				delete info; -				return FALSE; -			} -			mParamColorInfoList.push_back(info); -		} -	} -	return TRUE; -} diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h deleted file mode 100644 index ae04798445..0000000000 --- a/indra/newview/lltexglobalcolor.h +++ /dev/null @@ -1,83 +0,0 @@ -/**  - * @file lltexglobalcolor.h - * @brief This is global texture color info used by llvoavatar. - * - * $LicenseInfo:firstyear=2008&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_LLTEXGLOBALCOLOR_H -#define LL_LLTEXGLOBALCOLOR_H - -#include "lltexlayer.h" -#include "lltexlayerparams.h" - -class LLVOAvatar; -class LLWearable; -class LLTexGlobalColorInfo; - -class LLTexGlobalColor -{ -public: -	LLTexGlobalColor( LLVOAvatar* avatar ); -	~LLTexGlobalColor(); - -	LLTexGlobalColorInfo*	getInfo() const { return mInfo; } -	//   This sets mInfo and calls initialization functions -	BOOL					setInfo(LLTexGlobalColorInfo *info); -	 -	LLVOAvatar*				getAvatar()	const			   	{ return mAvatar; } -	LLColor4				getColor() const; -	const std::string&		getName() const; - -private: -	param_color_list_t		mParamGlobalColorList; -	LLVOAvatar*				mAvatar;  // just backlink, don't LLPointer  -	LLTexGlobalColorInfo	*mInfo; -}; - -// Used by llvoavatar to determine skin/eye/hair color. -class LLTexGlobalColorInfo -{ -	friend class LLTexGlobalColor; -public: -	LLTexGlobalColorInfo(); -	~LLTexGlobalColorInfo(); - -	BOOL parseXml(LLXmlTreeNode* node); - -private: -	param_color_info_list_t		mParamColorInfoList; -	std::string				mName; -}; - -class LLTexParamGlobalColor : public LLTexLayerParamColor -{ -public: -	LLTexParamGlobalColor(LLTexGlobalColor *tex_color); -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; -protected: -	/*virtual*/ void onGlobalColorChanged(bool upload_bake); -private: -	LLTexGlobalColor*		mTexGlobalColor; -}; - -#endif diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp deleted file mode 100644 index ad09af6594..0000000000 --- a/indra/newview/lltexlayer.cpp +++ /dev/null @@ -1,2514 +0,0 @@ -/**  - * @file lltexlayer.cpp - * @brief A texture layer. Used for avatars. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lltexlayer.h" - -#include "llagent.h" -#include "llimagej2c.h" -#include "llimagetga.h" -#include "llnotificationsutil.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewerstats.h" -#include "llviewerregion.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "pipeline.h" -#include "llassetuploadresponders.h" -#include "lltexlayerparams.h" -#include "llui.h" -#include "llagentwearables.h" -#include "llwearable.h" -#include "llviewercontrol.h" -#include "llviewershadermgr.h" -#include "llviewervisualparam.h" - -//#include "../tools/imdebug/imdebug.h" - -using namespace LLVOAvatarDefines; - -static const S32 BAKE_UPLOAD_ATTEMPTS = 7; -static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt - -// runway consolidate -extern std::string self_av_string(); - -class LLTexLayerInfo -{ -	friend class LLTexLayer; -	friend class LLTexLayerTemplate; -	friend class LLTexLayerInterface; -public: -	LLTexLayerInfo(); -	~LLTexLayerInfo(); - -	BOOL parseXml(LLXmlTreeNode* node); -	BOOL createVisualParams(LLVOAvatar *avatar); -	BOOL isUserSettable() { return mLocalTexture != -1;	} -	S32  getLocalTexture() const { return mLocalTexture; } -	BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; } -	std::string getName() const { return mName;	} - -private: -	std::string				mName; -	 -	BOOL					mWriteAllChannels; // Don't use masking.  Just write RGBA into buffer, -	LLTexLayerInterface::ERenderPass mRenderPass; - -	std::string				mGlobalColor; -	LLColor4				mFixedColor; - -	S32						mLocalTexture; -	std::string				mStaticImageFileName; -	BOOL					mStaticImageIsMask; -	BOOL					mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture.  Use alpha as a mask -	BOOL					mIsVisibilityMask; - -	typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t; -	morph_name_list_t		    mMorphNameList; -	param_color_info_list_t		mParamColorInfoList; -	param_alpha_info_list_t		mParamAlphaInfoList; -}; - -//----------------------------------------------------------------------------- -// LLBakedUploadData() -//----------------------------------------------------------------------------- -LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar, -									 LLTexLayerSet* layerset, -									 const LLUUID& id, -									 bool highest_res) : -	mAvatar(avatar), -	mTexLayerSet(layerset), -	mID(id), -	mStartTime(LLFrameTimer::getTotalTime()),		// Record starting time -	mIsHighestRes(highest_res) -{  -} - -//----------------------------------------------------------------------------- -// LLTexLayerSetBuffer -// The composite image that a LLTexLayerSet writes to.  Each LLTexLayerSet has one. -//----------------------------------------------------------------------------- - -// static -S32 LLTexLayerSetBuffer::sGLByteCount = 0; - -LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,  -										 S32 width, S32 height) : -	// ORDER_LAST => must render these after the hints are created. -	LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),  -	mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates -	mNeedsUpload(FALSE), -	mNumLowresUploads(0), -	mUploadFailCount(0), -	mNeedsUpdate(TRUE), -	mNumLowresUpdates(0), -	mTexLayerSet(owner) -{ -	LLTexLayerSetBuffer::sGLByteCount += getSize(); -	mNeedsUploadTimer.start(); -	mNeedsUpdateTimer.start(); -} - -LLTexLayerSetBuffer::~LLTexLayerSetBuffer() -{ -	LLTexLayerSetBuffer::sGLByteCount -= getSize(); -	destroyGLTexture(); -	for( S32 order = 0; order < ORDER_COUNT; order++ ) -	{ -		LLViewerDynamicTexture::sInstances[order].erase(this);  // will fail in all but one case. -	} -} - -//virtual  -S8 LLTexLayerSetBuffer::getType() const  -{ -	return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; -} - -//virtual  -void LLTexLayerSetBuffer::restoreGLTexture()  -{	 -	LLViewerDynamicTexture::restoreGLTexture() ; -} - -//virtual  -void LLTexLayerSetBuffer::destroyGLTexture()  -{ -	LLViewerDynamicTexture::destroyGLTexture() ; -} - -// static -void LLTexLayerSetBuffer::dumpTotalByteCount() -{ -	llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl; -} - -void LLTexLayerSetBuffer::requestUpdate() -{ -	restartUpdateTimer(); -	mNeedsUpdate = TRUE; -	mNumLowresUpdates = 0; -	// If we're in the middle of uploading a baked texture, we don't care about it any more. -	// When it's downloaded, ignore it. -	mUploadID.setNull(); -} - -void LLTexLayerSetBuffer::requestUpload() -{ -	conditionalRestartUploadTimer(); -	mNeedsUpload = TRUE; -	mNumLowresUploads = 0; -	mUploadPending = TRUE; -} - -void LLTexLayerSetBuffer::conditionalRestartUploadTimer() -{ -	// If we requested a new upload but haven't even uploaded -	// a low res version of our last upload request, then -	// keep the timer ticking instead of resetting it. -	if (mNeedsUpload && (mNumLowresUploads == 0)) -	{ -		mNeedsUploadTimer.unpause(); -	} -	else -	{ -		mNeedsUploadTimer.reset(); -		mNeedsUploadTimer.start(); -	} -} - -void LLTexLayerSetBuffer::restartUpdateTimer() -{ -	mNeedsUpdateTimer.reset(); -	mNeedsUpdateTimer.start(); -} - -void LLTexLayerSetBuffer::cancelUpload() -{ -	mNeedsUpload = FALSE; -	mUploadPending = FALSE; -	mNeedsUploadTimer.pause(); -	mUploadRetryTimer.reset(); -} - -void LLTexLayerSetBuffer::pushProjection() const -{ -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.pushMatrix(); -	gGL.loadIdentity(); -	gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); - -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.pushMatrix(); -	gGL.loadIdentity(); -} - -void LLTexLayerSetBuffer::popProjection() const -{ -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.popMatrix(); - -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.popMatrix(); -} - -BOOL LLTexLayerSetBuffer::needsRender() -{ -	llassert(mTexLayerSet->getAvatar() == gAgentAvatarp); -	if (!isAgentAvatarValid()) return FALSE; - -	const BOOL upload_now = mNeedsUpload && isReadyToUpload(); -	const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); - -	// Don't render if we don't want to (or aren't ready to) upload or update. -	if (!(update_now || upload_now)) -	{ -		return FALSE; -	} - -	// Don't render if we're animating our appearance. -	if (gAgentAvatarp->getIsAppearanceAnimating()) -	{ -		return FALSE; -	} - -	// Don't render if we are trying to create a shirt texture but aren't wearing a skirt. -	if (gAgentAvatarp->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED &&  -		!gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) -	{ -		cancelUpload(); -		return FALSE; -	} - -	// Render if we have at least minimal level of detail for each local texture. -	return mTexLayerSet->isLocalTextureDataAvailable(); -} - -void LLTexLayerSetBuffer::preRender(BOOL clear_depth) -{ -	// Set up an ortho projection -	pushProjection(); -	 -	// keep depth buffer, we don't need to clear it -	LLViewerDynamicTexture::preRender(FALSE); -} - -void LLTexLayerSetBuffer::postRender(BOOL success) -{ -	popProjection(); - -	LLViewerDynamicTexture::postRender(success); -} - -BOOL LLTexLayerSetBuffer::render() -{ -	// Default color mask for tex layer render -	gGL.setColorMask(true, true); - -	// do we need to upload, and do we have sufficient data to create an uploadable composite? -	// TODO: When do we upload the texture if gAgent.mNumPendingQueries is non-zero? -	const BOOL upload_now = mNeedsUpload && isReadyToUpload(); -	const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); -	 -	BOOL success = TRUE; -	 -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	if (use_shaders) -	{ -		gAlphaMaskProgram.bind(); -		gAlphaMaskProgram.setMinimumAlpha(0.004f); -	} - -	LLVertexBuffer::unbind(); - -	// Composite the color data -	LLGLSUIDefault gls_ui; -	success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight ); -	gGL.flush(); - -	if(upload_now) -	{ -		if (!success) -		{ -			llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl; -			mUploadPending = FALSE; -		} -		else -		{ -			if (mTexLayerSet->isVisible()) -			{ -				mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish. -				doUpload(); -			} -			else -			{ -				mUploadPending = FALSE; -				mNeedsUpload = FALSE; -				mNeedsUploadTimer.pause(); -				mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE); -			} -		} -	} -	 -	if (update_now) -	{ -		doUpdate(); -	} - -	if (use_shaders) -	{ -		gAlphaMaskProgram.unbind(); -	} - -	LLVertexBuffer::unbind(); -	 -	// reset GL state -	gGL.setColorMask(true, true); -	gGL.setSceneBlendType(LLRender::BT_ALPHA); - -	// we have valid texture data now -	mGLTexturep->setGLTextureCreated(true); - -	return success; -} - -BOOL LLTexLayerSetBuffer::isInitialized(void) const -{ -	return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); -} - -BOOL LLTexLayerSetBuffer::uploadPending() const -{ -	return mUploadPending; -} - -BOOL LLTexLayerSetBuffer::uploadNeeded() const -{ -	return mNeedsUpload; -} - -BOOL LLTexLayerSetBuffer::uploadInProgress() const -{ -	return !mUploadID.isNull(); -} - -BOOL LLTexLayerSetBuffer::isReadyToUpload() const -{ -	if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries. -	if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites. - -	BOOL ready = FALSE; -	if (mTexLayerSet->isLocalTextureDataFinal()) -	{ -		// If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry) -		if (mUploadFailCount == 0) -		{ -			ready = TRUE; -		} -		else -		{ -			ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1)); -		} -	} -	else -	{ -		// Upload if we've hit a timeout.  Upload is a pretty expensive process so we need to make sure -		// we aren't doing uploads too frequently. -		const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout"); -		if (texture_timeout != 0) -		{ -			// The timeout period increases exponentially between every lowres upload in order to prevent -			// spamming the server with frequent uploads. -			const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads); - -			// If we hit our timeout and have textures available at even lower resolution, then upload. -			const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold; -			const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); -			ready = has_lower_lod && is_upload_textures_timeout; -		} -	} - -	return ready; -} - -BOOL LLTexLayerSetBuffer::isReadyToUpdate() const -{ -	// If we requested an update and have the final LOD ready, then update. -	if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE; - -	// If we haven't done an update yet, then just do one now regardless of state of textures. -	if (mNumLowresUpdates == 0) return TRUE; - -	// Update if we've hit a timeout.  Unlike for uploads, we can make this timeout fairly small -	// since render unnecessarily doesn't cost much. -	const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedLocalTextureUpdateTimeout"); -	if (texture_timeout != 0) -	{ -		// If we hit our timeout and have textures available at even lower resolution, then update. -		const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= texture_timeout; -		const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); -		if (has_lower_lod && is_update_textures_timeout) return TRUE;  -	} - -	return FALSE; -} - -BOOL LLTexLayerSetBuffer::requestUpdateImmediate() -{ -	mNeedsUpdate = TRUE; -	BOOL result = FALSE; - -	if (needsRender()) -	{ -		preRender(FALSE); -		result = render(); -		postRender(result); -	} - -	return result; -} - -// Create the baked texture, send it out to the server, then wait for it to come -// back so we can switch to using it. -void LLTexLayerSetBuffer::doUpload() -{ -	llinfos << "Uploading baked " << mTexLayerSet->getBodyRegionName() << llendl; -	LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); - -	// Don't need caches since we're baked now.  (note: we won't *really* be baked  -	// until this image is sent to the server and the Avatar Appearance message is received.) -	mTexLayerSet->deleteCaches(); - -	// Get the COLOR information from our texture -	U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; -	glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); -	stop_glerror(); - -	// Get the MASK information from our texture -	LLGLSUIDefault gls_ui; -	LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); -	U8* baked_mask_data = baked_mask_image->getData();  -	mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight); - - -	// Create the baked image from our color and mask information -	const S32 baked_image_components = 5; // red green blue [bump] clothing -	LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); -	U8* baked_image_data = baked_image->getData(); -	S32 i = 0; -	for (S32 u=0; u < mFullWidth; u++) -	{ -		for (S32 v=0; v < mFullHeight; v++) -		{ -			baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; -			baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; -			baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; -			baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes. -			baked_image_data[5*i + 4] = baked_mask_data[i]; -			i++; -		} -	} -	 -	LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C; -	const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) -	if (compressedImage->encode(baked_image, comment_text)) -	{ -		LLTransactionID tid; -		tid.generate(); -		const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); -		if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), -							   gVFS, asset_id, LLAssetType::AT_TEXTURE)) -		{ -			// Read back the file and validate. -			BOOL valid = FALSE; -			LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; -			S32 file_size = 0; -			 -			//data buffer MUST be allocated using LLImageBase -			LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE); -			file_size = file.getSize(); -			U8* data = integrity_test->allocateData(file_size); -			file.read(data, file_size); -			 -			if (data) -			{ -				valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data' -			} -			else -			{ -				integrity_test->setLastError("Unable to read entire file"); -			} -			 -			if (valid) -			{ -				const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal(); -				// Baked_upload_data is owned by the responder and deleted after the request completes. -				LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,  -																			 this->mTexLayerSet,  -																			 asset_id, -																			 highest_lod); -				// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit. -				mUploadID = asset_id; - -				// Upload the image -				const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); -				if(!url.empty() -					&& !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method -					&& (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing. -				{ -					LLSD body = LLSD::emptyMap(); -					// The responder will call LLTexLayerSetBuffer::onTextureUploadComplete() -					LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); -					llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; -				}  -				else -				{ -					gAssetStorage->storeAssetData(tid, -												  LLAssetType::AT_TEXTURE, -												  LLTexLayerSetBuffer::onTextureUploadComplete, -												  baked_upload_data, -												  TRUE,		// temp_file -												  TRUE,		// is_priority -												  TRUE);	// store_local -					llinfos << "Baked texture upload via Asset Store." <<  llendl; -				} - -				if (highest_lod) -				{ -					// Sending the final LOD for the baked texture.  All done, pause  -					// the upload timer so we know how long it took. -					mNeedsUpload = FALSE; -					mNeedsUploadTimer.pause(); -				} -				else -				{ -					// Sending a lower level LOD for the baked texture.  Restart the upload timer. -					mNumLowresUploads++; -					mNeedsUploadTimer.unpause(); -					mNeedsUploadTimer.reset(); -				} - -				// Print out notification that we uploaded this texture. -				if (gSavedSettings.getBOOL("DebugAvatarRezTime")) -				{ -					const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; -					LLSD args; -					args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32()); -					args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); -					args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); -					args["RESOLUTION"] = lod_str; -					LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args); -					LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL; -				} -			} -			else -			{ -				// The read back and validate operation failed.  Remove the uploaded file. -				mUploadPending = FALSE; -				LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); -				file.remove(); -				llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; -			} -		} -	} -	else -	{ -		// The VFS write file operation failed. -		mUploadPending = FALSE; -		llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; -	} - -	delete [] baked_color_data; -} - -// Mostly bookkeeping; don't need to actually "do" anything since -// render() will actually do the update. -void LLTexLayerSetBuffer::doUpdate() -{ -	const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal(); -	if (highest_lod) -	{ -		mNeedsUpdate = FALSE; -	} -	else -	{ -		mNumLowresUpdates++; -	} - -	restartUpdateTimer(); - -	// need to swtich to using this layerset if this is the first update -	// after getting the lowest LOD -	mTexLayerSet->getAvatar()->updateMeshTextures(); -	 -	// Print out notification that we uploaded this texture. -	if (gSavedSettings.getBOOL("DebugAvatarRezTime")) -	{ -		const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal(); -		const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; -		LLSD args; -		args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32()); -		args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32()); -		args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); -		args["RESOLUTION"] = lod_str; -		LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args); -		LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL; -	} -} - -// static -void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, -												  void* userdata, -												  S32 result, -												  LLExtStat ext_status) // StoreAssetData callback (not fixed) -{ -	LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; - -	if (isAgentAvatarValid() && -		!gAgentAvatarp->isDead() && -		(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures. -		(baked_upload_data->mTexLayerSet->hasComposite())) -	{ -		LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite(); -		S32 failures = layerset_buffer->mUploadFailCount; -		layerset_buffer->mUploadFailCount = 0; - -		if (layerset_buffer->mUploadID.isNull()) -		{ -			// The upload got canceled, we should be in the -			// process of baking a new texture so request an -			// upload with the new data - -			// BAP: does this really belong in this callback, as -			// opposed to where the cancellation takes place? -			// suspect this does nothing. -			layerset_buffer->requestUpload(); -		} -		else if (baked_upload_data->mID == layerset_buffer->mUploadID) -		{ -			// This is the upload we're currently waiting for. -			layerset_buffer->mUploadID.setNull(); -			const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName()); -			const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res "; -			if (result >= 0) -			{ -				layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later -				LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet); -				// Update baked texture info with the new UUID -				U64 now = LLFrameTimer::getTotalTime();		// Record starting time -				llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; -				gAgentAvatarp->setNewBakedTexture(baked_te, uuid); -			} -			else -			{	 -				++failures; -				S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes -				llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl; -				if (failures < max_attempts) -				{ -					layerset_buffer->mUploadFailCount = failures; -					layerset_buffer->mUploadRetryTimer.start(); -					layerset_buffer->requestUpload(); -				} -			} -		} -		else -		{ -			llinfos << "Received baked texture out of date, ignored." << llendl; -		} - -		gAgentAvatarp->dirtyMesh(); -	} -	else -	{ -		// Baked texture failed to upload (in which case since we -		// didn't set the new baked texture, it means that they'll try -		// and rebake it at some point in the future (after login?)), -		// or this response to upload is out of date, in which case a -		// current response should be on the way or already processed. -		llwarns << "Baked upload failed" << llendl; -	} - -	delete baked_upload_data; -} - -//----------------------------------------------------------------------------- -// LLTexLayerSet -// An ordered set of texture layers that get composited into a single texture. -//----------------------------------------------------------------------------- - -LLTexLayerSetInfo::LLTexLayerSetInfo() : -	mBodyRegion( "" ), -	mWidth( 512 ), -	mHeight( 512 ), -	mClearAlpha( TRUE ) -{ -} - -LLTexLayerSetInfo::~LLTexLayerSetInfo( ) -{ -	std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer()); -} - -BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node) -{ -	llassert( node->hasName( "layer_set" ) ); -	if( !node->hasName( "layer_set" ) ) -	{ -		return FALSE; -	} - -	// body_region -	static LLStdStringHandle body_region_string = LLXmlTree::addAttributeString("body_region"); -	if( !node->getFastAttributeString( body_region_string, mBodyRegion ) ) -	{ -		llwarns << "<layer_set> is missing body_region attribute" << llendl; -		return FALSE; -	} - -	// width, height -	static LLStdStringHandle width_string = LLXmlTree::addAttributeString("width"); -	if( !node->getFastAttributeS32( width_string, mWidth ) ) -	{ -		return FALSE; -	} - -	static LLStdStringHandle height_string = LLXmlTree::addAttributeString("height"); -	if( !node->getFastAttributeS32( height_string, mHeight ) ) -	{ -		return FALSE; -	} - -	// Optional alpha component to apply after all compositing is complete. -	static LLStdStringHandle alpha_tga_file_string = LLXmlTree::addAttributeString("alpha_tga_file"); -	node->getFastAttributeString( alpha_tga_file_string, mStaticAlphaFileName ); - -	static LLStdStringHandle clear_alpha_string = LLXmlTree::addAttributeString("clear_alpha"); -	node->getFastAttributeBOOL( clear_alpha_string, mClearAlpha ); - -	// <layer> -	for (LLXmlTreeNode* child = node->getChildByName( "layer" ); -		 child; -		 child = node->getNextNamedChild()) -	{ -		LLTexLayerInfo* info = new LLTexLayerInfo(); -		if( !info->parseXml( child )) -		{ -			delete info; -			return FALSE; -		} -		mLayerInfoList.push_back( info );		 -	} -	return TRUE; -} - -// creates visual params without generating layersets or layers -void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar) -{ -	//layer_info_list_t		mLayerInfoList; -	for (layer_info_list_t::iterator layer_iter = mLayerInfoList.begin(); -		 layer_iter != mLayerInfoList.end(); -		 layer_iter++) -	{ -		LLTexLayerInfo *layer_info = *layer_iter; -		layer_info->createVisualParams(avatar); -	} -} - -//----------------------------------------------------------------------------- -// LLTexLayerSet -// An ordered set of texture layers that get composited into a single texture. -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::sHasCaches = FALSE; - -LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) : -	mComposite( NULL ), -	mAvatar( avatar ), -	mUpdatesEnabled( FALSE ), -	mIsVisible( TRUE ), -	mBakedTexIndex(LLVOAvatarDefines::BAKED_HEAD), -	mInfo( NULL ) -{ -} - -LLTexLayerSet::~LLTexLayerSet() -{ -	deleteCaches(); -	std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer()); -	std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer()); -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info) -{ -	llassert(mInfo == NULL); -	mInfo = info; -	//mID = info->mID; // No ID - -	mLayerList.reserve(info->mLayerInfoList.size()); -	for (LLTexLayerSetInfo::layer_info_list_t::const_iterator iter = info->mLayerInfoList.begin();  -		 iter != info->mLayerInfoList.end();  -		 iter++) -	{ -		LLTexLayerInterface *layer = NULL; -		if ( (*iter)->isUserSettable() ) -		{ -			layer = new LLTexLayerTemplate( this ); -		} -		else -		{ -			layer = new LLTexLayer(this); -		} -		// this is the first time this layer (of either type) is being created - make sure you add the parameters to the avatar -		if (!layer->setInfo(*iter, NULL)) -		{ -			mInfo = NULL; -			return FALSE; -		} -		if (!layer->isVisibilityMask()) -		{ -			mLayerList.push_back( layer ); -		} -		else -		{ -			mMaskLayerList.push_back(layer); -		} -	} - -	requestUpdate(); - -	stop_glerror(); - -	return TRUE; -} - -#if 0 // obsolete -//----------------------------------------------------------------------------- -// parseData -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::parseData(LLXmlTreeNode* node) -{ -	LLTexLayerSetInfo *info = new LLTexLayerSetInfo; - -	if (!info->parseXml(node)) -	{ -		delete info; -		return FALSE; -	} -	if (!setInfo(info)) -	{ -		delete info; -		return FALSE; -	} -	return TRUE; -} -#endif - -void LLTexLayerSet::deleteCaches() -{ -	for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		LLTexLayerInterface* layer = *iter; -		layer->deleteCaches(); -	} -	for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) -	{ -		LLTexLayerInterface* layer = *iter; -		layer->deleteCaches(); -	} -} - -// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on. -BOOL LLTexLayerSet::isLocalTextureDataAvailable() const -{ -	if (!mAvatar->isSelf()) return FALSE; -	return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataAvailable(this); -} - - -// Returns TRUE if all of the data for the textures that this layerset depends on have arrived. -BOOL LLTexLayerSet::isLocalTextureDataFinal() const -{ -	if (!mAvatar->isSelf()) return FALSE; -	return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataFinal(this); -} - - -BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) -{ -	BOOL success = TRUE; -	mIsVisible = TRUE; - -	if (mMaskLayerList.size() > 0) -	{ -		for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) -		{ -			LLTexLayerInterface* layer = *iter; -			if (layer->isInvisibleAlphaMask()) -			{ -				mIsVisible = FALSE; -			} -		} -	} - -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	LLGLSUIDefault gls_ui; -	LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); -	gGL.setColorMask(true, true); - -	// clear buffer area to ensure we don't pick up UI elements -	{ -		gGL.flush(); -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.0f); -		} -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - -		gl_rect_2d_simple( width, height ); - -		gGL.flush(); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.004f); -		} -	} - -	if (mIsVisible) -	{ -		// composite color layers -		for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -		{ -			LLTexLayerInterface* layer = *iter; -			if (layer->getRenderPass() == LLTexLayer::RP_COLOR) -			{ -				gGL.flush(); -				success &= layer->render(x, y, width, height); -				gGL.flush(); -			} -		} -		 -		renderAlphaMaskTextures(x, y, width, height, false); -	 -		stop_glerror(); -	} -	else -	{ -		gGL.flush(); - -		gGL.setSceneBlendType(LLRender::BT_REPLACE); -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.f); -		} - -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4f( 0.f, 0.f, 0.f, 0.f ); - -		gl_rect_2d_simple( width, height ); -		gGL.setSceneBlendType(LLRender::BT_ALPHA); - -		gGL.flush(); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.004f); -		} -	} - -	return success; -} - - -BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const  -{  -	return mInfo->mBodyRegion == region;  -} - -const std::string LLTexLayerSet::getBodyRegionName() const  -{  -	return mInfo->mBodyRegion;  -} - -void LLTexLayerSet::requestUpdate() -{ -	if( mUpdatesEnabled ) -	{ -		createComposite(); -		mComposite->requestUpdate();  -	} -} - -void LLTexLayerSet::requestUpload() -{ -	createComposite(); -	mComposite->requestUpload(); -} - -void LLTexLayerSet::cancelUpload() -{ -	if(mComposite) -	{ -		mComposite->cancelUpload(); -	} -} - -void LLTexLayerSet::createComposite() -{ -	if(!mComposite) -	{ -		S32 width = mInfo->mWidth; -		S32 height = mInfo->mHeight; -		// Composite other avatars at reduced resolution -		if( !mAvatar->isSelf() ) -		{ -			llerrs << "composites should not be created for non-self avatars!" << llendl; -		} -		mComposite = new LLTexLayerSetBuffer( this, width, height ); -	} -} - -void LLTexLayerSet::destroyComposite() -{ -	if( mComposite ) -	{ -		mComposite = NULL; -	} -} - -void LLTexLayerSet::setUpdatesEnabled( BOOL b ) -{ -	mUpdatesEnabled = b;  -} - - -void LLTexLayerSet::updateComposite() -{ -	createComposite(); -	mComposite->requestUpdateImmediate(); -} - -LLTexLayerSetBuffer* LLTexLayerSet::getComposite() -{ -	if (!mComposite) -	{ -		createComposite(); -	} -	return mComposite; -} - -const LLTexLayerSetBuffer* LLTexLayerSet::getComposite() const -{ -	return mComposite; -} - -void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height) -{ -	memset(data, 255, width * height); - -	for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		LLTexLayerInterface* layer = *iter; -		layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height); -	} -	 -	// Set alpha back to that of our alpha masks. -	renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true); -} - -void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear) -{ -	const LLTexLayerSetInfo *info = getInfo(); -	 -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	gGL.setColorMask(false, true); -	gGL.setSceneBlendType(LLRender::BT_REPLACE); -	 -	// (Optionally) replace alpha with a single component image from a tga file. -	if (!info->mStaticAlphaFileName.empty()) -	{ -		gGL.flush(); -		{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE); -			if( tex ) -			{ -				LLGLSUIDefault gls_ui; -				gGL.getTexUnit(0)->bind(tex); -				gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE ); -				gl_rect_2d_simple_tex( width, height ); -			} -		} -		gGL.flush(); -	} -	else if (forceClear || info->mClearAlpha || (mMaskLayerList.size() > 0)) -	{ -		// Set the alpha channel to one (clean up after previous blending) -		gGL.flush(); -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.f); -		} -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4f( 0.f, 0.f, 0.f, 1.f ); -		 -		gl_rect_2d_simple( width, height ); -		 -		gGL.flush(); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.004f); -		} -	} -	 -	// (Optional) Mask out part of the baked texture with alpha masks -	// will still have an effect even if mClearAlpha is set or the alpha component was replaced -	if (mMaskLayerList.size() > 0) -	{ -		gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); -		gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE ); -		for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) -		{ -			LLTexLayerInterface* layer = *iter; -			gGL.flush(); -			layer->blendAlphaTexture(x,y,width, height); -			gGL.flush(); -		} -		 -	} -	 -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -	gGL.setColorMask(true, true); -	gGL.setSceneBlendType(LLRender::BT_ALPHA); -} - -void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components) -{ -	mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex); -} - -BOOL LLTexLayerSet::isMorphValid() const -{ -	for(layer_list_t::const_iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		const LLTexLayerInterface* layer = *iter; -		if (layer && !layer->isMorphValid()) -		{ -			return FALSE; -		} -	} -	return TRUE; -} - -void LLTexLayerSet::invalidateMorphMasks() -{ -	for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		LLTexLayerInterface* layer = *iter; -		if (layer) -		{ -			layer->invalidateMorphMasks(); -		} -	} -} - - -//----------------------------------------------------------------------------- -// LLTexLayerInfo -//----------------------------------------------------------------------------- -LLTexLayerInfo::LLTexLayerInfo() : -	mWriteAllChannels( FALSE ), -	mRenderPass(LLTexLayer::RP_COLOR), -	mFixedColor( 0.f, 0.f, 0.f, 0.f ), -	mLocalTexture( -1 ), -	mStaticImageIsMask( FALSE ), -	mUseLocalTextureAlphaOnly(FALSE), -	mIsVisibilityMask(FALSE) -{ -} - -LLTexLayerInfo::~LLTexLayerInfo( ) -{ -	std::for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); -	std::for_each(mParamAlphaInfoList.begin(), mParamAlphaInfoList.end(), DeletePointer()); -} - -BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) -{ -	llassert( node->hasName( "layer" ) ); - -	// name attribute -	static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -	if( !node->getFastAttributeString( name_string, mName ) ) -	{ -		return FALSE; -	} -	 -	static LLStdStringHandle write_all_channels_string = LLXmlTree::addAttributeString("write_all_channels"); -	node->getFastAttributeBOOL( write_all_channels_string, mWriteAllChannels ); - -	std::string render_pass_name; -	static LLStdStringHandle render_pass_string = LLXmlTree::addAttributeString("render_pass"); -	if( node->getFastAttributeString( render_pass_string, render_pass_name ) ) -	{ -		if( render_pass_name == "bump" ) -		{ -			mRenderPass = LLTexLayer::RP_BUMP; -		} -	} - -	// Note: layers can have either a "global_color" attrib, a "fixed_color" attrib, or a <param_color> child. -	// global color attribute (optional) -	static LLStdStringHandle global_color_string = LLXmlTree::addAttributeString("global_color"); -	node->getFastAttributeString( global_color_string, mGlobalColor ); - -	// Visibility mask (optional) -	BOOL is_visibility; -	static LLStdStringHandle visibility_mask_string = LLXmlTree::addAttributeString("visibility_mask"); -	if (node->getFastAttributeBOOL(visibility_mask_string, is_visibility)) -	{ -		mIsVisibilityMask = is_visibility; -	} - -	// color attribute (optional) -	LLColor4U color4u; -	static LLStdStringHandle fixed_color_string = LLXmlTree::addAttributeString("fixed_color"); -	if( node->getFastAttributeColor4U( fixed_color_string, color4u ) ) -	{ -		mFixedColor.setVec( color4u ); -	} - -		// <texture> optional sub-element -	for (LLXmlTreeNode* texture_node = node->getChildByName( "texture" ); -		 texture_node; -		 texture_node = node->getNextNamedChild()) -	{ -		std::string local_texture_name; -		static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file"); -		static LLStdStringHandle local_texture_string = LLXmlTree::addAttributeString("local_texture"); -		static LLStdStringHandle file_is_mask_string = LLXmlTree::addAttributeString("file_is_mask"); -		static LLStdStringHandle local_texture_alpha_only_string = LLXmlTree::addAttributeString("local_texture_alpha_only"); -		if( texture_node->getFastAttributeString( tga_file_string, mStaticImageFileName ) ) -		{ -			texture_node->getFastAttributeBOOL( file_is_mask_string, mStaticImageIsMask ); -		} -		else if (texture_node->getFastAttributeString(local_texture_string, local_texture_name)) -		{ -			texture_node->getFastAttributeBOOL( local_texture_alpha_only_string, mUseLocalTextureAlphaOnly ); - -			/* if ("upper_shirt" == local_texture_name) -				mLocalTexture = TEX_UPPER_SHIRT; */ -			mLocalTexture = TEX_NUM_INDICES; -			for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -				 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); -				 iter++) -			{ -				const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; -				if (local_texture_name == texture_dict->mName) -			{ -					mLocalTexture = iter->first; -					break; -			} -			} -			if (mLocalTexture == TEX_NUM_INDICES) -			{ -				llwarns << "<texture> element has invalid local_texture attribute: " << mName << " " << local_texture_name << llendl; -				return FALSE; -			} -		} -		else	 -		{ -			llwarns << "<texture> element is missing a required attribute. " << mName << llendl; -			return FALSE; -		} -	} - -	for (LLXmlTreeNode* maskNode = node->getChildByName( "morph_mask" ); -		 maskNode; -		 maskNode = node->getNextNamedChild()) -	{ -		std::string morph_name; -		static LLStdStringHandle morph_name_string = LLXmlTree::addAttributeString("morph_name"); -		if (maskNode->getFastAttributeString(morph_name_string, morph_name)) -		{ -			BOOL invert = FALSE; -			static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert"); -			maskNode->getFastAttributeBOOL(invert_string, invert);			 -			mMorphNameList.push_back(std::pair<std::string,BOOL>(morph_name,invert)); -		} -	} - -	// <param> optional sub-element (color or alpha params) -	for (LLXmlTreeNode* child = node->getChildByName( "param" ); -		 child; -		 child = node->getNextNamedChild()) -	{ -		if( child->getChildByName( "param_color" ) ) -		{ -			// <param><param_color/></param> -			LLTexLayerParamColorInfo* info = new LLTexLayerParamColorInfo(); -			if (!info->parseXml(child)) -			{ -				delete info; -				return FALSE; -			} -			mParamColorInfoList.push_back(info); -		} -		else if( child->getChildByName( "param_alpha" ) ) -		{ -			// <param><param_alpha/></param> -			LLTexLayerParamAlphaInfo* info = new LLTexLayerParamAlphaInfo( ); -			if (!info->parseXml(child)) -			{ -				delete info; -				return FALSE; -			} - 			mParamAlphaInfoList.push_back(info); -		} -	} -	 -	return TRUE; -} - -BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar) -{ -	BOOL success = TRUE; -	for (param_color_info_list_t::iterator color_info_iter = mParamColorInfoList.begin(); -		 color_info_iter != mParamColorInfoList.end(); -		 color_info_iter++) -	{ -		LLTexLayerParamColorInfo * color_info = *color_info_iter; -		LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar); -		if (!param_color->setInfo(color_info, TRUE)) -		{ -			llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl; -			delete param_color; -			success = FALSE; -		} -	} - -	for (param_alpha_info_list_t::iterator alpha_info_iter = mParamAlphaInfoList.begin(); -		 alpha_info_iter != mParamAlphaInfoList.end(); -		 alpha_info_iter++) -	{ -		LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter; -		LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar); -		if (!param_alpha->setInfo(alpha_info, TRUE)) -		{ -			llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl; -			delete param_alpha; -			success = FALSE; -		} -	} - -	return success; -} - -LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set): -	mTexLayerSet( layer_set ), -	mMorphMasksValid( FALSE ), -	mInfo(NULL), -	mHasMorph(FALSE) -{ -} - -LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable): -	mTexLayerSet( layer.mTexLayerSet ), -	mInfo(NULL) -{ -	// don't add visual params for cloned layers -	setInfo(layer.getInfo(), wearable); - -	mHasMorph = layer.mHasMorph; -} - -BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable  ) // This sets mInfo and calls initialization functions -{ -	// setInfo should only be called once. Code is not robust enough to handle redefinition of a texlayer. -	// Not a critical warning, but could be useful for debugging later issues. -Nyx -	if (mInfo != NULL)  -	{ -			llwarns << "mInfo != NULL" << llendl; -	} -	mInfo = info; -	//mID = info->mID; // No ID - -	mParamColorList.reserve(mInfo->mParamColorInfoList.size()); -	for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin();  -		 iter != mInfo->mParamColorInfoList.end();  -		 iter++) -	{ -		LLTexLayerParamColor* param_color; -		if (!wearable) -			{ -				param_color = new LLTexLayerParamColor(this); -				if (!param_color->setInfo(*iter, TRUE)) -				{ -					mInfo = NULL; -					return FALSE; -				} -			} -			else -			{ -				param_color = (LLTexLayerParamColor*)wearable->getVisualParam((*iter)->getID()); -				if (!param_color) -				{ -					mInfo = NULL; -					return FALSE; -				} -			} -			mParamColorList.push_back( param_color ); -		} - -	mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size()); -	for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin();  -		 iter != mInfo->mParamAlphaInfoList.end();  -		 iter++) -		{ -			LLTexLayerParamAlpha* param_alpha; -			if (!wearable) -			{ -				param_alpha = new LLTexLayerParamAlpha( this ); -				if (!param_alpha->setInfo(*iter, TRUE)) -				{ -					mInfo = NULL; -					return FALSE; -				} -			} -			else -			{ -				param_alpha = (LLTexLayerParamAlpha*) wearable->getVisualParam((*iter)->getID()); -				if (!param_alpha) -				{ -					mInfo = NULL; -					return FALSE; -				} -			} -			mParamAlphaList.push_back( param_alpha ); -		} - -	return TRUE; -} - -/*virtual*/ void LLTexLayerInterface::requestUpdate() -{ -	mTexLayerSet->requestUpdate(); -} - -const std::string& LLTexLayerInterface::getName() const -{ -	return mInfo->mName;  -} - -LLTexLayerInterface::ERenderPass LLTexLayerInterface::getRenderPass() const -{ -	return mInfo->mRenderPass;  -} - -const std::string& LLTexLayerInterface::getGlobalColor() const -{ -	return mInfo->mGlobalColor;  -} - -BOOL LLTexLayerInterface::isVisibilityMask() const -{ -	return mInfo->mIsVisibilityMask; -} - -void LLTexLayerInterface::invalidateMorphMasks() -{ -	mMorphMasksValid = FALSE; -} - -LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index) const -{ -	LLViewerVisualParam *result = NULL; -	for (param_color_list_t::const_iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter) -	{ -		if ((*color_iter)->getID() == index) -		{ -			result = *color_iter; -		} -	} -	for (param_alpha_list_t::const_iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter) -	{ -		if ((*alpha_iter)->getID() == index) -		{ -			result = *alpha_iter; -		} -	} - -	return result; -} - -//----------------------------------------------------------------------------- -// LLTexLayer -// A single texture layer, consisting of: -//		* color, consisting of either -//			* one or more color parameters (weighted colors) -//			* a reference to a global color -//			* a fixed color with non-zero alpha -//			* opaque white (the default) -//		* (optional) a texture defined by either -//			* a GUID -//			* a texture entry index (TE) -//		* (optional) one or more alpha parameters (weighted alpha textures) -//----------------------------------------------------------------------------- -LLTexLayer::LLTexLayer(LLTexLayerSet* const layer_set) : -	LLTexLayerInterface( layer_set ), -	mLocalTextureObject(NULL) -{ -} - -LLTexLayer::LLTexLayer(const LLTexLayer &layer, LLWearable *wearable) : -	LLTexLayerInterface( layer, wearable ), -	mLocalTextureObject(NULL) -{ -} - -LLTexLayer::LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable) : -	LLTexLayerInterface( layer_template, wearable ), -	mLocalTextureObject(lto) -{ -} - -LLTexLayer::~LLTexLayer() -{ -	// mParamAlphaList and mParamColorList are LLViewerVisualParam's and get -	// deleted with ~LLCharacter() -	//std::for_each(mParamAlphaList.begin(), mParamAlphaList.end(), DeletePointer()); -	//std::for_each(mParamColorList.begin(), mParamColorList.end(), DeletePointer()); -	 -	for( alpha_cache_t::iterator iter = mAlphaCache.begin(); -		 iter != mAlphaCache.end(); iter++ ) -	{ -		U8* alpha_data = iter->second; -		delete [] alpha_data; -	} - -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -BOOL LLTexLayer::setInfo(const LLTexLayerInfo* info, LLWearable* wearable  ) -{ -	return LLTexLayerInterface::setInfo(info, wearable); -} - -//static  -void LLTexLayer::calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color) -{ -	for (param_color_list_t::const_iterator iter = param_list.begin(); -		 iter != param_list.end(); iter++) -	{ -		const LLTexLayerParamColor* param = *iter; -		LLColor4 param_net = param->getNetColor(); -		const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)param->getInfo(); -		switch(info->getOperation()) -		{ -			case LLTexLayerParamColor::OP_ADD: -				net_color += param_net; -				break; -			case LLTexLayerParamColor::OP_MULTIPLY: -				net_color = net_color * param_net; -				break; -			case LLTexLayerParamColor::OP_BLEND: -				net_color = lerp(net_color, param_net, param->getWeight()); -				break; -			default: -				llassert(0); -				break; -		} -	} -	net_color.clamp(); -} - -/*virtual*/ void LLTexLayer::deleteCaches() -{ -	// Only need to delete caches for alpha params. Color params don't hold extra memory -	for (param_alpha_list_t::iterator iter = mParamAlphaList.begin(); -		 iter != mParamAlphaList.end(); iter++ ) -	{ -		LLTexLayerParamAlpha* param = *iter; -		param->deleteCaches(); -	} -} - -BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height) -{ -	LLGLEnable color_mat(GL_COLOR_MATERIAL); -	gPipeline.disableLights(); - -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	LLColor4 net_color; -	BOOL color_specified = findNetColor(&net_color); -	 -	if (mTexLayerSet->getAvatar()->mIsDummy) -	{ -		color_specified = true; -		net_color = LLVOAvatar::getDummyColor(); -	} - -	BOOL success = TRUE; -	 -	// If you can't see the layer, don't render it. -	if( is_approx_zero( net_color.mV[VW] ) ) -	{ -		return success; -	} - -	BOOL alpha_mask_specified = FALSE; -	param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); -	if( iter != mParamAlphaList.end() ) -	{ -		// If we have alpha masks, but we're skipping all of them, skip the whole layer. -		// However, we can't do this optimization if we have morph masks that need updating. -/*		if (!mHasMorph) -		{ -			BOOL skip_layer = TRUE; - -			while( iter != mParamAlphaList.end() ) -			{ -				const LLTexLayerParamAlpha* param = *iter; -		 -				if( !param->getSkip() ) -				{ -					skip_layer = FALSE; -					break; -				} - -				iter++; -			}  - -			if( skip_layer ) -			{ -				return success; -			} -		}//*/ - -		renderMorphMasks(x, y, width, height, net_color); -		alpha_mask_specified = TRUE; -		gGL.flush(); -		gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA); -	} - -	gGL.color4fv( net_color.mV); - -	if( getInfo()->mWriteAllChannels ) -	{ -		gGL.flush(); -		gGL.setSceneBlendType(LLRender::BT_REPLACE); -	} - -	if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly ) -	{ -		{ -			LLViewerTexture* tex = NULL; -			if (mLocalTextureObject && mLocalTextureObject->getImage()) -			{ -				tex = mLocalTextureObject->getImage(); -				if (mLocalTextureObject->getID() == IMG_DEFAULT_AVATAR) -				{ -					tex = NULL; -				} -			} -			else -			{ -				llinfos << "lto not defined or image not defined: " << getInfo()->getLocalTexture() << " lto: " << mLocalTextureObject << llendl; -			} -//			if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) ) -			{ -				if( tex ) -				{ -					bool no_alpha_test = getInfo()->mWriteAllChannels; -					LLGLDisable alpha_test(no_alpha_test ? GL_ALPHA_TEST : 0); -					if (use_shaders && no_alpha_test) -					{ -						gAlphaMaskProgram.setMinimumAlpha(0.f); -					} -					 -					LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); -					 -					gGL.getTexUnit(0)->bind(tex, TRUE); -					gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - -					gl_rect_2d_simple_tex( width, height ); - -					gGL.getTexUnit(0)->setTextureAddressMode(old_mode); -					gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -					if (use_shaders && no_alpha_test) -					{ -						gAlphaMaskProgram.setMinimumAlpha(0.004f); -					} -					 -				} -			} -//			else -//			{ -//				success = FALSE; -//			} -		} -	} - -	if( !getInfo()->mStaticImageFileName.empty() ) -	{ -		{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); -			if( tex ) -			{ -				gGL.getTexUnit(0)->bind(tex, TRUE); -				gl_rect_2d_simple_tex( width, height ); -				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			} -			else -			{ -				success = FALSE; -			} -		} -	} - -	if(((-1 == getInfo()->mLocalTexture) || -		 getInfo()->mUseLocalTextureAlphaOnly) && -		getInfo()->mStaticImageFileName.empty() && -		color_specified ) -	{ -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.f); -		} -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4fv( net_color.mV ); -		gl_rect_2d_simple( width, height ); -		if (use_shaders) -		{ -			gAlphaMaskProgram.setMinimumAlpha(0.004f); -		} -	} - -	if( alpha_mask_specified || getInfo()->mWriteAllChannels ) -	{ -		// Restore standard blend func value -		gGL.flush(); -		gGL.setSceneBlendType(LLRender::BT_ALPHA); -		stop_glerror(); -	} - -	if( !success ) -	{ -		llinfos << "LLTexLayer::render() partial: " << getInfo()->mName << llendl; -	} -	return success; -} - -const U8*	LLTexLayer::getAlphaData() const -{ -	LLCRC alpha_mask_crc; -	const LLUUID& uuid = getUUID(); -	alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES); - -	for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) -	{ -		const LLTexLayerParamAlpha* param = *iter; -		// MULTI-WEARABLE: verify visual parameters used here -		F32 param_weight = param->getWeight(); -		alpha_mask_crc.update((U8*)¶m_weight, sizeof(F32)); -	} - -	U32 cache_index = alpha_mask_crc.getCRC(); - -	alpha_cache_t::const_iterator iter2 = mAlphaCache.find(cache_index); -	return (iter2 == mAlphaCache.end()) ? 0 : iter2->second; -} - -BOOL LLTexLayer::findNetColor(LLColor4* net_color) const -{ -	// Color is either: -	//	* one or more color parameters (weighted colors)  (which may make use of a global color or fixed color) -	//	* a reference to a global color -	//	* a fixed color with non-zero alpha -	//	* opaque white (the default) - -	if( !mParamColorList.empty() ) -	{ -		if( !getGlobalColor().empty() ) -		{ -			net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getInfo()->mGlobalColor ) ); -		} -		else if (getInfo()->mFixedColor.mV[VW]) -		{ -			net_color->setVec( getInfo()->mFixedColor ); -		} -		else -		{ -			net_color->setVec( 0.f, 0.f, 0.f, 0.f ); -		} -		 -		calculateTexLayerColor(mParamColorList, *net_color); -		return TRUE; -	} - -	if( !getGlobalColor().empty() ) -	{ -		net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getGlobalColor() ) ); -		return TRUE; -	} - -	if( getInfo()->mFixedColor.mV[VW] ) -	{ -		net_color->setVec( getInfo()->mFixedColor ); -		return TRUE; -	} - -	net_color->setToWhite(); - -	return FALSE; // No need to draw a separate colored polygon -} - -BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) -{ -	BOOL success = TRUE; - -	gGL.flush(); -	 -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	if( !getInfo()->mStaticImageFileName.empty() ) -	{ -		LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); -		if( tex ) -		{ -			LLGLSNoAlphaTest gls_no_alpha_test; -			if (use_shaders) -			{ -				gAlphaMaskProgram.setMinimumAlpha(0.f); -			} -			gGL.getTexUnit(0)->bind(tex, TRUE); -			gl_rect_2d_simple_tex( width, height ); -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			if (use_shaders) -			{ -				gAlphaMaskProgram.setMinimumAlpha(0.004f); -			} -		} -		else -		{ -			success = FALSE; -		} -	} -	else -	{ -		if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES) -		{ -			LLViewerTexture* tex = mLocalTextureObject->getImage(); -			if (tex) -			{ -				LLGLSNoAlphaTest gls_no_alpha_test; -				if (use_shaders) -				{ -					gAlphaMaskProgram.setMinimumAlpha(0.f); -				} -				gGL.getTexUnit(0)->bind(tex); -				gl_rect_2d_simple_tex( width, height ); -				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -				success = TRUE; -				if (use_shaders) -				{ -					gAlphaMaskProgram.setMinimumAlpha(0.004f); -				} -			} -		} -	} -	 -	return success; -} - -/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ -	addAlphaMask(data, originX, originY, width, height); -} - -BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color) -{ -	BOOL success = TRUE; - -	llassert( !mParamAlphaList.empty() ); - -	bool use_shaders = LLGLSLShader::sNoFixedFunction; - -	if (use_shaders) -	{ -		gAlphaMaskProgram.setMinimumAlpha(0.f); -	} - -	gGL.setColorMask(false, true); - -	LLTexLayerParamAlpha* first_param = *mParamAlphaList.begin(); -	// Note: if the first param is a mulitply, multiply against the current buffer's alpha -	if( !first_param || !first_param->getMultiplyBlend() ) -	{ -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -		// Clear the alpha -		gGL.flush(); -		gGL.setSceneBlendType(LLRender::BT_REPLACE); - -		gGL.color4f( 0.f, 0.f, 0.f, 0.f ); -		gl_rect_2d_simple( width, height ); -	} - -	// Accumulate alphas -	LLGLSNoAlphaTest gls_no_alpha_test; -	gGL.color4f( 1.f, 1.f, 1.f, 1.f ); -	for (param_alpha_list_t::iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) -	{ -		LLTexLayerParamAlpha* param = *iter; -		success &= param->render( x, y, width, height ); -	} - -	// Approximates a min() function -	gGL.flush(); -	gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); - -	// Accumulate the alpha component of the texture -	if( getInfo()->mLocalTexture != -1 ) -	{ -		LLViewerTexture* tex = mLocalTextureObject->getImage(); -		if( tex && (tex->getComponents() == 4) ) -		{ -			LLGLSNoAlphaTest gls_no_alpha_test; -			LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); -			 -			gGL.getTexUnit(0)->bind(tex, TRUE); -			gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - -			gl_rect_2d_simple_tex( width, height ); - -			gGL.getTexUnit(0)->setTextureAddressMode(old_mode); -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		} -	} - -	if( !getInfo()->mStaticImageFileName.empty() ) -	{ -		LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); -		if( tex ) -		{ -			if(	(tex->getComponents() == 4) || -				( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) -			{ -				LLGLSNoAlphaTest gls_no_alpha_test; -				gGL.getTexUnit(0)->bind(tex, TRUE); -				gl_rect_2d_simple_tex( width, height ); -				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			} -		} -	} - -	// Draw a rectangle with the layer color to multiply the alpha by that color's alpha. -	// Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); -	if (layer_color.mV[VW] != 1.f) -	{ -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4fv(layer_color.mV); -		gl_rect_2d_simple( width, height ); -	} - -	if (use_shaders) -	{ -		gAlphaMaskProgram.setMinimumAlpha(0.004f); -	} - -	LLGLSUIDefault gls_ui; - -	gGL.setColorMask(true, true); -	 -	if (hasMorph() && success) -	{ -		LLCRC alpha_mask_crc; -		const LLUUID& uuid = getUUID(); -		alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES); -		 -		for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) -		{ -			const LLTexLayerParamAlpha* param = *iter; -			F32 param_weight = param->getWeight(); -			alpha_mask_crc.update((U8*)¶m_weight, sizeof(F32)); -		} - -		U32 cache_index = alpha_mask_crc.getCRC(); -		U8* alpha_data = get_if_there(mAlphaCache,cache_index,(U8*)NULL); -		if (!alpha_data) -		{ -			// clear out a slot if we have filled our cache -			S32 max_cache_entries = getTexLayerSet()->getAvatar()->isSelf() ? 4 : 1; -			while ((S32)mAlphaCache.size() >= max_cache_entries) -			{ -				alpha_cache_t::iterator iter2 = mAlphaCache.begin(); // arbitrarily grab the first entry -				alpha_data = iter2->second; -				delete [] alpha_data; -				mAlphaCache.erase(iter2); -			} -			alpha_data = new U8[width * height]; -			mAlphaCache[cache_index] = alpha_data; -			glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data); -		} -		 -		getTexLayerSet()->getAvatar()->dirtyMesh(); - -		mMorphMasksValid = TRUE; -		getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1); -	} - -	return success; -} - -void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ -	S32 size = width * height; -	const U8* alphaData = getAlphaData(); -	if (!alphaData && hasAlphaParams()) -	{ -		LLColor4 net_color; -		findNetColor( &net_color ); -		// TODO: eliminate need for layer morph mask valid flag -		invalidateMorphMasks(); -		renderMorphMasks(originX, originY, width, height, net_color); -		alphaData = getAlphaData(); -	} -	if (alphaData) -	{ -		for( S32 i = 0; i < size; i++ ) -		{ -			U8 curAlpha = data[i]; -			U16 resultAlpha = curAlpha; -			resultAlpha *= (alphaData[i] + 1); -			resultAlpha = resultAlpha >> 8; -			data[i] = (U8)resultAlpha; -		} -	} -} - -/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask() const -{ -	if (mLocalTextureObject) -	{ -		if (mLocalTextureObject->getID() == IMG_INVISIBLE) -		{ -			return TRUE; -		} -	} - -	return FALSE; -} - -LLUUID LLTexLayer::getUUID() const -{ -	LLUUID uuid; -	if( getInfo()->mLocalTexture != -1 ) -	{ -			LLViewerTexture* tex = mLocalTextureObject->getImage(); -			if (tex) -			{ -				uuid = mLocalTextureObject->getID(); -			} -	} -	if( !getInfo()->mStaticImageFileName.empty() ) -	{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); -			if( tex ) -			{ -				uuid = tex->getID(); -			} -	} -	return uuid; -} - - -//----------------------------------------------------------------------------- -// LLTexLayerTemplate -// A single texture layer, consisting of: -//		* color, consisting of either -//			* one or more color parameters (weighted colors) -//			* a reference to a global color -//			* a fixed color with non-zero alpha -//			* opaque white (the default) -//		* (optional) a texture defined by either -//			* a GUID -//			* a texture entry index (TE) -//		* (optional) one or more alpha parameters (weighted alpha textures) -//----------------------------------------------------------------------------- -LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set) : -	LLTexLayerInterface(layer_set) -{ -} - -LLTexLayerTemplate::LLTexLayerTemplate(const LLTexLayerTemplate &layer) : -	LLTexLayerInterface(layer) -{ -} - -LLTexLayerTemplate::~LLTexLayerTemplate() -{ -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -/*virtual*/ BOOL LLTexLayerTemplate::setInfo(const LLTexLayerInfo* info, LLWearable* wearable  ) -{ -	return LLTexLayerInterface::setInfo(info, wearable); -} - -U32 LLTexLayerTemplate::updateWearableCache() const -{ -	mWearableCache.clear(); - -	S32 te = mInfo->mLocalTexture; -	if (te == -1) -	{ -		//this isn't a cloneable layer  -		return 0; -	} -	LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te); -	U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); -	U32 added = 0; -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLWearable*  wearable = gAgentWearables.getWearable(wearable_type, i); -		if (!wearable) -		{ -			continue; -		} -		mWearableCache.push_back(wearable); -		added++; -	} -	return added; -} -LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const -{ -	if (mWearableCache.size() <= i) -	{ -		return NULL; -	} -	LLWearable *wearable = mWearableCache[i]; -	LLLocalTextureObject *lto = NULL; -	LLTexLayer *layer = NULL; -	if (wearable) -	{ -		 lto = wearable->getLocalTextureObject(mInfo->mLocalTexture); -	} -	if (lto) -	{ -		layer = lto->getTexLayer(getName()); -	} -	return layer; -} - -/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height) -{ -	if(!mInfo) -	{ -		return FALSE ; -	} - -	BOOL success = TRUE; -	updateWearableCache(); -	for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++) -	{ -		LLWearable* wearable = NULL; -		LLLocalTextureObject *lto = NULL; -		LLTexLayer *layer = NULL; -		wearable = *iter; -		if (wearable) -		{ -			lto = wearable->getLocalTextureObject(mInfo->mLocalTexture); -		} -		if (lto) -		{ -			layer = lto->getTexLayer(getName()); -		} -		if (layer) -		{ -			wearable->writeToAvatar(); -			layer->setLTO(lto); -			success &= layer->render(x,y,width,height); -		} -	} - -	return success; -} - -/*virtual*/ BOOL LLTexLayerTemplate::blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) // Multiplies a single alpha texture against the frame buffer -{ -	BOOL success = TRUE; -	U32 num_wearables = updateWearableCache(); -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLTexLayer *layer = getLayer(i); -		if (layer) -		{ -			success &= layer->blendAlphaTexture(x,y,width,height); -		} -	} -	return success; -} - -/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ -	U32 num_wearables = updateWearableCache(); -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLTexLayer *layer = getLayer(i); -		if (layer) -		{ -			layer->addAlphaMask(data, originX, originY, width, height); -		} -	} -} - -/*virtual*/ void LLTexLayerTemplate::setHasMorph(BOOL newval) -{  -	mHasMorph = newval; -	U32 num_wearables = updateWearableCache(); -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLTexLayer *layer = getLayer(i); -		if (layer) -		{	 -			layer->setHasMorph(newval); -		} -	} -} - -/*virtual*/ void LLTexLayerTemplate::deleteCaches() -{ -	U32 num_wearables = updateWearableCache(); -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLTexLayer *layer = getLayer(i); -		if (layer) -		{ -			layer->deleteCaches(); -		} -	} -} - -/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask() const -{ -	U32 num_wearables = updateWearableCache(); -	for (U32 i = 0; i < num_wearables; i++) -	{ -		LLTexLayer *layer = getLayer(i); -		if (layer) -		{ -			 if (layer->isInvisibleAlphaMask()) -			 { -				 return TRUE; -			 } -		} -	} - -	return FALSE; -} - - -//----------------------------------------------------------------------------- -// finds a specific layer based on a passed in name -//----------------------------------------------------------------------------- -LLTexLayerInterface*  LLTexLayerSet::findLayerByName(const std::string& name) -{ -	for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		LLTexLayerInterface* layer = *iter; -		if (layer->getName() == name) -		{ -			return layer; -		} -	} -	for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) -	{ -		LLTexLayerInterface* layer = *iter; -		if (layer->getName() == name) -		{ -			return layer; -		} -	} -	return NULL; -} - -void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable *wearable) -{ -	// initialize all texlayers with this texture type for this LTO -	for( LLTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) -	{ -		LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter; -		if (layer->getInfo()->getLocalTexture() == (S32) tex_index) -		{ -			lto->addTexLayer(layer, wearable); -		} -	} -	for( LLTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) -	{ -		LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter; -		if (layer->getInfo()->getLocalTexture() == (S32) tex_index) -		{ -			lto->addTexLayer(layer, wearable); -		} -	} -} -//----------------------------------------------------------------------------- -// LLTexLayerStaticImageList -//----------------------------------------------------------------------------- - -LLTexLayerStaticImageList::LLTexLayerStaticImageList() : -	mGLBytes(0), -	mTGABytes(0), -	mImageNames(16384) -{ -} - -LLTexLayerStaticImageList::~LLTexLayerStaticImageList() -{ -	deleteCachedImages(); -} - -void LLTexLayerStaticImageList::dumpByteCount() const -{ -	llinfos << "Avatar Static Textures " << -		"KB GL:" << (mGLBytes / 1024) << -		"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl; -} - -void LLTexLayerStaticImageList::deleteCachedImages() -{ -	if( mGLBytes || mTGABytes ) -	{ -		llinfos << "Clearing Static Textures " << -			"KB GL:" << (mGLBytes / 1024) << -			"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl; - -		//mStaticImageLists uses LLPointers, clear() will cause deletion -		 -		mStaticImageListTGA.clear(); -		mStaticImageList.clear(); -		 -		mGLBytes = 0; -		mTGABytes = 0; -	} -} - -// Note: in general, for a given image image we'll call either getImageTga() or getTexture(). -// We call getImageTga() if the image is used as an alpha gradient. -// Otherwise, we call getTexture() - -// Returns an LLImageTGA that contains the encoded data from a tga file named file_name. -// Caches the result to speed identical subsequent requests. -LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name) -{ -	const char *namekey = mImageNames.addString(file_name); -	image_tga_map_t::const_iterator iter = mStaticImageListTGA.find(namekey); -	if( iter != mStaticImageListTGA.end() ) -	{ -		return iter->second; -	} -	else -	{ -		std::string path; -		path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name); -		LLPointer<LLImageTGA> image_tga = new LLImageTGA( path ); -		if( image_tga->getDataSize() > 0 ) -		{ -			mStaticImageListTGA[ namekey ] = image_tga; -			mTGABytes += image_tga->getDataSize(); -			return image_tga; -		} -		else -		{ -			return NULL; -		} -	} -} - -// Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name. -// Caches the result to speed identical subsequent requests. -LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask) -{ -	LLPointer<LLViewerTexture> tex; -	const char *namekey = mImageNames.addString(file_name); - -	texture_map_t::const_iterator iter = mStaticImageList.find(namekey); -	if( iter != mStaticImageList.end() ) -	{ -		tex = iter->second; -	} -	else -	{ -		tex = LLViewerTextureManager::getLocalTexture( FALSE ); -		LLPointer<LLImageRaw> image_raw = new LLImageRaw; -		if( loadImageRaw( file_name, image_raw ) ) -		{ -			if( (image_raw->getComponents() == 1) && is_mask ) -			{ -				// Note: these are static, unchanging images so it's ok to assume -				// that once an image is a mask it's always a mask. -				tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); -			} -			tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL); - -			gGL.getTexUnit(0)->bind(tex); -			tex->setAddressMode(LLTexUnit::TAM_CLAMP); - -			mStaticImageList [ namekey ] = tex; -			mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); -		} -		else -		{ -			tex = NULL; -		} -	} - -	return tex; -} - -// Reads a .tga file, decodes it, and puts the decoded data in image_raw. -// Returns TRUE if successful. -BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLImageRaw* image_raw) -{ -	BOOL success = FALSE; -	std::string path; -	path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name); -	LLPointer<LLImageTGA> image_tga = new LLImageTGA( path ); -	if( image_tga->getDataSize() > 0 ) -	{ -		// Copy data from tga to raw. -		success = image_tga->decode( image_raw ); -	} - -	return success; -} - -const std::string LLTexLayerSetBuffer::dumpTextureInfo() const -{ -	if (!isAgentAvatarValid()) return ""; - -	const BOOL is_high_res = !mNeedsUpload; -	const U32 num_low_res = mNumLowresUploads; -	const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); -	const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet); - -	std::string status 				= "CREATING "; -	if (!uploadNeeded()) status 	= "DONE     "; -	if (uploadInProgress()) status 	= "UPLOADING"; - -	std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", -								status.c_str(), -								is_high_res, num_low_res, -								upload_time,  -								local_texture_info.c_str()); -	return text; -} diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h deleted file mode 100644 index 4f43547dae..0000000000 --- a/indra/newview/lltexlayer.h +++ /dev/null @@ -1,380 +0,0 @@ -/**  - * @file lltexlayer.h - * @brief Texture layer classes. Used for avatars. - * - * $LicenseInfo:firstyear=2002&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_LLTEXLAYER_H -#define LL_LLTEXLAYER_H - -#include <deque> -#include "lldynamictexture.h" -#include "llvoavatardefines.h" -#include "lltexlayerparams.h" - -class LLVOAvatar; -class LLVOAvatarSelf; -class LLImageTGA; -class LLImageRaw; -class LLXmlTreeNode; -class LLTexLayerSet; -class LLTexLayerSetInfo; -class LLTexLayerInfo; -class LLTexLayerSetBuffer; -class LLWearable; -class LLViewerVisualParam; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerInterface -// -// Interface class to generalize functionality shared by LLTexLayer  -// and LLTexLayerTemplate. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerInterface  -{ -public: -	enum ERenderPass -	{ -		RP_COLOR, -		RP_BUMP, -		RP_SHINE -	}; - -	LLTexLayerInterface(LLTexLayerSet* const layer_set); -	LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable); -	virtual ~LLTexLayerInterface() {} - -	virtual BOOL			render(S32 x, S32 y, S32 width, S32 height) = 0; -	virtual void			deleteCaches() = 0; -	virtual BOOL			blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) = 0; -	virtual BOOL			isInvisibleAlphaMask() const = 0; - -	const LLTexLayerInfo* 	getInfo() const 			{ return mInfo; } -	virtual BOOL			setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // sets mInfo, calls initialization functions - -	const std::string&		getName() const; -	const LLTexLayerSet* const getTexLayerSet() const 	{ return mTexLayerSet; } -	LLTexLayerSet* const 	getTexLayerSet() 			{ return mTexLayerSet; } - -	void					invalidateMorphMasks(); -	virtual void			setHasMorph(BOOL newval) 	{ mHasMorph = newval; } -	BOOL					hasMorph() const			{ return mHasMorph; } -	BOOL					isMorphValid() const		{ return mMorphMasksValid; } - -	void					requestUpdate(); -	virtual void			gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0; -	BOOL					hasAlphaParams() const 		{ return !mParamAlphaList.empty(); } - -	ERenderPass				getRenderPass() const; -	BOOL					isVisibilityMask() const; - -protected: -	const std::string&		getGlobalColor() const; -	LLViewerVisualParam*	getVisualParamPtr(S32 index) const; - -protected: -	LLTexLayerSet* const	mTexLayerSet; -	const LLTexLayerInfo*	mInfo; -	BOOL					mMorphMasksValid; -	BOOL					mHasMorph; - -	// Layers can have either mParamColorList, mGlobalColor, or mFixedColor.  They are looked for in that order. -	param_color_list_t		mParamColorList; -	param_alpha_list_t		mParamAlphaList; -	// 						mGlobalColor name stored in mInfo -	// 						mFixedColor value stored in mInfo -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerTemplate -// -// Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerTemplate : public LLTexLayerInterface -{ -public: -	LLTexLayerTemplate(LLTexLayerSet* const layer_set); -	LLTexLayerTemplate(const LLTexLayerTemplate &layer); -	/*virtual*/ ~LLTexLayerTemplate(); -	/*virtual*/ BOOL		render(S32 x, S32 y, S32 width, S32 height); -	/*virtual*/ BOOL		setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions -	/*virtual*/ BOOL		blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer -	/*virtual*/ void		gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); -	/*virtual*/ void		setHasMorph(BOOL newval); -	/*virtual*/ void		deleteCaches(); -	/*virtual*/ BOOL		isInvisibleAlphaMask() const; -protected: -	U32 					updateWearableCache() const; -	LLTexLayer* 			getLayer(U32 i) const; -private: -	typedef std::vector<LLWearable*> wearable_cache_t; -	mutable wearable_cache_t mWearableCache; // mutable b/c most get- require updating this cache -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayer -// -// A single texture layer.  Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayer : public LLTexLayerInterface -{ -public: -	LLTexLayer(LLTexLayerSet* const layer_set); -	LLTexLayer(const LLTexLayer &layer, LLWearable *wearable); -	LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable); -	/*virtual*/ ~LLTexLayer(); - -	/*virtual*/ BOOL		setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions -	/*virtual*/ BOOL		render(S32 x, S32 y, S32 width, S32 height); - -	/*virtual*/ void		deleteCaches(); -	const U8*				getAlphaData() const; - -	BOOL					findNetColor(LLColor4* color) const; -	/*virtual*/ BOOL		blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer -	/*virtual*/ void		gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); -	BOOL					renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color); -	void					addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height); -	/*virtual*/ BOOL		isInvisibleAlphaMask() const; - -	void					setLTO(LLLocalTextureObject *lto) 	{ mLocalTextureObject = lto; } -	LLLocalTextureObject* 	getLTO() 							{ return mLocalTextureObject; } - -	static void 			calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color); -protected: -	LLUUID					getUUID() const; -private: -	typedef std::map<U32, U8*> alpha_cache_t; -	alpha_cache_t			mAlphaCache; -	LLLocalTextureObject* 	mLocalTextureObject; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSet -// -// An ordered set of texture layers that gets composited into a single texture. -// Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSet -{ -	friend class LLTexLayerSetBuffer; -public: -	LLTexLayerSet(LLVOAvatarSelf* const avatar); -	~LLTexLayerSet(); - -	const LLTexLayerSetInfo* 	getInfo() const 			{ return mInfo; } -	BOOL						setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions - -	BOOL						render(S32 x, S32 y, S32 width, S32 height); -	void						renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false); - -	BOOL						isBodyRegion(const std::string& region) const; -	LLTexLayerSetBuffer*		getComposite(); -	const LLTexLayerSetBuffer* 	getComposite() const; // Do not create one if it doesn't exist. -	void						requestUpdate(); -	void						requestUpload(); -	void						cancelUpload(); -	void						updateComposite(); -	BOOL						isLocalTextureDataAvailable() const; -	BOOL						isLocalTextureDataFinal() const; -	void						createComposite(); -	void						destroyComposite(); -	void						setUpdatesEnabled(BOOL b); -	BOOL						getUpdatesEnabled()	const 	{ return mUpdatesEnabled; } -	void						deleteCaches(); -	void						gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); -	void						applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); -	BOOL						isMorphValid() const; -	void						invalidateMorphMasks(); -	LLTexLayerInterface*		findLayerByName(const std::string& name); -	void						cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); -	 -	LLVOAvatarSelf*		    	getAvatar()	const 			{ return mAvatar; } -	const std::string			getBodyRegionName() const; -	BOOL						hasComposite() const 		{ return (mComposite.notNull()); } -	LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } -	void						setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } -	BOOL						isVisible() const 			{ return mIsVisible; } - -	static BOOL					sHasCaches; - -private: -	typedef std::vector<LLTexLayerInterface *> layer_list_t; -	layer_list_t				mLayerList; -	layer_list_t				mMaskLayerList; -	LLPointer<LLTexLayerSetBuffer>	mComposite; -	LLVOAvatarSelf*	const		mAvatar; // note: backlink only; don't make this an LLPointer. -	BOOL						mUpdatesEnabled; -	BOOL						mIsVisible; - -	LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex; -	const LLTexLayerSetInfo* 	mInfo; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSetInfo -// -// Contains shared layer set data. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSetInfo -{ -	friend class LLTexLayerSet; -public: -	LLTexLayerSetInfo(); -	~LLTexLayerSetInfo(); -	BOOL parseXml(LLXmlTreeNode* node); -	void createVisualParams(LLVOAvatar *avatar); -private: -	std::string				mBodyRegion; -	S32						mWidth; -	S32						mHeight; -	std::string				mStaticAlphaFileName; -	BOOL					mClearAlpha; // Set alpha to 1 for this layerset (if there is no mStaticAlphaFileName) -	typedef std::vector<LLTexLayerInfo*> layer_info_list_t; -	layer_info_list_t		mLayerInfoList; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSetBuffer -// -// The composite image that a LLTexLayerSet writes to.  Each LLTexLayerSet has one. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSetBuffer : public LLViewerDynamicTexture -{ -	LOG_CLASS(LLTexLayerSetBuffer); - -public: -	LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); -	virtual ~LLTexLayerSetBuffer(); - -public: -	/*virtual*/ S8          getType() const; -	BOOL					isInitialized(void) const; -	static void				dumpTotalByteCount(); -	const std::string		dumpTextureInfo() const; -	virtual void 			restoreGLTexture(); -	virtual void 			destroyGLTexture(); -protected: -	void					pushProjection() const; -	void					popProjection() const; -private: -	LLTexLayerSet* const    mTexLayerSet; -	static S32				sGLByteCount; - -	//-------------------------------------------------------------------- -	// Render -	//-------------------------------------------------------------------- -public: -	/*virtual*/ BOOL		needsRender(); -protected: -	BOOL					render(S32 x, S32 y, S32 width, S32 height); -	virtual void			preRender(BOOL clear_depth); -	virtual void			postRender(BOOL success); -	virtual BOOL			render();	 -	 -	//-------------------------------------------------------------------- -	// Uploads -	//-------------------------------------------------------------------- -public: -	void					requestUpload(); -	void					cancelUpload(); -	BOOL					uploadNeeded() const; 			// We need to upload a new texture -	BOOL					uploadInProgress() const; 		// We have started uploading a new texture and are awaiting the result -	BOOL					uploadPending() const; 			// We are expecting a new texture to be uploaded at some point -	static void				onTextureUploadComplete(const LLUUID& uuid, -													void* userdata, -													S32 result, LLExtStat ext_status); -protected: -	BOOL					isReadyToUpload() const; -	void					doUpload(); 					// Does a read back and upload. -	void					conditionalRestartUploadTimer(); -private: -	BOOL					mNeedsUpload; 					// Whether we need to send our baked textures to the server -	U32						mNumLowresUploads; 				// Number of times we've sent a lowres version of our baked textures to the server -	BOOL					mUploadPending; 				// Whether we have received back the new baked textures -	LLUUID					mUploadID; 						// The current upload process (null if none). -	LLFrameTimer    		mNeedsUploadTimer; 				// Tracks time since upload was requested and performed. -	S32						mUploadFailCount;				// Number of consecutive upload failures -	LLFrameTimer    		mUploadRetryTimer; 				// Tracks time since last upload failure. - -	//-------------------------------------------------------------------- -	// Updates -	//-------------------------------------------------------------------- -public: -	void					requestUpdate(); -	BOOL					requestUpdateImmediate(); -protected: -	BOOL					isReadyToUpdate() const; -	void					doUpdate(); -	void					restartUpdateTimer(); -private: -	BOOL					mNeedsUpdate; 					// Whether we need to locally update our baked textures -	U32						mNumLowresUpdates; 				// Number of times we've locally updated with lowres version of our baked textures -	LLFrameTimer    		mNeedsUpdateTimer; 				// Tracks time since update was requested and performed. -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerStaticImageList -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList> -{ -public: -	LLTexLayerStaticImageList(); -	~LLTexLayerStaticImageList(); -	LLViewerTexture*	getTexture(const std::string& file_name, BOOL is_mask); -	LLImageTGA*			getImageTGA(const std::string& file_name); -	void				deleteCachedImages(); -	void				dumpByteCount() const; -protected: -	BOOL				loadImageRaw(const std::string& file_name, LLImageRaw* image_raw); -private: -	LLStringTable 		mImageNames; -	typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t; -	texture_map_t 		mStaticImageList; -	typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t; -	image_tga_map_t 	mStaticImageListTGA; -	S32 				mGLBytes; -	S32 				mTGABytes; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLBakedUploadData -// -// Used by LLTexLayerSetBuffer for a callback. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -struct LLBakedUploadData -{ -	LLBakedUploadData(const LLVOAvatarSelf* avatar,  -					  LLTexLayerSet* layerset,  -					  const LLUUID& id, -					  bool highest_res); -	~LLBakedUploadData() {} -	const LLUUID				mID; -	const LLVOAvatarSelf*		mAvatar; // note: backlink only; don't LLPointer  -	LLTexLayerSet*				mTexLayerSet; -   	const U64					mStartTime;	// for measuring baked texture upload time -   	const bool					mIsHighestRes; // whether this is a "final" bake, or intermediate low res -}; - -#endif  // LL_LLTEXLAYER_H diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp deleted file mode 100644 index 8972827eff..0000000000 --- a/indra/newview/lltexlayerparams.cpp +++ /dev/null @@ -1,568 +0,0 @@ -/**  - * @file lltexlayerparams.cpp - * @brief Texture layer parameters - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lltexlayerparams.h" - -#include "llagentcamera.h" -#include "llimagetga.h" -#include "lltexlayer.h" -#include "llvoavatarself.h" -#include "llwearable.h" -#include "llui.h" - -//----------------------------------------------------------------------------- -// LLTexLayerParam -//----------------------------------------------------------------------------- -LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) : -	mTexLayer(layer), -	mAvatar(NULL) -{ -	if (mTexLayer != NULL) -	{ -		mAvatar = mTexLayer->getTexLayerSet()->getAvatar(); -	} -	else -	{ -		llerrs << "LLTexLayerParam constructor passed with NULL reference for layer!" << llendl; -	} -} - -LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) : -	mTexLayer(NULL) -{ -	mAvatar = avatar; -} - - -BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  ) -{	 -	LLViewerVisualParam::setInfo(info); - -	if (add_to_avatar) -	{ -		mAvatar->addVisualParam( this); -	} - -	return TRUE; -} - - -//----------------------------------------------------------------------------- -// LLTexLayerParamAlpha -//----------------------------------------------------------------------------- - -// static  -LLTexLayerParamAlpha::param_alpha_ptr_list_t LLTexLayerParamAlpha::sInstances; - -// static  -void LLTexLayerParamAlpha::dumpCacheByteCount() -{ -	S32 gl_bytes = 0; -	getCacheByteCount( &gl_bytes); -	llinfos << "Processed Alpha Texture Cache GL:" << (gl_bytes/1024) << "KB" << llendl; -} - -// static  -void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes) -{ -	*gl_bytes = 0; - -	for (param_alpha_ptr_list_t::iterator iter = sInstances.begin(); -		 iter != sInstances.end(); iter++) -	{ -		LLTexLayerParamAlpha* instance = *iter; -		LLViewerTexture* tex = instance->mCachedProcessedTexture; -		if (tex) -		{ -			S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); - -			if (tex->hasGLTexture()) -			{ -				*gl_bytes += bytes; -			} -		} -	} -} - -LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) : -	LLTexLayerParam(layer), -	mCachedProcessedTexture(NULL), -	mNeedsCreateTexture(FALSE), -	mStaticImageInvalid(FALSE), -	mAvgDistortionVec(1.f, 1.f, 1.f), -	mCachedEffectiveWeight(0.f) -{ -	sInstances.push_front(this); -} - -LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) : -	LLTexLayerParam(avatar), -	mCachedProcessedTexture(NULL), -	mNeedsCreateTexture(FALSE), -	mStaticImageInvalid(FALSE), -	mAvgDistortionVec(1.f, 1.f, 1.f), -	mCachedEffectiveWeight(0.f) -{ -	sInstances.push_front(this); -} - - -LLTexLayerParamAlpha::~LLTexLayerParamAlpha() -{ -	deleteCaches(); -	sInstances.remove(this); -} - -/*virtual*/ LLViewerVisualParam* LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const -{ -	LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer); -	*new_param = *this; -	return new_param; -} - -void LLTexLayerParamAlpha::deleteCaches() -{ -	mStaticImageTGA = NULL; // deletes image -	mCachedProcessedTexture = NULL; -	mStaticImageRaw = NULL; -	mNeedsCreateTexture = FALSE; -} - -BOOL LLTexLayerParamAlpha::getMultiplyBlend() const -{ -	return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; 	 -} - -void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake) -{ -	if (mIsAnimating || mTexLayer == NULL) -	{ -		return; -	} -	F32 min_weight = getMinWeight(); -	F32 max_weight = getMaxWeight(); -	F32 new_weight = llclamp(weight, min_weight, max_weight); -	U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); -	U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); -	if (cur_u8 != new_u8) -	{ -		mCurWeight = new_weight; - -		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. -		{ -			if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) -			{ -				upload_bake = FALSE; -			} -			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); -			mTexLayer->invalidateMorphMasks(); -		} -	} -} - -void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake) -{  -	// do not animate dummy parameters -	if (mIsDummy) -	{ -		setWeight(target_value, upload_bake); -		return; -	} - -	mTargetWeight = target_value;  -	setWeight(target_value, upload_bake);  -	mIsAnimating = TRUE; -	if (mNext) -	{ -		mNext->setAnimationTarget(target_value, upload_bake); -	} -} - -void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake) -{ -	if (mNext) -	{ -		mNext->animate(delta, upload_bake); -	} -} - -BOOL LLTexLayerParamAlpha::getSkip() const -{ -	if (!mTexLayer) -	{ -		return TRUE; -	} - -	const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar(); - -	if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight) -	{ -		F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); -		if (is_approx_zero(effective_weight))  -		{ -			return TRUE; -		} -	} - -	LLWearableType::EType type = (LLWearableType::EType)getWearableType(); -	if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type)) -	{ -		return TRUE; -	} - -	return FALSE; -} - - -BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height) -{ -	BOOL success = TRUE; - -	if (!mTexLayer) -	{ -		return success; -	} - -	F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); -	BOOL weight_changed = effective_weight != mCachedEffectiveWeight; -	if (getSkip()) -	{ -		return success; -	} - -	LLTexLayerParamAlphaInfo *info = (LLTexLayerParamAlphaInfo *)getInfo(); -	gGL.flush(); -	if (info->mMultiplyBlend) -	{ -		gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function -	} -	else -	{ -		gGL.setSceneBlendType(LLRender::BT_ADD);  // Addition: approximates a max() function -	} - -	if (!info->mStaticImageFileName.empty() && !mStaticImageInvalid) -	{ -		if (mStaticImageTGA.isNull()) -		{ -			// Don't load the image file until we actually need it the first time.  Like now. -			mStaticImageTGA = LLTexLayerStaticImageList::getInstance()->getImageTGA(info->mStaticImageFileName);   -			// We now have something in one of our caches -			LLTexLayerSet::sHasCaches |= mStaticImageTGA.notNull() ? TRUE : FALSE; - -			if (mStaticImageTGA.isNull()) -			{ -				llwarns << "Unable to load static file: " << info->mStaticImageFileName << llendl; -				mStaticImageInvalid = TRUE; // don't try again. -				return FALSE; -			} -		} - -		const S32 image_tga_width = mStaticImageTGA->getWidth(); -		const S32 image_tga_height = mStaticImageTGA->getHeight();  -		if (!mCachedProcessedTexture || -			(mCachedProcessedTexture->getWidth() != image_tga_width) || -			(mCachedProcessedTexture->getHeight() != image_tga_height) || -			(weight_changed)) -		{ -//			llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl; -			mCachedEffectiveWeight = effective_weight; - -			if (!mCachedProcessedTexture) -			{ -				mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE); - -				// We now have something in one of our caches -				LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE; - -				mCachedProcessedTexture->setExplicitFormat(GL_ALPHA8, GL_ALPHA); -			} - -			// Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed. -			mStaticImageRaw = NULL; -			mStaticImageRaw = new LLImageRaw; -			mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight); -			mNeedsCreateTexture = TRUE;			 -		} - -		if (mCachedProcessedTexture) -		{ -			{ -				// Create the GL texture, and then hang onto it for future use. -				if (mNeedsCreateTexture) -				{ -					mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw); -					mNeedsCreateTexture = FALSE; -					gGL.getTexUnit(0)->bind(mCachedProcessedTexture); -					mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP); -				} - -				LLGLSNoAlphaTest gls_no_alpha_test; -				gGL.getTexUnit(0)->bind(mCachedProcessedTexture); -				gl_rect_2d_simple_tex(width, height); -				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -				stop_glerror(); -			} -		} - -		// Don't keep the cache for other people's avatars -		// (It's not really a "cache" in that case, but the logic is the same) -		if (!mAvatar->isSelf()) -		{ -			mCachedProcessedTexture = NULL; -		} -	} -	else -	{ -		LLGLDisable no_alpha(GL_ALPHA_TEST); -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.color4f(0.f, 0.f, 0.f, effective_weight); -		gl_rect_2d_simple(width, height); -	} - -	return success; -} - -//----------------------------------------------------------------------------- -// LLTexLayerParamAlphaInfo -//----------------------------------------------------------------------------- -LLTexLayerParamAlphaInfo::LLTexLayerParamAlphaInfo() : -	mMultiplyBlend(FALSE), -	mSkipIfZeroWeight(FALSE), -	mDomain(0.f) -{ -} - -BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node) -{ -	llassert(node->hasName("param") && node->getChildByName("param_alpha")); - -	if (!LLViewerVisualParamInfo::parseXml(node)) -		return FALSE; - -	LLXmlTreeNode* param_alpha_node = node->getChildByName("param_alpha"); -	if (!param_alpha_node) -	{ -		return FALSE; -	} - -	static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file"); -	if (param_alpha_node->getFastAttributeString(tga_file_string, mStaticImageFileName)) -	{ -		// Don't load the image file until it's actually needed. -	} -//	else -//	{ -//		llwarns << "<param_alpha> element is missing tga_file attribute." << llendl; -//	} -	 -	static LLStdStringHandle multiply_blend_string = LLXmlTree::addAttributeString("multiply_blend"); -	param_alpha_node->getFastAttributeBOOL(multiply_blend_string, mMultiplyBlend); - -	static LLStdStringHandle skip_if_zero_string = LLXmlTree::addAttributeString("skip_if_zero"); -	param_alpha_node->getFastAttributeBOOL(skip_if_zero_string, mSkipIfZeroWeight); - -	static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain"); -	param_alpha_node->getFastAttributeF32(domain_string, mDomain); - -	return TRUE; -} - - - - -LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) : -	LLTexLayerParam(layer), -	mAvgDistortionVec(1.f, 1.f, 1.f) -{ -} - -LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) : -	LLTexLayerParam(avatar), -	mAvgDistortionVec(1.f, 1.f, 1.f) -{ -} - -LLTexLayerParamColor::~LLTexLayerParamColor() -{ -} - -/*virtual*/ LLViewerVisualParam* LLTexLayerParamColor::cloneParam(LLWearable* wearable) const -{ -	LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer); -	*new_param = *this; -	return new_param; -} - -LLColor4 LLTexLayerParamColor::getNetColor() const -{ -	const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo(); -	 -	llassert(info->mNumColors >= 1); - -	F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight(); - -	S32 index_last = info->mNumColors - 1; -	F32 scaled_weight = effective_weight * index_last; -	S32 index_start = (S32) scaled_weight; -	S32 index_end = index_start + 1; -	if (index_start == index_last) -	{ -		return info->mColors[index_last]; -	} -	else -	{ -		F32 weight = scaled_weight - index_start; -		const LLColor4 *start = &info->mColors[ index_start ]; -		const LLColor4 *end   = &info->mColors[ index_end ]; -		return LLColor4((1.f - weight) * start->mV[VX] + weight * end->mV[VX], -						(1.f - weight) * start->mV[VY] + weight * end->mV[VY], -						(1.f - weight) * start->mV[VZ] + weight * end->mV[VZ], -						(1.f - weight) * start->mV[VW] + weight * end->mV[VW]); -	} -} - -void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake) -{ -	if (mIsAnimating) -	{ -		return; -	} - -	const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo(); -	F32 min_weight = getMinWeight(); -	F32 max_weight = getMaxWeight(); -	F32 new_weight = llclamp(weight, min_weight, max_weight); -	U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); -	U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); -	if (cur_u8 != new_u8) -	{ -		mCurWeight = new_weight; - -		if (info->mNumColors <= 0) -		{ -			// This will happen when we set the default weight the first time. -			return; -		} - -		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. -		{ -			onGlobalColorChanged(upload_bake); -			if (mTexLayer) -			{ -				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); -			} -		} - -//		llinfos << "param " << mName << " = " << new_weight << llendl; -	} -} - -void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake) -{  -	// set value first then set interpolating flag to ignore further updates -	mTargetWeight = target_value;  -	setWeight(target_value, upload_bake); -	mIsAnimating = TRUE; -	if (mNext) -	{ -		mNext->setAnimationTarget(target_value, upload_bake); -	} -} - -void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake) -{ -	if (mNext) -	{ -		mNext->animate(delta, upload_bake); -	} -} - -//----------------------------------------------------------------------------- -// LLTexLayerParamColorInfo -//----------------------------------------------------------------------------- -LLTexLayerParamColorInfo::LLTexLayerParamColorInfo() : -	mOperation(LLTexLayerParamColor::OP_ADD), -	mNumColors(0) -{ -} - -BOOL LLTexLayerParamColorInfo::parseXml(LLXmlTreeNode *node) -{ -	llassert(node->hasName("param") && node->getChildByName("param_color")); - -	if (!LLViewerVisualParamInfo::parseXml(node)) -		return FALSE; - -	LLXmlTreeNode* param_color_node = node->getChildByName("param_color"); -	if (!param_color_node) -	{ -		return FALSE; -	} - -	std::string op_string; -	static LLStdStringHandle operation_string = LLXmlTree::addAttributeString("operation"); -	if (param_color_node->getFastAttributeString(operation_string, op_string)) -	{ -		LLStringUtil::toLower(op_string); -		if		(op_string == "add") 		mOperation = LLTexLayerParamColor::OP_ADD; -		else if	(op_string == "multiply")	mOperation = LLTexLayerParamColor::OP_MULTIPLY; -		else if	(op_string == "blend")	    mOperation = LLTexLayerParamColor::OP_BLEND; -	} - -	mNumColors = 0; - -	LLColor4U color4u; -	for (LLXmlTreeNode* child = param_color_node->getChildByName("value"); -		 child; -		 child = param_color_node->getNextNamedChild()) -	{ -		if ((mNumColors < MAX_COLOR_VALUES)) -		{ -			static LLStdStringHandle color_string = LLXmlTree::addAttributeString("color"); -			if (child->getFastAttributeColor4U(color_string, color4u)) -			{ -				mColors[ mNumColors ].setVec(color4u); -				mNumColors++; -			} -		} -	} -	if (!mNumColors) -	{ -		llwarns << "<param_color> is missing <value> sub-elements" << llendl; -		return FALSE; -	} - -	if ((mOperation == LLTexLayerParamColor::OP_BLEND) && (mNumColors != 1)) -	{ -		llwarns << "<param_color> with operation\"blend\" must have exactly one <value>" << llendl; -		return FALSE; -	} -	 -	return TRUE; -} diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h deleted file mode 100644 index fffe20208f..0000000000 --- a/indra/newview/lltexlayerparams.h +++ /dev/null @@ -1,213 +0,0 @@ -/**  - * @file lltexlayerparams.h - * @brief Texture layer parameters, used by lltexlayer. - * - * $LicenseInfo:firstyear=2002&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_LLTEXLAYERPARAMS_H -#define LL_LLTEXLAYERPARAMS_H - -#include "llviewervisualparam.h" - -class LLImageRaw; -class LLImageTGA; -class LLTexLayer; -class LLTexLayerInterface; -class LLViewerTexture; -class LLVOAvatar; -class LLWearable; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParam -//  -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerParam : public LLViewerVisualParam -{ -public:  -	LLTexLayerParam(LLTexLayerInterface *layer); -	LLTexLayerParam(LLVOAvatar *avatar); -	/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  ); -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0; - -protected: -	LLTexLayerInterface*	mTexLayer; -	LLVOAvatar*             mAvatar; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParamAlpha -//  -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerParamAlpha : public LLTexLayerParam -{ -public: -	LLTexLayerParamAlpha( LLTexLayerInterface* layer ); -	LLTexLayerParamAlpha( LLVOAvatar* avatar ); -	/*virtual*/ ~LLTexLayerParamAlpha(); - -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; - -	void* operator new(size_t size) -	{ -		return ll_aligned_malloc_16(size); -	} - -	void operator delete(void* ptr) -	{ -		ll_aligned_free_16(ptr); -	} - -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL		parseData(LLXmlTreeNode* node); -	/*virtual*/ void		apply( ESex avatar_sex ) {} -	/*virtual*/ void		setWeight(F32 weight, BOOL upload_bake); -	/*virtual*/ void		setAnimationTarget(F32 target_value, BOOL upload_bake);  -	/*virtual*/ void		animate(F32 delta, BOOL upload_bake); - -	// LLViewerVisualParam Virtual functions -	/*virtual*/ F32					getTotalDistortion()									{ return 1.f; } -	/*virtual*/ const LLVector4a&	getAvgDistortion()										{ return mAvgDistortionVec; } -	/*virtual*/ F32					getMaxDistortion()										{ return 3.f; } -	/*virtual*/ LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)	{ return LLVector4a(1.f, 1.f, 1.f);} -	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)	{ index = 0; poly_mesh = NULL; return &mAvgDistortionVec;}; -	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)	{ index = 0; poly_mesh = NULL; return NULL;}; - -	// New functions -	BOOL					render( S32 x, S32 y, S32 width, S32 height ); -	BOOL					getSkip() const; -	void					deleteCaches(); -	BOOL					getMultiplyBlend() const; - -private: -	LLPointer<LLViewerTexture>	mCachedProcessedTexture; -	LLPointer<LLImageTGA>	mStaticImageTGA; -	LLPointer<LLImageRaw>	mStaticImageRaw; -	BOOL					mNeedsCreateTexture; -	BOOL					mStaticImageInvalid; -	LLVector4a				mAvgDistortionVec; -	F32						mCachedEffectiveWeight; - -public: -	// Global list of instances for gathering statistics -	static void				dumpCacheByteCount(); -	static void				getCacheByteCount( S32* gl_bytes ); - -	typedef std::list< LLTexLayerParamAlpha* > param_alpha_ptr_list_t; -	static param_alpha_ptr_list_t sInstances; -}; -class LLTexLayerParamAlphaInfo : public LLViewerVisualParamInfo -{ -	friend class LLTexLayerParamAlpha; -public: -	LLTexLayerParamAlphaInfo(); -	/*virtual*/ ~LLTexLayerParamAlphaInfo() {}; - -	/*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -private: -	std::string				mStaticImageFileName; -	BOOL					mMultiplyBlend; -	BOOL					mSkipIfZeroWeight; -	F32						mDomain; -}; -// -// LLTexLayerParamAlpha -//----------------------------------------------------------------------------- - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParamColor -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerParamColor : public LLTexLayerParam -{ -public: -	enum EColorOperation -	{ -		OP_ADD = 0, -		OP_MULTIPLY = 1, -		OP_BLEND = 2, -		OP_COUNT = 3 // Number of operations -	}; - -	LLTexLayerParamColor( LLTexLayerInterface* layer ); -	LLTexLayerParamColor( LLVOAvatar* avatar ); -	/* virtual */ ~LLTexLayerParamColor(); - -	void* operator new(size_t size) -	{ -		return ll_aligned_malloc_16(size); -	} - -	void operator delete(void* ptr) -	{ -		ll_aligned_free_16(ptr); -	} - -	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; - -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node); -	/*virtual*/ void			apply( ESex avatar_sex ) {} -	/*virtual*/ void			setWeight(F32 weight, BOOL upload_bake); -	/*virtual*/ void			setAnimationTarget(F32 target_value, BOOL upload_bake); -	/*virtual*/ void			animate(F32 delta, BOOL upload_bake); - - -	// LLViewerVisualParam Virtual functions -	/*virtual*/ F32					getTotalDistortion()									{ return 1.f; } -	/*virtual*/ const LLVector4a&	getAvgDistortion()										{ return mAvgDistortionVec; } -	/*virtual*/ F32					getMaxDistortion()										{ return 3.f; } -	/*virtual*/ LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)	{ return LLVector4a(1.f, 1.f, 1.f); } -	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)	{ index = 0; poly_mesh = NULL; return &mAvgDistortionVec;}; -	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)	{ index = 0; poly_mesh = NULL; return NULL;}; - -	// New functions -	LLColor4				getNetColor() const; -protected: -	virtual void onGlobalColorChanged(bool upload_bake) {} -private: -	LLVector4a				mAvgDistortionVec; -}; - -class LLTexLayerParamColorInfo : public LLViewerVisualParamInfo -{ -	friend class LLTexLayerParamColor; - -public: -	LLTexLayerParamColorInfo(); -	virtual ~LLTexLayerParamColorInfo() {}; -	BOOL parseXml( LLXmlTreeNode* node ); -	LLTexLayerParamColor::EColorOperation getOperation() const { return mOperation; } -private: -	enum { MAX_COLOR_VALUES = 20 }; -	LLTexLayerParamColor::EColorOperation		mOperation; -	LLColor4			mColors[MAX_COLOR_VALUES]; -	S32					mNumColors; -}; - -typedef std::vector<LLTexLayerParamColor *> param_color_list_t; -typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t; -typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t; -typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t; - -#endif diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index ec36cf48c2..3dc506d265 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -571,7 +571,7 @@ void LLFloaterTexturePicker::draw()  		if(mImageAssetID.notNull())  		{  			mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES); -			mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); +			mTexturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW);  		}  		if (mTentativeLabel) @@ -1456,9 +1456,9 @@ void LLTextureCtrl::draw()  	}  	else if (!mImageAssetID.isNull())  	{ -		LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -		texture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); +		texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW);  		texture->forceToSaveRawImage(0) ;  		mTexturep = texture; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index a2854dd6d8..50f8ee27e9 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1182,11 +1182,6 @@ bool LLTextureFetchWorker::doWork(S32 param)  			}  			else if(!mUrl.empty() && mCanUseHTTP)  			{ -				if (!(mUrl.compare(0, 7, "http://") == 0)) -				{ -					// *TODO:?remove this warning -					llwarns << "Unknown URL Type: " << mUrl << llendl; -				}  				setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);  				mState = WAIT_HTTP_RESOURCE;  			} diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 16c42dbd43..e80136b286 100755 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -40,7 +40,7 @@  #include "lltooltip.h"  #include "llappviewer.h"  #include "llselectmgr.h" -#include "lltexlayer.h" +#include "llviewertexlayer.h"  #include "lltexturecache.h"  #include "lltexturefetch.h"  #include "llviewercontrol.h" @@ -170,7 +170,7 @@ void LLTextureBar::draw()  	{  		color = LLColor4::green4;  	} -	else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE) +	else if (mImagep->getBoostLevel() > LLGLTexture::BOOST_NONE)  	{  		color = LLColor4::magenta;  	} @@ -420,14 +420,14 @@ void LLAvatarTexBar::draw()  	LLColor4 color;  	U32 line_num = 1; -	for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{ -		const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; -		const LLTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index); +		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; +		const LLViewerTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index);  		if (!layerset) continue; -		const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); +		const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();  		if (!layerset_buffer) continue;  		LLColor4 text_color = LLColor4::white; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 75178a6ef8..64be5408be 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -33,6 +33,7 @@  #include "llbutton.h"  #include "lliconctrl.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "llnotifications.h"  #include "llviewertexteditor.h" diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 602b924398..8f5d6404e8 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -369,8 +369,6 @@ void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32  void LLToastNotifyPanel::adjustPanelForTipNotice()  { -	LLRect info_rect = mInfoPanel->getRect(); -	LLRect this_rect = getRect();  	//we don't need display ControlPanel for tips because they doesn't contain any buttons.   	mControlPanel->setVisible(FALSE);  	reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index aba43a9715..08d82ea9cb 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -657,7 +657,7 @@ bool LLToolBrushLand::canTerraform(LLViewerRegion* regionp) const  {  	if (!regionp) return false;  	if (regionp->canManageEstate()) return true; -	return !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_TERRAFORM); +	return !regionp->getRegionFlag(REGION_FLAGS_BLOCK_TERRAFORM);  }  // static diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 923fbecb1a..5270c3d33f 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -471,7 +471,7 @@ BOOL LLToolCompCreate::handleMouseDown(S32 x, S32 y, MASK mask)  	mObjectPlacedOnMouseDown = TRUE; -	return TRUE; +	return handled;  }  void LLToolCompCreate::pickCallback(const LLPickInfo& pick_info) diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index c69999981c..3181e19cae 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1215,7 +1215,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,  	if (!item || !item->isFinished()) return;  	//if (regionp -	//	&& (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) +	//	&& (regionp->getRegionFlag(REGION_FLAGS_SANDBOX)))  	//{  	//	LLFirstUse::useSandbox();  	//} diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index a754d8ee7e..857b0f0714 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -314,8 +314,6 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)  	S32 dx = gViewerWindow->getCurrentMouseDX();  	S32 dy = gViewerWindow->getCurrentMouseDY(); -	BOOL moved_outside_slop = FALSE; -	  	if (hasMouseCapture() && mValidClickPoint)  	{  		mAccumX += llabs(dx); @@ -323,19 +321,11 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)  		if (mAccumX >= SLOP_RANGE)  		{ -			if (!mOutsideSlopX) -			{ -				moved_outside_slop = TRUE; -			}  			mOutsideSlopX = TRUE;  		}  		if (mAccumY >= SLOP_RANGE)  		{ -			if (!mOutsideSlopY) -			{ -				moved_outside_slop = TRUE; -			}  			mOutsideSlopY = TRUE;  		}  	} diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 0d5daf129f..148e5a015b 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -34,6 +34,7 @@  #include "llaudioengine.h"  #include "llviewercontrol.h"  #include "llfontgl.h" +#include "llwearable.h"  #include "sound_ids.h"  #include "v3math.h"  #include "v3color.h" diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 3cd761b73b..c26d9dbede 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -790,14 +790,10 @@ BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg)  	LLParcel* hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();  	LLUUID owner; -	S32 width = 0; -	S32 height = 0;  	if ( hover_parcel )  	{  		owner = hover_parcel->getOwnerID(); -		width = S32(LLViewerParcelMgr::getInstance()->getHoverParcelWidth()); -		height = S32(LLViewerParcelMgr::getInstance()->getHoverParcelHeight());  	}  	// Line: "Land" @@ -1609,9 +1605,6 @@ BOOL LLToolPie::handleRightClickPick()  	// didn't click in any UI object, so must have clicked in the world  	LLViewerObject *object = mPick.getObject(); -	LLViewerObject *parent = NULL; -	if(object) -		parent = object->getRootEdit();  	// Can't ignore children here.  	LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index 93ba3b2558..641fbc5042 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -182,7 +182,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )  		return FALSE;  	} -	if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) +	if (regionp->getRegionFlag(REGION_FLAGS_SANDBOX))  	{  		//LLFirstUse::useSandbox();  	} @@ -485,7 +485,7 @@ BOOL LLToolPlacer::addDuplicate(S32 x, S32 y)  										FALSE);				// select copy  	if (regionp -		&& (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) +		&& (regionp->getRegionFlag(REGION_FLAGS_SANDBOX)))  	{  		//LLFirstUse::useSandbox();  	} diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index edec30f8c4..dd17068be5 100644 --- a/indra/newview/llurlhistory.cpp +++ b/indra/newview/llurlhistory.cpp @@ -112,8 +112,6 @@ void LLURLHistory::addURL(const std::string& collection, const std::string& url)  // static  void LLURLHistory::removeURL(const std::string& collection, const std::string& url)  { -	LLSD::array_iterator iter = sHistorySD[collection].beginArray(); -	LLSD::array_iterator end = sHistorySD[collection].endArray();  	for(int index = 0; index < sHistorySD[collection].size(); index++)  	{  		if(sHistorySD[collection].get(index).asString() == url) diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index 4c59fd0371..4c59fd0371 100644..100755 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index 8319752230..8319752230 100644..100755 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index a437a8b3b5..b5aa0ac92a 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -136,9 +136,6 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er,  	mLastPointOfInterest = point_of_interest; -	// constrain to max distance from avatar -	LLVector3 camera_offset = center - gAgent.getPositionAgent(); -  	LLViewerRegion * regp = gAgent.getRegion();  	F32 water_height = (NULL != regp) ? regp->getWaterHeight() : 0.f; @@ -318,7 +315,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,  {  	F32 fov_y, aspect;  	fov_y = RAD_TO_DEG * getView(); -	BOOL z_default_near, z_default_far = FALSE; +	BOOL z_default_far = FALSE;  	if (z_far <= 0)  	{  		z_default_far = TRUE; @@ -326,7 +323,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection,  	}  	if (z_near <= 0)  	{ -		z_default_near = TRUE;  		z_near = getNear();  	}  	aspect = getAspect(); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index d58ee05fb6..bd8377e281 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -313,24 +313,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// Logic for forcing window updates if we're in drone mode.  	// -	// *TODO: Investigate running display() during gHeadlessClient.  See if this early exit is needed DK 2011-02-18 -	if (gHeadlessClient)  -	{ -#if LL_WINDOWS -		static F32 last_update_time = 0.f; -		if ((gFrameTimeSeconds - last_update_time) > 1.f) -		{ -			InvalidateRect((HWND)gViewerWindow->getPlatformWindow(), NULL, FALSE); -			last_update_time = gFrameTimeSeconds; -		} -#elif LL_DARWIN -		// MBW -- Do something clever here. -#endif -		// Not actually rendering, don't bother. -		return; -	} - -  	//  	// Bail out if we're in the startup state and don't want to try to  	// render the world. @@ -1052,7 +1034,6 @@ void render_hud_attachments()  	if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())  	{  		LLCamera hud_cam = *LLViewerCamera::getInstance(); -		LLVector3 origin = hud_cam.getOrigin();  		hud_cam.setOrigin(-1.f,0,0);  		hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1));  		LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE); @@ -1063,7 +1044,7 @@ void render_hud_attachments()  		gPipeline.pushRenderTypeMask();  		// turn off everything -		gPipeline.andRenderTypeMask(LLPipeline::END_RENDER_TYPES); +		gPipeline.clearAllRenderTypes();  		// turn on HUD  		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD);  		// turn on HUD particles @@ -1440,7 +1421,7 @@ void render_ui_2d()  		gGL.pushMatrix();  		S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);  		S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2); -		gGL.scalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f); +		gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f);  		gGL.translatef((F32)half_width, (F32)half_height, 0.f);  		F32 zoom = gAgentCamera.mHUDCurZoom;  		gGL.scalef(zoom,zoom,1.f); @@ -1478,10 +1459,10 @@ void render_ui_2d()  				LLUI::sDirtyRect = last_rect;  				last_rect = t_rect; -				last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::sGLScaleFactor.mV[0]); -				last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::sGLScaleFactor.mV[0]); -				last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::sGLScaleFactor.mV[1]); -				last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::sGLScaleFactor.mV[1]); +				last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::getScaleFactor().mV[0]); +				last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::getScaleFactor().mV[0]); +				last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::getScaleFactor().mV[1]); +				last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::getScaleFactor().mV[1]);  				LLRect clip_rect(last_rect); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index b47a41c44c..b47a41c44c 100644..100755 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp index a907f102f8..e46299f9d2 100644 --- a/indra/newview/llviewerjoint.cpp +++ b/indra/newview/llviewerjoint.cpp @@ -35,50 +35,26 @@  #include "llrender.h"  #include "llmath.h"  #include "llglheaders.h" -#include "llrendersphere.h"  #include "llvoavatar.h"  #include "pipeline.h" -#define DEFAULT_LOD 0.0f - -const S32 MIN_PIXEL_AREA_3PASS_HAIR = 64*64; - -//----------------------------------------------------------------------------- -// Static Data -//----------------------------------------------------------------------------- -BOOL					LLViewerJoint::sDisableLOD = FALSE; +static const S32 MIN_PIXEL_AREA_3PASS_HAIR = 64*64;  //-----------------------------------------------------------------------------  // LLViewerJoint() -// Class Constructor +// Class Constructors  //----------------------------------------------------------------------------- -LLViewerJoint::LLViewerJoint() -	:       LLJoint() -{ -	init(); -} +LLViewerJoint::LLViewerJoint() : +	LLAvatarJoint() +{ } +LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) : +	LLAvatarJoint(name, parent) +{ } -//----------------------------------------------------------------------------- -// LLViewerJoint() -// Class Constructor -//----------------------------------------------------------------------------- -LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) -	:	LLJoint(name, parent) -{ -	init(); -} - - -void LLViewerJoint::init() -{ -	mValid = FALSE; -	mComponents = SC_JOINT | SC_BONE | SC_AXES; -	mMinPixelArea = DEFAULT_LOD; -	mPickName = PN_DEFAULT; -	mVisible = TRUE; -	mMeshID = 0; -} +LLViewerJoint::LLViewerJoint(S32 joint_num) : +	LLAvatarJoint(joint_num) +{ }  //----------------------------------------------------------------------------- @@ -89,154 +65,6 @@ LLViewerJoint::~LLViewerJoint()  {  } - -//-------------------------------------------------------------------- -// setValid() -//-------------------------------------------------------------------- -void LLViewerJoint::setValid( BOOL valid, BOOL recursive ) -{ -	//---------------------------------------------------------------- -	// set visibility for this joint -	//---------------------------------------------------------------- -	mValid = valid; -	 -	//---------------------------------------------------------------- -	// set visibility for children -	//---------------------------------------------------------------- -	if (recursive) -	{ -		for (child_list_t::iterator iter = mChildren.begin(); -			 iter != mChildren.end(); ++iter) -		{ -			LLViewerJoint* joint = (LLViewerJoint*)(*iter); -			joint->setValid(valid, TRUE); -		} -	} - -} - -//-------------------------------------------------------------------- -// renderSkeleton() -// DEBUG (UNUSED) -//-------------------------------------------------------------------- -// void LLViewerJoint::renderSkeleton(BOOL recursive) -// { -// 	F32 nc = 0.57735f; - -// 	//---------------------------------------------------------------- -// 	// push matrix stack -// 	//---------------------------------------------------------------- -// 	gGL.pushMatrix(); - -// 	//---------------------------------------------------------------- -// 	// render the bone to my parent -// 	//---------------------------------------------------------------- -// 	if (mComponents & SC_BONE) -// 	{ -// 		drawBone(); -// 	} - -// 	//---------------------------------------------------------------- -// 	// offset to joint position and  -// 	// rotate to our orientation -// 	//---------------------------------------------------------------- -// 	gGL.loadIdentity(); -// 	gGL.multMatrix( &getWorldMatrix().mMatrix[0][0] ); - -// 	//---------------------------------------------------------------- -// 	// render joint axes -// 	//---------------------------------------------------------------- -// 	if (mComponents & SC_AXES) -// 	{ -// 		gGL.begin(LLRender::LINES); -// 		gGL.color3f( 1.0f, 0.0f, 0.0f ); -// 		gGL.vertex3f( 0.0f,            0.0f, 0.0f ); -// 		gGL.vertex3f( 0.1f, 0.0f, 0.0f ); - -// 		gGL.color3f( 0.0f, 1.0f, 0.0f ); -// 		gGL.vertex3f( 0.0f, 0.0f,            0.0f ); -// 		gGL.vertex3f( 0.0f, 0.1f, 0.0f ); - -// 		gGL.color3f( 0.0f, 0.0f, 1.0f ); -// 		gGL.vertex3f( 0.0f, 0.0f, 0.0f ); -// 		gGL.vertex3f( 0.0f, 0.0f, 0.1f ); -// 		gGL.end(); -// 	} - -// 	//---------------------------------------------------------------- -// 	// render the joint graphic -// 	//---------------------------------------------------------------- -// 	if (mComponents & SC_JOINT) -// 	{ -// 		gGL.color3f( 1.0f, 1.0f, 0.0f ); - -// 		gGL.begin(LLRender::TRIANGLES); - -// 		// joint top half -// 		glNormal3f(nc, nc, nc); -// 		gGL.vertex3f(0.0f,             0.0f, 0.05f); -// 		gGL.vertex3f(0.05f,       0.0f,       0.0f); -// 		gGL.vertex3f(0.0f,       0.05f,       0.0f); - -// 		glNormal3f(-nc, nc, nc); -// 		gGL.vertex3f(0.0f,             0.0f, 0.05f); -// 		gGL.vertex3f(0.0f,       0.05f,       0.0f); -// 		gGL.vertex3f(-0.05f,      0.0f,       0.0f); -		 -// 		glNormal3f(-nc, -nc, nc); -// 		gGL.vertex3f(0.0f,             0.0f, 0.05f); -// 		gGL.vertex3f(-0.05f,      0.0f,      0.0f); -// 		gGL.vertex3f(0.0f,      -0.05f,      0.0f); - -// 		glNormal3f(nc, -nc, nc); -// 		gGL.vertex3f(0.0f,              0.0f, 0.05f); -// 		gGL.vertex3f(0.0f,       -0.05f,       0.0f); -// 		gGL.vertex3f(0.05f,        0.0f,       0.0f); -		 -// 		// joint bottom half -// 		glNormal3f(nc, nc, -nc); -// 		gGL.vertex3f(0.0f,             0.0f, -0.05f); -// 		gGL.vertex3f(0.0f,       0.05f,        0.0f); -// 		gGL.vertex3f(0.05f,       0.0f,        0.0f); - -// 		glNormal3f(-nc, nc, -nc); -// 		gGL.vertex3f(0.0f,             0.0f, -0.05f); -// 		gGL.vertex3f(-0.05f,      0.0f,        0.0f); -// 		gGL.vertex3f(0.0f,       0.05f,        0.0f); -		 -// 		glNormal3f(-nc, -nc, -nc); -// 		gGL.vertex3f(0.0f,              0.0f, -0.05f); -// 		gGL.vertex3f(0.0f,       -0.05f,        0.0f); -// 		gGL.vertex3f(-0.05f,       0.0f,        0.0f); - -// 		glNormal3f(nc, -nc, -nc); -// 		gGL.vertex3f(0.0f,             0.0f,  -0.05f); -// 		gGL.vertex3f(0.05f,       0.0f,         0.0f); -// 		gGL.vertex3f(0.0f,      -0.05f,         0.0f); -		 -// 		gGL.end(); -// 	} - -// 	//---------------------------------------------------------------- -// 	// render children -// 	//---------------------------------------------------------------- -// 	if (recursive) -// 	{ -// 		for (child_list_t::iterator iter = mChildren.begin(); -// 			 iter != mChildren.end(); ++iter) -// 		{ -// 			LLViewerJoint* joint = (LLViewerJoint*)(*iter); -// 			joint->renderSkeleton(); -// 		} -// 	} - -// 	//---------------------------------------------------------------- -// 	// pop matrix stack -// 	//---------------------------------------------------------------- -// 	gGL.popMatrix(); -// } - -  //--------------------------------------------------------------------  // render()  //-------------------------------------------------------------------- @@ -317,13 +145,13 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )  	for (child_list_t::iterator iter = mChildren.begin();  		 iter != mChildren.end(); ++iter)  	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter);  		F32 jointLOD = joint->getLOD();  		if (pixelArea >= jointLOD || sDisableLOD)  		{  			triangle_count += joint->render( pixelArea, TRUE, is_dummy ); -			if (jointLOD != DEFAULT_LOD) +			if (jointLOD != DEFAULT_AVATAR_JOINT_LOD)  			{  				break;  			} @@ -333,72 +161,6 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )  	return triangle_count;  } - -//-------------------------------------------------------------------- -// drawBone() -// DEBUG (UNUSED) -//-------------------------------------------------------------------- -// void LLViewerJoint::drawBone() -// { -// 	if ( mParent == NULL ) -// 		return; - -// 	F32 boneSize = 0.02f; - -// 	// rotate to point to child (bone direction) -// 	gGL.pushMatrix(); - -// 	LLVector3 boneX = getPosition(); -// 	F32 length = boneX.normVec(); - -// 	LLVector3 boneZ(1.0f, 0.0f, 1.0f); -	 -// 	LLVector3 boneY = boneZ % boneX; -// 	boneY.normVec(); - -// 	boneZ = boneX % boneY; - -// 	LLMatrix4 rotateMat; -// 	rotateMat.setFwdRow( boneX ); -// 	rotateMat.setLeftRow( boneY ); -// 	rotateMat.setUpRow( boneZ ); -// 	gGL.multMatrix( &rotateMat.mMatrix[0][0] ); - -// 	// render the bone -// 	gGL.color3f( 0.5f, 0.5f, 0.0f ); - -// 	gGL.begin(LLRender::TRIANGLES); - -// 	gGL.vertex3f( length,     0.0f,       0.0f); -// 	gGL.vertex3f( 0.0f,       boneSize,  0.0f); -// 	gGL.vertex3f( 0.0f,       0.0f,       boneSize); - -// 	gGL.vertex3f( length,     0.0f,        0.0f); -// 	gGL.vertex3f( 0.0f,       0.0f,        -boneSize); -// 	gGL.vertex3f( 0.0f,       boneSize,   0.0f); - -// 	gGL.vertex3f( length,     0.0f,        0.0f); -// 	gGL.vertex3f( 0.0f,       -boneSize,  0.0f); -// 	gGL.vertex3f( 0.0f,       0.0f,        -boneSize); - -// 	gGL.vertex3f( length,     0.0f,        0.0f); -// 	gGL.vertex3f( 0.0f,       0.0f,        boneSize); -// 	gGL.vertex3f( 0.0f,       -boneSize,  0.0f); - -// 	gGL.end(); - -// 	// restore matrix -// 	gGL.popMatrix(); -// } - -//-------------------------------------------------------------------- -// isTransparent() -//-------------------------------------------------------------------- -BOOL LLViewerJoint::isTransparent() -{ -	return FALSE; -} -  //--------------------------------------------------------------------  // drawShape()  //-------------------------------------------------------------------- @@ -407,213 +169,4 @@ U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy )  	return 0;  } -//-------------------------------------------------------------------- -// setSkeletonComponents() -//-------------------------------------------------------------------- -void LLViewerJoint::setSkeletonComponents( U32 comp, BOOL recursive ) -{ -	mComponents = comp; -	if (recursive) -	{ -		for (child_list_t::iterator iter = mChildren.begin(); -			 iter != mChildren.end(); ++iter) -		{ -			LLViewerJoint* joint = (LLViewerJoint*)(*iter); -			joint->setSkeletonComponents(comp, recursive); -		} -	} -} - -void LLViewerJoint::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area) -{ -	for (child_list_t::iterator iter = mChildren.begin(); -		 iter != mChildren.end(); ++iter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); -		joint->updateFaceSizes(num_vertices, num_indices, pixel_area); -	} -} - -void LLViewerJoint::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind, bool terse_update) -{ -	for (child_list_t::iterator iter = mChildren.begin(); -		 iter != mChildren.end(); ++iter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); -		joint->updateFaceData(face, pixel_area, damp_wind, terse_update); -	} -} - -void LLViewerJoint::updateJointGeometry() -{ -	for (child_list_t::iterator iter = mChildren.begin(); -		 iter != mChildren.end(); ++iter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); -		joint->updateJointGeometry(); -	} -} - - -BOOL LLViewerJoint::updateLOD(F32 pixel_area, BOOL activate) -{ -	BOOL lod_changed = FALSE; -	BOOL found_lod = FALSE; - -	for (child_list_t::iterator iter = mChildren.begin(); -		 iter != mChildren.end(); ++iter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); -		F32 jointLOD = joint->getLOD(); -		 -		if (found_lod || jointLOD == DEFAULT_LOD) -		{ -			// we've already found a joint to enable, so enable the rest as alternatives -			lod_changed |= joint->updateLOD(pixel_area, TRUE); -		} -		else -		{ -			if (pixel_area >= jointLOD || sDisableLOD) -			{ -				lod_changed |= joint->updateLOD(pixel_area, TRUE); -				found_lod = TRUE; -			} -			else -			{ -				lod_changed |= joint->updateLOD(pixel_area, FALSE); -			} -		} -	} -	return lod_changed; -} - -void LLViewerJoint::dump() -{ -	for (child_list_t::iterator iter = mChildren.begin(); -		 iter != mChildren.end(); ++iter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*)(*iter); -		joint->dump(); -	} -} - -void LLViewerJoint::setVisible(BOOL visible, BOOL recursive) -{ -	mVisible = visible; - -	if (recursive) -	{ -		for (child_list_t::iterator iter = mChildren.begin(); -			 iter != mChildren.end(); ++iter) -		{ -			LLViewerJoint* joint = (LLViewerJoint*)(*iter); -			joint->setVisible(visible, recursive); -		} -	} -} - - -void LLViewerJoint::setMeshesToChildren() -{ -	removeAllChildren(); -	for (std::vector<LLViewerJointMesh*>::iterator iter = mMeshParts.begin(); -		iter != mMeshParts.end(); iter++) -	{ -		addChild((LLViewerJointMesh *) *iter); -	} -} -//----------------------------------------------------------------------------- -// LLViewerJointCollisionVolume() -//----------------------------------------------------------------------------- - -LLViewerJointCollisionVolume::LLViewerJointCollisionVolume() -{ -	mUpdateXform = FALSE; -} - -LLViewerJointCollisionVolume::LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent) : LLViewerJoint(name, parent) -{ -	 -} - -void LLViewerJointCollisionVolume::renderCollision() -{ -	updateWorldMatrix(); -	 -	gGL.pushMatrix(); -	gGL.multMatrix( &mXform.getWorldMatrix().mMatrix[0][0] ); - -	gGL.diffuseColor3f( 0.f, 0.f, 1.f ); -	 -	gGL.begin(LLRender::LINES); -	 -	LLVector3 v[] =  -	{ -		LLVector3(1,0,0), -		LLVector3(-1,0,0), -		LLVector3(0,1,0), -		LLVector3(0,-1,0), - -		LLVector3(0,0,-1), -		LLVector3(0,0,1), -	}; - -	//sides -	gGL.vertex3fv(v[0].mV);  -	gGL.vertex3fv(v[2].mV); - -	gGL.vertex3fv(v[0].mV);  -	gGL.vertex3fv(v[3].mV); - -	gGL.vertex3fv(v[1].mV);  -	gGL.vertex3fv(v[2].mV); - -	gGL.vertex3fv(v[1].mV);  -	gGL.vertex3fv(v[3].mV); - - -	//top -	gGL.vertex3fv(v[0].mV);  -	gGL.vertex3fv(v[4].mV); - -	gGL.vertex3fv(v[1].mV);  -	gGL.vertex3fv(v[4].mV); - -	gGL.vertex3fv(v[2].mV);  -	gGL.vertex3fv(v[4].mV); - -	gGL.vertex3fv(v[3].mV);  -	gGL.vertex3fv(v[4].mV); - - -	//bottom -	gGL.vertex3fv(v[0].mV);  -	gGL.vertex3fv(v[5].mV); - -	gGL.vertex3fv(v[1].mV);  -	gGL.vertex3fv(v[5].mV); - -	gGL.vertex3fv(v[2].mV);  -	gGL.vertex3fv(v[5].mV); - -	gGL.vertex3fv(v[3].mV);  -	gGL.vertex3fv(v[5].mV); - -	gGL.end(); - -	gGL.popMatrix(); -} - -LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset) -{ -	mUpdateXform = TRUE; -	 -	LLVector3 result = offset; -	result.scaleVec(getScale()); -	result.rotVec(getWorldRotation()); -	result += getWorldPosition(); - -	return result; -} -  // End diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h index 76e3833acb..fd262b6e80 100644 --- a/indra/newview/llviewerjoint.h +++ b/indra/newview/llviewerjoint.h @@ -30,7 +30,8 @@  //-----------------------------------------------------------------------------  // Header Files  //----------------------------------------------------------------------------- -#include "lljoint.h" +#include "llavatarjoint.h" +#include "lljointpickname.h"  class LLFace;  class LLViewerJointMesh; @@ -39,124 +40,25 @@ class LLViewerJointMesh;  // class LLViewerJoint  //-----------------------------------------------------------------------------  class LLViewerJoint : -	public LLJoint +	public virtual LLAvatarJoint  {  public:  	LLViewerJoint(); +	LLViewerJoint(S32 joint_num); +	// *TODO: Only used for LLVOAvatarSelf::mScreenp.  *DOES NOT INITIALIZE mResetAfterRestoreOldXform*  	LLViewerJoint(const std::string &name, LLJoint *parent = NULL);  	virtual ~LLViewerJoint(); -	// Gets the validity of this joint -	BOOL getValid() { return mValid; } - -	// Sets the validity of this joint -	virtual void setValid( BOOL valid, BOOL recursive=FALSE ); - -	// Primarily for debugging and character setup -	// Derived classes may add text/graphic output. -	// Draw skeleton graphic for debugging and character setup - 	void renderSkeleton(BOOL recursive=TRUE); // debug only (unused) - -	// Draws a bone graphic to the parent joint. -	// Derived classes may add text/graphic output. -	// Called by renderSkeleton(). - 	void drawBone(); // debug only (unused) -  	// Render character hierarchy.  	// Traverses the entire joint hierarchy, setting up  	// transforms and calling the drawShape().  	// Derived classes may add text/graphic output.  	virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE );	// Returns triangle count -	// Returns true if this object is transparent. -	// This is used to determine in which order to draw objects. -	virtual BOOL isTransparent(); - -	// Returns true if this object should inherit scale modifiers from its immediate parent -	virtual BOOL inheritScale() { return FALSE; } -  	// Draws the shape attached to a joint.  	// Called by render().  	virtual U32 drawShape( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE );  	virtual void drawNormals() {} - -	enum Components -	{ -		SC_BONE		= 1, -		SC_JOINT	= 2, -		SC_AXES		= 4 -	}; - -	// Selects which skeleton components to draw -	void setSkeletonComponents( U32 comp, BOOL recursive = TRUE ); - -	// Returns which skeleton components are enables for drawing -	U32 getSkeletonComponents() { return mComponents; } - -	// Sets the level of detail for this node as a minimum -	// pixel area threshold.  If the current pixel area for this -	// object is less than the specified threshold, the node is -	// not traversed.  In addition, if a value is specified (not -	// default of 0.0), and the pixel area is larger than the -	// specified minimum, the node is rendered, but no other siblings -	// of this node under the same parent will be. -	F32 getLOD() { return mMinPixelArea; } -	void setLOD( F32 pixelArea ) { mMinPixelArea = pixelArea; } -	 -	// Sets the OpenGL selection stack name that is pushed and popped -	// with this joint state.  The default value indicates that no name -	// should be pushed/popped. -	enum PickName -	{ -		PN_DEFAULT = -1, -		PN_0 = 0, -		PN_1 = 1, -		PN_2 = 2, -		PN_3 = 3, -		PN_4 = 4, -		PN_5 = 5 -	}; -	void setPickName(PickName name) { mPickName = name; } -	PickName getPickName() { return mPickName; } - -	virtual void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area); -	virtual void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false); -	virtual BOOL updateLOD(F32 pixel_area, BOOL activate); -	virtual void updateJointGeometry(); -	virtual void dump(); - -	void setVisible( BOOL visible, BOOL recursive ); - -	// Takes meshes in mMeshParts and sets each one as a child joint -	void setMeshesToChildren(); - -public: -	static BOOL	sDisableLOD; -	std::vector<LLViewerJointMesh*> mMeshParts; -	void setMeshID( S32 id ) {mMeshID = id;} - -protected: -	void init(); - -	BOOL		mValid; -	U32			mComponents; -	F32			mMinPixelArea; -	PickName	mPickName; -	BOOL		mVisible; -	S32			mMeshID; -}; - -class LLViewerJointCollisionVolume : public LLViewerJoint -{ -public: -	LLViewerJointCollisionVolume(); -	LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent = NULL); -	virtual ~LLViewerJointCollisionVolume() {}; - -	virtual BOOL inheritScale() { return TRUE; } - -	void renderCollision(); -	LLVector3 getVolumePos(LLVector3 &offset);  };  #endif // LL_LLVIEWERJOINT_H diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 5d1aa870a3..64454a03d1 100644..100755 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -42,7 +42,7 @@  #include "llface.h"  #include "llgldbg.h"  #include "llglheaders.h" -#include "lltexlayer.h" +#include "llviewertexlayer.h"  #include "llviewercamera.h"  #include "llviewercontrol.h"  #include "llviewertexturelist.h" @@ -67,101 +67,20 @@ static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX |  							   LLVertexBuffer::MAP_NORMAL |  							   LLVertexBuffer::MAP_TEXCOORD0; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// LLViewerJointMesh::LLSkinJoint -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// LLSkinJoint -//----------------------------------------------------------------------------- -LLSkinJoint::LLSkinJoint() -{ -	mJoint       = NULL; -} - -//----------------------------------------------------------------------------- -// ~LLSkinJoint -//----------------------------------------------------------------------------- -LLSkinJoint::~LLSkinJoint() -{ -	mJoint = NULL; -} - - -//----------------------------------------------------------------------------- -// LLSkinJoint::setupSkinJoint() -//----------------------------------------------------------------------------- -BOOL LLSkinJoint::setupSkinJoint( LLViewerJoint *joint) -{ -	// find the named joint -	mJoint = joint; -	if ( !mJoint ) -	{ -		llinfos << "Can't find joint" << llendl; -	} - -	// compute the inverse root skin matrix -	mRootToJointSkinOffset.clearVec(); - -	LLVector3 rootSkinOffset; -	while (joint) -	{ -		rootSkinOffset += joint->getSkinOffset(); -		joint = (LLViewerJoint*)joint->getParent(); -	} - -	mRootToJointSkinOffset = -rootSkinOffset; -	mRootToParentJointSkinOffset = mRootToJointSkinOffset; -	mRootToParentJointSkinOffset += mJoint->getSkinOffset(); - -	return TRUE; -} - -  //-----------------------------------------------------------------------------  //-----------------------------------------------------------------------------  // LLViewerJointMesh  //-----------------------------------------------------------------------------  //----------------------------------------------------------------------------- -BOOL LLViewerJointMesh::sPipelineRender = FALSE; -EAvatarRenderPass LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE; -U32 LLViewerJointMesh::sClothingMaskImageName = 0; -LLColor4 LLViewerJointMesh::sClothingInnerColor;  //-----------------------------------------------------------------------------  // LLViewerJointMesh()  //-----------------------------------------------------------------------------  LLViewerJointMesh::LLViewerJointMesh()  	: -	mTexture( NULL ), -	mLayerSet( NULL ), -	mTestImageName( 0 ), -	mFaceIndexCount(0), -	mIsTransparent(FALSE) +	LLAvatarJointMesh()  { - -	mColor[0] = 1.0f; -	mColor[1] = 1.0f; -	mColor[2] = 1.0f; -	mColor[3] = 1.0f; -	mShiny = 0.0f; -	mCullBackFaces = TRUE; - -	mMesh = NULL; - -	mNumSkinJoints = 0; -	mSkinJoints = NULL; - -	mFace = NULL; - -	mMeshID = 0; -	mUpdateXform = FALSE; - -	mValid = FALSE;  } @@ -171,199 +90,6 @@ LLViewerJointMesh::LLViewerJointMesh()  //-----------------------------------------------------------------------------  LLViewerJointMesh::~LLViewerJointMesh()  { -	mMesh = NULL; -	mTexture = NULL; -	freeSkinData(); -} - - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::allocateSkinData() -//----------------------------------------------------------------------------- -BOOL LLViewerJointMesh::allocateSkinData( U32 numSkinJoints ) -{ -	mSkinJoints = new LLSkinJoint[ numSkinJoints ]; -	mNumSkinJoints = numSkinJoints; -	return TRUE; -} - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::freeSkinData() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::freeSkinData() -{ -	mNumSkinJoints = 0; -	delete [] mSkinJoints; -	mSkinJoints = NULL; -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getColor() -//-------------------------------------------------------------------- -void LLViewerJointMesh::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha ) -{ -	*red   = mColor[0]; -	*green = mColor[1]; -	*blue  = mColor[2]; -	*alpha = mColor[3]; -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setColor() -//-------------------------------------------------------------------- -void LLViewerJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha ) -{ -	mColor[0] = red; -	mColor[1] = green; -	mColor[2] = blue; -	mColor[3] = alpha; -} - - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getTexture() -//-------------------------------------------------------------------- -//LLViewerTexture *LLViewerJointMesh::getTexture() -//{ -//	return mTexture; -//} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setTexture() -//-------------------------------------------------------------------- -void LLViewerJointMesh::setTexture( LLViewerTexture *texture ) -{ -	mTexture = texture; - -	// texture and dynamic_texture are mutually exclusive -	if( texture ) -	{ -		mLayerSet = NULL; -		//texture->bindTexture(0); -		//texture->setClamp(TRUE, TRUE); -	} -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setLayerSet() -// Sets the shape texture (takes precedence over normal texture) -//-------------------------------------------------------------------- -void LLViewerJointMesh::setLayerSet( LLTexLayerSet* layer_set ) -{ -	mLayerSet = layer_set; -	 -	// texture and dynamic_texture are mutually exclusive -	if( layer_set ) -	{ -		mTexture = NULL; -	} -} - - - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getMesh() -//-------------------------------------------------------------------- -LLPolyMesh *LLViewerJointMesh::getMesh() -{ -	return mMesh; -} - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::setMesh() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::setMesh( LLPolyMesh *mesh ) -{ -	// set the mesh pointer -	mMesh = mesh; - -	// release any existing skin joints -	freeSkinData(); - -	if ( mMesh == NULL ) -	{ -		return; -	} - -	// acquire the transform from the mesh object -	setPosition( mMesh->getPosition() ); -	setRotation( mMesh->getRotation() ); -	setScale( mMesh->getScale() ); - -	// create skin joints if necessary -	if ( mMesh->hasWeights() && !mMesh->isLOD()) -	{ -		U32 numJointNames = mMesh->getNumJointNames(); -		 -		allocateSkinData( numJointNames ); -		std::string *jointNames = mMesh->getJointNames(); - -		U32 jn; -		for (jn = 0; jn < numJointNames; jn++) -		{ -			//llinfos << "Setting up joint " << jointNames[jn] << llendl; -			LLViewerJoint* joint = (LLViewerJoint*)(getRoot()->findJoint(jointNames[jn]) ); -			mSkinJoints[jn].setupSkinJoint( joint ); -		} -	} - -	// setup joint array -	if (!mMesh->isLOD()) -	{ -		setupJoint((LLViewerJoint*)getRoot()); -	} - -//	llinfos << "joint render entries: " << mMesh->mJointRenderData.count() << llendl; -} - -//----------------------------------------------------------------------------- -// setupJoint() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::setupJoint(LLViewerJoint* current_joint) -{ -//	llinfos << "Mesh: " << getName() << llendl; - -//	S32 joint_count = 0; -	U32 sj; -	for (sj=0; sj<mNumSkinJoints; sj++) -	{ -		LLSkinJoint &js = mSkinJoints[sj]; - -		if (js.mJoint != current_joint) -		{ -			continue; -		} - -		// we've found a skinjoint for this joint.. - -		// is the last joint in the array our parent? -		if(mMesh->mJointRenderData.count() && mMesh->mJointRenderData[mMesh->mJointRenderData.count() - 1]->mWorldMatrix == ¤t_joint->getParent()->getWorldMatrix()) -		{ -			// ...then just add ourselves -			LLViewerJoint* jointp = js.mJoint; -			mMesh->mJointRenderData.put(new LLJointRenderData(&jointp->getWorldMatrix(), &js)); -//			llinfos << "joint " << joint_count << js.mJoint->getName() << llendl; -//			joint_count++; -		} -		// otherwise add our parent and ourselves -		else -		{ -			mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getParent()->getWorldMatrix(), NULL)); -//			llinfos << "joint " << joint_count << current_joint->getParent()->getName() << llendl; -//			joint_count++; -			mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getWorldMatrix(), &js)); -//			llinfos << "joint " << joint_count << current_joint->getName() << llendl; -//			joint_count++; -		} -	} - -	// depth-first traversal -	for (LLJoint::child_list_t::iterator iter = current_joint->mChildren.begin(); -		 iter != current_joint->mChildren.end(); ++iter) -	{ -		LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); -		setupJoint(child_joint); -	}  }  const S32 NUM_AXES = 3; @@ -475,21 +201,6 @@ void LLViewerJointMesh::uploadJointMatrices()  }  //-------------------------------------------------------------------- -// LLViewerJointMesh::drawBone() -//-------------------------------------------------------------------- -void LLViewerJointMesh::drawBone() -{ -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::isTransparent() -//-------------------------------------------------------------------- -BOOL LLViewerJointMesh::isTransparent() -{ -	return mIsTransparent; -} - -//--------------------------------------------------------------------  // DrawElementsBLEND and utility code  //-------------------------------------------------------------------- @@ -544,6 +255,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)  	llassert( !(mTexture.notNull() && mLayerSet) );  // mutually exclusive  	LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP; +	LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mLayerSet);  	if (mTestImageName)  	{  		gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName); @@ -558,11 +270,11 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)  			gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);  		}  	} -	else if( !is_dummy && mLayerSet ) +	else if( !is_dummy && layerset )  	{ -		if(	mLayerSet->hasComposite() ) +		if(	layerset->hasComposite() )  		{ -			gGL.getTexUnit(diffuse_channel)->bind(mLayerSet->getComposite()); +			gGL.getTexUnit(diffuse_channel)->bind(layerset->getViewerComposite());  		}  		else  		{ diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h index dd5dae1dc1..0db2836e15 100644..100755 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -1,6 +1,6 @@  /**    * @file llviewerjointmesh.h - * @brief Implementation of LLViewerJointMesh class + * @brief Declaration of LLViewerJointMesh class   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code @@ -29,64 +29,20 @@  #include "llviewerjoint.h"  #include "llviewertexture.h" +#include "llavatarjointmesh.h"  #include "llpolymesh.h"  #include "v4color.h"  class LLDrawable;  class LLFace;  class LLCharacter; -class LLTexLayerSet; - -typedef enum e_avatar_render_pass -{ -	AVATAR_RENDER_PASS_SINGLE, -	AVATAR_RENDER_PASS_CLOTHING_INNER, -	AVATAR_RENDER_PASS_CLOTHING_OUTER -} EAvatarRenderPass; - -class LLSkinJoint -{ -public: -	LLSkinJoint(); -	~LLSkinJoint(); -	BOOL setupSkinJoint( LLViewerJoint *joint); - -	LLViewerJoint	*mJoint; -	LLVector3		mRootToJointSkinOffset; -	LLVector3		mRootToParentJointSkinOffset; -}; +class LLViewerTexLayerSet;  //-----------------------------------------------------------------------------  // class LLViewerJointMesh  //----------------------------------------------------------------------------- -class LLViewerJointMesh : public LLViewerJoint +class LLViewerJointMesh : public LLAvatarJointMesh, public LLViewerJoint  { -	friend class LLVOAvatar; -protected: -	LLColor4					mColor;			// color value -// 	LLColor4					mSpecular;		// specular color (always white for now) -	F32							mShiny;			// shiny value -	LLPointer<LLViewerTexture>	mTexture;		// ptr to a global texture -	LLTexLayerSet*				mLayerSet;		// ptr to a layer set owned by the avatar -	U32 						mTestImageName;		// handle to a temporary texture for previewing uploads -	LLPolyMesh*					mMesh;			// ptr to a global polymesh -	BOOL						mCullBackFaces;	// true by default -	LLFace*						mFace;			// ptr to a face w/ AGP copy of mesh - -	U32							mFaceIndexCount; -	BOOL						mIsTransparent; - -	U32							mNumSkinJoints; -	LLSkinJoint*				mSkinJoints; -	S32							mMeshID; - -public: -	static BOOL					sPipelineRender; -	//RN: this is here for testing purposes -	static U32					sClothingMaskImageName; -	static EAvatarRenderPass	sRenderPass; -	static LLColor4				sClothingInnerColor; -  public:  	// Constructor  	LLViewerJointMesh(); @@ -94,67 +50,28 @@ public:  	// Destructor  	virtual ~LLViewerJointMesh(); -	// Gets the shape color -	void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha ); - -	// Sets the shape color -	void setColor( F32 red, F32 green, F32 blue, F32 alpha ); - -	// Sets the shininess -	void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; }; - -	// Sets the shape texture -	void setTexture( LLViewerTexture *texture ); - -	void setTestTexture( U32 name ) { mTestImageName = name; } - -	// Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture) -	void setLayerSet( LLTexLayerSet* layer_set ); - -	// Gets the poly mesh -	LLPolyMesh *getMesh(); - -	// Sets the poly mesh -	void setMesh( LLPolyMesh *mesh ); - -	// Sets up joint matrix data for rendering -	void setupJoint(LLViewerJoint* current_joint); -  	// Render time method to upload batches of joint matrices  	void uploadJointMatrices(); -	// Sets ID for picking -	void setMeshID( S32 id ) {mMeshID = id;} - -	// Gets ID for picking -	S32 getMeshID() { return mMeshID; }	 -  	// overloaded from base class -	/*virtual*/ void drawBone(); -	/*virtual*/ BOOL isTransparent();  	/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy ); +	// necessary because MS's compiler warns on function inheritance via dominance in the diamond inheritance here. +	// warns even though LLViewerJoint holds the only non virtual implementation. +	/*virtual*/ U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ) { return LLViewerJoint::render(pixelArea,first_pass,is_dummy);} +  	/*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);  	/*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false);  	/*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate);  	/*virtual*/ void updateJointGeometry();  	/*virtual*/ void dump(); -	void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; } -  	/*virtual*/ BOOL isAnimatable() const { return FALSE; }  private:  	//copy mesh into given face's vertex buffer, applying current animation pose  	static void updateGeometry(LLFace* face, LLPolyMesh* mesh); - -private: -	// Allocate skin data -	BOOL allocateSkinData( U32 numSkinJoints ); - -	// Free skin data -	void freeSkinData();  };  #endif // LL_LLVIEWERJOINTMESH_H diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 4543a1ba9a..297906803b 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -406,11 +406,9 @@ void LLViewerMediaFocus::update()  	LLViewerObject *viewer_object = getFocusedObject();  	S32 face = mFocusedObjectFace;  	LLVector3 normal = mFocusedObjectNormal; -	bool focus = true;  	if(!media_impl || !viewer_object)  	{ -		focus = false;  		media_impl = getHoverMediaImpl();  		viewer_object = getHoverObject();  		face = mHoverObjectFace; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 5a8ef00b1f..4e2d1363bd 100644..100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -123,7 +123,7 @@  #include "llpathfindingmanager.h"  #include "boost/unordered_map.hpp" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  typedef LLPointer<LLViewerObject> LLViewerObjectPtr; @@ -1597,11 +1597,26 @@ class LLAdvancedEnableGrabBakedTexture : public view_listener_t  /////////////////////// +class LLAdvancedEnableAppearanceToXML : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		return gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); +	} +}; +  class LLAdvancedAppearanceToXML : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLVOAvatar::dumpArchetypeXML(NULL); +		std::string emptyname; +		LLVOAvatar* avatar = +			find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); +		if (!avatar) +		{ +			avatar = gAgentAvatarp; +		} +		avatar->dumpArchetypeXML(emptyname);  		return true;  	}  }; @@ -2799,7 +2814,7 @@ class LLSelfRemoveAllAttachments : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLAgentWearables::userRemoveAllAttachments(); +		LLAppearanceMgr::instance().removeAllAttachmentsFromAvatar();  		return true;  	}  }; @@ -6421,23 +6436,21 @@ class LLAttachmentDetachFromPoint : public view_listener_t  {  	bool handleEvent(const LLSD& user_data)  	{ +		uuid_vec_t ids_to_remove;  		const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL);  		if (attachment->getNumObjects() > 0)  		{ -			gMessageSystem->newMessage("ObjectDetach"); -			gMessageSystem->nextBlockFast(_PREHASH_AgentData); -			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			  			for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator iter = attachment->mAttachedObjects.begin();  				 iter != attachment->mAttachedObjects.end();  				 iter++)  			{  				LLViewerObject *attached_object = (*iter); -				gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -				gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, attached_object->getLocalID()); +				ids_to_remove.push_back(attached_object->getAttachmentItemID());  			} -			gMessageSystem->sendReliable( gAgent.getRegionHost() ); +		} +		if (!ids_to_remove.empty()) +		{ +			LLAppearanceMgr::instance().removeItemsFromAvatar(ids_to_remove);  		}  		return true;  	} @@ -6510,17 +6523,8 @@ class LLAttachmentDetach : public view_listener_t  			return true;  		} -		// The sendDetach() method works on the list of selected -		// objects.  Thus we need to clear the list, make sure it only -		// contains the object the user clicked, send the message, -		// then clear the list. -		// We use deselectAll to update the simulator's notion of what's -		// selected, and removeAll just to change things locally. -		//RN: I thought it was more useful to detach everything that was selected -		if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) -		{ -			LLSelectMgr::getInstance()->sendDetach(); -		} +		LLAppearanceMgr::instance().removeItemFromAvatar(object->getAttachmentItemID()); +  		return true;  	}  }; @@ -7419,7 +7423,7 @@ void handle_grab_baked_texture(void* data)  	if(folder_id.notNull())  	{  		std::string name; -		name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture"; +		name = "Baked " + LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture";  		LLUUID item_id;  		item_id.generate(); @@ -7663,6 +7667,10 @@ void handle_rebake_textures(void*)  	// Slam pending upload count to "unstick" things  	bool slam_for_debug = true;  	gAgentAvatarp->forceBakeAllTextures(slam_for_debug); +	if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) +	{ +		LLAppearanceMgr::instance().requestServerAppearanceUpdate(); +	}  }  void toggle_visibility(void* user_data) @@ -7929,7 +7937,7 @@ class LLEditTakeOff : public view_listener_t  	{  		std::string clothing = userdata.asString();  		if (clothing == "all") -			LLWearableBridge::removeAllClothesFromAvatar(); +			LLAppearanceMgr::instance().removeAllClothesFromAvatar();  		else  		{  			LLWearableType::EType type = LLWearableType::typeNameToType(clothing); @@ -7939,8 +7947,8 @@ class LLEditTakeOff : public view_listener_t  			{  				// MULTI-WEARABLES: assuming user wanted to remove top shirt.  				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; -				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index)); -				LLWearableBridge::removeItemFromAvatar(item); +				LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index); +				LLAppearanceMgr::instance().removeItemFromAvatar(item_id);  			}  		} @@ -8493,6 +8501,7 @@ void initialize_menus()  	// Advanced > Character > Character Tests  	view_listener_t::addMenu(new LLAdvancedAppearanceToXML(), "Advanced.AppearanceToXML"); +	view_listener_t::addMenu(new LLAdvancedEnableAppearanceToXML(), "Advanced.EnableAppearanceToXML");  	view_listener_t::addMenu(new LLAdvancedToggleCharacterGeometry(), "Advanced.ToggleCharacterGeometry");  	view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 3515aa4302..885a0721c0 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -139,6 +139,11 @@ bool handle_go_to();  // Export to XML or Collada  void handle_export_selected( void * ); +// Convert strings to internal types +U32 render_type_from_string(std::string render_type); +U32 feature_from_string(std::string feature); +U32 info_display_from_string(std::string info_display); +  class LLViewerMenuHolderGL : public LLMenuHolderGL  {  public: diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index b048332e59..a3291b3463 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -626,7 +626,6 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)  bool join_group_response(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	BOOL delete_context_data = TRUE;  	bool accept_invite = false;  	LLUUID group_id = notification["payload"]["group_id"].asUUID(); @@ -655,7 +654,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  		}  		else  		{ -			delete_context_data = FALSE;  			LLSD args;  			args["NAME"] = name;  			LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]); @@ -668,7 +666,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  		// sure the user is sure they want to join.  		if (fee > 0)  		{ -			delete_context_data = FALSE;  			LLSD args;  			args["COST"] = llformat("%d", fee);  			// Set the fee for next time to 0, so that we don't keep @@ -2768,11 +2765,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());  		}  		buffer = saved + message; -		BOOL is_this_agent = FALSE; -		if(from_id == gAgentID) -		{ -			is_this_agent = TRUE; -		}  		gIMMgr->addMessage(  			session_id,  			from_id, @@ -3386,7 +3378,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  	LLColor4	color(1.0f, 1.0f, 1.0f, 1.0f);  	LLUUID		from_id;  	LLUUID		owner_id; -	BOOL		is_owned_by_me = FALSE;  	LLViewerObject*	chatter;  	msg->getString("ChatData", "FromName", from_name); @@ -3471,13 +3462,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  				gAgent.heardChat(chat.mFromID);  			}  		} - -		is_owned_by_me = chatter->permYouOwner();  	}  	if (is_audible)  	{ -		BOOL visible_in_chat_bubble = FALSE; +		//BOOL visible_in_chat_bubble = FALSE;  		color.setVec(1.f,1.f,1.f,1.f);  		msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); @@ -3560,7 +3549,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  			if (!is_muted && !is_busy)  			{ -				visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); +				//visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");  				std::string formated_msg = "";  				LLViewerChat::formatChatMsg(chat, formated_msg);  				LLChat chat_bubble = chat; @@ -4900,9 +4889,19 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)  	// Various hacks that aren't statistics, but are being handled here.  	//  	U32 max_tasks_per_region; -	U32 region_flags; +	U64 region_flags;  	msg->getU32("Region", "ObjectCapacity", max_tasks_per_region); -	msg->getU32("Region", "RegionFlags", region_flags); + +	if (msg->has(_PREHASH_RegionInfo)) +	{ +		msg->getU64("RegionInfo", "RegionFlagsExtended", region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32("Region", "RegionFlags", flags); +		region_flags = flags; +	}  	LLViewerRegion* regionp = gAgent.getRegion();  	if (regionp) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b2bd547811..831bef8323 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3281,14 +3281,14 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)  	S32 tex_count = getNumTEs();  	for (i = 0; i < tex_count; i++)  	{ - 		getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); + 		getTEImage(i)->setBoostLevel(LLGLTexture::BOOST_SELECTED);  	}  	if (isSculpted() && !isMesh())  	{  		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);  		LLUUID sculpt_id = sculpt_params->getSculptTexture(); -		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); +		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED);  	}  	if (boost_children) @@ -4035,7 +4035,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)  //	if (mDrawable.notNull() && mDrawable->isVisible())  //	{  		const LLUUID& image_id = getTE(te)->getID(); -		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  //	}  } @@ -4054,6 +4054,23 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)  } +S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, const std::string &url ) +{ +	S32 retval = 0; +	if (uuid != getTE(te)->getID() || +		uuid == LLUUID::null) +	{ +		retval = LLPrimitive::setTETexture(te, uuid); +		mTEImages[te] = LLViewerTextureManager::getFetchedTextureFromUrl  (url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); +		setChanged(TEXTURE); +		if (mDrawable.notNull()) +		{ +			gPipeline.markTextured(mDrawable); +		} +	} +	return retval; +} +  S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)  {  	S32 retval = 0; @@ -4061,7 +4078,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos  		uuid == LLUUID::null)  	{  		retval = LLPrimitive::setTETexture(te, uuid); -		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); +		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);  		setChanged(TEXTURE);  		if (mDrawable.notNull())  		{ diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 1fb30db8f2..0403f1f144 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -304,6 +304,7 @@ public:  	/*virtual*/	void	setTE(const U8 te, const LLTextureEntry &texture_entry);  	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);  	S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host); +	S32 setTETextureCore(const U8 te, const LLUUID& uuid, const std::string &url );  	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color);  	/*virtual*/ S32		setTEColor(const U8 te, const LLColor4 &color);  	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 3eeab0bf3e..65e0349dc1 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -286,7 +286,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  	LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE);  	LLFastTimer t(FTM_PROCESS_OBJECTS);	 -	LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();  	LLViewerObject *objectp;  	S32			num_objects;  	U32			local_id; @@ -305,6 +304,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  	{  		//llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl;  		gTerseObjectUpdates += num_objects; +		/*  		S32 size;  		if (mesgsys->getReceiveCompressedSize())  		{ @@ -314,10 +314,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  		{  			size = mesgsys->getReceiveSize();  		} -		//llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; +		llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; +		*/  	}  	else  	{ +		/*  		S32 size;  		if (mesgsys->getReceiveCompressedSize())  		{ @@ -328,7 +330,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  			size = mesgsys->getReceiveSize();  		} -		// llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; +		llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; +		*/  		gFullObjectUpdates += num_objects;  	} diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 90fbc41daa..386b2fd400 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -85,7 +85,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  			}  			// we're in a parcel -			bool new_parcel = false;  			S32 parcelid = parcel->getLocalID();						  			LLUUID regionid = gAgent.getRegion()->getRegionID(); @@ -94,7 +93,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  				LL_DEBUGS("Media") << "New parcel, parcel id = " << parcelid << ", region id = " << regionid << LL_ENDL;  				sMediaParcelLocalID = parcelid;  				sMediaRegionID = regionid; -				new_parcel = true;  			}  			std::string mediaUrl = std::string ( parcel->getMediaURL () ); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 77e382b8c7..4cdb568d17 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -696,8 +696,8 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL  	// This mirrors the traditional menu bar parcel icon code, but is not  	// technically correct.  	return region -		&& !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) -		&& !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		&& !region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS) +		&& !region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS)  		&& parcel  		&& parcel->getAllowOtherScripts();  } @@ -2057,7 +2057,7 @@ void LLViewerParcelMgr::startReleaseLand()  		return;  	}  /* -	if ((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +	if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)  		&& !gAgent.isGodlike())  	{  		LLSD args; @@ -2302,7 +2302,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()  	/*  	if(!gAgent.isGodlike())  	{ -		if((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if(region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)  			&& (mCurrentParcel->getOwnerID() != region->getOwner()))  		{  			LLSD args; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index b607afbd9d..0fa87162c4 100644..100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -278,9 +278,11 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mZoning(""),  	mIsEstateManager(FALSE),  	mRegionFlags( REGION_FLAGS_DEFAULT ), +	mRegionProtocols( 0 ),  	mSimAccess( SIM_ACCESS_MIN ),  	mBillableFactor(1.0),  	mMaxTasks(DEFAULT_MAX_REGION_WIDE_PRIM_COUNT), +	mCentralBakeVersion(0),  	mClassID(0),  	mCPURatio(0),  	mColoName("unknown"), @@ -453,18 +455,6 @@ void LLViewerRegion::sendReliableMessage()  	gMessageSystem->sendReliable(mImpl->mHost);  } -void LLViewerRegion::setFlags(BOOL b, U32 flags) -{ -	if (b) -	{ -		mRegionFlags |=  flags; -	} -	else -	{ -		mRegionFlags &= ~flags; -	} -} -  void LLViewerRegion::setWaterHeight(F32 water_level)  {  	mImpl->mLandp->setWaterHeight(water_level); @@ -477,10 +467,10 @@ F32 LLViewerRegion::getWaterHeight() const  BOOL LLViewerRegion::isVoiceEnabled() const  { -	return (getRegionFlags() & REGION_FLAGS_ALLOW_VOICE); +	return getRegionFlag(REGION_FLAGS_ALLOW_VOICE);  } -void LLViewerRegion::setRegionFlags(U32 flags) +void LLViewerRegion::setRegionFlags(U64 flags)  {  	mRegionFlags = flags;  } @@ -573,7 +563,7 @@ std::string LLViewerRegion::getLocalizedSimProductName() const  }  // static -std::string LLViewerRegion::regionFlagsToString(U32 flags) +std::string LLViewerRegion::regionFlagsToString(U64 flags)  {  	std::string result; @@ -1392,7 +1382,8 @@ void LLViewerRegion::unpackRegionHandshake()  {  	LLMessageSystem *msg = gMessageSystem; -	U32 region_flags; +	U64 region_flags = 0; +	U64 region_protocols = 0;  	U8 sim_access;  	std::string sim_name;  	LLUUID sim_owner; @@ -1401,7 +1392,6 @@ void LLViewerRegion::unpackRegionHandshake()  	F32 billable_factor;  	LLUUID cache_id; -	msg->getU32		("RegionInfo", "RegionFlags", region_flags);  	msg->getU8		("RegionInfo", "SimAccess", sim_access);  	msg->getString	("RegionInfo", "SimName", sim_name);  	msg->getUUID	("RegionInfo", "SimOwner", sim_owner); @@ -1410,7 +1400,20 @@ void LLViewerRegion::unpackRegionHandshake()  	msg->getF32		("RegionInfo", "BillableFactor", billable_factor);  	msg->getUUID	("RegionInfo", "CacheID", cache_id ); +	if (msg->has(_PREHASH_RegionInfo4)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionFlagsExtended, region_flags); +		msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionProtocols, region_protocols); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		region_flags = flags; +	} +  	setRegionFlags(region_flags); +	setRegionProtocols(region_protocols);  	setSimAccess(sim_access);  	setRegionNameAndZone(sim_name);  	setOwner(sim_owner); @@ -1449,6 +1452,8 @@ void LLViewerRegion::unpackRegionHandshake()  		mProductName = productName;  	} + +	mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking");  	LLVLComposition *compp = getComposition();  	if (compp)  	{ @@ -1575,6 +1580,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("UntrustedSimulatorMessage");  	capabilityNames.append("UpdateAgentInformation");  	capabilityNames.append("UpdateAgentLanguage"); +	capabilityNames.append("UpdateAvatarAppearance");  	capabilityNames.append("UpdateGestureAgentInventory");  	capabilityNames.append("UpdateGestureTaskInventory");  	capabilityNames.append("UpdateNotecardAgentInventory"); @@ -1737,6 +1743,11 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)  std::string LLViewerRegion::getCapability(const std::string& name) const  { +	if (!capabilitiesReceived() && (name!=std::string("Seed")) && (name!=std::string("ObjectMedia"))) +	{ +		llwarns << "getCapability called before caps received" << llendl; +	} +	  	CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name);  	if(iter == mImpl->mCapabilities.end())  	{ @@ -1796,7 +1807,7 @@ LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)  // the viewer can not yet distinquish between normal- and estate-owned objects  // so we collapse these two bits and enable the UI if either are set -const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT +const U64 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT  											| REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT;  bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const @@ -1804,7 +1815,7 @@ bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<  	return (mParcelOverlay != NULL)  		&& (mParcelOverlay->isOwnedSelf(pos)  			|| mParcelOverlay->isOwnedGroup(pos) -			|| ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT) +			|| (getRegionFlag(ALLOW_RETURN_ENCROACHING_OBJECT)  				&& mParcelOverlay->encroachesOwned(boxes)) );  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index c9fffaf30e..20d96ad9ac 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -109,13 +109,13 @@ public:  	//void setAgentOffset(const LLVector3d &offset);  	void updateRenderMatrix(); -	void setAllowDamage(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DAMAGE); } -	void setAllowLandmark(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_LANDMARK); } -	void setAllowSetHome(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_SET_HOME); } -	void setResetHomeOnTeleport(BOOL b) { setFlags(b, REGION_FLAGS_RESET_HOME_ON_TELEPORT); } -	void setSunFixed(BOOL b) { setFlags(b, REGION_FLAGS_SUN_FIXED); } -	void setBlockFly(BOOL b) { setFlags(b, REGION_FLAGS_BLOCK_FLY); } -	void setAllowDirectTeleport(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +	void setAllowDamage(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DAMAGE, b); } +	void setAllowLandmark(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_LANDMARK, b); } +	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); } +	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); } +	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } +	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } +	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); }  	inline BOOL getAllowDamage()			const; @@ -156,8 +156,15 @@ public:  	LLViewerParcelOverlay *getParcelOverlay() const  			{ return mParcelOverlay; } -	void setRegionFlags(U32 flags); -	U32 getRegionFlags() const					{ return mRegionFlags; } +	inline void setRegionFlag(U64 flag, BOOL on); +	inline BOOL getRegionFlag(U64 flag) const; +	void setRegionFlags(U64 flags); +	U64 getRegionFlags() const					{ return mRegionFlags; } + +	inline void setRegionProtocol(U64 protocol, BOOL on); +	BOOL getRegionProtocol(U64 protocol) const; +	void setRegionProtocols(U64 protocols)			{ mRegionProtocols = protocols; } +	U64 getRegionProtocols() const					{ return mRegionProtocols; }  	void setTimeDilation(F32 time_dilation);  	F32  getTimeDilation() const				{ return mTimeDilation; } @@ -195,7 +202,7 @@ public:  	std::string getLocalizedSimProductName() const;  	// Returns "Sandbox", "Expensive", etc. -	static std::string regionFlagsToString(U32 flags); +	static std::string regionFlagsToString(U64 flags);  	// Returns translated version of "Mature", "PG", "Adult", etc.  	static std::string accessToString(U8 sim_access); @@ -278,6 +285,8 @@ public:  	F32 getLandHeightRegion(const LLVector3& region_pos); +	U8 getCentralBakeVersion() { return mCentralBakeVersion; } +  	void getInfo(LLSD& info);  	bool meshRezEnabled() const; @@ -345,7 +354,6 @@ public:  protected:  	void disconnectAllNeighbors();  	void initStats(); -	void setFlags(BOOL b, U32 flags);  public:  	LLWind  mWind; @@ -390,11 +398,13 @@ private:  	U32		mPingDelay;  	F32		mDeltaTime;				// Time since last measurement of lastPackets, Bits, etc -	U32		mRegionFlags;			// includes damage flags +	U64		mRegionFlags;			// includes damage flags +	U64		mRegionProtocols;		// protocols supported by this region  	U8		mSimAccess;  	F32 	mBillableFactor;  	U32		mMaxTasks;				// max prim count  	F32		mCameraDistanceSquared;	// updated once per frame +	U8		mCentralBakeVersion;  	// Information for Homestead / CR-53  	S32 mClassID; @@ -423,6 +433,40 @@ private:  	LLSD mSimulatorFeatures;  }; +inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const +{ +	return ((mRegionProtocols & protocol) != 0); +} + +inline void LLViewerRegion::setRegionProtocol(U64 protocol, BOOL on) +{ +	if (on) +	{ +		mRegionProtocols |= protocol; +	} +	else +	{ +		mRegionProtocols &= ~protocol; +	} +} + +inline BOOL LLViewerRegion::getRegionFlag(U64 flag) const +{ +	return ((mRegionFlags & flag) != 0); +} + +inline void LLViewerRegion::setRegionFlag(U64 flag, BOOL on) +{ +	if (on) +	{ +		mRegionFlags |= flag; +	} +	else +	{ +		mRegionFlags &= ~flag; +	} +} +  inline BOOL LLViewerRegion::getAllowDamage() const  {  	return ((mRegionFlags & REGION_FLAGS_ALLOW_DAMAGE) !=0); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index d6dd645e8c..e3d28f2f5c 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -229,7 +229,6 @@ extern LLGLSLShader			gSplatTextureRectProgram;  extern LLGLSLShader			gGlowCombineFXAAProgram;  extern LLGLSLShader			gDebugProgram;  extern LLGLSLShader			gClipProgram; -extern LLGLSLShader			gAlphaMaskProgram;  //output tex0[tc0] + tex1[tc1]  extern LLGLSLShader			gTwoTextureAddProgram; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 603634e5f3..dfd82b40d7 100755 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -41,7 +41,6 @@  #include "lltexturefetch.h"   #include "llviewerobjectlist.h"   #include "llviewertexturelist.h"  -#include "lltexlayer.h"  #include "lltexlayerparams.h"  #include "llsurface.h"  #include "llvlmanager.h" @@ -55,6 +54,7 @@  #include "llviewerregion.h"  #include "llvoavatar.h"  #include "llvoavatarself.h" +#include "llviewertexlayer.h"  #include "llviewerwindow.h"		// *TODO: remove, only used for width/height  #include "llworld.h"  #include "llfeaturemanager.h" @@ -519,7 +519,7 @@ void output_statistics(void*)  	llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;  	LLTexLayerStaticImageList::getInstance()->dumpByteCount();  	LLVOAvatarSelf::dumpScratchTextureByteCount(); -	LLTexLayerSetBuffer::dumpTotalByteCount(); +	LLViewerTexLayerSetBuffer::dumpTotalByteCount();  	LLVOAvatarSelf::dumpTotalLocalTextureByteCount();  	LLTexLayerParamAlpha::dumpCacheByteCount();  	LLVOAvatar::dumpBakedStatus(); @@ -564,7 +564,7 @@ F32		gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f;  U32		gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0;  U32		gObjectBits = 0;  F32		gAvgSimPing = 0.f; -U32     gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {0}; +U32     gTotalTextureBytesPerBoostLevel[LLGLTexture::MAX_GL_IMAGE_CATEGORY] = {0};  extern U32  gVisCompared;  extern U32  gVisTested; diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 554e4d647e..554e4d647e 100644..100755 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp new file mode 100755 index 0000000000..cd5e781d71 --- /dev/null +++ b/indra/newview/llviewertexlayer.cpp @@ -0,0 +1,745 @@ +/**  + * @file llviewertexlayer.cpp + * @brief Viewer texture layer. Used for avatars. + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewertexlayer.h" + +#include "llagent.h" +#include "llimagej2c.h" +#include "llnotificationsutil.h" +#include "llvfile.h" +#include "llvfs.h" +#include "llviewerregion.h" +#include "llglslshader.h" +#include "llvoavatarself.h" +#include "pipeline.h" +#include "llassetuploadresponders.h" +#include "llviewercontrol.h" + +static const S32 BAKE_UPLOAD_ATTEMPTS = 7; +static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt + +// runway consolidate +extern std::string self_av_string(); + + +//----------------------------------------------------------------------------- +// LLBakedUploadData() +//----------------------------------------------------------------------------- +LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar, +									 LLViewerTexLayerSet* layerset, +									 const LLUUID& id, +									 bool highest_res) : +	mAvatar(avatar), +	mTexLayerSet(layerset), +	mID(id), +	mStartTime(LLFrameTimer::getTotalTime()),		// Record starting time +	mIsHighestRes(highest_res) +{  +} + +//----------------------------------------------------------------------------- +// LLViewerTexLayerSetBuffer +// The composite image that a LLViewerTexLayerSet writes to.  Each LLViewerTexLayerSet has one. +//----------------------------------------------------------------------------- + +// static +S32 LLViewerTexLayerSetBuffer::sGLByteCount = 0; + +LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,  +										 S32 width, S32 height) : +	// ORDER_LAST => must render these after the hints are created. +	LLTexLayerSetBuffer(owner), +	LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),  +	mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates +	mNeedsUpload(FALSE), +	mNumLowresUploads(0), +	mUploadFailCount(0), +	mNeedsUpdate(TRUE), +	mNumLowresUpdates(0) +{ +	LLViewerTexLayerSetBuffer::sGLByteCount += getSize(); +	mNeedsUploadTimer.start(); +	mNeedsUpdateTimer.start(); +} + +LLViewerTexLayerSetBuffer::~LLViewerTexLayerSetBuffer() +{ +	LLViewerTexLayerSetBuffer::sGLByteCount -= getSize(); +	destroyGLTexture(); +	for( S32 order = 0; order < ORDER_COUNT; order++ ) +	{ +		LLViewerDynamicTexture::sInstances[order].erase(this);  // will fail in all but one case. +	} +} + +//virtual  +S8 LLViewerTexLayerSetBuffer::getType() const  +{ +	return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; +} + +//virtual  +void LLViewerTexLayerSetBuffer::restoreGLTexture()  +{	 +	LLViewerDynamicTexture::restoreGLTexture() ; +} + +//virtual  +void LLViewerTexLayerSetBuffer::destroyGLTexture()  +{ +	LLViewerDynamicTexture::destroyGLTexture() ; +} + +// static +void LLViewerTexLayerSetBuffer::dumpTotalByteCount() +{ +	llinfos << "Composite System GL Buffers: " << (LLViewerTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl; +} + +void LLViewerTexLayerSetBuffer::requestUpdate() +{ +	restartUpdateTimer(); +	mNeedsUpdate = TRUE; +	mNumLowresUpdates = 0; +	// If we're in the middle of uploading a baked texture, we don't care about it any more. +	// When it's downloaded, ignore it. +	mUploadID.setNull(); +} + +void LLViewerTexLayerSetBuffer::requestUpload() +{ +	conditionalRestartUploadTimer(); +	mNeedsUpload = TRUE; +	mNumLowresUploads = 0; +	mUploadPending = TRUE; +} + +void LLViewerTexLayerSetBuffer::conditionalRestartUploadTimer() +{ +	// If we requested a new upload but haven't even uploaded +	// a low res version of our last upload request, then +	// keep the timer ticking instead of resetting it. +	if (mNeedsUpload && (mNumLowresUploads == 0)) +	{ +		mNeedsUploadTimer.unpause(); +	} +	else +	{ +		mNeedsUploadTimer.reset(); +		mNeedsUploadTimer.start(); +	} +} + +void LLViewerTexLayerSetBuffer::restartUpdateTimer() +{ +	mNeedsUpdateTimer.reset(); +	mNeedsUpdateTimer.start(); +} + +void LLViewerTexLayerSetBuffer::cancelUpload() +{ +	mNeedsUpload = FALSE; +	mUploadPending = FALSE; +	mNeedsUploadTimer.pause(); +	mUploadRetryTimer.reset(); +} + +// virtual +BOOL LLViewerTexLayerSetBuffer::needsRender() +{ +	llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp); +	if (!isAgentAvatarValid()) return FALSE; + +	const BOOL upload_now = mNeedsUpload && isReadyToUpload(); +	const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); + +	// Don't render if we don't want to (or aren't ready to) upload or update. +	if (!(update_now || upload_now)) +	{ +		return FALSE; +	} + +	// Don't render if we're animating our appearance. +	if (gAgentAvatarp->getIsAppearanceAnimating()) +	{ +		return FALSE; +	} + +	// Don't render if we are trying to create a shirt texture but aren't wearing a skirt. +	if (gAgentAvatarp->getBakedTE(getViewerTexLayerSet()) == LLAvatarAppearanceDefines::TEX_SKIRT_BAKED &&  +		!gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) +	{ +		cancelUpload(); +		return FALSE; +	} + +	// Render if we have at least minimal level of detail for each local texture. +	return getViewerTexLayerSet()->isLocalTextureDataAvailable(); +} + +// virtual +void LLViewerTexLayerSetBuffer::preRenderTexLayerSet() +{ +	LLTexLayerSetBuffer::preRenderTexLayerSet(); +	 +	// keep depth buffer, we don't need to clear it +	LLViewerDynamicTexture::preRender(FALSE); +} + +// virtual +void LLViewerTexLayerSetBuffer::postRenderTexLayerSet(BOOL success) +{ + +	LLTexLayerSetBuffer::postRenderTexLayerSet(success); +	LLViewerDynamicTexture::postRender(success); +} + +// virtual +void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success) +{ +	// do we need to upload, and do we have sufficient data to create an uploadable composite? +	// TODO: When do we upload the texture if gAgent.mNumPendingQueries is non-zero? +	const BOOL upload_now = mNeedsUpload && isReadyToUpload(); +	const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); + +	if(upload_now) +	{ +		if (!success) +		{ +			llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl; +			mUploadPending = FALSE; +		} +		else +		{ +			LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); +			if (layer_set->isVisible()) +			{ +				layer_set->getAvatar()->debugBakedTextureUpload(layer_set->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish. +				doUpload(); +			} +			else +			{ +				mUploadPending = FALSE; +				mNeedsUpload = FALSE; +				mNeedsUploadTimer.pause(); +				layer_set->getAvatar()->setNewBakedTexture(layer_set->getBakedTexIndex(),IMG_INVISIBLE); +			} +		} +	} +	 +	if (update_now) +	{ +		doUpdate(); +	} + +	// *TODO: Old logic does not check success before setGLTextureCreated +	// we have valid texture data now +	mGLTexturep->setGLTextureCreated(true); +} + +BOOL LLViewerTexLayerSetBuffer::isInitialized(void) const +{ +	return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); +} + +BOOL LLViewerTexLayerSetBuffer::uploadPending() const +{ +	return mUploadPending; +} + +BOOL LLViewerTexLayerSetBuffer::uploadNeeded() const +{ +	return mNeedsUpload; +} + +BOOL LLViewerTexLayerSetBuffer::uploadInProgress() const +{ +	return !mUploadID.isNull(); +} + +BOOL LLViewerTexLayerSetBuffer::isReadyToUpload() const +{ +	if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries. +	if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) return FALSE; // Don't upload if avatar is being edited. + +	BOOL ready = FALSE; +	if (getViewerTexLayerSet()->isLocalTextureDataFinal()) +	{ +		// If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry) +		if (mUploadFailCount == 0) +		{ +			ready = TRUE; +		} +		else +		{ +			ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1)); +		} +	} +	else +	{ +		// Upload if we've hit a timeout.  Upload is a pretty expensive process so we need to make sure +		// we aren't doing uploads too frequently. +		const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout"); +		if (texture_timeout != 0) +		{ +			// The timeout period increases exponentially between every lowres upload in order to prevent +			// spamming the server with frequent uploads. +			const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads); + +			// If we hit our timeout and have textures available at even lower resolution, then upload. +			const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold; +			const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable(); +			ready = has_lower_lod && is_upload_textures_timeout; +		} +	} + +	return ready; +} + +BOOL LLViewerTexLayerSetBuffer::isReadyToUpdate() const +{ +	// If we requested an update and have the final LOD ready, then update. +	if (getViewerTexLayerSet()->isLocalTextureDataFinal()) return TRUE; + +	// If we haven't done an update yet, then just do one now regardless of state of textures. +	if (mNumLowresUpdates == 0) return TRUE; + +	// Update if we've hit a timeout.  Unlike for uploads, we can make this timeout fairly small +	// since render unnecessarily doesn't cost much. +	const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedLocalTextureUpdateTimeout"); +	if (texture_timeout != 0) +	{ +		// If we hit our timeout and have textures available at even lower resolution, then update. +		const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= texture_timeout; +		const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable(); +		if (has_lower_lod && is_update_textures_timeout) return TRUE;  +	} + +	return FALSE; +} + +BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate() +{ +	mNeedsUpdate = TRUE; +	BOOL result = FALSE; + +	if (needsRender()) +	{ +		preRender(FALSE); +		result = render(); +		postRender(result); +	} + +	return result; +} + +// Create the baked texture, send it out to the server, then wait for it to come +// back so we can switch to using it. +void LLViewerTexLayerSetBuffer::doUpload() +{ +	LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); +	llinfos << "Uploading baked " << layer_set->getBodyRegionName() << llendl; +	LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); + +	// Don't need caches since we're baked now.  (note: we won't *really* be baked  +	// until this image is sent to the server and the Avatar Appearance message is received.) +	layer_set->deleteCaches(); + +	// Get the COLOR information from our texture +	U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; +	glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); +	stop_glerror(); + +	// Get the MASK information from our texture +	LLGLSUIDefault gls_ui; +	LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); +	U8* baked_mask_data = baked_mask_image->getData();  +	layer_set->gatherMorphMaskAlpha(baked_mask_data, +									mOrigin.mX, mOrigin.mY, +									mFullWidth, mFullHeight); + + +	// Create the baked image from our color and mask information +	const S32 baked_image_components = 5; // red green blue [bump] clothing +	LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); +	U8* baked_image_data = baked_image->getData(); +	S32 i = 0; +	for (S32 u=0; u < mFullWidth; u++) +	{ +		for (S32 v=0; v < mFullHeight; v++) +		{ +			baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; +			baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; +			baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; +			baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes. +			baked_image_data[5*i + 4] = baked_mask_data[i]; +			i++; +		} +	} +	 +	LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C; +	const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) +	if (compressedImage->encode(baked_image, comment_text)) +	{ +		LLTransactionID tid; +		tid.generate(); +		const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); +		if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), +							   gVFS, asset_id, LLAssetType::AT_TEXTURE)) +		{ +			// Read back the file and validate. +			BOOL valid = FALSE; +			LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; +			S32 file_size = 0; +			U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size); +			if (data) +			{ +				valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data' +			} +			else +			{ +				integrity_test->setLastError("Unable to read entire file"); +			} +			 +			if (valid) +			{ +				const bool highest_lod = layer_set->isLocalTextureDataFinal(); +				// Baked_upload_data is owned by the responder and deleted after the request completes. +				LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,  +																			 layer_set,  +																			 asset_id, +																			 highest_lod); +				// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit. +				mUploadID = asset_id; + +				// Upload the image +				const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); +				if(!url.empty() +					&& !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method +					&& (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing. +				{ +					LLSD body = LLSD::emptyMap(); +					// The responder will call LLViewerTexLayerSetBuffer::onTextureUploadComplete() +					LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); +					llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; +				}  +				else +				{ +					gAssetStorage->storeAssetData(tid, +												  LLAssetType::AT_TEXTURE, +												  LLViewerTexLayerSetBuffer::onTextureUploadComplete, +												  baked_upload_data, +												  TRUE,		// temp_file +												  TRUE,		// is_priority +												  TRUE);	// store_local +					llinfos << "Baked texture upload via Asset Store." <<  llendl; +				} + +				if (highest_lod) +				{ +					// Sending the final LOD for the baked texture.  All done, pause  +					// the upload timer so we know how long it took. +					mNeedsUpload = FALSE; +					mNeedsUploadTimer.pause(); +				} +				else +				{ +					// Sending a lower level LOD for the baked texture.  Restart the upload timer. +					mNumLowresUploads++; +					mNeedsUploadTimer.unpause(); +					mNeedsUploadTimer.reset(); +				} + +				// Print out notification that we uploaded this texture. +				if (gSavedSettings.getBOOL("DebugAvatarRezTime")) +				{ +					const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; +					LLSD args; +					args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32()); +					args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); +					args["BODYREGION"] = layer_set->getBodyRegionName(); +					args["RESOLUTION"] = lod_str; +					LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args); +					LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL; +				} +			} +			else +			{ +				// The read back and validate operation failed.  Remove the uploaded file. +				mUploadPending = FALSE; +				LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); +				file.remove(); +				llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; +			} +		} +	} +	else +	{ +		// The VFS write file operation failed. +		mUploadPending = FALSE; +		llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; +	} + +	delete [] baked_color_data; +} + +// Mostly bookkeeping; don't need to actually "do" anything since +// render() will actually do the update. +void LLViewerTexLayerSetBuffer::doUpdate() +{ +	LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); +	const BOOL highest_lod = layer_set->isLocalTextureDataFinal(); +	if (highest_lod) +	{ +		mNeedsUpdate = FALSE; +	} +	else +	{ +		mNumLowresUpdates++; +	} + +	restartUpdateTimer(); + +	// need to switch to using this layerset if this is the first update +	// after getting the lowest LOD +	layer_set->getAvatar()->updateMeshTextures(); +	 +	// Print out notification that we updated this texture. +	if (gSavedSettings.getBOOL("DebugAvatarRezTime")) +	{ +		const BOOL highest_lod = layer_set->isLocalTextureDataFinal(); +		const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; +		LLSD args; +		args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32()); +		args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32()); +		args["BODYREGION"] = layer_set->getBodyRegionName(); +		args["RESOLUTION"] = lod_str; +		LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args); +		LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL; +	} +} + +// static +void LLViewerTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, +												  void* userdata, +												  S32 result, +												  LLExtStat ext_status) // StoreAssetData callback (not fixed) +{ +	LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; + +	if (isAgentAvatarValid() && +		!gAgentAvatarp->isDead() && +		(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures. +		(baked_upload_data->mTexLayerSet->hasComposite())) +	{ +		LLViewerTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getViewerComposite(); +		S32 failures = layerset_buffer->mUploadFailCount; +		layerset_buffer->mUploadFailCount = 0; + +		if (layerset_buffer->mUploadID.isNull()) +		{ +			// The upload got canceled, we should be in the +			// process of baking a new texture so request an +			// upload with the new data + +			// BAP: does this really belong in this callback, as +			// opposed to where the cancellation takes place? +			// suspect this does nothing. +			layerset_buffer->requestUpload(); +		} +		else if (baked_upload_data->mID == layerset_buffer->mUploadID) +		{ +			// This is the upload we're currently waiting for. +			layerset_buffer->mUploadID.setNull(); +			const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName()); +			const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res "; +			if (result >= 0) +			{ +				layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later +				LLAvatarAppearanceDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->getViewerTexLayerSet()); +				// Update baked texture info with the new UUID +				U64 now = LLFrameTimer::getTotalTime();		// Record starting time +				llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; +				gAgentAvatarp->setNewBakedTexture(baked_te, uuid); +			} +			else +			{	 +				++failures; +				S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes +				llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl; +				if (failures < max_attempts) +				{ +					layerset_buffer->mUploadFailCount = failures; +					layerset_buffer->mUploadRetryTimer.start(); +					layerset_buffer->requestUpload(); +				} +			} +		} +		else +		{ +			llinfos << "Received baked texture out of date, ignored." << llendl; +		} + +		gAgentAvatarp->dirtyMesh(); +	} +	else +	{ +		// Baked texture failed to upload (in which case since we +		// didn't set the new baked texture, it means that they'll try +		// and rebake it at some point in the future (after login?)), +		// or this response to upload is out of date, in which case a +		// current response should be on the way or already processed. +		llwarns << "Baked upload failed" << llendl; +	} + +	delete baked_upload_data; +} + +//----------------------------------------------------------------------------- +// LLViewerTexLayerSet +// An ordered set of texture layers that get composited into a single texture. +//----------------------------------------------------------------------------- + +LLViewerTexLayerSet::LLViewerTexLayerSet(LLAvatarAppearance* const appearance) : +	LLTexLayerSet(appearance), +	mUpdatesEnabled( FALSE ) +{ +} + +// virtual +LLViewerTexLayerSet::~LLViewerTexLayerSet() +{ +} + +// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on. +BOOL LLViewerTexLayerSet::isLocalTextureDataAvailable() const +{ +	if (!mAvatarAppearance->isSelf()) return FALSE; +	return getAvatar()->isLocalTextureDataAvailable(this); +} + + +// Returns TRUE if all of the data for the textures that this layerset depends on have arrived. +BOOL LLViewerTexLayerSet::isLocalTextureDataFinal() const +{ +	if (!mAvatarAppearance->isSelf()) return FALSE; +	return getAvatar()->isLocalTextureDataFinal(this); +} + +// virtual +void LLViewerTexLayerSet::requestUpdate() +{ +	if( mUpdatesEnabled ) +	{ +		createComposite(); +		getViewerComposite()->requestUpdate();  +	} +} + +void LLViewerTexLayerSet::requestUpload() +{ +	createComposite(); +	getViewerComposite()->requestUpload(); +} + +void LLViewerTexLayerSet::cancelUpload() +{ +	if(mComposite) +	{ +		getViewerComposite()->cancelUpload(); +	} +} + +void LLViewerTexLayerSet::updateComposite() +{ +	createComposite(); +	getViewerComposite()->requestUpdateImmediate(); +} + +// virtual +void LLViewerTexLayerSet::createComposite() +{ +	if(!mComposite) +	{ +		S32 width = mInfo->getWidth(); +		S32 height = mInfo->getHeight(); +		// Composite other avatars at reduced resolution +		if( !mAvatarAppearance->isSelf() ) +		{ +			llerrs << "composites should not be created for non-self avatars!" << llendl; +		} +		mComposite = new LLViewerTexLayerSetBuffer( this, width, height ); +	} +} + +void LLViewerTexLayerSet::setUpdatesEnabled( BOOL b ) +{ +	mUpdatesEnabled = b;  +} + +LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() +{ +	return dynamic_cast<LLVOAvatarSelf*> (mAvatarAppearance); +} + +const LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() const +{ +	return dynamic_cast<const LLVOAvatarSelf*> (mAvatarAppearance); +} + +LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() +{ +	return dynamic_cast<LLViewerTexLayerSetBuffer*> (getComposite()); +} + +const LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() const +{ +	return dynamic_cast<const LLViewerTexLayerSetBuffer*> (getComposite()); +} + + +const std::string LLViewerTexLayerSetBuffer::dumpTextureInfo() const +{ +	if (!isAgentAvatarValid()) return ""; + +	const BOOL is_high_res = !mNeedsUpload; +	const U32 num_low_res = mNumLowresUploads; +	const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); +	const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet()); + +	std::string status 				= "CREATING "; +	if (!uploadNeeded()) status 	= "DONE     "; +	if (uploadInProgress()) status 	= "UPLOADING"; + +	std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", +								status.c_str(), +								is_high_res, num_low_res, +								upload_time,  +								local_texture_info.c_str()); +	return text; +} diff --git a/indra/newview/llviewertexlayer.h b/indra/newview/llviewertexlayer.h new file mode 100644 index 0000000000..959c883da8 --- /dev/null +++ b/indra/newview/llviewertexlayer.h @@ -0,0 +1,180 @@ +/**  + * @file llviewertexlayer.h + * @brief Viewer Texture layer classes. Used for avatars. + * + * $LicenseInfo:firstyear=2012&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_VIEWER_TEXLAYER_H +#define LL_VIEWER_TEXLAYER_H + +#include "lldynamictexture.h" +#include "llextendedstatus.h" +#include "lltexlayer.h" + +class LLVOAvatarSelf; +class LLViewerTexLayerSetBuffer; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLViewerTexLayerSet +// +// An ordered set of texture layers that gets composited into a single texture. +// Only exists for llavatarappearanceself. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLViewerTexLayerSet : public LLTexLayerSet +{ +public: +	LLViewerTexLayerSet(LLAvatarAppearance* const appearance); +	virtual ~LLViewerTexLayerSet(); + +	/*virtual*/void				requestUpdate(); +	void						requestUpload(); +	void						cancelUpload(); +	BOOL						isLocalTextureDataAvailable() const; +	BOOL						isLocalTextureDataFinal() const; +	void						updateComposite(); +	/*virtual*/void				createComposite(); +	void						setUpdatesEnabled(BOOL b); +	BOOL						getUpdatesEnabled()	const 	{ return mUpdatesEnabled; } + +	LLVOAvatarSelf*				getAvatar(); +	const LLVOAvatarSelf*		getAvatar()	const; +	LLViewerTexLayerSetBuffer*	getViewerComposite(); +	const LLViewerTexLayerSetBuffer*	getViewerComposite() const; + +private: +	BOOL						mUpdatesEnabled; + +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLViewerTexLayerSetBuffer +// +// The composite image that a LLViewerTexLayerSet writes to.  Each LLViewerTexLayerSet has one. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLViewerTexLayerSetBuffer : public LLTexLayerSetBuffer, public LLViewerDynamicTexture +{ +	LOG_CLASS(LLViewerTexLayerSetBuffer); + +public: +	LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); +	virtual ~LLViewerTexLayerSetBuffer(); + +public: +	/*virtual*/ S8          getType() const; +	BOOL					isInitialized(void) const; +	static void				dumpTotalByteCount(); +	const std::string		dumpTextureInfo() const; +	virtual void 			restoreGLTexture(); +	virtual void 			destroyGLTexture(); +private: +	LLViewerTexLayerSet*	getViewerTexLayerSet()  +		{ return dynamic_cast<LLViewerTexLayerSet*> (mTexLayerSet); } +	const LLViewerTexLayerSet*	getViewerTexLayerSet() const +		{ return dynamic_cast<const LLViewerTexLayerSet*> (mTexLayerSet); } +	static S32				sGLByteCount; + +	//-------------------------------------------------------------------- +	// Tex Layer Render +	//-------------------------------------------------------------------- +	virtual void			preRenderTexLayerSet(); +	virtual void			midRenderTexLayerSet(BOOL success); +	virtual void			postRenderTexLayerSet(BOOL success); +	virtual S32				getCompositeOriginX() const { return getOriginX(); } +	virtual S32				getCompositeOriginY() const { return getOriginY(); } +	virtual S32				getCompositeWidth() const { return getFullWidth(); } +	virtual S32				getCompositeHeight() const { return getFullHeight(); } + +	//-------------------------------------------------------------------- +	// Dynamic Texture Interface +	//-------------------------------------------------------------------- +public: +	/*virtual*/ BOOL		needsRender(); +protected: +	// Pass these along for tex layer rendering. +	virtual void			preRender(BOOL clear_depth) { preRenderTexLayerSet(); } +	virtual void			postRender(BOOL success) { postRenderTexLayerSet(success); } +	virtual BOOL			render() { return renderTexLayerSet(); } +	 +	//-------------------------------------------------------------------- +	// Uploads +	//-------------------------------------------------------------------- +public: +	void					requestUpload(); +	void					cancelUpload(); +	BOOL					uploadNeeded() const; 			// We need to upload a new texture +	BOOL					uploadInProgress() const; 		// We have started uploading a new texture and are awaiting the result +	BOOL					uploadPending() const; 			// We are expecting a new texture to be uploaded at some point +	static void				onTextureUploadComplete(const LLUUID& uuid, +													void* userdata, +													S32 result, LLExtStat ext_status); +protected: +	BOOL					isReadyToUpload() const; +	void					doUpload(); 					// Does a read back and upload. +	void					conditionalRestartUploadTimer(); +private: +	BOOL					mNeedsUpload; 					// Whether we need to send our baked textures to the server +	U32						mNumLowresUploads; 				// Number of times we've sent a lowres version of our baked textures to the server +	BOOL					mUploadPending; 				// Whether we have received back the new baked textures +	LLUUID					mUploadID; 						// The current upload process (null if none). +	LLFrameTimer    		mNeedsUploadTimer; 				// Tracks time since upload was requested and performed. +	S32						mUploadFailCount;				// Number of consecutive upload failures +	LLFrameTimer    		mUploadRetryTimer; 				// Tracks time since last upload failure. + +	//-------------------------------------------------------------------- +	// Updates +	//-------------------------------------------------------------------- +public: +	void					requestUpdate(); +	BOOL					requestUpdateImmediate(); +protected: +	BOOL					isReadyToUpdate() const; +	void					doUpdate(); +	void					restartUpdateTimer(); +private: +	BOOL					mNeedsUpdate; 					// Whether we need to locally update our baked textures +	U32						mNumLowresUpdates; 				// Number of times we've locally updated with lowres version of our baked textures +	LLFrameTimer    		mNeedsUpdateTimer; 				// Tracks time since update was requested and performed. +}; + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLBakedUploadData +// +// Used by LLTexLayerSetBuffer for a callback. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +struct LLBakedUploadData +{ +	LLBakedUploadData(const LLVOAvatarSelf* avatar, +					  LLViewerTexLayerSet* layerset,  +					  const LLUUID& id, +					  bool highest_res); +	~LLBakedUploadData() {} +	const LLUUID				mID; +	const LLVOAvatarSelf*		mAvatar; // note: backlink only; don't LLPointer  +	LLViewerTexLayerSet*		mTexLayerSet; +   	const U64					mStartTime;	// for measuring baked texture upload time +   	const bool					mIsHighestRes; // whether this is a "final" bake, or intermediate low res +}; + +#endif  // LL_VIEWER_TEXLAYER_H + diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 99102309a1..d309faf331 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -1052,8 +1052,6 @@ void LLViewerTextEditor::findEmbeddedItemSegments(S32 start, S32 end)  {  	LLWString text = getWText(); -	LLColor4 text_color = ( mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get()  ); -  	// Start with i just after the first embedded item  	for(S32 idx = start; idx < end; idx++ )  	{ diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 96d7890a9e..846216211e 100644..100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -59,6 +59,7 @@  #include "lltextureatlas.h"  #include "lltextureatlasmanager.h"  #include "lltextureentry.h" +#include "lltexturemanagerbridge.h"  #include "llmediaentry.h"  #include "llvovolume.h"  #include "llviewermedia.h" @@ -232,7 +233,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(BOOL usemipma  	if(generate_gl_tex)  	{  		tex->generateGLTexture() ; -		tex->setCategory(LLViewerTexture::LOCAL) ; +		tex->setCategory(LLGLTexture::LOCAL) ;  	}  	return tex ;  } @@ -242,14 +243,14 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLUUID&  	if(generate_gl_tex)  	{  		tex->generateGLTexture() ; -		tex->setCategory(LLViewerTexture::LOCAL) ; +		tex->setCategory(LLGLTexture::LOCAL) ;  	}  	return tex ;  }  LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps)   {  	LLPointer<LLViewerTexture> tex = new LLViewerTexture(raw, usemipmaps) ; -	tex->setCategory(LLViewerTexture::LOCAL) ; +	tex->setCategory(LLGLTexture::LOCAL) ;  	return tex ;  }  LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex)  @@ -258,7 +259,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid  	if(generate_gl_tex)  	{  		tex->generateGLTexture() ; -		tex->setCategory(LLViewerTexture::LOCAL) ; +		tex->setCategory(LLGLTexture::LOCAL) ;  	}  	return tex ;  } @@ -305,6 +306,26 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const  	return gTextureList.getImageFromHost(image_id, host) ;  } +// Create a bridge to the viewer texture manager. +class LLViewerTextureManagerBridge : public LLTextureManagerBridge +{ +	/*virtual*/ LLPointer<LLGLTexture> getLocalTexture(BOOL usemipmaps = TRUE, BOOL generate_gl_tex = TRUE) +	{ +		return LLViewerTextureManager::getLocalTexture(usemipmaps, generate_gl_tex); +	} + +	/*virtual*/ LLPointer<LLGLTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) +	{ +		return LLViewerTextureManager::getLocalTexture(width, height, components, usemipmaps, generate_gl_tex); +	} + +	/*virtual*/ LLGLTexture* getFetchedTexture(const LLUUID &image_id) +	{ +		return LLViewerTextureManager::getFetchedTexture(image_id); +	} +}; + +  void LLViewerTextureManager::init()  {  	{ @@ -350,12 +371,12 @@ void LLViewerTextureManager::init()  	imagep->setCachedRawImage(0, image_raw) ;  	image_raw = NULL;  #else - 	LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); + 	LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLGLTexture::BOOST_UI);  #endif  	LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); -	LLViewerFetchedTexture::sDefaultImagep->setCategory(LLViewerTexture::OTHER) ; +	LLViewerFetchedTexture::sDefaultImagep->setCategory(LLGLTexture::OTHER) ; - 	LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI); + 	LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLGLTexture::BOOST_UI);  	LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ;  	image_raw = new LLImageRaw(32,32,3); @@ -374,6 +395,9 @@ void LLViewerTextureManager::init()  	LLViewerTexture::sCheckerBoardImagep = LLViewerTextureManager::getLocalTexture(image_raw.get(), TRUE);  	LLViewerTexture::initClass() ; +	 +	// Create a texture manager bridge. +	gTextureManagerBridgep = new LLViewerTextureManagerBridge();  	if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName))  	{ @@ -390,6 +414,7 @@ void LLViewerTextureManager::cleanup()  {  	stop_glerror(); +	delete gTextureManagerBridgep;  	LLImageGL::sDefaultGLTexture = NULL ;  	LLViewerTexture::sNullImagep = NULL;  	LLViewerTexture::sBlackImagep = NULL; @@ -417,25 +442,6 @@ void LLViewerTexture::initClass()  	}  } -// static -S32 LLViewerTexture::getTotalNumOfCategories()  -{ -	return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; -} - -// static -//index starts from zero. -S32 LLViewerTexture::getIndexFromCategory(S32 category)  -{ -	return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ; -} - -//static  -S32 LLViewerTexture::getCategoryFromIndex(S32 index) -{ -	return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ; -} -  // tuning params  const F32 discard_bias_delta = .25f;  const F32 discard_delta_time = 0.5f; @@ -572,45 +578,38 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  //-------------------------------------------------------------------------------------------  const U32 LLViewerTexture::sCurrentFileVersion = 1; -LLViewerTexture::LLViewerTexture(BOOL usemipmaps) +LLViewerTexture::LLViewerTexture(BOOL usemipmaps) : +	LLGLTexture(usemipmaps)  {  	init(true); -	mUseMipMaps = usemipmaps ;  	mID.generate();  	sImageCount++;  } -LLViewerTexture::LLViewerTexture(const LLUUID& id, BOOL usemipmaps) -	: mID(id) +LLViewerTexture::LLViewerTexture(const LLUUID& id, BOOL usemipmaps) : +	LLGLTexture(usemipmaps), +	mID(id)  {  	init(true); -	mUseMipMaps = usemipmaps ;  	sImageCount++;  } -LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps)  +LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps)  : +	LLGLTexture(width, height, components, usemipmaps)  {  	init(true); -	mFullWidth = width ; -	mFullHeight = height ; -	mUseMipMaps = usemipmaps ; -	mComponents = components ; -	setTexelsPerImage(); -  	mID.generate();  	sImageCount++;  } -LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps)	 +LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) : +	LLGLTexture(raw, usemipmaps)  {  	init(true); -	mUseMipMaps = usemipmaps ; -	mGLTexturep = new LLImageGL(raw, usemipmaps) ; -	// Create an empty image of the specified size and width  	mID.generate();  	sImageCount++;  } @@ -621,21 +620,11 @@ LLViewerTexture::~LLViewerTexture()  	sImageCount--;  } +// virtual  void LLViewerTexture::init(bool firstinit)  { -	mBoostLevel = LLViewerTexture::BOOST_NONE;  	mSelectedTime = 0.f; - -	mFullWidth = 0; -	mFullHeight = 0; -	mTexelsPerImage = 0 ; -	mUseMipMaps = FALSE ; -	mComponents = 0 ; - -	mTextureState = NO_DELETE ; -	mDontDiscard = FALSE;  	mMaxVirtualSize = 0.f; -	mNeedsGLTexture = FALSE ;  	mMaxVirtualSizeResetInterval = 1;  	mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ;  	mAdditionalDecodePriority = 0.f ;	 @@ -656,19 +645,12 @@ void LLViewerTexture::cleanup()  {  	mFaceList.clear() ;  	mVolumeList.clear(); -	if(mGLTexturep) -	{ -		mGLTexturep->cleanup(); -	}  }  // virtual  void LLViewerTexture::dump()  { -	if(mGLTexturep) -	{ -		mGLTexturep->dump(); -	} +	LLGLTexture::dump();  	llinfos << "LLViewerTexture"  			<< " mID " << mID @@ -691,10 +673,8 @@ void LLViewerTexture::setBoostLevel(S32 level)  	{  		mSelectedTime = gFrameTimeSeconds;  	} -  } -  bool LLViewerTexture::bindDefaultImage(S32 stage)   {  	if (stage < 0) return false; @@ -887,294 +867,18 @@ void LLViewerTexture::reorganizeVolumeList()  	mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end());  } - -  //virtual  void LLViewerTexture::switchToCachedImage()  {  	//nothing here.  } -void LLViewerTexture::forceActive() -{ -	mTextureState = ACTIVE ;  -} - -void LLViewerTexture::setActive()  -{  -	if(mTextureState != NO_DELETE) -	{ -		mTextureState = ACTIVE ;  -	} -} - -//set the texture to stay in memory -void LLViewerTexture::setNoDelete()  -{  -	mTextureState = NO_DELETE ; -} - -void LLViewerTexture::generateGLTexture()  -{	 -	if(mGLTexturep.isNull()) -	{ -		mGLTexturep = new LLImageGL(mFullWidth, mFullHeight, mComponents, mUseMipMaps) ; -	} -} - -LLImageGL* LLViewerTexture::getGLTexture() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep ; -} - -BOOL LLViewerTexture::createGLTexture()  -{ -	if(mGLTexturep.isNull()) -	{ -		generateGLTexture() ; -	} - -	return mGLTexturep->createGLTexture() ; -} - -BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category) -{ -	llassert(mGLTexturep.notNull()) ;	 - -	BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ; - -	if(ret) -	{ -		mFullWidth = mGLTexturep->getCurrentWidth() ; -		mFullHeight = mGLTexturep->getCurrentHeight() ;  -		mComponents = mGLTexturep->getComponents() ;	 -		setTexelsPerImage(); -	} - -	return ret ; -} -  //virtual  void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)  {  	//nothing here.  } -void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes) -{ -	llassert(mGLTexturep.notNull()) ; -	 -	mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ; -} -void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode) -{ -	llassert(mGLTexturep.notNull()) ; -	mGLTexturep->setAddressMode(mode) ; -} -void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option) -{ -	llassert(mGLTexturep.notNull()) ; -	mGLTexturep->setFilteringOption(option) ; -} - -//virtual -S32	LLViewerTexture::getWidth(S32 discard_level) const -{ -	llassert(mGLTexturep.notNull()) ; -	return mGLTexturep->getWidth(discard_level) ; -} - -//virtual -S32	LLViewerTexture::getHeight(S32 discard_level) const -{ -	llassert(mGLTexturep.notNull()) ; -	return mGLTexturep->getHeight(discard_level) ; -} - -S32 LLViewerTexture::getMaxDiscardLevel() const -{ -	llassert(mGLTexturep.notNull()) ; -	return mGLTexturep->getMaxDiscardLevel() ; -} -S32 LLViewerTexture::getDiscardLevel() const -{ -	llassert(mGLTexturep.notNull()) ; -	return mGLTexturep->getDiscardLevel() ; -} -S8  LLViewerTexture::getComponents() const  -{  -	llassert(mGLTexturep.notNull()) ; -	 -	return mGLTexturep->getComponents() ; -} - -LLGLuint LLViewerTexture::getTexName() const  -{  -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getTexName() ;  -} - -BOOL LLViewerTexture::hasGLTexture() const  -{ -	if(mGLTexturep.notNull()) -	{ -		return mGLTexturep->getHasGLTexture() ; -	} -	return FALSE ; -} - -BOOL LLViewerTexture::getBoundRecently() const -{ -	if(mGLTexturep.notNull()) -	{ -		return mGLTexturep->getBoundRecently() ; -	} -	return FALSE ; -} - -LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const -{ -	llassert(mGLTexturep.notNull()) ; -	return mGLTexturep->getTarget() ; -} - -BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height) -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ; -} - -BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height) -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ; -} - -void LLViewerTexture::setGLTextureCreated (bool initialized) -{ -	llassert(mGLTexturep.notNull()) ; - -	mGLTexturep->setGLTextureCreated (initialized) ; -} - -void  LLViewerTexture::setCategory(S32 category)  -{ -	llassert(mGLTexturep.notNull()) ; - -	mGLTexturep->setCategory(category) ; -} - -LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getAddressMode() ; -} - -S32 LLViewerTexture::getTextureMemory() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->mTextureMemory ; -} - -LLGLenum LLViewerTexture::getPrimaryFormat() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getPrimaryFormat() ; -} - -BOOL LLViewerTexture::getIsAlphaMask() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getIsAlphaMask() ; -} - -BOOL LLViewerTexture::getMask(const LLVector2 &tc) -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getMask(tc) ; -} - -F32 LLViewerTexture::getTimePassedSinceLastBound() -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getTimePassedSinceLastBound() ; -} -BOOL LLViewerTexture::getMissed() const  -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getMissed() ; -} - -BOOL LLViewerTexture::isJustBound() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->isJustBound() ; -} - -void LLViewerTexture::forceUpdateBindStats(void) const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->forceUpdateBindStats() ; -} - -U32 LLViewerTexture::getTexelsInAtlas() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getTexelsInAtlas() ; -} - -U32 LLViewerTexture::getTexelsInGLTexture() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getTexelsInGLTexture() ; -} - -BOOL LLViewerTexture::isGLTextureCreated() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->isGLTextureCreated() ; -} - -S32  LLViewerTexture::getDiscardLevelInAtlas() const -{ -	llassert(mGLTexturep.notNull()) ; - -	return mGLTexturep->getDiscardLevelInAtlas() ; -} - -void LLViewerTexture::destroyGLTexture()  -{ -	if(mGLTexturep.notNull() && mGLTexturep->getHasGLTexture()) -	{ -		mGLTexturep->destroyGLTexture() ; -		mTextureState = DELETED ;	 -	}	 -} - -void LLViewerTexture::setTexelsPerImage() -{ -	S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); -	S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); -	mTexelsPerImage = (F32)fullwidth * fullheight; -} -  BOOL LLViewerTexture::isLargeImage()  {  	return  (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize ; @@ -1758,7 +1462,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		// Don't decode anything we don't need  		priority = -4.0f;  	} -	else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data) +	else if ((mBoostLevel == LLGLTexture::BOOST_UI || mBoostLevel == LLGLTexture::BOOST_ICON) && !have_all_data)  	{  		priority = 1.f;  	} @@ -2165,7 +1869,7 @@ bool LLViewerFetchedTexture::updateFetch()  		// Load the texture progressively: we try not to rush to the desired discard too fast.  		// If the camera is not moving, we do not tweak the discard level notch by notch but go to the desired discard with larger boosted steps  		// This mitigates the "textures stay blurry" problem when loading while not killing the texture memory while moving around -		S32 delta_level = (mBoostLevel > LLViewerTexture::BOOST_NONE) ? 2 : 1 ;  +		S32 delta_level = (mBoostLevel > LLGLTexture::BOOST_NONE) ? 2 : 1 ;   		if (current_discard < 0)  		{  			desired_discard = llmax(desired_discard, getMaxDiscardLevel() - delta_level); @@ -2282,8 +1986,10 @@ void LLViewerFetchedTexture::setIsMissingAsset()  	}  	else  	{ -		//it is normal no map tile on an empty region. -		//llwarns << mUrl << ": Marking image as missing" << llendl; +		// This may or may not be an error - it is normal to have no +		// map tile on an empty region, but bad if we're failing on a +		// server bake texture. +		llwarns << mUrl << ": Marking image as missing" << llendl;  	}  	if (mHasFetcher)  	{ @@ -2416,7 +2122,7 @@ void LLViewerFetchedTexture::deleteCallbackEntry(const LLLoadedCallbackEntry::so  			destroySavedRawImage() ;  		}  	} -	else if(needsToSaveRawImage() && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) +	else if(needsToSaveRawImage() && mBoostLevel != LLGLTexture::BOOST_PREVIEW)  	{  		if(desired_raw_discard != INVALID_DISCARD_LEVEL)  		{ @@ -2874,7 +2580,7 @@ void LLViewerFetchedTexture::setCachedRawImage()  		S32 h = mRawImage->getHeight() ;  		S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ; -		if(LLViewerTexture::BOOST_TERRAIN == mBoostLevel) +		if(LLGLTexture::BOOST_TERRAIN == mBoostLevel)  		{  			max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ;  		}		 @@ -3247,7 +2953,7 @@ void LLViewerLODTexture::processTextureStats()  		if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)  			mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048  	} -	else if (mBoostLevel < LLViewerTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f) +	else if (mBoostLevel < LLGLTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f)  	{  		// If the image has not been significantly visible in a while, we don't want it  		mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1)); @@ -3297,7 +3003,7 @@ void LLViewerLODTexture::processTextureStats()  				mCalculatedDiscardLevel = discard_level;  			}  		} -		if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED) +		if (mBoostLevel < LLGLTexture::BOOST_SCULPTED)  		{  			discard_level += sDesiredDiscardBias;  			discard_level *= sDesiredDiscardScale; // scale @@ -3323,7 +3029,7 @@ void LLViewerLODTexture::processTextureStats()  		//  		S32 current_discard = getDiscardLevel(); -		if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0) +		if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLGLTexture::BOOST_SCULPTED && current_discard >= 0)  		{  			if(desired_discard_bias_max <= sDesiredDiscardBias && !mForceToSaveRawImage)  			{ @@ -3466,7 +3172,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL  	setMediaImpl() ; -	setCategory(LLViewerTexture::MEDIA) ; +	setCategory(LLGLTexture::MEDIA) ;  	LLViewerTexture* tex = gTextureList.findImage(mID) ;  	if(tex) //this media is a parcel media for tex. diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 2e7949e9a3..3df942d922 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -27,7 +27,7 @@  #ifndef LL_LLVIEWERTEXTURE_H					  #define LL_LLVIEWERTEXTURE_H -#include "lltexture.h" +#include "llgltexture.h"  #include "lltimer.h"  #include "llframetimer.h"  #include "llhost.h" @@ -88,16 +88,11 @@ public:  class LLTextureBar; -class LLViewerTexture : public LLTexture +class LLViewerTexture : public LLGLTexture  {  public:  	enum  	{ -		MAX_IMAGE_SIZE_DEFAULT = 1024, -		INVALID_DISCARD_LEVEL = 0x7fff -	}; -	enum -	{  		LOCAL_TEXTURE,		  		MEDIA_TEXTURE,  		DYNAMIC_TEXTURE, @@ -107,43 +102,6 @@ public:  		INVALID_TEXTURE_TYPE  	}; -	enum EBoostLevel -	{ -		BOOST_NONE 			= 0, -		BOOST_AVATAR_BAKED	, -		BOOST_AVATAR		, -		BOOST_CLOUDS		, -		BOOST_SCULPTED      , -		 -		BOOST_HIGH 			= 10, -		BOOST_BUMP          , -		BOOST_TERRAIN		, // has to be high priority for minimap / low detail -		BOOST_SELECTED		,		 -		BOOST_AVATAR_BAKED_SELF	, -		BOOST_AVATAR_SELF	, // needed for baking avatar -		BOOST_SUPER_HIGH    , //textures higher than this need to be downloaded at the required resolution without delay. -		BOOST_HUD			, -		BOOST_ICON			, -		BOOST_UI			, -		BOOST_PREVIEW		, -		BOOST_MAP			, -		BOOST_MAP_VISIBLE	,		 -		BOOST_MAX_LEVEL, - -		//other texture Categories -		LOCAL = BOOST_MAX_LEVEL, -		AVATAR_SCRATCH_TEX, -		DYNAMIC_TEX, -		MEDIA, -		ATLAS, -		OTHER, -		MAX_GL_IMAGE_CATEGORY -	}; - -	static S32 getTotalNumOfCategories() ; -	static S32 getIndexFromCategory(S32 category) ; -	static S32 getCategoryFromIndex(S32 index) ; -  	typedef std::vector<LLFace*> ll_face_list_t;  	typedef std::vector<LLVOVolume*> ll_volume_list_t; @@ -168,8 +126,7 @@ public:  	/*virtual*/ bool bindDefaultImage(const S32 stage = 0) ;  	/*virtual*/ void forceImmediateUpdate() ; -	const LLUUID& getID() const { return mID; } -	 +	/*virtual*/ const LLUUID& getID() const { return mID; }  	void setBoostLevel(S32 level);  	S32  getBoostLevel() { return mBoostLevel; } @@ -182,8 +139,6 @@ public:  	LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;} -	S32 getFullWidth() const { return mFullWidth; } -	S32 getFullHeight() const { return mFullHeight; }	  	/*virtual*/ void setKnownDrawSize(S32 width, S32 height);  	virtual void addFace(LLFace* facep) ; @@ -196,60 +151,8 @@ public:  	S32 getNumVolumes() const;  	const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } -	void generateGLTexture() ; -	void destroyGLTexture() ; -	//--------------------------------------------------------------------------------------------- -	//functions to access LLImageGL -	//--------------------------------------------------------------------------------------------- -	/*virtual*/S32	       getWidth(S32 discard_level = -1) const; -	/*virtual*/S32	       getHeight(S32 discard_level = -1) const; -	 -	BOOL       hasGLTexture() const ; -	LLGLuint   getTexName() const ;		 -	BOOL       createGLTexture() ; -	BOOL       createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER);  	virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; - -	void       setFilteringOption(LLTexUnit::eTextureFilterOptions option); -	void       setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); -	void       setAddressMode(LLTexUnit::eTextureAddressMode mode); -	BOOL       setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height); -	BOOL       setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height); -	void       setGLTextureCreated (bool initialized); -	void       setCategory(S32 category) ; - -	LLTexUnit::eTextureAddressMode getAddressMode(void) const ; -	S32        getMaxDiscardLevel() const; -	S32        getDiscardLevel() const; -	S8		   getComponents() const ;		 -	BOOL       getBoundRecently() const; -	S32        getTextureMemory() const ; -	LLGLenum   getPrimaryFormat() const; -	BOOL       getIsAlphaMask() const ; -	LLTexUnit::eTextureType getTarget(void) const ; -	BOOL       getMask(const LLVector2 &tc); -	F32        getTimePassedSinceLastBound(); -	BOOL       getMissed() const ; -	BOOL       isJustBound()const ; -	void       forceUpdateBindStats(void) const; - -	U32        getTexelsInAtlas() const ; -	U32        getTexelsInGLTexture() const ; -	BOOL       isGLTextureCreated() const ; -	S32        getDiscardLevelInAtlas() const ; -	//--------------------------------------------------------------------------------------------- -	//end of functions to access LLImageGL -	//--------------------------------------------------------------------------------------------- - -	//----------------- -	/*virtual*/ void setActive() ; -	void forceActive() ; -	void setNoDelete() ; -	void dontDiscard() { mDontDiscard = 1; mTextureState = NO_DELETE; } -	BOOL getDontDiscard() const { return mDontDiscard; } -	//-----------------	 -	  	BOOL isLargeImage() ;	  	void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;} @@ -262,36 +165,22 @@ protected:  	void init(bool firstinit) ;	  	void reorganizeFaceList() ;  	void reorganizeVolumeList() ; -	void setTexelsPerImage();  private:  	friend class LLBumpImageList;  	friend class LLUIImageList; -	//note: do not make this function public. -	/*virtual*/ LLImageGL* getGLTexture() const ;  	virtual void switchToCachedImage();  	static bool isMemoryForTextureLow() ;  protected:  	LLUUID mID; -	S32 mBoostLevel;				// enum describing priority level  	F32 mSelectedTime;				// time texture was last selected -	S32 mFullWidth; -	S32 mFullHeight; -	BOOL  mUseMipMaps ; -	S8  mComponents; -	F32 mTexelsPerImage;			// Texels per image. -	mutable S8  mNeedsGLTexture;  	mutable F32 mMaxVirtualSize;	// The largest virtual size of the image, in pixels - how much data to we need?	  	mutable S32  mMaxVirtualSizeResetCounter ;  	mutable S32  mMaxVirtualSizeResetInterval;  	mutable F32 mAdditionalDecodePriority;  // priority add to mDecodePriority.  	LLFrameTimer mLastReferencedTimer;	 -	//GL texture -	LLPointer<LLImageGL> mGLTexturep ; -	S8 mDontDiscard;			// Keep full res version of this image (for UI, etc) -  	ll_face_list_t    mFaceList ; //reverse pointer pointing to the faces using this image as texture  	U32               mNumFaces ;  	LLFrameTimer      mLastFaceListUpdateTimer ; @@ -303,17 +192,6 @@ protected:  	//do not use LLPointer here.  	LLViewerMediaTexture* mParcelMedia ; -protected: -	typedef enum  -	{ -		DELETED = 0,         //removed from memory -		DELETION_CANDIDATE,  //ready to be removed from memory -		INACTIVE,            //not be used for the last certain period (i.e., 30 seconds). -		ACTIVE,              //just being used, can become inactive if not being used for a certain time (10 seconds). -		NO_DELETE = 99       //stay in memory, can not be removed. -	} LLGLTextureState; -	LLGLTextureState  mTextureState ; -  	static F32 sTexelPixelRatio;  public:  	static const U32 sCurrentFileVersion;	 @@ -509,7 +387,7 @@ protected:  	S32 getCurrentDiscardLevelForFetching() ;  private: -	void init(bool firstinit) ; +	void init(bool firstinit) ;	  	void cleanup() ;  	void saveRawImage() ; @@ -732,7 +610,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -741,7 +619,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -750,7 +628,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,									   									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 49d7e8b842..4708938f1a 100644..100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -198,7 +198,7 @@ void LLViewerTextureList::doPrefetchImages()  		if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type)  		{ -			LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type); +			LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, texture_type);  			if (image)  			{  				image->addTextureStats((F32)pixel_area); @@ -228,7 +228,9 @@ void LLViewerTextureList::shutdown()  		if (!image->hasGLTexture() ||  			!image->getUseDiscard() ||  			image->needsAux() || -			image->getTargetHost() != LLHost::invalid) +			image->getTargetHost() != LLHost::invalid || +			!image->getUrl().empty() +			)  		{  			continue; // avoid UI, baked, and other special images  		} @@ -339,7 +341,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&  	if (full_path.empty())  	{  		llwarns << "Failed to find local image file: " << filename << llendl; -		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); +		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLGLTexture::BOOST_UI);  	}  	std::string url = "file://" + full_path; @@ -430,7 +432,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,  	if ((&image_id == NULL) || image_id.isNull())  	{ -		return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI)); +		return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLGLTexture::BOOST_UI));  	}  	LLPointer<LLViewerFetchedTexture> imagep = findImage(image_id); @@ -1361,7 +1363,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d  	U8 *data = new U8[data_size];  	msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); -	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	if (!image)  	{  		delete [] data; @@ -1434,7 +1436,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d  	U8 *data = new U8[data_size];  	msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); -	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	if (!image)  	{  		delete [] data; @@ -1534,9 +1536,9 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori  LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,  											  BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority )  { -	if (boost_priority == LLViewerTexture::BOOST_NONE) +	if (boost_priority == LLGLTexture::BOOST_NONE)  	{ -		boost_priority = LLViewerTexture::BOOST_UI; +		boost_priority = LLGLTexture::BOOST_UI;  	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect); @@ -1545,9 +1547,9 @@ LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std  LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,  											BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority)  { -	if (boost_priority == LLViewerTexture::BOOST_NONE) +	if (boost_priority == LLGLTexture::BOOST_NONE)  	{ -		boost_priority = LLViewerTexture::BOOST_UI; +		boost_priority = LLGLTexture::BOOST_UI;  	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect); @@ -1572,7 +1574,7 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st  	//Note:  	//Some other textures such as ICON also through this flow to be fetched.  	//But only UI textures need to set this callback. -	if(imagep->getBoostLevel() == LLViewerTexture::BOOST_UI) +	if(imagep->getBoostLevel() == LLGLTexture::BOOST_UI)  	{  		LLUIImageLoadData* datap = new LLUIImageLoadData;  		datap->mImageName = name; diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 3dda973d3f..05c7c35f7c 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -131,7 +131,7 @@ private:  	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -140,7 +140,7 @@ private:  	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -149,7 +149,7 @@ private:  	LLViewerFetchedTexture* getImageFromUrl(const std::string& url,  									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -158,7 +158,7 @@ private:  	LLViewerFetchedTexture* createImage(const LLUUID &image_id,  									 BOOL usemipmap = TRUE, -									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -168,7 +168,7 @@ private:  	// Request image from a specific host, used for baked avatar textures.  	// Implemented in header in case someone changes default params above. JC  	LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host) -	{ return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }	 +	{ return getImage(image_id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }	  public:  	typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t;	 @@ -233,11 +233,11 @@ private:  	LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,  		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,   								   const LLRect& clip_rect = LLRect::null, -		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); +		                           LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI);  	LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,  								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,   								 const LLRect& clip_rect = LLRect::null, -								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); +								 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI);  	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null); diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp deleted file mode 100644 index f0cf9b7692..0000000000 --- a/indra/newview/llviewervisualparam.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/**  - * @file llviewervisualparam.cpp - * @brief Implementation of LLViewerVisualParam 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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llviewervisualparam.h" -#include "llxmltree.h" -#include "llui.h" -#include "llwearable.h" - -//----------------------------------------------------------------------------- -// LLViewerVisualParamInfo() -//----------------------------------------------------------------------------- -LLViewerVisualParamInfo::LLViewerVisualParamInfo() -	: -	mWearableType( LLWearableType::WT_INVALID ), -	mCrossWearable(FALSE), -	mCamDist( 0.5f ), -	mCamAngle( 0.f ), -	mCamElevation( 0.f ), -	mEditGroupDisplayOrder( 0 ), -	mShowSimple(FALSE), -	mSimpleMin(0.f), -	mSimpleMax(100.f) -{ -} - -LLViewerVisualParamInfo::~LLViewerVisualParamInfo() -{ -} - -//----------------------------------------------------------------------------- -// parseXml() -//----------------------------------------------------------------------------- -BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node) -{ -	llassert( node->hasName( "param" ) ); - -	if (!LLVisualParamInfo::parseXml(node)) -		return FALSE; -	 -	// VIEWER SPECIFIC PARAMS -	 -	std::string wearable; -	static LLStdStringHandle wearable_string = LLXmlTree::addAttributeString("wearable"); -	if( node->getFastAttributeString( wearable_string, wearable) ) -	{ -		mWearableType = LLWearableType::typeNameToType( wearable ); -	} - -	static LLStdStringHandle edit_group_string = LLXmlTree::addAttributeString("edit_group"); -	if (!node->getFastAttributeString( edit_group_string, mEditGroup)) -	{ -		mEditGroup = ""; -	} - -	static LLStdStringHandle cross_wearable_string = LLXmlTree::addAttributeString("cross_wearable"); -	if (!node->getFastAttributeBOOL(cross_wearable_string, mCrossWearable)) -	{ -		mCrossWearable = FALSE; -	} - -	// Optional camera offsets from the current joint center.  Used for generating "hints" (thumbnails). -	static LLStdStringHandle camera_distance_string = LLXmlTree::addAttributeString("camera_distance"); -	node->getFastAttributeF32( camera_distance_string, mCamDist ); -	static LLStdStringHandle camera_angle_string = LLXmlTree::addAttributeString("camera_angle"); -	node->getFastAttributeF32( camera_angle_string, mCamAngle );	// in degrees -	static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation"); -	node->getFastAttributeF32( camera_elevation_string, mCamElevation ); - -	mCamAngle += 180; - -	static S32 params_loaded = 0; - -	// By default, parameters are displayed in the order in which they appear in the xml file. -	// "edit_group_order" overriddes. -	static LLStdStringHandle edit_group_order_string = LLXmlTree::addAttributeString("edit_group_order"); -	if( !node->getFastAttributeF32( edit_group_order_string, mEditGroupDisplayOrder ) ) -	{ -		mEditGroupDisplayOrder = (F32)params_loaded; -	} - -	params_loaded++; -	 -	return TRUE; -} - -/*virtual*/ void LLViewerVisualParamInfo::toStream(std::ostream &out) -{ -	LLVisualParamInfo::toStream(out); - -	out << mWearableType << "\t"; -	out << mEditGroup << "\t"; -	out << mEditGroupDisplayOrder << "\t"; -} - -//----------------------------------------------------------------------------- -// LLViewerVisualParam() -//----------------------------------------------------------------------------- -LLViewerVisualParam::LLViewerVisualParam() -{ -} - -//----------------------------------------------------------------------------- -// setInfo() -//----------------------------------------------------------------------------- - -BOOL LLViewerVisualParam::setInfo(LLViewerVisualParamInfo *info) -{ -	llassert(mInfo == NULL); -	if (info->mID < 0) -		return FALSE; -	mInfo = info; -	mID = info->mID; -	setWeight(getDefaultWeight(), FALSE ); -	return TRUE; -} - -/* -//============================================================================= -// These virtual functions should always be overridden, -// but are included here for use as templates -//============================================================================= - -//----------------------------------------------------------------------------- -// parseData() -//----------------------------------------------------------------------------- -BOOL LLViewerVisualParam::parseData(LLXmlTreeNode *node) -{ -	LLViewerVisualParamInfo* info = new LLViewerVisualParamInfo; - -	info->parseXml(node); -	if (!setInfo(info)) -		return FALSE; -	 -	return TRUE; -} -*/ diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h deleted file mode 100644 index 3bc95cbfbf..0000000000 --- a/indra/newview/llviewervisualparam.h +++ /dev/null @@ -1,109 +0,0 @@ -/**  - * @file llviewervisualparam.h - * @brief viewer side visual params (with data file parsing) - * - * $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_LLViewerVisualParam_H -#define LL_LLViewerVisualParam_H - -#include "v3math.h" -#include "llstring.h" -#include "llvisualparam.h" - -class LLWearable; - -//----------------------------------------------------------------------------- -// LLViewerVisualParamInfo -//----------------------------------------------------------------------------- -class LLViewerVisualParamInfo : public LLVisualParamInfo -{ -	friend class LLViewerVisualParam; -public: -	LLViewerVisualParamInfo(); -	/*virtual*/ ~LLViewerVisualParamInfo(); -	 -	/*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -	/*virtual*/ void toStream(std::ostream &out); - -protected: -	S32			mWearableType; -	BOOL		mCrossWearable; -	std::string	mEditGroup; -	F32			mCamDist; -	F32			mCamAngle;		// degrees -	F32			mCamElevation; -	F32			mEditGroupDisplayOrder; -	BOOL		mShowSimple;	// show edit controls when in "simple ui" mode? -	F32			mSimpleMin;		// when in simple UI, apply this minimum, range 0.f to 100.f -	F32			mSimpleMax;		// when in simple UI, apply this maximum, range 0.f to 100.f -}; - -//----------------------------------------------------------------------------- -// LLViewerVisualParam -// VIRTUAL CLASS -// a viewer side interface class for a generalized parametric modification of the avatar mesh -//----------------------------------------------------------------------------- -class LLViewerVisualParam : public LLVisualParam -{ -public: -	LLViewerVisualParam(); -	/*virtual*/ ~LLViewerVisualParam(){}; - -	// Special: These functions are overridden by child classes -	LLViewerVisualParamInfo 	*getInfo() const { return (LLViewerVisualParamInfo*)mInfo; }; -	//   This sets mInfo and calls initialization functions -	BOOL						setInfo(LLViewerVisualParamInfo *info); - -	virtual LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0; -	 -	// LLVisualParam Virtual functions -	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node); - -	// New Virtual functions -	virtual F32					getTotalDistortion() = 0; -	virtual const LLVector4a&	getAvgDistortion() = 0; -	virtual F32					getMaxDistortion() = 0; -	virtual LLVector4a			getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0; -	virtual const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0; -	virtual const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0; -	 -	// interface methods -	F32					getDisplayOrder() const		{ return getInfo()->mEditGroupDisplayOrder; } -	S32					getWearableType() const		{ return getInfo()->mWearableType; } -	const std::string&	getEditGroup() const		{ return getInfo()->mEditGroup; } - -	F32					getCameraDistance()	const	{ return getInfo()->mCamDist; }  -	F32					getCameraAngle() const		{ return getInfo()->mCamAngle; }  // degrees -	F32					getCameraElevation() const	{ return getInfo()->mCamElevation; }  -	 -	BOOL				getShowSimple() const		{ return getInfo()->mShowSimple; } -	F32					getSimpleMin() const		{ return getInfo()->mSimpleMin; } -	F32					getSimpleMax() const		{ return getInfo()->mSimpleMax; } - -	BOOL				getCrossWearable() const 	{ return getInfo()->mCrossWearable; } - -}; - -#endif // LL_LLViewerVisualParam_H diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp new file mode 100755 index 0000000000..4477893063 --- /dev/null +++ b/indra/newview/llviewerwearable.cpp @@ -0,0 +1,656 @@ +/**  + * @file llviewerwearable.cpp + * @brief LLViewerWearable class implementation + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llagent.h" +#include "llagentcamera.h" +#include "llagentwearables.h" +#include "llfloatersidepanelcontainer.h" +#include "llnotificationsutil.h" +#include "llsidepanelappearance.h" +#include "lltextureentry.h" +#include "llviewertexlayer.h" +#include "llvoavatarself.h" +#include "llavatarappearancedefines.h" +#include "llviewerwearable.h" +#include "llviewercontrol.h" +#include "llviewerregion.h" + +using namespace LLAvatarAppearanceDefines; + +// support class - remove for 2.1 (hackity hack hack) +class LLOverrideBakedTextureUpdate +{ +public: +	LLOverrideBakedTextureUpdate(bool temp_state) +	{ +		U32 num_bakes = (U32) LLAvatarAppearanceDefines::BAKED_NUM_INDICES; +		for( U32 index = 0; index < num_bakes; ++index ) +		{ +			composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); +		} +		gAgentAvatarp->setCompositeUpdatesEnabled(temp_state); +	} + +	~LLOverrideBakedTextureUpdate() +	{ +		U32 num_bakes = (U32)LLAvatarAppearanceDefines::BAKED_NUM_INDICES;		 +		for( U32 index = 0; index < num_bakes; ++index ) +		{ +			gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]); +		} +	} +private: +	bool composite_enabled[LLAvatarAppearanceDefines::BAKED_NUM_INDICES]; +}; + +// Private local functions +static std::string asset_id_to_filename(const LLUUID &asset_id); + +LLViewerWearable::LLViewerWearable(const LLTransactionID& transaction_id) : +	LLWearable() +{ +	mTransactionID = transaction_id; +	mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); +} + +LLViewerWearable::LLViewerWearable(const LLAssetID& asset_id) : +	LLWearable() +{ +	mAssetID = asset_id; +	mTransactionID.setNull(); +} + +// virtual +LLViewerWearable::~LLViewerWearable() +{ +} + +// virtual +LLWearable::EImportResult LLViewerWearable::importStream( std::istream& input_stream, LLAvatarAppearance* avatarp ) +{ +	// suppress texlayerset updates while wearables are being imported. Layersets will be updated +	// when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. +	LLOverrideBakedTextureUpdate stop_bakes(false); + +	LLWearable::EImportResult result = LLWearable::importStream(input_stream, avatarp); +	if (LLWearable::FAILURE == result) return result; +	if (LLWearable::BAD_HEADER == result) +	{ +		// Shouldn't really log the asset id for security reasons, but +		// we need it in this case. +		llwarns << "Bad Wearable asset header: " << mAssetID << llendl; +		//gVFS->dumpMap(); +		return result; +	} + +	LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN ); +	LLStringUtil::truncate(mDescription, DB_INV_ITEM_DESC_STR_LEN ); + +	te_map_t::const_iterator iter = mTEMap.begin(); +	te_map_t::const_iterator end = mTEMap.end(); +	for (; iter != end; ++iter) +	{ +		S32 te = iter->first; +		LLLocalTextureObject* lto = iter->second; +		LLUUID textureid = LLUUID::null; +		if (lto) +		{ +			textureid = lto->getID(); +		} + +		LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( textureid ); +		if(gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime")) +		{ +			image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(textureid, (LLAvatarAppearanceDefines::ETextureIndex)te), NULL); +		} +	} + +	return result; +} + + +// Avatar parameter and texture definitions can change over time. +// This function returns true if parameters or textures have been added or removed +// since this wearable was created. +BOOL LLViewerWearable::isOldVersion() const +{ +	if (!isAgentAvatarValid()) return FALSE; + +	if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion ) +	{ +		llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; +		llassert(0); +	} + +	if( LLWearable::sCurrentDefinitionVersion != mDefinitionVersion ) +	{ +		return TRUE; +	} + +	S32 param_count = 0; +	for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  +		param; +		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) +	{ +		if( (param->getWearableType() == mType) && (param->isTweakable() ) ) +		{ +			param_count++; +			if( !is_in_map(mVisualParamIndexMap, param->getID() ) ) +			{ +				return TRUE; +			} +		} +	} +	if( param_count != mVisualParamIndexMap.size() ) +	{ +		return TRUE; +	} + + +	S32 te_count = 0; +	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) +	{ +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		{ +			te_count++; +			if( !is_in_map(mTEMap, te ) ) +			{ +				return TRUE; +			} +		} +	} +	if( te_count != mTEMap.size() ) +	{ +		return TRUE; +	} + +	return FALSE; +} + +// Avatar parameter and texture definitions can change over time. +// * If parameters or textures have been REMOVED since the wearable was created, +// they're just ignored, so we consider the wearable clean even though isOldVersion() +// will return true.  +// * If parameters or textures have been ADDED since the wearable was created, +// they are taken to have default values, so we consider the wearable clean +// only if those values are the same as the defaults. +BOOL LLViewerWearable::isDirty() const +{ +	if (!isAgentAvatarValid()) return FALSE; + +	for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  +		param; +		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) +	{ +		if( (param->getWearableType() == mType)  +			&& (param->isTweakable() )  +			&& !param->getCrossWearable()) +		{ +			F32 current_weight = getVisualParamWeight(param->getID()); +			current_weight = llclamp( current_weight, param->getMinWeight(), param->getMaxWeight() ); +			F32 saved_weight = get_if_there(mSavedVisualParamMap, param->getID(), param->getDefaultWeight()); +			saved_weight = llclamp( saved_weight, param->getMinWeight(), param->getMaxWeight() ); +			 +			U8 a = F32_to_U8( saved_weight, param->getMinWeight(), param->getMaxWeight() ); +			U8 b = F32_to_U8( current_weight, param->getMinWeight(), param->getMaxWeight() ); +			if( a != b  ) +			{ +				return TRUE; +			} +		} +	} + +	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) +	{ +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		{ +			te_map_t::const_iterator current_iter = mTEMap.find(te); +			if(current_iter != mTEMap.end()) +			{ + 				const LLUUID& current_image_id = current_iter->second->getID(); +				te_map_t::const_iterator saved_iter = mSavedTEMap.find(te); +				if(saved_iter != mSavedTEMap.end()) +				{ +					const LLUUID& saved_image_id = saved_iter->second->getID(); +					if (saved_image_id != current_image_id) +					{ +						// saved vs current images are different, wearable is dirty +						return TRUE; +					} +				} +				else +				{ +					// image found in current image list but not saved image list +					return TRUE; +				} +			} +		} +	} + +	return FALSE; +} + + +void LLViewerWearable::setParamsToDefaults() +{ +	if (!isAgentAvatarValid()) return; + +	for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) +	{ +		if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->isTweakable() ) ) +		{ +			setVisualParamWeight(param->getID(),param->getDefaultWeight(), FALSE); +		} +	} +} + +void LLViewerWearable::setTexturesToDefaults() +{ +	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) +	{ +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		{ +			LLUUID id = getDefaultTextureImageID((ETextureIndex) te); +			LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id ); +			if( mTEMap.find(te) == mTEMap.end() ) +			{ +				mTEMap[te] = new LLLocalTextureObject(image, id); +				createLayers(te, gAgentAvatarp); +			} +			else +			{ +				// Local Texture Object already created, just set image and UUID +				LLLocalTextureObject *lto = mTEMap[te]; +				lto->setID(id); +				lto->setImage(image); +			} +		} +	} +} + + +// virtual +LLUUID LLViewerWearable::getDefaultTextureImageID(ETextureIndex index) const +{ +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); +	const std::string &default_image_name = texture_dict->mDefaultImageName; +	if (default_image_name == "") +	{ +		return IMG_DEFAULT_AVATAR; +	} +	else +	{ +		return LLUUID(gSavedSettings.getString(default_image_name)); +	} +} + + +// Updates the user's avatar's appearance +//virtual +void LLViewerWearable::writeToAvatar(LLAvatarAppearance *avatarp) +{ +	LLVOAvatarSelf* viewer_avatar = dynamic_cast<LLVOAvatarSelf*>(avatarp); + +	if (!avatarp || !viewer_avatar) return; + +	if (!viewer_avatar->isValid()) return; + +#if 0 +	// FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. +	// Ideally would avoid calling this func in the first place. +	if (viewer_avatar->isUsingServerBakes() && +		!viewer_avatar->isUsingLocalAppearance()) +	{ +		return; +	} +#endif + +	ESex old_sex = avatarp->getSex(); + +	LLWearable::writeToAvatar(avatarp); + + +	// Pull texture entries +	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) +	{ +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		{ +			te_map_t::const_iterator iter = mTEMap.find(te); +			LLUUID image_id; +			if(iter != mTEMap.end()) +			{ +				image_id = iter->second->getID(); +			} +			else +			{	 +				image_id = getDefaultTextureImageID((ETextureIndex) te); +			} +			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); +			// MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this. +			viewer_avatar->setLocalTextureTE(te, image, 0); +		} +	} + +	ESex new_sex = avatarp->getSex(); +	if( old_sex != new_sex ) +	{ +		viewer_avatar->updateSexDependentLayerSets( FALSE ); +	}	 +	 +//	if( upload_bake ) +//	{ +//		gAgent.sendAgentSetAppearance(); +//	} +} + + +// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. +// static  +void LLViewerWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ) +{ +	if (!isAgentAvatarValid()) return; + +	// You can't just remove body parts. +	if( (type == LLWearableType::WT_SHAPE) || +		(type == LLWearableType::WT_SKIN) || +		(type == LLWearableType::WT_HAIR) || +		(type == LLWearableType::WT_EYES) ) +	{ +		return; +	} + +	// Pull params +	for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) +	{ +		if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->isTweakable() ) ) +		{ +			S32 param_id = param->getID(); +			gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); +		} +	} + +	if(gAgentCamera.cameraCustomizeAvatar()) +	{ +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); +	} + +	gAgentAvatarp->updateVisualParams(); +	gAgentAvatarp->wearableUpdated(type, FALSE); + +//	if( upload_bake ) +//	{ +//		gAgent.sendAgentSetAppearance(); +//	} +} + +// Does not copy mAssetID. +// Definition version is current: removes obsolete enties and creates default values for new ones. +void LLViewerWearable::copyDataFrom(const LLViewerWearable* src) +{ +	if (!isAgentAvatarValid()) return; + +	mDefinitionVersion = LLWearable::sCurrentDefinitionVersion; + +	mName = src->mName; +	mDescription = src->mDescription; +	mPermissions = src->mPermissions; +	mSaleInfo = src->mSaleInfo; + +	setType(src->mType, gAgentAvatarp); + +	mSavedVisualParamMap.clear(); +	// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) +	for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  +		param; +		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) +	{ +		if( (param->getWearableType() == mType) ) +		{ +			S32 id = param->getID(); +			F32 weight = src->getVisualParamWeight(id); +			mSavedVisualParamMap[id] = weight; +		} +	} + +	destroyTextures(); +	// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) +	for (S32 te = 0; te < TEX_NUM_INDICES; te++) +	{ +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		{ +			te_map_t::const_iterator iter = src->mTEMap.find(te); +			LLUUID image_id; +			LLViewerFetchedTexture *image = NULL; +			if(iter != src->mTEMap.end()) +			{ +				image = dynamic_cast<LLViewerFetchedTexture*> (src->getLocalTextureObject(te)->getImage()); +				image_id = src->getLocalTextureObject(te)->getID(); +				mTEMap[te] = new LLLocalTextureObject(image, image_id); +				mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); +				mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady()); +				mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard()); +			} +			else +			{ +				image_id = getDefaultTextureImageID((ETextureIndex) te); +				image = LLViewerTextureManager::getFetchedTexture( image_id ); +				mTEMap[te] = new LLLocalTextureObject(image, image_id); +				mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); +			} +			createLayers(te, gAgentAvatarp); +		} +	} + +	// Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable +	// to be the same as the saved values (which were loaded from src at param->cloneParam(this)) +	revertValues(); +} + +void LLViewerWearable::setItemID(const LLUUID& item_id) +{ +	mItemID = item_id; +} + +void LLViewerWearable::revertValues() +{ +#if 0 +	// DRANO avoid overwrite when not in local appearance +	if (isAgentAvatarValid() && gAgentAvatarp->isUsingServerBakes() && !gAgentAvatarp->isUsingLocalAppearance()) +	{ +		return; +	} +#endif +	LLWearable::revertValues(); + + +	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); +	if( panel ) +	{ +		panel->updateScrollingPanelList(); +	} +} + +void LLViewerWearable::saveValues() +{ +	LLWearable::saveValues(); + +	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); +	if( panel ) +	{ +		panel->updateScrollingPanelList(); +	} +} + +// virtual +void LLViewerWearable::setUpdated() const +{  +	gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID()); +} + +void LLViewerWearable::refreshName() +{ +	LLUUID item_id = getItemID(); +	LLInventoryItem* item = gInventory.getItem(item_id); +	if( item ) +	{ +		mName = item->getName(); +	} +} + +// virtual +void LLViewerWearable::addToBakedTextureHash(LLMD5& hash) const +{ +	LLUUID asset_id = getAssetID(); +	hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); +} + +struct LLWearableSaveData +{ +	LLWearableType::EType mType; +}; + +void LLViewerWearable::saveNewAsset() const +{ +//	llinfos << "LLViewerWearable::saveNewAsset() type: " << getTypeName() << llendl; +	//llinfos << *this << llendl; + +	const std::string filename = asset_id_to_filename(mAssetID); +	LLFILE* fp = LLFile::fopen(filename, "wb");		/* Flawfinder: ignore */ +	BOOL successful_save = FALSE; +	if(fp && exportFile(fp)) +	{ +		successful_save = TRUE; +	} +	if(fp) +	{ +		fclose(fp); +		fp = NULL; +	} +	if(!successful_save) +	{ +		std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str()); +		llwarns << buffer << llendl; +		 +		LLSD args; +		args["NAME"] = mName; +		LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args); +		return; +	} + +	// save it out to database +	if( gAssetStorage ) +	{ +		 /* +		std::string url = gAgent.getRegion()->getCapability("NewAgentInventory"); +		if (!url.empty()) +		{ +			llinfos << "Update Agent Inventory via capability" << llendl; +			LLSD body; +			body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); +			body["asset_type"] = LLAssetType::lookup(getAssetType()); +			body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); +			body["name"] = getName(); +			body["description"] = getDescription(); +			LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, filename)); +		} +		else +		{ +		} +		 */ +		 LLWearableSaveData* data = new LLWearableSaveData; +		 data->mType = mType; +		 gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), +                                     &LLViewerWearable::onSaveNewAssetComplete, +                                     (void*)data); +	} +} + +// static +void LLViewerWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) +{ +	LLWearableSaveData* data = (LLWearableSaveData*)userdata; +	const std::string& type_name = LLWearableType::getTypeName(data->mType); +	if(0 == status) +	{ +		// Success +		llinfos << "Saved wearable " << type_name << llendl; +	} +	else +	{ +		std::string buffer = llformat("Unable to save %s to central asset store.", type_name.c_str()); +		llwarns << buffer << " Status: " << status << llendl; +		LLSD args; +		args["NAME"] = type_name; +		LLNotificationsUtil::add("CannotSaveToAssetStore", args); +	} + +	// Delete temp file +	const std::string src_filename = asset_id_to_filename(new_asset_id); +	LLFile::remove(src_filename); + +	// delete the context data +	delete data; + +} + +std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w) +{ +	s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n"; +	s << "    Name: " << w.mName << "\n"; +	s << "    Desc: " << w.mDescription << "\n"; +	//w.mPermissions +	//w.mSaleInfo + +	s << "    Params:" << "\n"; +	for (LLWearable::visual_param_index_map_t::const_iterator iter = w.mVisualParamIndexMap.begin(); +		 iter != w.mVisualParamIndexMap.end(); ++iter) +	{ +		S32 param_id = iter->first; +		LLVisualParam *wearable_param = iter->second; +		F32 param_weight = wearable_param->getWeight(); +		s << "        " << param_id << " " << param_weight << "\n"; +	} + +	s << "    Textures:" << "\n"; +	for (LLViewerWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); +		 iter != w.mTEMap.end(); ++iter) +	{ +		S32 te = iter->first; +		const LLUUID& image_id = iter->second->getID(); +		s << "        " << te << " " << image_id << "\n"; +	} +	return s; +} + +std::string asset_id_to_filename(const LLUUID &asset_id) +{ +	std::string asset_id_string; +	asset_id.toString(asset_id_string); +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id_string) + ".wbl";	 +	return filename; +} diff --git a/indra/newview/llviewerwearable.h b/indra/newview/llviewerwearable.h new file mode 100644 index 0000000000..65566f23a5 --- /dev/null +++ b/indra/newview/llviewerwearable.h @@ -0,0 +1,104 @@ +/**  + * @file llviewerwearable.h + * @brief LLViewerWearable class header file + * + * $LicenseInfo:firstyear=2012&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_VIEWER_WEARABLE_H +#define LL_VIEWER_WEARABLE_H + +#include "llwearable.h" +#include "llavatarappearancedefines.h" + +class LLVOAvatar; + +class LLViewerWearable : public LLWearable +{ +	friend class LLWearableList; + +	//-------------------------------------------------------------------- +	// Constructors and destructors +	//-------------------------------------------------------------------- +private: +	// Private constructors used by LLViewerWearableList +	LLViewerWearable(const LLTransactionID& transactionID); +	LLViewerWearable(const LLAssetID& assetID); +public: +	virtual ~LLViewerWearable(); + +	//-------------------------------------------------------------------- +	// Accessors +	//-------------------------------------------------------------------- +public: +	const LLUUID&				getItemID() const { return mItemID; } +	const LLAssetID&			getAssetID() const { return mAssetID; } +	const LLTransactionID&		getTransactionID() const { return mTransactionID; } +	void						setItemID(const LLUUID& item_id); + +public: + +	BOOL				isDirty() const; +	BOOL				isOldVersion() const; + +	/*virtual*/ void	writeToAvatar(LLAvatarAppearance *avatarp); +	void				removeFromAvatar( BOOL upload_bake )	{ LLViewerWearable::removeFromAvatar( mType, upload_bake ); } +	static void			removeFromAvatar( LLWearableType::EType type, BOOL upload_bake );  + +	/*virtual*/ EImportResult	importStream( std::istream& input_stream, LLAvatarAppearance* avatarp ); +	 +	void				setParamsToDefaults(); +	void				setTexturesToDefaults(); + +	/*virtual*/ LLUUID	getDefaultTextureImageID(LLAvatarAppearanceDefines::ETextureIndex index) const; + + +	void				saveNewAsset() const; +	static void			onSaveNewAssetComplete( const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status ); + +	void				copyDataFrom(const LLViewerWearable* src); + +	friend std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w); + +	/*virtual*/ void	revertValues(); +	/*virtual*/ void	saveValues(); + +	// Something happened that requires the wearable's label to be updated (e.g. worn/unworn). +	/*virtual*/void		setUpdated() const; + +	// the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem, +	// not the wearable asset itself. +	void				refreshName(); + +	// Update the baked texture hash. +	/*virtual*/void		addToBakedTextureHash(LLMD5& hash) const; + +protected: +	LLAssetID			mAssetID; +	LLTransactionID		mTransactionID; + +	LLUUID				mItemID;  // ID of the inventory item in the agent's inventory	 +}; + + +#endif  // LL_VIEWER_WEARABLE_H + diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 29ca7dac27..c072a82a4b 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -382,7 +382,7 @@ public:  			if (isAgentAvatarValid())  			{ -				tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); +				tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot->getWorldPosition());  				agent_root_center_text = llformat("AgentRootCenter %f %f %f",  												  (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));  			} @@ -732,7 +732,7 @@ public:  		if(log_texture_traffic)  		{	  			U32 old_y = ypos ; -			for(S32 i = LLViewerTexture::BOOST_NONE; i < LLViewerTexture::MAX_GL_IMAGE_CATEGORY; i++) +			for(S32 i = LLGLTexture::BOOST_NONE; i < LLGLTexture::MAX_GL_IMAGE_CATEGORY; i++)  			{  				if(gTotalTextureBytesPerBoostLevel[i] > 0)  				{ @@ -1388,43 +1388,6 @@ void LLViewerWindow::handleMenuSelect(LLWindow *window,  S32 menu_item)  BOOL LLViewerWindow::handlePaint(LLWindow *window,  S32 x,  S32 y, S32 width,  S32 height)  { -	// *TODO: Enable similar information output for other platforms?  DK 2011-02-18 -#if LL_WINDOWS -	if (gHeadlessClient) -	{ -		HWND window_handle = (HWND)window->getPlatformWindow(); -		PAINTSTRUCT ps;  -		HDC hdc;  -  -		RECT wnd_rect; -		wnd_rect.left = 0; -		wnd_rect.top = 0; -		wnd_rect.bottom = 200; -		wnd_rect.right = 500; - -		hdc = BeginPaint(window_handle, &ps);  -		//SetBKColor(hdc, RGB(255, 255, 255)); -		FillRect(hdc, &wnd_rect, CreateSolidBrush(RGB(255, 255, 255))); - -		std::string temp_str; -		temp_str = llformat( "FPS %3.1f Phy FPS %2.1f Time Dil %1.3f",		/* Flawfinder: ignore */ -				LLViewerStats::getInstance()->mFPSStat.getMeanPerSec(), -				LLViewerStats::getInstance()->mSimPhysicsFPS.getPrev(0), -				LLViewerStats::getInstance()->mSimTimeDilation.getPrev(0)); -		S32 len = temp_str.length(); -		TextOutA(hdc, 0, 0, temp_str.c_str(), len);  - - -		LLVector3d pos_global = gAgent.getPositionGlobal(); -		temp_str = llformat( "Avatar pos %6.1lf %6.1lf %6.1lf", pos_global.mdV[0], pos_global.mdV[1], pos_global.mdV[2]); -		len = temp_str.length(); -		TextOutA(hdc, 0, 25, temp_str.c_str(), len);  - -		TextOutA(hdc, 0, 50, "Set \"HeadlessClient FALSE\" in settings.ini file to reenable", 61); -		EndPaint(window_handle, &ps);  -		return TRUE; -	} -#endif  	return FALSE;  } @@ -1571,12 +1534,12 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	resetSnapshotLoc();  	// create window +	const BOOL clear_bg = FALSE;  	mWindow = LLWindowManager::createWindow(this,  		p.title, p.name, p.x, p.y, p.width, p.height, 0,  		p.fullscreen,  -		gHeadlessClient, +		clear_bg,  		gSavedSettings.getBOOL("DisableVerticalSync"), -		!gHeadlessClient,  		p.ignore_pixel_depth,  		gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled @@ -1681,7 +1644,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	// Init the image list.  Must happen after GL is initialized and before the images that  	// LLViewerWindow needs are requested. -	LLImageGL::initClass(LLViewerTexture::MAX_GL_IMAGE_CATEGORY) ; +	const BOOL SKIP_ANALYZE_ALPHA=FALSE; +	LLImageGL::initClass(LLGLTexture::MAX_GL_IMAGE_CATEGORY, SKIP_ANALYZE_ALPHA) ;  	gTextureList.init();  	LLViewerTextureManager::init() ;  	gBumpImageList.init(); @@ -2142,7 +2106,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)  		calcDisplayScale(); -		BOOL display_scale_changed = mDisplayScale != LLUI::sGLScaleFactor; +		BOOL display_scale_changed = mDisplayScale != LLUI::getScaleFactor();  		LLUI::setScaleFactor(mDisplayScale);  		// update our window rectangle @@ -2348,7 +2312,7 @@ void LLViewerWindow::draw()  		// scale view by UI global scale factor and aspect ratio correction factor  		gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); -		LLVector2 old_scale_factor = LLUI::sGLScaleFactor; +		LLVector2 old_scale_factor = LLUI::getScaleFactor();  		// apply camera zoom transform (for high res screenshots)  		F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();  		S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion(); @@ -2362,7 +2326,7 @@ void LLViewerWindow::draw()  						(F32)getWindowHeightScaled() * -(F32)pos_y,   						0.f);  			gGL.scalef(zoom_factor, zoom_factor, 1.f); -			LLUI::sGLScaleFactor *= zoom_factor; +			LLUI::getScaleFactor() *= zoom_factor;  		}  		// Draw tool specific overlay on world @@ -2410,7 +2374,7 @@ void LLViewerWindow::draw()  				LLFontGL::HCENTER, LLFontGL::TOP);  		} -		LLUI::sGLScaleFactor = old_scale_factor; +		LLUI::setScaleFactor(old_scale_factor);  	}  	LLUI::popMatrix();  	gGL.popMatrix(); @@ -2817,7 +2781,6 @@ void LLViewerWindow::updateUI()  	BOOL handled = FALSE; -	BOOL handled_by_top_ctrl = FALSE;  	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();  	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();  	LLView* captor_view = dynamic_cast<LLView*>(mouse_captor); @@ -3002,7 +2965,6 @@ void LLViewerWindow::updateUI()  				S32 local_x, local_y;  				top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );  				handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); -				handled_by_top_ctrl = TRUE;  			}  			if ( !handled ) @@ -3210,8 +3172,8 @@ void LLViewerWindow::updateLayout()  void LLViewerWindow::updateMouseDelta()  { -	S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::sGLScaleFactor.mV[VX]); -	S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::sGLScaleFactor.mV[VY]); +	S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::getScaleFactor().mV[VX]); +	S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::getScaleFactor().mV[VY]);  	//RN: fix for asynchronous notification of mouse leaving window not working  	LLCoordWindow mouse_pos; @@ -4733,7 +4695,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)  		gResizeScreenTexture = TRUE;  		gWindowResized = TRUE; -		if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) +		if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance())  		{  			LLVisualParamHint::requestHintUpdates();  		} @@ -4998,11 +4960,6 @@ bool LLViewerWindow::onAlert(const LLSD& notify)  {  	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); -	if (gHeadlessClient) -	{ -		llinfos << "Alert: " << notification->getName() << llendl; -	} -  	// If we're in mouselook, the mouse is hidden and so the user can't click   	// the dialog buttons.  In that case, change to First Person instead.  	if( gAgentCamera.cameraMouselook() ) diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index ec932501e5..49474dcc7a 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -223,7 +223,7 @@ BOOL LLVLComposition::generateComposition()  	{  		if (mDetailTextures[i]->getDiscardLevel() < 0)  		{ -			mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail +			mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail  			mDetailTextures[i]->addTextureStats(BASE_SIZE*BASE_SIZE);  			return FALSE;  		} @@ -240,7 +240,7 @@ BOOL LLVLComposition::generateComposition()  				ddiscard++;  				min_dim /= 2;  			} -			mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail +			mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail  			mDetailTextures[i]->setMinDiscardLevel(ddiscard);  			return FALSE;  		} @@ -376,9 +376,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,  	LLPointer<LLImageRaw> raw = new LLImageRaw(tex_width, tex_height, tex_comps);  	U8 *rawp = raw->getData(); -	F32 tex_width_inv = 1.f/tex_width; -	F32 tex_height_inv = 1.f/tex_height; -  	F32 st_x_stride, st_y_stride;  	st_x_stride = ((F32)st_width / (F32)mTexScaleX)*((F32)mWidth / (F32)tex_width);  	st_y_stride = ((F32)st_height / (F32)mTexScaleY)*((F32)mWidth / (F32)tex_height); @@ -413,11 +410,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,  			tex1 = tex0 + 1;  			tex1 = llclamp(tex1, 0, 3); -			F32 xy_int_i, xy_int_j; - -			xy_int_i = i * tex_width_inv; -			xy_int_j = j * tex_height_inv; -  			st_offset = (lltrunc(sti) + lltrunc(stj)*st_width) * st_comps;  			for (U32 k = 0; k < tex_comps; k++)  			{ @@ -463,7 +455,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,  	for (S32 i = 0; i < 4; i++)  	{  		// Un-boost detatil textures (will get re-boosted if rendering in high detail) -		mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_NONE); +		mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_NONE);  		mDetailTextures[i]->setMinDiscardLevel(MAX_DISCARD_LEVEL + 1);  	} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 627238b0f5..18d3ea7a47 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -24,18 +24,13 @@   * $/LicenseInfo$   */ -#if LL_MSVC -// disable warning about boost::lexical_cast returning uninitialized data -// when it fails to parse the string -#pragma warning (disable:4701) -#endif -  #include "llviewerprecompiledheaders.h"  #include "llvoavatar.h"  #include <stdio.h>  #include <ctype.h> +#include <sstream>  #include "llaudioengine.h"  #include "noise.h" @@ -53,6 +48,7 @@  #include "llcallingcard.h"		// IDEVO for LLAvatarTracker  #include "lldrawpoolavatar.h"  #include "lldriverparam.h" +#include "llpolyskeletaldistortion.h"  #include "lleditingmotion.h"  #include "llemote.h"  //#include "llfirstuse.h" @@ -77,15 +73,16 @@  #include "llselectmgr.h"  #include "llsprite.h"  #include "lltargetingmotion.h" -#include "lltexlayer.h"  #include "lltoolmorph.h"  #include "llviewercamera.h" +#include "llviewertexlayer.h"  #include "llviewertexturelist.h"  #include "llviewermenu.h"  #include "llviewerobjectlist.h"  #include "llviewerparcelmgr.h"  #include "llviewershadermgr.h"  #include "llviewerstats.h" +#include "llviewerwearable.h"  #include "llvoavatarself.h"  #include "llvovolume.h"  #include "llworld.h" @@ -108,16 +105,10 @@ extern F32 SPEED_ADJUST_MAX_SEC;  extern F32 ANIM_SPEED_MAX;  extern F32 ANIM_SPEED_MIN; -#if LL_MSVC -// disable boost::lexical_cast warning -#pragma warning (disable:4702) -#endif - -#include <boost/lexical_cast.hpp>  // #define OUTPUT_BREAST_DATA -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  //-----------------------------------------------------------------------------  // Global constants @@ -138,7 +129,6 @@ const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df44  //-----------------------------------------------------------------------------  // Constants  //----------------------------------------------------------------------------- -const std::string AVATAR_DEFAULT_CHAR = "avatar";  const S32 MIN_PIXEL_AREA_FOR_COMPOSITE = 1024;  const F32 SHADOW_OFFSET_AMT = 0.03f; @@ -192,8 +182,6 @@ const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;  const F32 CHAT_FADE_TIME = 8.0;  const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f; -const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0); -  enum ERenderName  {  	RENDER_NAME_NEVER, @@ -201,6 +189,11 @@ enum ERenderName  	RENDER_NAME_FADE  }; + +// Utility func - FIXME move out of avatar. +std::string get_sequential_numbered_file_name(const std::string& prefix, +											  const std::string& suffix); +  //-----------------------------------------------------------------------------  // Callback data  //----------------------------------------------------------------------------- @@ -221,58 +214,6 @@ struct LLTextureMaskData   **   **/ -//------------------------------------------------------------------------ -// LLVOBoneInfo -// Trans/Scale/Rot etc. info about each avatar bone.  Used by LLVOAvatarSkeleton. -//------------------------------------------------------------------------ -class LLVOAvatarBoneInfo -{ -	friend class LLVOAvatar; -	friend class LLVOAvatarSkeletonInfo; -public: -	LLVOAvatarBoneInfo() : mIsJoint(FALSE) {} -	~LLVOAvatarBoneInfo() -	{ -		std::for_each(mChildList.begin(), mChildList.end(), DeletePointer()); -	} -	BOOL parseXml(LLXmlTreeNode* node); -	 -private: -	std::string mName; -	BOOL mIsJoint; -	LLVector3 mPos; -	LLVector3 mRot; -	LLVector3 mScale; -	LLVector3 mPivot; -	typedef std::vector<LLVOAvatarBoneInfo*> child_list_t; -	child_list_t mChildList; -}; - -//------------------------------------------------------------------------ -// LLVOAvatarSkeletonInfo -// Overall avatar skeleton -//------------------------------------------------------------------------ -class LLVOAvatarSkeletonInfo -{ -	friend class LLVOAvatar; -public: -	LLVOAvatarSkeletonInfo() : -		mNumBones(0), mNumCollisionVolumes(0) {} -	~LLVOAvatarSkeletonInfo() -	{ -		std::for_each(mBoneInfoList.begin(), mBoneInfoList.end(), DeletePointer()); -	} -	BOOL parseXml(LLXmlTreeNode* node); -	S32 getNumBones() const { return mNumBones; } -	S32 getNumCollisionVolumes() const { return mNumCollisionVolumes; } -	 -private: -	S32 mNumBones; -	S32 mNumCollisionVolumes; -	typedef std::vector<LLVOAvatarBoneInfo*> bone_info_list_t; -	bone_info_list_t mBoneInfoList; -}; -  //-----------------------------------------------------------------------------  // class LLBodyNoiseMotion  //----------------------------------------------------------------------------- @@ -594,11 +535,7 @@ private:  //-----------------------------------------------------------------------------  // Static Data  //----------------------------------------------------------------------------- -LLXmlTree LLVOAvatar::sXMLTree; -LLXmlTree LLVOAvatar::sSkeletonXMLTree; -LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL; -LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL; -LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL; +LLAvatarAppearanceDictionary *LLVOAvatar::sAvatarDictionary = NULL;  S32 LLVOAvatar::sFreezeCounter = 0;  U32 LLVOAvatar::sMaxVisible = 12;  F32 LLVOAvatar::sRenderDistance = 256.f; @@ -645,15 +582,13 @@ static F32 calc_bouncy_animation(F32 x);  LLVOAvatar::LLVOAvatar(const LLUUID& id,  					   const LLPCode pcode,  					   LLViewerRegion* regionp) : +	LLAvatarAppearance(&gAgentWearables),  	LLViewerObject(id, pcode, regionp), -	mIsDummy(FALSE),  	mSpecialRenderMode(0),  	mAttachmentGeometryBytes(0),  	mAttachmentSurfaceArea(0.f),  	mTurning(FALSE), -	mPelvisToFoot(0.f),  	mLastSkeletonSerialNum( 0 ), -	mHeadOffset(),  	mIsSitting(FALSE),  	mTimeVisible(),  	mTyping(FALSE), @@ -678,9 +613,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mFirstAppearanceMessageReceived( FALSE ),  	mCulled( FALSE ),  	mVisibilityRank(0), -	mTexSkinColor( NULL ), -	mTexHairColor( NULL ), -	mTexEyeColor( NULL ),  	mNeedsSkin(FALSE),  	mLastSkinTime(0.f),  	mUpdatePeriod(1), @@ -688,12 +620,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mFullyLoaded(FALSE),  	mPreviousFullyLoaded(FALSE),  	mFullyLoadedInitialized(FALSE), -	mSupportsAlphaLayers(FALSE),  	mLoadedCallbacksPaused(FALSE),  	mHasPelvisOffset( FALSE ),  	mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")), -	mLastRezzedStatus(-1) - +	mLastRezzedStatus(-1), +	mIsEditingAppearance(FALSE), +	mUseLocalAppearance(FALSE), +	mUseServerBakes(FALSE) // FIXME DRANO consider using boost::optional, defaulting to unknown.  {  	LLMemType mt(LLMemType::MTYPE_AVATAR);  	//VTResume();  // VTune @@ -706,28 +639,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mPelvisp = NULL; -	mBakedTextureDatas.resize(BAKED_NUM_INDICES); -	for (U32 i = 0; i < mBakedTextureDatas.size(); i++ ) -	{ -		mBakedTextureDatas[i].mLastTextureIndex = IMG_DEFAULT_AVATAR; -		mBakedTextureDatas[i].mTexLayerSet = NULL; -		mBakedTextureDatas[i].mIsLoaded = false; -		mBakedTextureDatas[i].mIsUsed = false; -		mBakedTextureDatas[i].mMaskTexName = 0; -		mBakedTextureDatas[i].mTextureIndex = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)i); -	} -  	mDirtyMesh = 2;	// Dirty geometry, need to regenerate.  	mMeshTexturesDirty = FALSE;  	mHeadp = NULL; -	mIsBuilt = FALSE; - -	mNumJoints = 0; -	mSkeleton = NULL; - -	mNumCollisionVolumes = 0; -	mCollisionVolumes = NULL;  	// set up animation variables  	mSpeed = 0.f; @@ -816,48 +731,9 @@ LLVOAvatar::~LLVOAvatar()  	lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; -	mRoot.removeAllChildren(); -	mJointMap.clear(); - -	deleteAndClearArray(mSkeleton); -	deleteAndClearArray(mCollisionVolumes); - -	mNumJoints = 0; - -	for (U32 i = 0; i < mBakedTextureDatas.size(); i++) -	{ -		deleteAndClear(mBakedTextureDatas[i].mTexLayerSet); -		mBakedTextureDatas[i].mMeshes.clear(); - -		for (morph_list_t::iterator iter2 = mBakedTextureDatas[i].mMaskedMorphs.begin(); -			 iter2 != mBakedTextureDatas[i].mMaskedMorphs.end(); iter2++) -		{ -			LLMaskedMorph* masked_morph = (*iter2); -			delete masked_morph; -		} -	} -  	std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer());  	mAttachmentPoints.clear(); -	deleteAndClear(mTexSkinColor); -	deleteAndClear(mTexHairColor); -	deleteAndClear(mTexEyeColor); - -	std::for_each(mMeshes.begin(), mMeshes.end(), DeletePairedPointer()); -	mMeshes.clear(); - -	for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin(); -		 jointIter != mMeshLOD.end();  -		 ++jointIter) -	{ -		LLViewerJoint* joint = (LLViewerJoint *) *jointIter; -		std::for_each(joint->mMeshParts.begin(), joint->mMeshParts.end(), DeletePointer()); -		joint->mMeshParts.clear(); -	} -	std::for_each(mMeshLOD.begin(), mMeshLOD.end(), DeletePointer()); -	mMeshLOD.clear(); -	  	mDead = TRUE;  	mAnimationSources.clear(); @@ -902,7 +778,7 @@ BOOL LLVOAvatar::isFullyTextured() const  {  	for (S32 i = 0; i < mMeshLOD.size(); i++)  	{ -		LLViewerJoint* joint = (LLViewerJoint*) mMeshLOD[i]; +		LLAvatarJoint* joint = mMeshLOD[i];  		if (i==MESH_ID_SKIRT && !isWearingWearableType(LLWearableType::WT_SKIRT))  		{  			continue; // don't care about skirt textures if we're not wearing one. @@ -911,19 +787,19 @@ BOOL LLVOAvatar::isFullyTextured() const  		{  			continue; // nonexistent LOD OK.  		} -		std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin(); +		avatar_joint_mesh_list_t::iterator meshIter = joint->mMeshParts.begin();  		if (meshIter != joint->mMeshParts.end())  		{ -			LLViewerJointMesh *mesh = (LLViewerJointMesh *) *meshIter; +			LLAvatarJointMesh *mesh = (*meshIter);  			if (!mesh)  			{  				continue; // nonexistent mesh OK  			} -			if (mesh->mTexture.notNull() && mesh->mTexture->hasGLTexture()) +			if (mesh->hasGLTexture())  			{  				continue; // Mesh exists and has a baked texture.  			} -			if (mesh->mLayerSet && mesh->mLayerSet->hasComposite()) +			if (mesh->hasComposite())  			{  				continue; // Mesh exists and has a composite texture.  			} @@ -1076,15 +952,15 @@ void LLVOAvatar::dumpBakedStatus()  		{  			llcont << " Unbaked ("; -			for (LLVOAvatarDictionary::BakedTextures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -				 iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +				 iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  				 ++iter)  			{ -				const LLVOAvatarDictionary::BakedEntry *baked_dict = iter->second; +				const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = iter->second;  				const ETextureIndex index = baked_dict->mTextureIndex;  				if (!inst->isTextureDefined(index))  				{ -					llcont << " " << LLVOAvatarDictionary::getInstance()->getTexture(index)->mName; +					llcont << " " << LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mName;  				}  			}  			llcont << " ) " << inst->getUnbakedPixelAreaRank(); @@ -1105,7 +981,7 @@ void LLVOAvatar::restoreGL()  	gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);  	for (U32 i = 0; i < gAgentAvatarp->mBakedTextureDatas.size(); i++)  	{ -		gAgentAvatarp->invalidateComposite(gAgentAvatarp->mBakedTextureDatas[i].mTexLayerSet, FALSE); +		gAgentAvatarp->invalidateComposite(gAgentAvatarp->getTexLayerSet(i), FALSE);  	}  	gAgentAvatarp->updateMeshTextures();  } @@ -1132,7 +1008,7 @@ void LLVOAvatar::resetImpostors()  // static  void LLVOAvatar::deleteCachedImages(bool clearAll)  {	 -	if (LLTexLayerSet::sHasCaches) +	if (LLViewerTexLayerSet::sHasCaches)  	{  		lldebugs << "Deleting layer set caches" << llendl;  		for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); @@ -1141,7 +1017,7 @@ void LLVOAvatar::deleteCachedImages(bool clearAll)  			LLVOAvatar* inst = (LLVOAvatar*) *iter;  			inst->deleteLayerSetCaches(clearAll);  		} -		LLTexLayerSet::sHasCaches = FALSE; +		LLViewerTexLayerSet::sHasCaches = FALSE;  	}  	LLVOAvatarSelf::deleteScratchTextures();  	LLTexLayerStaticImageList::getInstance()->deleteCachedImages(); @@ -1154,109 +1030,6 @@ void LLVOAvatar::deleteCachedImages(bool clearAll)  //------------------------------------------------------------------------  void LLVOAvatar::initClass()  {  -	std::string xmlFile; - -	xmlFile = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR) + "_lad.xml"; -	BOOL success = sXMLTree.parseFile( xmlFile, FALSE ); -	if (!success) -	{ -		llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl; -	} - -	// now sanity check xml file -	LLXmlTreeNode* root = sXMLTree.getRoot(); -	if (!root)  -	{ -		llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl; -		return; -	} - -	//------------------------------------------------------------------------- -	// <linden_avatar version="1.0"> (root) -	//------------------------------------------------------------------------- -	if( !root->hasName( "linden_avatar" ) ) -	{ -		llerrs << "Invalid avatar file header: " << xmlFile << llendl; -	} -	 -	std::string version; -	static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version"); -	if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") ) -	{ -		llerrs << "Invalid avatar file version: " << version << " in file: " << xmlFile << llendl; -	} - -	S32 wearable_def_version = 1; -	static LLStdStringHandle wearable_definition_version_string = LLXmlTree::addAttributeString("wearable_definition_version"); -	root->getFastAttributeS32( wearable_definition_version_string, wearable_def_version ); -	LLWearable::setCurrentDefinitionVersion( wearable_def_version ); - -	std::string mesh_file_name; - -	LLXmlTreeNode* skeleton_node = root->getChildByName( "skeleton" ); -	if (!skeleton_node) -	{ -		llerrs << "No skeleton in avatar configuration file: " << xmlFile << llendl; -		return; -	} -	 -	std::string skeleton_file_name; -	static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name"); -	if (!skeleton_node->getFastAttributeString(file_name_string, skeleton_file_name)) -	{ -		llerrs << "No file name in skeleton node in avatar config file: " << xmlFile << llendl; -	} -	 -	std::string skeleton_path; -	skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name); -	if (!parseSkeletonFile(skeleton_path)) -	{ -		llerrs << "Error parsing skeleton file: " << skeleton_path << llendl; -	} - -	// Process XML data - -	// avatar_skeleton.xml -	if (sAvatarSkeletonInfo) -	{ //this can happen if a login attempt failed -		delete sAvatarSkeletonInfo; -	} -	sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo; -	if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot())) -	{ -		llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl; -	} -	// parse avatar_lad.xml -	if (sAvatarXmlInfo) -	{ //this can happen if a login attempt failed -		deleteAndClear(sAvatarXmlInfo); -	} -	sAvatarXmlInfo = new LLVOAvatarXmlInfo; -	if (!sAvatarXmlInfo->parseXmlSkeletonNode(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -	if (!sAvatarXmlInfo->parseXmlMeshNodes(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -	if (!sAvatarXmlInfo->parseXmlColorNodes(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -	if (!sAvatarXmlInfo->parseXmlLayerNodes(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -	if (!sAvatarXmlInfo->parseXmlDriverNodes(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -	if (!sAvatarXmlInfo->parseXmlMorphNodes(root)) -	{ -		llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; -	} -  	gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise");  	gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot");  	gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION,"physics_motion"); @@ -1273,85 +1046,12 @@ void LLVOAvatar::initClass()  void LLVOAvatar::cleanupClass()  { -	deleteAndClear(sAvatarXmlInfo); -	sSkeletonXMLTree.cleanup(); -	sXMLTree.cleanup();  } +// virtual  void LLVOAvatar::initInstance(void)  {  	//------------------------------------------------------------------------- -	// initialize joint, mesh and shape members -	//------------------------------------------------------------------------- -	mRoot.setName( "mRoot" ); -	 -	for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); -		 ++iter) -	{ -		const EMeshIndex mesh_index = iter->first; -		const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second; -		LLViewerJoint* joint = new LLViewerJoint(); -		joint->setName(mesh_dict->mName); -		joint->setMeshID(mesh_index); -		mMeshLOD.push_back(joint); -		 -		/* mHairLOD.setName("mHairLOD"); -		   mHairMesh0.setName("mHairMesh0"); -		   mHairMesh0.setMeshID(MESH_ID_HAIR); -		   mHairMesh1.setName("mHairMesh1"); */ -		for (U32 lod = 0; lod < mesh_dict->mLOD; lod++) -		{ -			LLViewerJointMesh* mesh = new LLViewerJointMesh(); -			std::string mesh_name = "m" + mesh_dict->mName + boost::lexical_cast<std::string>(lod); -			// We pre-pended an m - need to capitalize first character for camelCase -			mesh_name[1] = toupper(mesh_name[1]); -			mesh->setName(mesh_name); -			mesh->setMeshID(mesh_index); -			mesh->setPickName(mesh_dict->mPickName); -			mesh->setIsTransparent(FALSE); -			switch((int)mesh_index) -			{ -				case MESH_ID_HAIR: -					mesh->setIsTransparent(TRUE); -					break; -				case MESH_ID_SKIRT: -					mesh->setIsTransparent(TRUE); -					break; -				case MESH_ID_EYEBALL_LEFT: -				case MESH_ID_EYEBALL_RIGHT: -					mesh->setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f ); -					break; -			} -			 -			joint->mMeshParts.push_back(mesh); -		} -	} -	 -	//------------------------------------------------------------------------- -	// associate baked textures with meshes -	//------------------------------------------------------------------------- -	for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); -		 ++iter) -	{ -		const EMeshIndex mesh_index = iter->first; -		const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second; -		const EBakedTextureIndex baked_texture_index = mesh_dict->mBakedID; -		// Skip it if there's no associated baked texture. -		if (baked_texture_index == BAKED_NUM_INDICES) continue; -		 -		for (std::vector<LLViewerJointMesh* >::iterator iter = mMeshLOD[mesh_index]->mMeshParts.begin(); -			 iter != mMeshLOD[mesh_index]->mMeshParts.end();  -			 ++iter) -		{ -			LLViewerJointMesh* mesh = (LLViewerJointMesh*) *iter; -			mBakedTextureDatas[(int)baked_texture_index].mMeshes.push_back(mesh); -		} -	} -	 -	 -	//-------------------------------------------------------------------------  	// register motions  	//-------------------------------------------------------------------------  	if (LLCharacter::sInstances.size() == 1) @@ -1409,10 +1109,9 @@ void LLVOAvatar::initInstance(void)  		registerMotion( ANIM_AGENT_SIT_FEMALE,				LLKeyframeMotion::create );  		registerMotion( ANIM_AGENT_TARGET,					LLTargetingMotion::create );  		registerMotion( ANIM_AGENT_WALK_ADJUST,				LLWalkAdjustMotion::create ); -		  	} -	 -	buildCharacter(); + +	LLAvatarAppearance::initInstance();  	// preload specific motions here  	createMotion( ANIM_AGENT_CUSTOMIZE); @@ -1421,7 +1120,30 @@ void LLVOAvatar::initInstance(void)  	//VTPause();  // VTune  	mVoiceVisualizer->setVoiceEnabled( LLVoiceClient::getInstance()->getVoiceEnabled( mID ) ); +} +// virtual +LLAvatarJoint* LLVOAvatar::createAvatarJoint() +{ +	return new LLViewerJoint(); +} + +// virtual +LLAvatarJoint* LLVOAvatar::createAvatarJoint(S32 joint_num) +{ +	return new LLViewerJoint(joint_num); +} + +// virtual +LLAvatarJointMesh* LLVOAvatar::createAvatarJointMesh() +{ +	return new LLViewerJointMesh(); +} + +// virtual +LLTexLayerSet* LLVOAvatar::createTexLayerSet() +{ +	return new LLViewerTexLayerSet(this);  }  const LLVector3 LLVOAvatar::getRenderPosition() const @@ -1496,7 +1218,7 @@ void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)  	float max_attachment_span = get_default_max_prim_scale() * 5.0f;  	//stretch bounding box by joint positions -	for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i) +	for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i)  	{  		LLPolyMesh* mesh = i->second;  		for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++) @@ -1734,160 +1456,6 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector  	return hit;  } -//----------------------------------------------------------------------------- -// parseSkeletonFile() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) -{ -	LLMemType mt(LLMemType::MTYPE_AVATAR); -	 -	//------------------------------------------------------------------------- -	// parse the file -	//------------------------------------------------------------------------- -	BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE ); - -	if (!parsesuccess) -	{ -		llerrs << "Can't parse skeleton file: " << filename << llendl; -		return FALSE; -	} - -	// now sanity check xml file -	LLXmlTreeNode* root = sSkeletonXMLTree.getRoot(); -	if (!root)  -	{ -		llerrs << "No root node found in avatar skeleton file: " << filename << llendl; -		return FALSE; -	} - -	if( !root->hasName( "linden_skeleton" ) ) -	{ -		llerrs << "Invalid avatar skeleton file header: " << filename << llendl; -		return FALSE; -	} - -	std::string version; -	static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version"); -	if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") ) -	{ -		llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl; -		return FALSE; -	} - -	return TRUE; -} - -//----------------------------------------------------------------------------- -// setupBone() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num) -{ -	LLMemType mt(LLMemType::MTYPE_AVATAR); -	 -	LLViewerJoint* joint = NULL; - -	if (info->mIsJoint) -	{ -		joint = (LLViewerJoint*)getCharacterJoint(joint_num); -		if (!joint) -		{ -			llwarns << "Too many bones" << llendl; -			return FALSE; -		} -		joint->setName( info->mName ); -	} -	else // collision volume -	{ -		if (volume_num >= (S32)mNumCollisionVolumes) -		{ -			llwarns << "Too many bones" << llendl; -			return FALSE; -		} -		joint = (LLViewerJoint*)(&mCollisionVolumes[volume_num]); -		joint->setName( info->mName ); -	} - -	// add to parent -	if (parent) -	{ -		parent->addChild( joint ); -	} - -	joint->setPosition(info->mPos); -	joint->setRotation(mayaQ(info->mRot.mV[VX], info->mRot.mV[VY], -							 info->mRot.mV[VZ], LLQuaternion::XYZ)); -	joint->setScale(info->mScale); - -	joint->setDefaultFromCurrentXform(); -	 -	if (info->mIsJoint) -	{ -		joint->setSkinOffset( info->mPivot ); -		joint_num++; -	} -	else // collision volume -	{ -		volume_num++; -	} - -	// setup children -	LLVOAvatarBoneInfo::child_list_t::const_iterator iter; -	for (iter = info->mChildList.begin(); iter != info->mChildList.end(); ++iter) -	{ -		LLVOAvatarBoneInfo *child_info = *iter; -		if (!setupBone(child_info, joint, volume_num, joint_num)) -		{ -			return FALSE; -		} -	} - -	return TRUE; -} - -//----------------------------------------------------------------------------- -// buildSkeleton() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info) -{ -	LLMemType mt(LLMemType::MTYPE_AVATAR); -	 -	//------------------------------------------------------------------------- -	// allocate joints -	//------------------------------------------------------------------------- -	if (!allocateCharacterJoints(info->mNumBones)) -	{ -		llerrs << "Can't allocate " << info->mNumBones << " joints" << llendl; -		return FALSE; -	} -	 -	//------------------------------------------------------------------------- -	// allocate volumes -	//------------------------------------------------------------------------- -	if (info->mNumCollisionVolumes) -	{ -		if (!allocateCollisionVolumes(info->mNumCollisionVolumes)) -		{ -			llerrs << "Can't allocate " << info->mNumCollisionVolumes << " collision volumes" << llendl; -			return FALSE; -		} -	} - -	S32 current_joint_num = 0; -	S32 current_volume_num = 0; -	LLVOAvatarSkeletonInfo::bone_info_list_t::const_iterator iter; -	for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); ++iter) -	{ -		LLVOAvatarBoneInfo *info = *iter; -		if (!setupBone(info, NULL, current_volume_num, current_joint_num)) -		{ -			llerrs << "Error parsing bone in skeleton file" << llendl; -			return FALSE; -		} -	} - -	return TRUE; -} -  LLVOAvatar* LLVOAvatar::asAvatar()  {  	return this; @@ -1919,116 +1487,15 @@ void LLVOAvatar::startDefaultMotions()  // LLVOAvatar::buildCharacter()  // Deferred initialization and rebuild of the avatar.  //----------------------------------------------------------------------------- +// virtual  void LLVOAvatar::buildCharacter()  { -	LLMemType mt(LLMemType::MTYPE_AVATAR); -	 -	//------------------------------------------------------------------------- -	// remove all references to our existing skeleton -	// so we can rebuild it -	//------------------------------------------------------------------------- -	flushAllMotions(); +	LLAvatarAppearance::buildCharacter(); -	//------------------------------------------------------------------------- -	// remove all of mRoot's children -	//------------------------------------------------------------------------- -	mRoot.removeAllChildren(); -	mJointMap.clear(); +	// Not done building yet; more to do.  	mIsBuilt = FALSE;  	//------------------------------------------------------------------------- -	// clear mesh data -	//------------------------------------------------------------------------- -	for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin(); -		 jointIter != mMeshLOD.end(); ++jointIter) -	{ -		LLViewerJoint* joint = (LLViewerJoint*) *jointIter; -		for (std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin(); -			 meshIter != joint->mMeshParts.end(); ++meshIter) -		{ -			LLViewerJointMesh * mesh = (LLViewerJointMesh *) *meshIter; -			mesh->setMesh(NULL); -		} -	} - -	//------------------------------------------------------------------------- -	// (re)load our skeleton and meshes -	//------------------------------------------------------------------------- -	LLTimer timer; - -	BOOL status = loadAvatar(); -	stop_glerror(); - -// 	gPrintMessagesThisFrame = TRUE; -	lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl; - -	if (!status) -	{ -		if (isSelf()) -		{ -			llerrs << "Unable to load user's avatar" << llendl; -		} -		else -		{ -			llwarns << "Unable to load other's avatar" << llendl; -		} -		return; -	} - -	//------------------------------------------------------------------------- -	// initialize "well known" joint pointers -	//------------------------------------------------------------------------- -	mPelvisp		= (LLViewerJoint*)mRoot.findJoint("mPelvis"); -	mTorsop			= (LLViewerJoint*)mRoot.findJoint("mTorso"); -	mChestp			= (LLViewerJoint*)mRoot.findJoint("mChest"); -	mNeckp			= (LLViewerJoint*)mRoot.findJoint("mNeck"); -	mHeadp			= (LLViewerJoint*)mRoot.findJoint("mHead"); -	mSkullp			= (LLViewerJoint*)mRoot.findJoint("mSkull"); -	mHipLeftp		= (LLViewerJoint*)mRoot.findJoint("mHipLeft"); -	mHipRightp		= (LLViewerJoint*)mRoot.findJoint("mHipRight"); -	mKneeLeftp		= (LLViewerJoint*)mRoot.findJoint("mKneeLeft"); -	mKneeRightp		= (LLViewerJoint*)mRoot.findJoint("mKneeRight"); -	mAnkleLeftp		= (LLViewerJoint*)mRoot.findJoint("mAnkleLeft"); -	mAnkleRightp	= (LLViewerJoint*)mRoot.findJoint("mAnkleRight"); -	mFootLeftp		= (LLViewerJoint*)mRoot.findJoint("mFootLeft"); -	mFootRightp		= (LLViewerJoint*)mRoot.findJoint("mFootRight"); -	mWristLeftp		= (LLViewerJoint*)mRoot.findJoint("mWristLeft"); -	mWristRightp	= (LLViewerJoint*)mRoot.findJoint("mWristRight"); -	mEyeLeftp		= (LLViewerJoint*)mRoot.findJoint("mEyeLeft"); -	mEyeRightp		= (LLViewerJoint*)mRoot.findJoint("mEyeRight"); - -	//------------------------------------------------------------------------- -	// Make sure "well known" pointers exist -	//------------------------------------------------------------------------- -	if (!(mPelvisp &&  -		  mTorsop && -		  mChestp && -		  mNeckp && -		  mHeadp && -		  mSkullp && -		  mHipLeftp && -		  mHipRightp && -		  mKneeLeftp && -		  mKneeRightp && -		  mAnkleLeftp && -		  mAnkleRightp && -		  mFootLeftp && -		  mFootRightp && -		  mWristLeftp && -		  mWristRightp && -		  mEyeLeftp && -		  mEyeRightp)) -	{ -		llerrs << "Failed to create avatar." << llendl; -		return; -	} - -	//------------------------------------------------------------------------- -	// initialize the pelvis -	//------------------------------------------------------------------------- -	mPelvisp->setPosition( LLVector3(0.0f, 0.0f, 0.0f) ); -	 -	//-------------------------------------------------------------------------  	// set head offset from pelvis  	//-------------------------------------------------------------------------  	updateHeadOffset(); @@ -2082,11 +1549,11 @@ void LLVOAvatar::releaseMeshData()  	//llinfos << "Releasing" << llendl;  	// cleanup mesh data -	for (std::vector<LLViewerJoint*>::iterator iter = mMeshLOD.begin(); +	for (avatar_joint_list_t::iterator iter = mMeshLOD.begin();  		 iter != mMeshLOD.end();   		 ++iter)  	{ -		LLViewerJoint* joint = (LLViewerJoint*) *iter; +		LLAvatarJoint* joint = (*iter);  		joint->setValid(FALSE, TRUE);  	} @@ -2176,7 +1643,11 @@ void LLVOAvatar::updateMeshData()  				last_v_num = num_vertices ;  				last_i_num = num_indices ; -				mMeshLOD[part_index++]->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea); +				LLViewerJoint* part_mesh = getViewerJoint(part_index++); +				if (part_mesh) +				{ +					part_mesh->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea); +				}  			}  			if(num_vertices < 1)//skip empty meshes  			{ @@ -2250,7 +1721,11 @@ void LLVOAvatar::updateMeshData()  					rigid = true;  				} -				mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid); +				LLViewerJoint* mesh = getViewerJoint(k); +				if (mesh) +				{ +					mesh->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid); +				}  			}  			stop_glerror(); @@ -2271,72 +1746,6 @@ void LLVOAvatar::updateMeshData()  //------------------------------------------------------------------------  //------------------------------------------------------------------------ -// The viewer can only suggest a good size for the agent, -// the simulator will keep it inside a reasonable range. -void LLVOAvatar::computeBodySize()  -{ -	LLVector3 pelvis_scale = mPelvisp->getScale(); - -	// some of the joints have not been cached -	LLVector3 skull = mSkullp->getPosition(); -	LLVector3 skull_scale = mSkullp->getScale(); - -	LLVector3 neck = mNeckp->getPosition(); -	LLVector3 neck_scale = mNeckp->getScale(); - -	LLVector3 chest = mChestp->getPosition(); -	LLVector3 chest_scale = mChestp->getScale(); - -	// the rest of the joints have been cached -	LLVector3 head = mHeadp->getPosition(); -	LLVector3 head_scale = mHeadp->getScale(); - -	LLVector3 torso = mTorsop->getPosition(); -	LLVector3 torso_scale = mTorsop->getScale(); - -	LLVector3 hip = mHipLeftp->getPosition(); -	LLVector3 hip_scale = mHipLeftp->getScale(); - -	LLVector3 knee = mKneeLeftp->getPosition(); -	LLVector3 knee_scale = mKneeLeftp->getScale(); - -	LLVector3 ankle = mAnkleLeftp->getPosition(); -	LLVector3 ankle_scale = mAnkleLeftp->getScale(); - -	LLVector3 foot  = mFootLeftp->getPosition(); - -	mPelvisToFoot = hip.mV[VZ] * pelvis_scale.mV[VZ] - -				 	knee.mV[VZ] * hip_scale.mV[VZ] - -				 	ankle.mV[VZ] * knee_scale.mV[VZ] - -				 	foot.mV[VZ] * ankle_scale.mV[VZ]; - -	LLVector3 new_body_size; -	new_body_size.mV[VZ] = mPelvisToFoot + -					   // the sqrt(2) correction below is an approximate -					   // correction to get to the top of the head -					   F_SQRT2 * (skull.mV[VZ] * head_scale.mV[VZ]) +  -					   head.mV[VZ] * neck_scale.mV[VZ] +  -					   neck.mV[VZ] * chest_scale.mV[VZ] +  -					   chest.mV[VZ] * torso_scale.mV[VZ] +  -					   torso.mV[VZ] * pelvis_scale.mV[VZ];  - -	// TODO -- measure the real depth and width -	new_body_size.mV[VX] = DEFAULT_AGENT_DEPTH; -	new_body_size.mV[VY] = DEFAULT_AGENT_WIDTH; - -	if (new_body_size != mBodySize) -	{ -		mBodySize = new_body_size; - -		if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF()) -		{	// notify simulator of change in size -			// but not if we are in the middle of updating appearance -			gAgent.sendAgentSetAppearance(); -		} -	} -} - -//------------------------------------------------------------------------  // LLVOAvatar::processUpdateMessage()  //------------------------------------------------------------------------  U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, @@ -2346,7 +1755,6 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,  {  	LLMemType mt(LLMemType::MTYPE_AVATAR); -	LLVector3 old_vel = getVelocity();  	const BOOL has_name = !getNVPair("FirstName");  	// Do base class updates... @@ -2381,6 +1789,13 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)  	// to redirect certain avatar texture requests to different sims.  	if (isIndexBakedTexture((ETextureIndex)te))  	{ +		const std::string url = getImageURL(te,uuid); +		if (!url.empty()) +		{ +			llinfos << "texture URL " << url << llendl; +			return setTETextureCore(te, uuid, url); +		} +  		LLHost target_host = getObjectHost();  		return setTETextureCore(te, uuid, target_host);  	} @@ -2499,7 +1914,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	// animate the character  	// store off last frame's root position to be consistent with camera position -	LLVector3 root_pos_last = mRoot.getWorldPosition(); +	LLVector3 root_pos_last = mRoot->getWorldPosition();  	BOOL detailed_update = updateCharacter(agent);  	static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); @@ -2618,11 +2033,11 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)  		if ( mIsSitting )  		{  			LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] ); -			mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset ); +			mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot->getWorldPosition() + headOffset );  		}  		else   		{ -			LLVector3 tagPos = mRoot.getWorldPosition(); +			LLVector3 tagPos = mRoot->getWorldPosition();  			tagPos[VZ] -= mPelvisToFoot;  			tagPos[VZ] += ( mBodySize[VZ] + 0.125f );  			mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos ); @@ -3230,8 +2645,6 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)  		mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT);  		mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f); -		char line[MAX_STRING];		/* Flawfinder: ignore */ -		line[0] = '\0';  		std::deque<LLChat>::iterator chat_iter = mChats.begin();  		mNameText->clearString(); @@ -3359,7 +2772,7 @@ void LLVOAvatar::invalidateNameTags()  // Compute name tag position during idle update  LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)  { -	LLQuaternion root_rot = mRoot.getWorldRotation(); +	LLQuaternion root_rot = mRoot->getWorldRotation();  	LLVector3 pixel_right_vec;  	LLVector3 pixel_up_vec;  	LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec); @@ -3373,7 +2786,7 @@ LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)  	local_camera_up.scaleVec(mBodySize * 0.5f);  	local_camera_at.scaleVec(mBodySize * 0.5f); -	LLVector3 name_position = mRoot.getWorldPosition(); +	LLVector3 name_position = mRoot->getWorldPosition();  	name_position[VZ] -= mPelvisToFoot;  	name_position[VZ] += (mBodySize[VZ]* 0.55f);  	name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));	 @@ -3438,13 +2851,13 @@ void LLVOAvatar::idleUpdateBelowWater()  void LLVOAvatar::slamPosition()  {  	gAgent.setPositionAgent(getPositionAgent()); -	mRoot.setWorldPosition(getPositionAgent()); // teleport +	mRoot->setWorldPosition(getPositionAgent()); // teleport  	setChanged(TRANSLATED);  	if (mDrawable.notNull())  	{  		gPipeline.updateMoveNormalAsync(mDrawable);  	} -	mRoot.updateWorldMatrixChildren(); +	mRoot->updateWorldMatrixChildren();  }  bool LLVOAvatar::isVisuallyMuted() const @@ -3467,6 +2880,24 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  	// clear debug text  	mDebugText.clear(); + +	if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +	{ +		S32 central_bake_version = -1; +		if (getRegion()) +		{ +			central_bake_version = getRegion()->getCentralBakeVersion(); +		} +		addDebugText(llformat("mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d", +							  mUseLocalAppearance, mIsEditingAppearance, +							  mUseServerBakes, central_bake_version)); +	} +	if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +	{ +		if (!mBakedTextureDebugText.empty()) +			addDebugText(mBakedTextureDebugText); +	} +				   	if (LLVOAvatar::sShowAnimationDebug)  	{  		for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); @@ -3606,8 +3037,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  	xyVel.mV[VZ] = 0.0f;  	speed = xyVel.length(); -	BOOL throttle = TRUE; -  	if (!(mIsSitting && getParent()))  	{  		//-------------------------------------------------------------------- @@ -3618,11 +3047,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		if (mTimeLast == 0.0f)  		{  			mTimeLast = animation_time; -			throttle = FALSE;  			// put the pelvis at slaved position/mRotation -			mRoot.setWorldPosition( getPositionAgent() ); // first frame -			mRoot.setWorldRotation( getRotation() ); +			mRoot->setWorldPosition( getPositionAgent() ); // first frame +			mRoot->setWorldRotation( getRotation() );  		}  		//-------------------------------------------------------------------- @@ -3665,10 +3093,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos); -		if (newPosition != mRoot.getXform()->getWorldPosition()) +		if (newPosition != mRoot->getXform()->getWorldPosition())  		{		 -			mRoot.touch(); -			mRoot.setWorldPosition( newPosition ); // regular update				 +			mRoot->touch(); +			mRoot->setWorldPosition( newPosition ); // regular update				  		} @@ -3729,7 +3157,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			} -			LLQuaternion root_rotation = mRoot.getWorldMatrix().quaternion(); +			LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion();  			F32 root_roll, root_pitch, root_yaw;  			root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw); @@ -3738,7 +3166,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			// and head turn.  Once in motion, it must conform however.  			BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook(); -			LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV ); +			LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV );  			static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow");  			static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast"); @@ -3824,14 +3252,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			F32 u = llclamp((deltaTime / pelvis_lag_time), 0.0f, 1.0f);	 -			mRoot.setWorldRotation( slerp(u, mRoot.getWorldRotation(), wQv) ); +			mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) );  		}  	}  	else if (mDrawable.notNull())  	{ -		mRoot.setPosition(mDrawable->getPosition()); -		mRoot.setRotation(mDrawable->getRotation()); +		mRoot->setPosition(mDrawable->getPosition()); +		mRoot->setRotation(mDrawable->getRotation());  	}  	//------------------------------------------------------------------------- @@ -3931,7 +3359,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		}  	} -	mRoot.updateWorldMatrixChildren(); +	mRoot->updateWorldMatrixChildren();  	if (!mDebugText.size() && mText.notNull())  	{ @@ -3955,7 +3383,7 @@ void LLVOAvatar::updateHeadOffset()  {  	// since we only care about Z, just grab one of the eyes  	LLVector3 midEyePt = mEyeLeftp->getWorldPosition(); -	midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot.getWorldPosition(); +	midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot->getWorldPosition();  	midEyePt.mV[VZ] = llmax(-mPelvisToFoot + LLViewerCamera::getInstance()->getNear(), midEyePt.mV[VZ]);  	if (mDrawable.notNull()) @@ -3993,8 +3421,8 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount,  void LLVOAvatar::postPelvisSetRecalc( void )  {	  	computeBodySize();  -	mRoot.touch(); -	mRoot.updateWorldMatrixChildren();	 +	mRoot->touch(); +	mRoot->updateWorldMatrixChildren();	  	dirtyMesh();  	updateHeadOffset();  } @@ -4149,7 +3577,7 @@ void LLVOAvatar::updateVisibility()  // private  bool LLVOAvatar::shouldAlphaMask()  { -	const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked +	const bool should_alpha_mask = !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked  							&& !LLDrawPoolAvatar::sSkipTransparent;  	return should_alpha_mask; @@ -4228,19 +3656,44 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  		if (mNeedsSkin)  		{  			//generate animated mesh -			mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry(); -			mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry(); +			LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY); +			LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY); +			LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT); +			LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH); +			LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD); +			LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); + +			if(upper_mesh) +			{ +				upper_mesh->updateJointGeometry(); +			} +			if (lower_mesh) +			{ +				lower_mesh->updateJointGeometry(); +			}  			if( isWearingWearableType( LLWearableType::WT_SKIRT ) )  			{ -				mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry(); +				if(skirt_mesh) +				{ +					skirt_mesh->updateJointGeometry(); +				}  			}  			if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)  			{ -				mMeshLOD[MESH_ID_EYELASH]->updateJointGeometry(); -				mMeshLOD[MESH_ID_HEAD]->updateJointGeometry(); -				mMeshLOD[MESH_ID_HAIR]->updateJointGeometry(); +				if(eyelash_mesh) +				{ +					eyelash_mesh->updateJointGeometry(); +				} +				if(head_mesh) +				{ +					head_mesh->updateJointGeometry(); +				} +				if(hair_mesh) +				{ +					hair_mesh->updateJointGeometry(); +				}  			}  			mNeedsSkin = FALSE;  			mLastSkinTime = gFrameTimeSeconds; @@ -4357,19 +3810,31 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  			{  				if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy)  				{ -					num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea, TRUE, mIsDummy); +					LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD); +					if (head_mesh) +					{ +						num_indices += head_mesh->render(mAdjustedPixelArea, TRUE, mIsDummy); +					}  					first_pass = FALSE;  				}  			}  			if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy)  			{ -				num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy); +				LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY); +				if (upper_mesh) +				{ +					num_indices += upper_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); +				}  				first_pass = FALSE;  			}  			if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy)  			{ -				num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy); +				LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY); +				if (lower_mesh) +				{ +					num_indices += lower_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); +				}  				first_pass = FALSE;  			}  		} @@ -4402,7 +3867,11 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  	if( isWearingWearableType( LLWearableType::WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )  	{  		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f); -		num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE); +		LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT); +		if (skirt_mesh) +		{ +			num_indices += skirt_mesh->render(mAdjustedPixelArea, FALSE); +		}  		first_pass = FALSE;  		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	} @@ -4416,16 +3885,23 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  		if (isTextureVisible(TEX_HEAD_BAKED))  		{ -			num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy); +			LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH); +			if (eyelash_mesh) +			{ +				num_indices += eyelash_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); +			}  			first_pass = FALSE;  		}  		// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)  		// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible(); - -		if ( getImage(TEX_HAIR_BAKED, 0) -			&& getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha) +		if ( getImage(TEX_HAIR_BAKED, 0) &&  +		     getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)		  		{ -			num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy); +			LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); +			if (hair_mesh) +			{ +				num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); +			}  			first_pass = FALSE;  		}  		if (LLPipeline::sImpostorRender) @@ -4469,8 +3945,16 @@ U32 LLVOAvatar::renderRigid()  	if (isTextureVisible(TEX_EYES_BAKED)  || mIsDummy)  	{ -		num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy); -		num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy); +		LLViewerJoint* eyeball_left = getViewerJoint(MESH_ID_EYEBALL_LEFT); +		LLViewerJoint* eyeball_right = getViewerJoint(MESH_ID_EYEBALL_RIGHT); +		if (eyeball_left) +		{ +			num_indices += eyeball_left->render(mAdjustedPixelArea, TRUE, mIsDummy); +		} +		if(eyeball_right) +		{ +			num_indices += eyeball_right->render(mAdjustedPixelArea, TRUE, mIsDummy); +		}  	}  	if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction) @@ -4564,7 +4048,7 @@ void LLVOAvatar::updateTextures()  	mHasGrey = FALSE; // debug  	for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)  	{ -		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index); +		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index);  		U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);  		const LLTextureEntry *te = getTE(texture_index); @@ -4587,7 +4071,7 @@ void LLVOAvatar::updateTextures()  			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE);  			if (imagep)  			{ -				const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture_index); +				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index);  				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;  				if (texture_dict->mIsLocalTexture)  				{ @@ -4603,6 +4087,7 @@ void LLVOAvatar::updateTextures()  			if (isIndexBakedTexture((ETextureIndex)texture_index)  				&& imagep->getID() != IMG_DEFAULT_AVATAR  				&& imagep->getID() != IMG_INVISIBLE +				&& !isUsingServerBakes()   				&& !imagep->getTargetHost().isOk())  			{  				LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture " @@ -4697,7 +4182,10 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel  	//the texture pipeline will stop fetching this texture.  	imagep->resetTextureStats(); -	imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. +	// TODO: currently default to HTTP texture and fall back to UDP if cannot be found there. +	// Once server messaging is in place, we should call setCanUseHTTP(false) for old style +	// appearance requests +	imagep->setCanUseHTTP(true);  	imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL);  	imagep->resetMaxVirtualSizeResetCounter() ; @@ -4706,7 +4194,7 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel  	imagep->addTextureStats(pixel_area / texel_area_ratio);  	imagep->setBoostLevel(boost_level); -	if(boost_level != LLViewerTexture::BOOST_AVATAR_BAKED_SELF) +	if(boost_level != LLGLTexture::BOOST_AVATAR_BAKED_SELF)  	{  		imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ;  	} @@ -4739,6 +4227,28 @@ void LLVOAvatar::setTexEntry(const U8 index, const LLTextureEntry &te)  	setTE(index, te);  } +const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid) +{ +	std::string url = ""; +	if (isUsingServerBakes()) +	{ +		if (gSavedSettings.getString("AgentAppearanceServiceURL").empty()) +		{ +			// Probably a server-side issue if we get here: +			llwarns << "AgentAppearanceServiceURL not set - Baked texture requests will fail" << llendl; +			return url; +		} +	 +		const LLAvatarAppearanceDictionary::TextureEntry* texture_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)te); +		if (texture_entry != NULL) +		{ +			url = gSavedSettings.getString("AgentAppearanceServiceURL") + "texture/" + getID().asString() + "/" + texture_entry->mDefaultImageName + "/" + uuid.asString(); +			//llinfos << "baked texture url: " << url << llendl; +		} +	} +	return url; +} +  //-----------------------------------------------------------------------------  // resolveHeight()  //----------------------------------------------------------------------------- @@ -5086,48 +4596,6 @@ void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id)  }  //----------------------------------------------------------------------------- -// getVolumePos() -//----------------------------------------------------------------------------- -LLVector3 LLVOAvatar::getVolumePos(S32 joint_index, LLVector3& volume_offset) -{ -	if (joint_index > mNumCollisionVolumes) -	{ -		return LLVector3::zero; -	} - -	return mCollisionVolumes[joint_index].getVolumePos(volume_offset); -} - -//----------------------------------------------------------------------------- -// findCollisionVolume() -//----------------------------------------------------------------------------- -LLJoint* LLVOAvatar::findCollisionVolume(U32 volume_id) -{ -	if ((S32)volume_id > mNumCollisionVolumes) -	{ -		return NULL; -	} -	 -	return &mCollisionVolumes[volume_id]; -} - -//----------------------------------------------------------------------------- -// findCollisionVolume() -//----------------------------------------------------------------------------- -S32 LLVOAvatar::getCollisionVolumeID(std::string &name) -{ -	for (S32 i = 0; i < mNumCollisionVolumes; i++) -	{ -		if (mCollisionVolumes[i].getName() == name) -		{ -			return i; -		} -	} - -	return -1; -} - -//-----------------------------------------------------------------------------  // addDebugText()  //-----------------------------------------------------------------------------  void LLVOAvatar::addDebugText(const std::string& text) @@ -5156,7 +4624,7 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )  	if (iter == mJointMap.end() || iter->second == NULL)  	{ //search for joint and cache found joint in lookup table -		jointp = mRoot.findJoint(name); +		jointp = mRoot->findJoint(name);  		mJointMap[name] = jointp;  	}  	else @@ -5172,10 +4640,12 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )  //-----------------------------------------------------------------------------  void LLVOAvatar::resetJointPositions( void )  { -	for(S32 i = 0; i < (S32)mNumJoints; ++i) +	avatar_joint_list_t::iterator iter = mSkeleton.begin(); +	avatar_joint_list_t::iterator end  = mSkeleton.end(); +	for (; iter != end; ++iter)  	{ -		mSkeleton[i].restoreOldXform(); -		mSkeleton[i].setId( LLUUID::null ); +		(*iter)->restoreOldXform(); +		(*iter)->setId( LLUUID::null );  	}  	mHasPelvisOffset = false;  	mPelvisFixup	 = mLastPelvisFixup; @@ -5185,7 +4655,7 @@ void LLVOAvatar::resetJointPositions( void )  //-----------------------------------------------------------------------------  void LLVOAvatar::resetSpecificJointPosition( const std::string& name )  { -	LLJoint* pJoint = mRoot.findJoint( name ); +	LLJoint* pJoint = mRoot->findJoint( name );  	if ( pJoint  && pJoint->doesJointNeedToBeReset() )  	{ @@ -5207,16 +4677,17 @@ void LLVOAvatar::resetSpecificJointPosition( const std::string& name )  //-----------------------------------------------------------------------------  void LLVOAvatar::resetJointPositionsToDefault( void )  { -  	//Subsequent joints are relative to pelvis -	for( S32 i = 0; i < (S32)mNumJoints; ++i ) +	avatar_joint_list_t::iterator iter = mSkeleton.begin(); +	avatar_joint_list_t::iterator end  = mSkeleton.end(); +	for (; iter != end; ++iter)  	{ -		LLJoint* pJoint = (LLJoint*)&mSkeleton[i]; +		LLJoint* pJoint = (*iter);  		if ( pJoint->doesJointNeedToBeReset() )  		{ -  			pJoint->setId( LLUUID::null );  			//restore joints to default positions, however skip over the pelvis +			// *TODO: How does this pointer check skip over pelvis?  			if ( pJoint )  			{  				pJoint->restoreOldXform(); @@ -5315,23 +4786,6 @@ F32 LLVOAvatar::getPixelArea() const  } -//----------------------------------------------------------------------------- -// LLVOAvatar::getHeadMesh() -//----------------------------------------------------------------------------- -LLPolyMesh*	LLVOAvatar::getHeadMesh() -{ -	return mMeshLOD[MESH_ID_HEAD]->mMeshParts[0]->getMesh(); -} - - -//----------------------------------------------------------------------------- -// LLVOAvatar::getUpperBodyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh*	LLVOAvatar::getUpperBodyMesh() -{ -	return mMeshLOD[MESH_ID_UPPER_BODY]->mMeshParts[0]->getMesh(); -} -  //-----------------------------------------------------------------------------  // LLVOAvatar::getPosGlobalFromAgent() @@ -5349,61 +4803,6 @@ LLVector3	LLVOAvatar::getPosAgentFromGlobal(const LLVector3d &position)  	return gAgent.getPosAgentFromGlobal(position);  } -//----------------------------------------------------------------------------- -// allocateCharacterJoints() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::allocateCharacterJoints( U32 num ) -{ -	deleteAndClearArray(mSkeleton); -	mNumJoints = 0; - -	mSkeleton = new LLViewerJoint[num]; -	 -	for(S32 joint_num = 0; joint_num < (S32)num; joint_num++) -	{ -		mSkeleton[joint_num].setJointNum(joint_num); -	} - -	if (!mSkeleton) -	{ -		return FALSE; -	} - -	mNumJoints = num; -	return TRUE; -} - -//----------------------------------------------------------------------------- -// allocateCollisionVolumes() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::allocateCollisionVolumes( U32 num ) -{ -	deleteAndClearArray(mCollisionVolumes); -	mNumCollisionVolumes = 0; - -	mCollisionVolumes = new LLViewerJointCollisionVolume[num]; -	if (!mCollisionVolumes) -	{ -		return FALSE; -	} - -	mNumCollisionVolumes = num; -	return TRUE; -} - - -//----------------------------------------------------------------------------- -// getCharacterJoint() -//----------------------------------------------------------------------------- -LLJoint *LLVOAvatar::getCharacterJoint( U32 num ) -{ -	if ((S32)num >= mNumJoints  -	    || (S32)num < 0) -	{ -		return NULL; -	} -	return (LLJoint*)&mSkeleton[num]; -}  //-----------------------------------------------------------------------------  // requestStopMotion() @@ -5415,215 +4814,24 @@ void LLVOAvatar::requestStopMotion( LLMotion* motion )  }  //----------------------------------------------------------------------------- -// loadAvatar() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_LOAD_AVATAR("Load Avatar"); - -BOOL LLVOAvatar::loadAvatar() -{ -// 	LLFastTimer t(FTM_LOAD_AVATAR); -	 -	// avatar_skeleton.xml -	if( !buildSkeleton(sAvatarSkeletonInfo) ) -	{ -		llwarns << "avatar file: buildSkeleton() failed" << llendl; -		return FALSE; -	} - -	// avatar_lad.xml : <skeleton> -	if( !loadSkeletonNode() ) -	{ -		llwarns << "avatar file: loadNodeSkeleton() failed" << llendl; -		return FALSE; -	} -	 -	// avatar_lad.xml : <mesh> -	if( !loadMeshNodes() ) -	{ -		llwarns << "avatar file: loadNodeMesh() failed" << llendl; -		return FALSE; -	} -	 -	// avatar_lad.xml : <global_color> -	if( sAvatarXmlInfo->mTexSkinColorInfo ) -	{ -		mTexSkinColor = new LLTexGlobalColor( this ); -		if( !mTexSkinColor->setInfo( sAvatarXmlInfo->mTexSkinColorInfo ) ) -		{ -			llwarns << "avatar file: mTexSkinColor->setInfo() failed" << llendl; -			return FALSE; -		} -	} -	else -	{ -		llwarns << "<global_color> name=\"skin_color\" not found" << llendl; -		return FALSE; -	} -	if( sAvatarXmlInfo->mTexHairColorInfo ) -	{ -		mTexHairColor = new LLTexGlobalColor( this ); -		if( !mTexHairColor->setInfo( sAvatarXmlInfo->mTexHairColorInfo ) ) -		{ -			llwarns << "avatar file: mTexHairColor->setInfo() failed" << llendl; -			return FALSE; -		} -	} -	else -	{ -		llwarns << "<global_color> name=\"hair_color\" not found" << llendl; -		return FALSE; -	} -	if( sAvatarXmlInfo->mTexEyeColorInfo ) -	{ -		mTexEyeColor = new LLTexGlobalColor( this ); -		if( !mTexEyeColor->setInfo( sAvatarXmlInfo->mTexEyeColorInfo ) ) -		{ -			llwarns << "avatar file: mTexEyeColor->setInfo() failed" << llendl; -			return FALSE; -		} -	} -	else -	{ -		llwarns << "<global_color> name=\"eye_color\" not found" << llendl; -		return FALSE; -	} -	 -	// avatar_lad.xml : <layer_set> -	if (sAvatarXmlInfo->mLayerInfoList.empty()) -	{ -		llwarns << "avatar file: missing <layer_set> node" << llendl; -		return FALSE; -	} - -	if (sAvatarXmlInfo->mMorphMaskInfoList.empty()) -	{ -		llwarns << "avatar file: missing <morph_masks> node" << llendl; -		return FALSE; -	} - -	// avatar_lad.xml : <morph_masks> -	for (LLVOAvatarXmlInfo::morph_info_list_t::iterator iter = sAvatarXmlInfo->mMorphMaskInfoList.begin(); -		 iter != sAvatarXmlInfo->mMorphMaskInfoList.end(); -		 ++iter) -	{ -		LLVOAvatarXmlInfo::LLVOAvatarMorphInfo *info = *iter; - -		EBakedTextureIndex baked = LLVOAvatarDictionary::findBakedByRegionName(info->mRegion);  -		if (baked != BAKED_NUM_INDICES) -		{ -			LLPolyMorphTarget *morph_param; -			const std::string *name = &info->mName; -			morph_param = (LLPolyMorphTarget *)(getVisualParam(name->c_str())); -			if (morph_param) -			{ -				BOOL invert = info->mInvert; -				addMaskedMorph(baked, morph_param, invert, info->mLayer); -			} -		} - -	} - -	loadLayersets();	 -	 -	// avatar_lad.xml : <driver_parameters> -	for (LLVOAvatarXmlInfo::driver_info_list_t::iterator iter = sAvatarXmlInfo->mDriverInfoList.begin(); -		 iter != sAvatarXmlInfo->mDriverInfoList.end();  -		 ++iter) -	{ -		LLDriverParamInfo *info = *iter; -		LLDriverParam* driver_param = new LLDriverParam( this ); -		if (driver_param->setInfo(info)) -		{ -			addVisualParam( driver_param ); -			LLVisualParam*(LLVOAvatar::*avatar_function)(S32)const = &LLVOAvatar::getVisualParam;  -			if( !driver_param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatar*)this,_1 ), false)) -			{ -				llwarns << "could not link driven params for avatar " << this->getFullname() << " id: " << driver_param->getID() << llendl; -				continue; -			} -		} -		else -		{ -			delete driver_param; -			llwarns << "avatar file: driver_param->parseData() failed" << llendl; -			return FALSE; -		} -	} - -	 -	return TRUE; -} - -//-----------------------------------------------------------------------------  // loadSkeletonNode(): loads <skeleton> node from XML tree  //----------------------------------------------------------------------------- +//virtual  BOOL LLVOAvatar::loadSkeletonNode ()  { -	mRoot.addChild( &mSkeleton[0] ); - -	for (std::vector<LLViewerJoint *>::iterator iter = mMeshLOD.begin(); -		 iter != mMeshLOD.end();  -		 ++iter) +	if (!LLAvatarAppearance::loadSkeletonNode())  	{ -		LLViewerJoint *joint = (LLViewerJoint *) *iter; -		joint->mUpdateXform = FALSE; -		joint->setMeshesToChildren(); -	} - -	mRoot.addChild(mMeshLOD[MESH_ID_HEAD]); -	mRoot.addChild(mMeshLOD[MESH_ID_EYELASH]); -	mRoot.addChild(mMeshLOD[MESH_ID_UPPER_BODY]); -	mRoot.addChild(mMeshLOD[MESH_ID_LOWER_BODY]); -	mRoot.addChild(mMeshLOD[MESH_ID_SKIRT]); -	mRoot.addChild(mMeshLOD[MESH_ID_HEAD]); - -	LLViewerJoint *skull = (LLViewerJoint*)mRoot.findJoint("mSkull"); -	if (skull) -	{ -		skull->addChild(mMeshLOD[MESH_ID_HAIR] ); -	} - -	LLViewerJoint *eyeL = (LLViewerJoint*)mRoot.findJoint("mEyeLeft"); -	if (eyeL) -	{ -		eyeL->addChild( mMeshLOD[MESH_ID_EYEBALL_LEFT] ); -	} - -	LLViewerJoint *eyeR = (LLViewerJoint*)mRoot.findJoint("mEyeRight"); -	if (eyeR) -	{ -		eyeR->addChild( mMeshLOD[MESH_ID_EYEBALL_RIGHT] ); +		return FALSE;  	} -	// SKELETAL DISTORTIONS -	{ -		LLVOAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter; -		for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin(); -			 iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end();  -			 ++iter) -		{ -			LLPolySkeletalDistortionInfo *info = *iter; -			LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this); -			if (!param->setInfo(info)) -			{ -				delete param; -				return FALSE; -			} -			else -			{ -				addVisualParam(param); -			}				 -		} -	} -	  	// ATTACHMENTS  	{ -		LLVOAvatarXmlInfo::attachment_info_list_t::iterator iter; +		LLAvatarXmlInfo::attachment_info_list_t::iterator iter;  		for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin();  			 iter != sAvatarXmlInfo->mAttachmentInfoList.end();   			 ++iter)  		{ -			LLVOAvatarXmlInfo::LLVOAvatarAttachmentInfo *info = *iter; +			LLAvatarXmlInfo::LLAvatarAttachmentInfo *info = *iter;  			if (!isSelf() && info->mJointName == "mScreen")  			{ //don't process screen joint for other avatars  				continue; @@ -5696,144 +4904,6 @@ BOOL LLVOAvatar::loadSkeletonNode ()  }  //----------------------------------------------------------------------------- -// loadMeshNodes(): loads <mesh> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::loadMeshNodes() -{ -	for (LLVOAvatarXmlInfo::mesh_info_list_t::const_iterator meshinfo_iter = sAvatarXmlInfo->mMeshInfoList.begin(); -		 meshinfo_iter != sAvatarXmlInfo->mMeshInfoList.end();  -		 ++meshinfo_iter) -	{ -		const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo *info = *meshinfo_iter; -		const std::string &type = info->mType; -		S32 lod = info->mLOD; - -		LLViewerJointMesh* mesh = NULL; -		U8 mesh_id = 0; -		BOOL found_mesh_id = FALSE; - -		/* if (type == "hairMesh") -			switch(lod) -			  case 0: -				mesh = &mHairMesh0; */ -		for (LLVOAvatarDictionary::Meshes::const_iterator mesh_iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); -			 mesh_iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); -			 ++mesh_iter) -		{ -			const EMeshIndex mesh_index = mesh_iter->first; -			const LLVOAvatarDictionary::MeshEntry *mesh_dict = mesh_iter->second; -			if (type.compare(mesh_dict->mName) == 0) -			{ -				mesh_id = mesh_index; -				found_mesh_id = TRUE; -				break; -			} -		} - -		if (found_mesh_id) -		{ -			if (lod < (S32)mMeshLOD[mesh_id]->mMeshParts.size()) -			{ -				mesh = mMeshLOD[mesh_id]->mMeshParts[lod]; -			} -			else -			{ -				llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl; -				return FALSE; -			} -		} -		else  -		{ -			llwarns << "Ignoring unrecognized mesh type: " << type << llendl; -			return FALSE; -		} - -		//	llinfos << "Parsing mesh data for " << type << "..." << llendl; - -		// If this isn't set to white (1.0), avatars will *ALWAYS* be darker than their surroundings. -		// Do not touch!!! -		mesh->setColor( 1.0f, 1.0f, 1.0f, 1.0f ); - -		LLPolyMesh *poly_mesh = NULL; - -		if (!info->mReferenceMeshName.empty()) -		{ -			polymesh_map_t::const_iterator polymesh_iter = mMeshes.find(info->mReferenceMeshName); -			if (polymesh_iter != mMeshes.end()) -			{ -				poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName, polymesh_iter->second); -				poly_mesh->setAvatar(this); -			} -			else -			{ -				// This should never happen -				LL_WARNS("Avatar") << "Could not find avatar mesh: " << info->mReferenceMeshName << LL_ENDL; -			} -		} -		else -		{ -			poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName); -			poly_mesh->setAvatar(this); -		} - -		if( !poly_mesh ) -		{ -			llwarns << "Failed to load mesh of type " << type << llendl; -			return FALSE; -		} - -		// Multimap insert -		mMeshes.insert(std::make_pair(info->mMeshFileName, poly_mesh)); -	 -		mesh->setMesh( poly_mesh ); -		mesh->setLOD( info->mMinPixelArea ); - -		for (LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_list_t::const_iterator xmlinfo_iter = info->mPolyMorphTargetInfoList.begin(); -			 xmlinfo_iter != info->mPolyMorphTargetInfoList.end();  -			 ++xmlinfo_iter) -		{ -			const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_pair_t *info_pair = &(*xmlinfo_iter); -			LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh()); -			if (!param->setInfo(info_pair->first)) -			{ -				delete param; -				return FALSE; -			} -			else -			{ -				if (info_pair->second) -				{ -					addSharedVisualParam(param); -				} -				else -				{ -					addVisualParam(param); -				} -			}				 -		} -	} - -	return TRUE; -} - -//----------------------------------------------------------------------------- -// loadLayerSets() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::loadLayersets() -{ -	BOOL success = TRUE; -	for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator layerset_iter = sAvatarXmlInfo->mLayerInfoList.begin(); -		 layerset_iter != sAvatarXmlInfo->mLayerInfoList.end();  -		 ++layerset_iter) -	{ -		// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such. -		LLTexLayerSetInfo *layerset_info = *layerset_iter; -		layerset_info->createVisualParams(this); -	} -	return success; -} - -//-----------------------------------------------------------------------------  // updateVisualParams()  //-----------------------------------------------------------------------------  void LLVOAvatar::updateVisualParams() @@ -5846,7 +4916,7 @@ void LLVOAvatar::updateVisualParams()  	{  		computeBodySize();  		mLastSkeletonSerialNum = mSkeletonSerialNum; -		mRoot.updateWorldMatrixChildren(); +		mRoot->updateWorldMatrixChildren();  	}  	dirtyMesh(); @@ -5936,7 +5006,12 @@ BOOL LLVOAvatar::updateJointLODs()  		}  		// now select meshes to render based on adjusted pixel area -		BOOL res = mRoot.updateLOD(mAdjustedPixelArea, TRUE); +		LLViewerJoint* root = dynamic_cast<LLViewerJoint*>(mRoot); +		BOOL res = FALSE; +		if (root) +		{ +			res = root->updateLOD(mAdjustedPixelArea, TRUE); +		}   		if (res)  		{  			sNumLODChangesThisFrame++; @@ -6026,6 +5101,15 @@ void LLVOAvatar::dirtyMesh(S32 priority)  {  	mDirtyMesh = llmax(mDirtyMesh, priority);  } + +//----------------------------------------------------------------------------- +// getViewerJoint() +//----------------------------------------------------------------------------- +LLViewerJoint*	LLVOAvatar::getViewerJoint(S32 idx) +{ +	return dynamic_cast<LLViewerJoint*>(mMeshLOD[idx]); +} +  //-----------------------------------------------------------------------------  // hideSkirt()  //----------------------------------------------------------------------------- @@ -6339,9 +5423,9 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)  	// Notice that removing sitDown() from here causes avatars sitting on  	// objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655.  	sitDown(TRUE); -	mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject -	mRoot.setPosition(getPosition()); -	mRoot.updateWorldMatrixChildren(); +	mRoot->getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject +	mRoot->setPosition(getPosition()); +	mRoot->updateWorldMatrixChildren();  	stopMotion(ANIM_AGENT_BODY_NOISE); @@ -6387,10 +5471,10 @@ void LLVOAvatar::getOffObject()  	sitDown(FALSE); -	mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject -	mRoot.setPosition(cur_position_world); -	mRoot.setRotation(cur_rotation_world); -	mRoot.getXform()->update(); +	mRoot->getXform()->setParent(NULL); // LLVOAvatar::getOffObject +	mRoot->setPosition(cur_position_world); +	mRoot->setRotation(cur_rotation_world); +	mRoot->getXform()->update();  	startMotion(ANIM_AGENT_BODY_NOISE); @@ -6442,27 +5526,54 @@ S32 LLVOAvatar::getAttachmentCount()  	return count;  } -LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const +BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const  { -	if (color_name=="skin_color" && mTexSkinColor) -	{ -		return mTexSkinColor->getColor(); -	} -	else if(color_name=="hair_color" && mTexHairColor) +	if (mIsDummy) return TRUE; + +	if (isSelf())  	{ -		return mTexHairColor->getColor(); +		return LLAvatarAppearance::isWearingWearableType(type);  	} -	if(color_name=="eye_color" && mTexEyeColor) + +	switch(type)  	{ -		return mTexEyeColor->getColor(); +		case LLWearableType::WT_SHAPE: +		case LLWearableType::WT_SKIN: +		case LLWearableType::WT_HAIR: +		case LLWearableType::WT_EYES: +			return TRUE;  // everyone has all bodyparts +		default: +			break; // Do nothing  	} -	else + +	/* switch(type) +		case LLWearableType::WT_SHIRT: +			indicator_te = TEX_UPPER_SHIRT; */ +	for (LLAvatarAppearanceDictionary::Textures::const_iterator tex_iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 tex_iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +		 ++tex_iter)  	{ -//		return LLColor4( .5f, .5f, .5f, .5f ); -		return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = tex_iter->second; +		if (texture_dict->mWearableType == type) +		{ +			// If you're checking another avatar's clothing, you don't have component textures. +			// Thus, you must check to see if the corresponding baked texture is defined. +			// NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing +			// this works for detecting a skirt (most important), but is ineffective at any piece of clothing that +			// gets baked into a texture that always exists (upper or lower). +			if (texture_dict->mIsUsedByBakedTexture) +			{ +				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; +				return isTextureDefined(LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); +			} +			return FALSE; +		}  	} +	return FALSE;  } + +  // virtual  void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )  { @@ -6472,6 +5583,7 @@ void LLVOAvatar::invalidateAll()  {  } +// virtual  void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )  {  	if (global_color == mTexSkinColor) @@ -6490,9 +5602,15 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL  		if (!isTextureDefined(mBakedTextureDatas[BAKED_HAIR].mTextureIndex))  		{  			LLColor4 color = mTexHairColor->getColor(); -			for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) +			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin(); +			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end(); +			for (; iter != end; ++iter)  			{ -				mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh) +				{ +					mesh->setColor( color ); +				}  			}  		}  	}  @@ -6667,24 +5785,46 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const  	return mMotionController.findMotion(id);  } +void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) +{ +	if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +	{ +		avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +		avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +		for (; iter != end; ++iter) +		{ +			LLAvatarJointMesh* mesh = (*iter); +			if (mesh) +			{ +				{ +					mesh->setColor(color); +				} +			} +		} +	} +} +  //-----------------------------------------------------------------------------  // updateMeshTextures()  // Uses the current TE values to set the meshes' and layersets' textures.  //----------------------------------------------------------------------------- +// virtual  void LLVOAvatar::updateMeshTextures()  { -    // llinfos << "updateMeshTextures" << llendl; +	mBakedTextureDebugText.clear(); +	  	// if user has never specified a texture, assign the default  	for (U32 i=0; i < getNumTEs(); i++)  	{  		const LLViewerTexture* te_image = getImage(i, 0);  		if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT))  		{ -			setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered. +			// IMG_DEFAULT_AVATAR = a special texture that's never rendered. +			const LLUUID& image_id = (i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR); +			setImage(i, LLViewerTextureManager::getFetchedTexture(image_id), 0);   		}  	} -	const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures  	const BOOL other_culled = !isSelf() && mCulled;  	LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ;  	BOOL paused = FALSE; @@ -6700,71 +5840,115 @@ void LLVOAvatar::updateMeshTextures()  	std::vector<BOOL> use_lkg_baked_layer; // lkg = "last known good"  	use_lkg_baked_layer.resize(mBakedTextureDatas.size(), false); +	mBakedTextureDebugText +=          "indx layerset linvld ltda ilb ulkg ltid\n";  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{  		is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex); - +		LLViewerTexLayerSet* layerset = NULL; +		bool layerset_invalid = false;  		if (!other_culled)  		{  			// When an avatar is changing clothes and not in Appearance mode, -			// use the last-known good baked texture until it finish the first +			// use the last-known good baked texture until it finishes the first  			// render of the new layerset. -			const BOOL layerset_invalid = mBakedTextureDatas[i].mTexLayerSet  -										  && ( !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized() -										  || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() ); +			layerset = getTexLayerSet(i); +			layerset_invalid = layerset && ( !layerset->getViewerComposite()->isInitialized() +											 || !layerset->isLocalTextureDataAvailable() );  			use_lkg_baked_layer[i] = (!is_layer_baked[i]  -									  && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR)  +									  && (mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR)   									  && layerset_invalid);  			if (use_lkg_baked_layer[i])  			{ -				mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); +				layerset->setUpdatesEnabled(TRUE);  			}  		}  		else  		{  			use_lkg_baked_layer[i] = (!is_layer_baked[i]  -									  && mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR); -			if (mBakedTextureDatas[i].mTexLayerSet) -			{ -				mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); -			} +									  && mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR);  		} -	} - -	// Turn on alpha masking correctly for yourself and other avatars on 1.23+ -	mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; - -	// Baked textures should be requested from the sim this avatar is on. JC -	const LLHost target_host = getObjectHost(); -	if (!target_host.isOk()) -	{ -		llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl; +		std::string last_id_string; +		if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT_AVATAR) +			last_id_string = "A"; +		else if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT) +			last_id_string = "D"; +		else +			last_id_string = "*"; +		bool is_ltda = layerset +			&& layerset->getViewerComposite()->isInitialized() +			&& layerset->isLocalTextureDataAvailable(); +		mBakedTextureDebugText += llformat("%4d   %4s     %4d %4d %4d %4d %4s\n", +										   i, +										   (layerset?"*":"0"), +										   layerset_invalid, +										   is_ltda, +										   is_layer_baked[i], +										   use_lkg_baked_layer[i], +										   last_id_string.c_str());  	}  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{ -		if (use_lkg_baked_layer[i] && !self_customizing ) +		debugColorizeSubMeshes(i, LLColor4::white); + +		LLViewerTexLayerSet* layerset = getTexLayerSet(i); +		if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() )  		{ -			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host ); +			LLViewerFetchedTexture* baked_img; +#ifndef LL_RELEASE_FOR_DOWNLOAD +			LLViewerFetchedTexture* existing_baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID); +#endif +			const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureID); +			if (!url.empty()) +			{ +				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureID); +			} +			else +			{ +				// Baked textures should be requested from the sim this avatar is on. JC +				const LLHost target_host = getObjectHost(); +				if (!target_host.isOk()) +				{ +					llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl; +				} + +				baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureID, target_host ); +			} +			llassert(baked_img == existing_baked_img); +  			mBakedTextureDatas[i].mIsUsed = TRUE; -			for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + +			debugColorizeSubMeshes(i,LLColor4::red); + +			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +			for (; iter != end; ++iter)  			{ -				mBakedTextureDatas[i].mMeshes[k]->setTexture( baked_img ); +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh) +				{ +					mesh->setTexture( baked_img ); +				}  			}  		} -		else if (!self_customizing && is_layer_baked[i]) +		else if (!isUsingLocalAppearance() && is_layer_baked[i])  		{ -			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; -			if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex ) +			LLViewerFetchedTexture* baked_img = +				LLViewerTextureManager::staticCastToFetchedTexture( +					getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; +			if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureID )  			{ -				// Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing). +				// Even though the file may not be finished loading, +				// we'll consider it loaded and use it (rather than +				// doing compositing).  				useBakedTexture( baked_img->getID() );  			}  			else  			{  				mBakedTextureDatas[i].mIsLoaded = FALSE; -				if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) +				if ( (baked_img->getID() != IMG_INVISIBLE) && +					 ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )  				{			  					baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),   						src_callback_list, paused);	 @@ -6773,40 +5957,59 @@ void LLVOAvatar::updateMeshTextures()  					src_callback_list, paused );  			}  		} -		else if (mBakedTextureDatas[i].mTexLayerSet  -				 && !other_culled)  +		else if (layerset && isUsingLocalAppearance())  		{ -			mBakedTextureDatas[i].mTexLayerSet->createComposite(); -			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); +			debugColorizeSubMeshes(i,LLColor4::yellow ); + +			layerset->createComposite(); +			layerset->setUpdatesEnabled( TRUE );  			mBakedTextureDatas[i].mIsUsed = FALSE; -			for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + +			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +			for (; iter != end; ++iter)  			{ -				mBakedTextureDatas[i].mMeshes[k]->setLayerSet( mBakedTextureDatas[i].mTexLayerSet ); +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh) +				{ +					mesh->setLayerSet( layerset ); +				}  			}  		} +		else +		{ +			debugColorizeSubMeshes(i,LLColor4::blue); +		}  	}  	// set texture and color of hair manually if we are not using a baked image.  	// This can happen while loading hair for yourself, or for clients that did not  	// bake a hair texture. Still needed for yourself after 1.22 is depricated. -	if (!is_layer_baked[BAKED_HAIR] || self_customizing) +	if (!is_layer_baked[BAKED_HAIR] || isEditingAppearance())  	{  		const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);  		LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 ); -		for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) +		avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin(); +		avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end(); +		for (; iter != end; ++iter)  		{ -			mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); -			mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setTexture( hair_img ); +			LLAvatarJointMesh* mesh = (*iter); +			if (mesh) +			{ +				mesh->setColor( color ); +				mesh->setTexture( hair_img ); +			}  		}  	}  -	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = +			 LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first; -		const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second;  		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  			 local_tex_iter != baked_dict->mLocalTextures.end(); @@ -6834,7 +6037,7 @@ void LLVOAvatar::setLocalTexture( ETextureIndex type, LLViewerTexture* in_tex, B  }  //virtual  -void LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) +void LLVOAvatar::setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)  {  	// invalid for anyone but self  	llassert(0); @@ -6869,18 +6072,30 @@ void LLVOAvatar::clearChat()  	mChats.clear();  } -// adds a morph mask to the appropriate baked texture structure -void LLVOAvatar::addMaskedMorph(EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer) + +void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index)  { -	if (index < BAKED_NUM_INDICES) +	if (index >= BAKED_NUM_INDICES)  	{ -		LLMaskedMorph *morph = new LLMaskedMorph(morph_target, invert, layer); -		mBakedTextureDatas[index].mMaskedMorphs.push_front(morph); +		llwarns << "invalid baked texture index passed to applyMorphMask" << llendl; +		return; +	} + +	for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin(); +		 iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) +	{ +		const LLMaskedMorph* maskedMorph = (*iter); +		LLPolyMorphTarget* morph_target = dynamic_cast<LLPolyMorphTarget*>(maskedMorph->mMorphTarget); +		if (morph_target) +		{ +			morph_target->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); +		}  	}  } +  // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise -BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index) +BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index)  {  	if (index >= BAKED_NUM_INDICES)  	{ @@ -6891,7 +6106,7 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde  	{  		if (isSelf())  		{ -			LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet; +			LLViewerTexLayerSet *layer_set = getTexLayerSet(index);  			if (layer_set)  			{  				return !layer_set->isMorphValid(); @@ -6906,23 +6121,6 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde  	return FALSE;  } -void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index) -{ -	if (index >= BAKED_NUM_INDICES) -	{ -		llwarns << "invalid baked texture index passed to applyMorphMask" << llendl; -		return; -	} - -	for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin(); -		 iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) -	{ -		const LLMaskedMorph* maskedMorph = (*iter); -		maskedMorph->mMorphTarget->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); -	} -} - -  //-----------------------------------------------------------------------------  // releaseComponentTextures()  // release any component texture UUIDs for which we have a baked texture @@ -6945,7 +6143,7 @@ void LLVOAvatar::releaseComponentTextures()  	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  	{ -		const LLVOAvatarDictionary::BakedEntry * bakedDicEntry = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +		const LLAvatarAppearanceDictionary::BakedEntry * bakedDicEntry = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);  		// skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID  		if (!isTextureDefined(bakedDicEntry->mTextureIndex)  			&& ( (baked_index != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) )) @@ -6961,120 +6159,14 @@ void LLVOAvatar::releaseComponentTextures()  	}  } -//static -BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name ) -{ -	switch( te ) -	{ -		case TEX_UPPER_SHIRT: -			param_name[0] = 803; //"shirt_red"; -			param_name[1] = 804; //"shirt_green"; -			param_name[2] = 805; //"shirt_blue"; -			break; - -		case TEX_LOWER_PANTS: -			param_name[0] = 806; //"pants_red"; -			param_name[1] = 807; //"pants_green"; -			param_name[2] = 808; //"pants_blue"; -			break; - -		case TEX_LOWER_SHOES: -			param_name[0] = 812; //"shoes_red"; -			param_name[1] = 813; //"shoes_green"; -			param_name[2] = 817; //"shoes_blue"; -			break; - -		case TEX_LOWER_SOCKS: -			param_name[0] = 818; //"socks_red"; -			param_name[1] = 819; //"socks_green"; -			param_name[2] = 820; //"socks_blue"; -			break; - -		case TEX_UPPER_JACKET: -		case TEX_LOWER_JACKET: -			param_name[0] = 834; //"jacket_red"; -			param_name[1] = 835; //"jacket_green"; -			param_name[2] = 836; //"jacket_blue"; -			break; - -		case TEX_UPPER_GLOVES: -			param_name[0] = 827; //"gloves_red"; -			param_name[1] = 829; //"gloves_green"; -			param_name[2] = 830; //"gloves_blue"; -			break; - -		case TEX_UPPER_UNDERSHIRT: -			param_name[0] = 821; //"undershirt_red"; -			param_name[1] = 822; //"undershirt_green"; -			param_name[2] = 823; //"undershirt_blue"; -			break; -	 -		case TEX_LOWER_UNDERPANTS: -			param_name[0] = 824; //"underpants_red"; -			param_name[1] = 825; //"underpants_green"; -			param_name[2] = 826; //"underpants_blue"; -			break; - -		case TEX_SKIRT: -			param_name[0] = 921; //"skirt_red"; -			param_name[1] = 922; //"skirt_green"; -			param_name[2] = 923; //"skirt_blue"; -			break; - -		case TEX_HEAD_TATTOO: -		case TEX_LOWER_TATTOO: -		case TEX_UPPER_TATTOO: -			param_name[0] = 1071; //"tattoo_red"; -			param_name[1] = 1072; //"tattoo_green"; -			param_name[2] = 1073; //"tattoo_blue"; -			break;	 - -		default: -			llassert(0); -			return FALSE; -	} - -	return TRUE; -} - -void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake ) -{ -	U32 param_name[3]; -	if( teToColorParams( te, param_name ) ) -	{ -		setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake ); -		setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake ); -		setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake ); -	} -} - -LLColor4 LLVOAvatar::getClothesColor( ETextureIndex te ) -{ -	LLColor4 color; -	U32 param_name[3]; -	if( teToColorParams( te, param_name ) ) -	{ -		color.mV[VX] = getVisualParamWeight( param_name[0] ); -		color.mV[VY] = getVisualParamWeight( param_name[1] ); -		color.mV[VZ] = getVisualParamWeight( param_name[2] ); -	} -	return color; -} - -// static -LLColor4 LLVOAvatar::getDummyColor() -{ -	return DUMMY_COLOR; -} -  void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const  {	  	LL_DEBUGS("Avatar") << avString() << (isSelf() ? "Self: " : "Other: ") << context << LL_ENDL; -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{ -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		// TODO: MULTI-WEARABLE: handle multiple textures for self  		const LLViewerTexture* te_image = getImage(iter->first,0);  		if( !te_image ) @@ -7100,48 +6192,6 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const  	}  } -// Unlike most wearable functions, this works for both self and other. -BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const -{ -	if (mIsDummy) return TRUE; - -	switch(type) -	{ -		case LLWearableType::WT_SHAPE: -		case LLWearableType::WT_SKIN: -		case LLWearableType::WT_HAIR: -		case LLWearableType::WT_EYES: -			return TRUE;  // everyone has all bodyparts -		default: -			break; // Do nothing -	} - -	/* switch(type) -		case LLWearableType::WT_SHIRT: -			indicator_te = TEX_UPPER_SHIRT; */ -	for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); -		 ++tex_iter) -	{ -		const LLVOAvatarDictionary::TextureEntry *texture_dict = tex_iter->second; -		if (texture_dict->mWearableType == type) -		{ -			// If you're checking another avatar's clothing, you don't have component textures. -			// Thus, you must check to see if the corresponding baked texture is defined. -			// NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing -			// this works for detecting a skirt (most important), but is ineffective at any piece of clothing that -			// gets baked into a texture that always exists (upper or lower). -			if (texture_dict->mIsUsedByBakedTexture) -			{ -				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; -				return isTextureDefined(LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); -			} -			return FALSE; -		} -	} -	return FALSE; -} -  //-----------------------------------------------------------------------------  // clampAttachmentPositions()  //----------------------------------------------------------------------------- @@ -7248,7 +6298,7 @@ void LLVOAvatar::onFirstTEMessageReceived()  			if (layer_baked)  			{  				LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; -				mBakedTextureDatas[i].mLastTextureIndex = image->getID(); +				mBakedTextureDatas[i].mLastTextureID = image->getID();  				// If we have more than one texture for the other baked layers, we'll want to call this for them too.  				if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )  				{ @@ -7300,18 +6350,87 @@ bool LLVOAvatar::visualParamWeightsAreDefault()  	return rtn;  } +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value) +{ +	std::string type_string = "unknown"; +	if (dynamic_cast<LLTexLayerParamAlpha*>(viewer_param)) +		type_string = "param_alpha"; +	if (dynamic_cast<LLTexLayerParamColor*>(viewer_param)) +		type_string = "param_color"; +	if (dynamic_cast<LLDriverParam*>(viewer_param)) +		type_string = "param_driver"; +	if (dynamic_cast<LLPolyMorphTarget*>(viewer_param)) +		type_string = "param_morph"; +	if (dynamic_cast<LLPolySkeletalDistortion*>(viewer_param)) +		type_string = "param_skeleton"; +	S32 wtype = -1; +	LLViewerVisualParam *vparam = dynamic_cast<LLViewerVisualParam*>(viewer_param); +	if (vparam) +	{ +		wtype = vparam->getWearableType(); +	} +	S32 u8_value = F32_to_U8(value,viewer_param->getMinWeight(),viewer_param->getMaxWeight()); +	apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\"/>\n", +					viewer_param->getID(), viewer_param->getName().c_str(), value, u8_value, type_string.c_str(), +					LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str() +//					param_location_name(vparam->getParamLocation()).c_str() +		); +} + + +void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, +										  const std::vector<F32>& params_for_dump, +										  const LLTEContents& tec) +{ +	std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml"); + +	LLAPRFile outfile; +	std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); +	outfile.open(fullpath, LL_APR_WB ); +	apr_file_t* file = outfile.getFileHandle(); +	if (!file) +	{ +		return; +	} +	else +	{ +		llinfos << "xmlfile write handle obtained : " << fullpath << llendl; +	} + + +	LLVisualParam* param = getFirstVisualParam(); +	for (S32 i = 0; i < params_for_dump.size(); i++) +	{ +		while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) // should not be any of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT +		{ +			param = getNextVisualParam(); +		} +		LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; +		F32 value = params_for_dump[i]; +		dump_visual_param(file, viewer_param, value); +		param = getNextVisualParam(); +	} +	for (U32 i = 0; i < tec.face_count; i++) +	{ +		std::string uuid_str; +		((LLUUID*)tec.image_data)[i].toString(uuid_str); +		apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", i, uuid_str.c_str()); +	} +}  //-----------------------------------------------------------------------------  // processAvatarAppearance()  //-----------------------------------------------------------------------------  void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  { +	bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); +	std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_"; +	if (enable_verbose_dumps) { dumpArchetypeXML(dump_prefix + "process_start"); }  	if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages"))  	{  		llwarns << "Blocking AvatarAppearance message" << llendl;  		return;  	} -	  	LLMemType mt(LLMemType::MTYPE_AVATAR);  	BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived; @@ -7321,32 +6440,68 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  			<< " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL; +	ESex old_sex = getSex(); + +	LLTEContents tec; +	parseTEMessage(mesgsys, _PREHASH_ObjectData, -1, tec); + +	U8 appearance_version = 0; +	S32 this_update_cof_version = LLViewerInventoryCategory::VERSION_UNKNOWN; +	S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion; +	// For future use: +	//U32 appearance_flags = 0; + +	if (mesgsys->has(_PREHASH_AppearanceData)) +	{ +		mesgsys->getU8Fast(_PREHASH_AppearanceData, _PREHASH_AppearanceVersion, appearance_version, 0); +		mesgsys->getS32Fast(_PREHASH_AppearanceData, _PREHASH_CofVersion, this_update_cof_version, 0); +		// For future use: +		//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0); +	} + +	// Only now that we have result of appearance_version can we decide whether to bail out.  	if( isSelf() )  	{ -		llwarns << avString() << "Received AvatarAppearance for self" << llendl; -		if( mFirstTEMessageReceived ) +		if (getRegion() && (getRegion()->getCentralBakeVersion()==0)) +		{ +			llwarns << avString() << "Received AvatarAppearance message for self in non-server-bake region" << llendl; +		} +		if( mFirstTEMessageReceived && (appearance_version == 0))  		{ -//			llinfos << "processAvatarAppearance end  " << mID << llendl;  			return;  		}  	} -	ESex old_sex = getSex(); -//	llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl; -//	dumpAvatarTEs( "PRE  processAvatarAppearance()" ); -	unpackTEMessage(mesgsys, _PREHASH_ObjectData); -//	dumpAvatarTEs( "POST processAvatarAppearance()" ); +	// Check for stale update. +	if (isSelf() +		&& (appearance_version>0) +		&& (this_update_cof_version < last_update_request_cof_version)) +	{ +		llwarns << "Stale appearance update, wanted version " << last_update_request_cof_version +				<< ", got " << this_update_cof_version << llendl; +		return; +	} + +	if (isSelf() && isEditingAppearance()) +	{ +		llinfos << "ignoring appearance message while in appearance edit" << llendl; +		return; +	} + +	mUseServerBakes = (appearance_version > 0); + +	applyParsedTEMessage(tec);  	// prevent the overwriting of valid baked textures with invalid baked textures  	for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)  	{  		if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex)  -			&& mBakedTextureDatas[baked_index].mLastTextureIndex != IMG_DEFAULT +			&& mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT  			&& baked_index != BAKED_SKIRT)  		{  			setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,  -				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  		}  	} @@ -7360,16 +6515,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	}  	setCompositeUpdatesEnabled( FALSE ); -	mMeshTexturesDirty = TRUE;  	gPipeline.markGLRebuild(this); -	// ! BACKWARDS COMPATIBILITY ! -	// Non-self avatars will no longer have component textures -	if (!isSelf()) -	{ -		releaseComponentTextures(); -	} -	  	// parse visual params  	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);  	bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing @@ -7387,6 +6534,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		}  		else  		{ +			std::vector<F32> params_for_dump;  			for( S32 i = 0; i < num_blocks; i++ )  			{  				while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) // should not be any of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT @@ -7403,6 +6551,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  				U8 value;  				mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i);  				F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight()); +				params_for_dump.push_back(newWeight);  				if (is_first_appearance_message || (param->getWeight() != newWeight))  				{ @@ -7420,8 +6569,12 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  				}  				param = getNextVisualParam();  			} +			if (enable_verbose_dumps) +				dumpAppearanceMsgParams(dump_prefix + "appearance_msg", params_for_dump, tec);  		} +		if (enable_verbose_dumps) { dumpArchetypeXML(dump_prefix + "process_post_set_weights"); } +  		const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT  		if (num_blocks != expected_tweakable_count)  		{ @@ -7479,6 +6632,14 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	// If all of the avatars are completely baked, release the global image caches to conserve memory.  	LLVOAvatar::cullAvatarsByPixelArea(); +	if (isSelf()) +	{ +		mUseLocalAppearance = false; +	} + +	updateMeshTextures(); + +	if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end");  //	llinfos << "processAvatarAppearance end " << mID << llendl;  } @@ -7553,12 +6714,12 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture  					 self->mBakedTextureDatas[BAKED_HEAD].mTexLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);  					 maskData->mLastDiscardLevel = discard_level; */  			BOOL found_texture_id = false; -			for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -				 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +			for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +				 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  				 ++iter)  			{ -				const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  				if (texture_dict->mIsUsedByBakedTexture)  				{  					const ETextureIndex texture_index = iter->first; @@ -7626,7 +6787,7 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,  									  LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src,  									  S32 discard_level, BOOL final, void* userdata)  { -	//llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl; +	// llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl;  	LLUUID id = src_vi->getID();  	LLUUID *avatar_idp = (LLUUID *)userdata; @@ -7657,12 +6818,6 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,  void LLVOAvatar::useBakedTexture( const LLUUID& id )  { -	 -	/* if(id == head_baked->getID()) -		 mHeadBakedLoaded = TRUE; -		 mLastHeadBakedID = id; -		 mHeadMesh0.setTexture( head_baked ); -		 mHeadMesh1.setTexture( head_baked ); */  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{  		LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 ); @@ -7670,17 +6825,31 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  		{  			LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL;  			mBakedTextureDatas[i].mIsLoaded = true; -			mBakedTextureDatas[i].mLastTextureIndex = id; +			mBakedTextureDatas[i].mLastTextureID = id;  			mBakedTextureDatas[i].mIsUsed = true; -			for (U32 k = 0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + +			if (isUsingLocalAppearance())  			{ -				mBakedTextureDatas[i].mMeshes[k]->setTexture( image_baked ); +				llinfos << "not changing to baked texture while isUsingLocalAppearance" << llendl;  			} -			if (mBakedTextureDatas[i].mTexLayerSet) +			else  			{ -				//mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); +				debugColorizeSubMeshes(i,LLColor4::green); + +				avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +				avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +				for (; iter != end; ++iter) +				{ +					LLAvatarJointMesh* mesh = (*iter); +					if (mesh) +					{ +						mesh->setTexture( image_baked ); +					} +				}  			} -			const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +			 +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = +				LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter) @@ -7693,9 +6862,15 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  			// This is paired with similar code in updateMeshTextures that sets hair mesh color.  			if (i == BAKED_HAIR)  			{ -				for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) +				avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +				avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +				for (; iter != end; ++iter)  				{ -					mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f ); +					LLAvatarJointMesh* mesh = (*iter); +					if (mesh) +					{ +						mesh->setColor( LLColor4::white ); +					}  				}  			}  		} @@ -7704,11 +6879,39 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  	dirtyMesh();  } -// static -void LLVOAvatar::dumpArchetypeXML( void* ) +std::string get_sequential_numbered_file_name(const std::string& prefix, +											  const std::string& suffix)  { +	typedef std::map<std::string,S32> file_num_type; +	static  file_num_type file_nums; +	file_num_type::iterator it = file_nums.find(prefix); +	S32 num = 0; +	if (it != file_nums.end()) +	{ +		num = it->second; +	} +	file_nums[prefix] = num+1; +	std::string outfilename = prefix + " " + llformat("%04d",num) + ".xml"; +	std::replace(outfilename.begin(),outfilename.end(),' ','_'); +	return outfilename; +} + +void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_wearables ) +{ +	std::string outprefix(prefix); +	if (outprefix.empty()) +	{ +		outprefix = getFullname() + (isSelf()?"_s":"_o"); +	} +	if (outprefix.empty()) +	{ +		outprefix = std::string("new_archetype"); +	} +	std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); +	  	LLAPRFile outfile; -	outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml"), LL_APR_WB ); +	std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); +	outfile.open(fullpath, LL_APR_WB );  	apr_file_t* file = outfile.getFileHandle();  	if (!file)  	{ @@ -7716,36 +6919,60 @@ void LLVOAvatar::dumpArchetypeXML( void* )  	}  	else  	{ -		llinfos << "xmlfile write handle obtained : " << gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml") << llendl; +		llinfos << "xmlfile write handle obtained : " << fullpath << llendl;  	}  	apr_file_printf( file, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n" );  	apr_file_printf( file, "<linden_genepool version=\"1.0\">\n" );  	apr_file_printf( file, "\n\t<archetype name=\"???\">\n" ); -	// only body parts, not clothing. -	for (S32 type = LLWearableType::WT_SHAPE; type <= LLWearableType::WT_EYES; type++) +	if (group_by_wearables)  	{ -		const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); -		apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); - -		for (LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam()) +		for (S32 type = LLWearableType::WT_SHAPE; type < LLWearableType::WT_COUNT; type++)  		{ -			LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; -			if( (viewer_param->getWearableType() == type) &&  -				(viewer_param->isTweakable() ) ) +			const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); +			apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); + +			for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) +			{ +				LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; +				if( (viewer_param->getWearableType() == type) &&  +					(viewer_param->isTweakable() ) ) +				{ +					dump_visual_param(file, viewer_param, viewer_param->getWeight()); +				} +			} + +			for (U8 te = 0; te < TEX_NUM_INDICES; te++)  			{ -				apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n", -								viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight()); +				if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) +				{ +					// MULTIPLE_WEARABLES: extend to multiple wearables? +					LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); +					if( te_image ) +					{ +						std::string uuid_str; +						te_image->getID().toString( uuid_str ); +						apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); +					} +				}  			}  		} +	} +	else  +	{ +		// Just dump all params sequentially. +		for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) +		{ +			LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; +			dump_visual_param(file, viewer_param, viewer_param->getWeight()); +		}  		for (U8 te = 0; te < TEX_NUM_INDICES; te++)  		{ -			if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type)  			{  				// MULTIPLE_WEARABLES: extend to multiple wearables? -				LLViewerTexture* te_image = ((LLVOAvatar *)(gAgentAvatarp))->getImage((ETextureIndex)te, 0); +				LLViewerTexture* te_image = getImage((ETextureIndex)te, 0);  				if( te_image )  				{  					std::string uuid_str; @@ -7754,14 +6981,18 @@ void LLVOAvatar::dumpArchetypeXML( void* )  				}  			}  		} +  	}  	apr_file_printf( file, "\t</archetype>\n" );  	apr_file_printf( file, "\n</linden_genepool>\n" ); -	//explictly close the file if it is still open which it should be -	if (file) + +	bool ultra_verbose = false; +	if (isSelf() && ultra_verbose)  	{ -		outfile.close(); +		// show the cloned params inside the wearables as well. +		gAgentAvatarp->dumpWearableInfo(outfile);  	} +	// File will close when handle goes out of scope  } @@ -7843,15 +7074,9 @@ void LLVOAvatar::cullAvatarsByPixelArea()  		}  	} -	// runway - this doesn't detect gray/grey state. -	// think we just need to be checking self av since it's the only -	// one with lltexlayer stuff. +	// runway - this doesn't really detect gray/grey state.  	S32 grey_avatars = 0; -	if (LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars)) -	{ -		LLVOAvatar::deleteCachedImages(false); -	} -	else +	if (!LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars))  	{  		if (gFrameTimeSeconds != sUnbakedUpdateTime) // only update once per frame  		{ @@ -7879,501 +7104,24 @@ void LLVOAvatar::startAppearanceAnimation()  	}  } -// virtual -void LLVOAvatar::removeMissingBakedTextures() -{	 -} - -//----------------------------------------------------------------------------- -// LLVOAvatarXmlInfo -//----------------------------------------------------------------------------- - -LLVOAvatar::LLVOAvatarXmlInfo::LLVOAvatarXmlInfo() -	: mTexSkinColorInfo(0), mTexHairColorInfo(0), mTexEyeColorInfo(0) -{ -} - -LLVOAvatar::LLVOAvatarXmlInfo::~LLVOAvatarXmlInfo() -{ -	std::for_each(mMeshInfoList.begin(), mMeshInfoList.end(), DeletePointer()); -	std::for_each(mSkeletalDistortionInfoList.begin(), mSkeletalDistortionInfoList.end(), DeletePointer());		 -	std::for_each(mAttachmentInfoList.begin(), mAttachmentInfoList.end(), DeletePointer()); -	deleteAndClear(mTexSkinColorInfo); -	deleteAndClear(mTexHairColorInfo); -	deleteAndClear(mTexEyeColorInfo); -	std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer());		 -	std::for_each(mDriverInfoList.begin(), mDriverInfoList.end(), DeletePointer()); -	std::for_each(mMorphMaskInfoList.begin(), mMorphMaskInfoList.end(), DeletePointer()); -} - -//----------------------------------------------------------------------------- -// LLVOAvatarBoneInfo::parseXml() -//----------------------------------------------------------------------------- -BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node) -{ -	if (node->hasName("bone")) -	{ -		mIsJoint = TRUE; -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -		if (!node->getFastAttributeString(name_string, mName)) -		{ -			llwarns << "Bone without name" << llendl; -			return FALSE; -		} -	} -	else if (node->hasName("collision_volume")) -	{ -		mIsJoint = FALSE; -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -		if (!node->getFastAttributeString(name_string, mName)) -		{ -			mName = "Collision Volume"; -		} -	} -	else -	{ -		llwarns << "Invalid node " << node->getName() << llendl; -		return FALSE; -	} - -	static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos"); -	if (!node->getFastAttributeVector3(pos_string, mPos)) -	{ -		llwarns << "Bone without position" << llendl; -		return FALSE; -	} - -	static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot"); -	if (!node->getFastAttributeVector3(rot_string, mRot)) -	{ -		llwarns << "Bone without rotation" << llendl; -		return FALSE; -	} -	 -	static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); -	if (!node->getFastAttributeVector3(scale_string, mScale)) -	{ -		llwarns << "Bone without scale" << llendl; -		return FALSE; -	} - -	if (mIsJoint) -	{ -		static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot"); -		if (!node->getFastAttributeVector3(pivot_string, mPivot)) -		{ -			llwarns << "Bone without pivot" << llendl; -			return FALSE; -		} -	} - -	// parse children -	LLXmlTreeNode* child; -	for( child = node->getFirstChild(); child; child = node->getNextChild() ) -	{ -		LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo; -		if (!child_info->parseXml(child)) -		{ -			delete child_info; -			return FALSE; -		} -		mChildList.push_back(child_info); -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// LLVOAvatarSkeletonInfo::parseXml() -//----------------------------------------------------------------------------- -BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node) -{ -	static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones"); -	if (!node->getFastAttributeS32(num_bones_string, mNumBones)) -	{ -		llwarns << "Couldn't find number of bones." << llendl; -		return FALSE; -	} - -	static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes"); -	node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes); - -	LLXmlTreeNode* child; -	for( child = node->getFirstChild(); child; child = node->getNextChild() ) -	{ -		LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo; -		if (!info->parseXml(child)) -		{ -			delete info; -			llwarns << "Error parsing bone in skeleton file" << llendl; -			return FALSE; -		} -		mBoneInfoList.push_back(info); -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlSkeletonNode(LLXmlTreeNode* root) -{ -	LLXmlTreeNode* node = root->getChildByName( "skeleton" ); -	if( !node ) -	{ -		llwarns << "avatar file: missing <skeleton>" << llendl; -		return FALSE; -	} - -	LLXmlTreeNode* child; - -	// SKELETON DISTORTIONS -	for (child = node->getChildByName( "param" ); -		 child; -		 child = node->getNextNamedChild()) -	{ -		if (!child->getChildByName("param_skeleton")) -		{ -			if (child->getChildByName("param_morph")) -			{ -				llwarns << "Can't specify morph param in skeleton definition." << llendl; -			} -			else -			{ -				llwarns << "Unknown param type." << llendl; -			} -			continue; -		} -		 -		LLPolySkeletalDistortionInfo *info = new LLPolySkeletalDistortionInfo; -		if (!info->parseXml(child)) -		{ -			delete info; -			return FALSE; -		} - -		mSkeletalDistortionInfoList.push_back(info); -	} - -	// ATTACHMENT POINTS -	for (child = node->getChildByName( "attachment_point" ); -		 child; -		 child = node->getNextNamedChild()) -	{ -		LLVOAvatarAttachmentInfo* info = new LLVOAvatarAttachmentInfo(); - -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -		if (!child->getFastAttributeString(name_string, info->mName)) -		{ -			llwarns << "No name supplied for attachment point." << llendl; -			delete info; -			continue; -		} - -		static LLStdStringHandle joint_string = LLXmlTree::addAttributeString("joint"); -		if (!child->getFastAttributeString(joint_string, info->mJointName)) -		{ -			llwarns << "No bone declared in attachment point " << info->mName << llendl; -			delete info; -			continue; -		} - -		static LLStdStringHandle position_string = LLXmlTree::addAttributeString("position"); -		if (child->getFastAttributeVector3(position_string, info->mPosition)) -		{ -			info->mHasPosition = TRUE; -		} - -		static LLStdStringHandle rotation_string = LLXmlTree::addAttributeString("rotation"); -		if (child->getFastAttributeVector3(rotation_string, info->mRotationEuler)) -		{ -			info->mHasRotation = TRUE; -		} -		 static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group"); -		if (child->getFastAttributeS32(group_string, info->mGroup)) -		{ -			if (info->mGroup == -1) -				info->mGroup = -1111; // -1 = none parsed, < -1 = bad value -		} - -		static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id"); -		if (!child->getFastAttributeS32(id_string, info->mAttachmentID)) -		{ -			llwarns << "No id supplied for attachment point " << info->mName << llendl; -			delete info; -			continue; -		} - -		static LLStdStringHandle slot_string = LLXmlTree::addAttributeString("pie_slice"); -		child->getFastAttributeS32(slot_string, info->mPieMenuSlice); -			 -		static LLStdStringHandle visible_in_first_person_string = LLXmlTree::addAttributeString("visible_in_first_person"); -		child->getFastAttributeBOOL(visible_in_first_person_string, info->mVisibleFirstPerson); - -		static LLStdStringHandle hud_attachment_string = LLXmlTree::addAttributeString("hud"); -		child->getFastAttributeBOOL(hud_attachment_string, info->mIsHUDAttachment); - -		mAttachmentInfoList.push_back(info); -	} - -	return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlMeshNodes(): parses <mesh> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMeshNodes(LLXmlTreeNode* root) -{ -	for (LLXmlTreeNode* node = root->getChildByName( "mesh" ); -		 node; -		 node = root->getNextNamedChild()) -	{ -		LLVOAvatarMeshInfo *info = new LLVOAvatarMeshInfo; - -		// attribute: type -		static LLStdStringHandle type_string = LLXmlTree::addAttributeString("type"); -		if( !node->getFastAttributeString( type_string, info->mType ) ) -		{ -			llwarns << "Avatar file: <mesh> is missing type attribute.  Ignoring element. " << llendl; -			delete info; -			return FALSE;  // Ignore this element -		} -		 -		static LLStdStringHandle lod_string = LLXmlTree::addAttributeString("lod"); -		if (!node->getFastAttributeS32( lod_string, info->mLOD )) -		{ -			llwarns << "Avatar file: <mesh> is missing lod attribute.  Ignoring element. " << llendl; -			delete info; -			return FALSE;  // Ignore this element -		} - -		static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name"); -		if( !node->getFastAttributeString( file_name_string, info->mMeshFileName ) ) -		{ -			llwarns << "Avatar file: <mesh> is missing file_name attribute.  Ignoring: " << info->mType << llendl; -			delete info; -			return FALSE;  // Ignore this element -		} - -		static LLStdStringHandle reference_string = LLXmlTree::addAttributeString("reference"); -		node->getFastAttributeString( reference_string, info->mReferenceMeshName ); -		 -		// attribute: min_pixel_area -		static LLStdStringHandle min_pixel_area_string = LLXmlTree::addAttributeString("min_pixel_area"); -		static LLStdStringHandle min_pixel_width_string = LLXmlTree::addAttributeString("min_pixel_width"); -		if (!node->getFastAttributeF32( min_pixel_area_string, info->mMinPixelArea )) -		{ -			F32 min_pixel_area = 0.1f; -			if (node->getFastAttributeF32( min_pixel_width_string, min_pixel_area )) -			{ -				// this is square root of pixel area (sensible to use linear space in defining lods) -				min_pixel_area = min_pixel_area * min_pixel_area; -			} -			info->mMinPixelArea = min_pixel_area; -		} -		 -		// Parse visual params for this node only if we haven't already -		for (LLXmlTreeNode* child = node->getChildByName( "param" ); -			 child; -			 child = node->getNextNamedChild()) -		{ -			if (!child->getChildByName("param_morph")) -			{ -				if (child->getChildByName("param_skeleton")) -				{ -					llwarns << "Can't specify skeleton param in a mesh definition." << llendl; -				} -				else -				{ -					llwarns << "Unknown param type." << llendl; -				} -				continue; -			} - -			LLPolyMorphTargetInfo *morphinfo = new LLPolyMorphTargetInfo(); -			if (!morphinfo->parseXml(child)) -			{ -				delete morphinfo; -				delete info; -				return -1; -			} -			BOOL shared = FALSE; -			static LLStdStringHandle shared_string = LLXmlTree::addAttributeString("shared"); -			child->getFastAttributeBOOL(shared_string, shared); - -			info->mPolyMorphTargetInfoList.push_back(LLVOAvatarMeshInfo::morph_info_pair_t(morphinfo, shared)); -		} - -		mMeshInfoList.push_back(info); -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlColorNodes(): parses <global_color> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlColorNodes(LLXmlTreeNode* root) -{ -	for (LLXmlTreeNode* color_node = root->getChildByName( "global_color" ); -		 color_node; -		 color_node = root->getNextNamedChild()) -	{ -		std::string global_color_name; -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -		if (color_node->getFastAttributeString( name_string, global_color_name ) ) -		{ -			if( global_color_name == "skin_color" ) -			{ -				if (mTexSkinColorInfo) -				{ -					llwarns << "avatar file: multiple instances of skin_color" << llendl; -					return FALSE; -				} -				mTexSkinColorInfo = new LLTexGlobalColorInfo; -				if( !mTexSkinColorInfo->parseXml( color_node ) ) -				{ -					deleteAndClear(mTexSkinColorInfo); -					llwarns << "avatar file: mTexSkinColor->parseXml() failed" << llendl; -					return FALSE; -				} -			} -			else if( global_color_name == "hair_color" ) -			{ -				if (mTexHairColorInfo) -				{ -					llwarns << "avatar file: multiple instances of hair_color" << llendl; -					return FALSE; -				} -				mTexHairColorInfo = new LLTexGlobalColorInfo; -				if( !mTexHairColorInfo->parseXml( color_node ) ) -				{ -					deleteAndClear(mTexHairColorInfo); -					llwarns << "avatar file: mTexHairColor->parseXml() failed" << llendl; -					return FALSE; -				} -			} -			else if( global_color_name == "eye_color" ) -			{ -				if (mTexEyeColorInfo) -				{ -					llwarns << "avatar file: multiple instances of eye_color" << llendl; -					return FALSE; -				} -				mTexEyeColorInfo = new LLTexGlobalColorInfo; -				if( !mTexEyeColorInfo->parseXml( color_node ) ) -				{ -					llwarns << "avatar file: mTexEyeColor->parseXml() failed" << llendl; -					return FALSE; -				} -			} -		} -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlLayerNodes(): parses <layer_set> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlLayerNodes(LLXmlTreeNode* root) +//virtual +void LLVOAvatar::bodySizeChanged()  { -	for (LLXmlTreeNode* layer_node = root->getChildByName( "layer_set" ); -		 layer_node; -		 layer_node = root->getNextNamedChild()) -	{ -		LLTexLayerSetInfo* layer_info = new LLTexLayerSetInfo(); -		if( layer_info->parseXml( layer_node ) ) -		{ -			mLayerInfoList.push_back(layer_info); -		} -		else -		{ -			delete layer_info; -			llwarns << "avatar file: layer_set->parseXml() failed" << llendl; -			return FALSE; -		} +	if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF()) +	{	// notify simulator of change in size +		// but not if we are in the middle of updating appearance +		gAgent.sendAgentSetAppearance();  	} -	return TRUE;  } -//----------------------------------------------------------------------------- -// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlDriverNodes(LLXmlTreeNode* root) +void LLVOAvatar::setIsUsingServerBakes(BOOL newval)  { -	LLXmlTreeNode* driver = root->getChildByName( "driver_parameters" ); -	if( driver ) -	{ -		for (LLXmlTreeNode* grand_child = driver->getChildByName( "param" ); -			 grand_child; -			 grand_child = driver->getNextNamedChild()) -		{ -			if( grand_child->getChildByName( "param_driver" ) ) -			{ -				LLDriverParamInfo* driver_info = new LLDriverParamInfo(); -				if( driver_info->parseXml( grand_child ) ) -				{ -					mDriverInfoList.push_back(driver_info); -				} -				else -				{ -					delete driver_info; -					llwarns << "avatar file: driver_param->parseXml() failed" << llendl; -					return FALSE; -				} -			} -		} -	} -	return TRUE; +	mUseServerBakes = newval;  } -//----------------------------------------------------------------------------- -// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root) -{ -	LLXmlTreeNode* masks = root->getChildByName( "morph_masks" ); -	if( !masks ) -	{ -		return FALSE; -	} - -	for (LLXmlTreeNode* grand_child = masks->getChildByName( "mask" ); -		 grand_child; -		 grand_child = masks->getNextNamedChild()) -	{ -		LLVOAvatarMorphInfo* info = new LLVOAvatarMorphInfo(); - -		static LLStdStringHandle name_string = LLXmlTree::addAttributeString("morph_name"); -		if (!grand_child->getFastAttributeString(name_string, info->mName)) -		{ -			llwarns << "No name supplied for morph mask." << llendl; -			delete info; -			continue; -		} - -		static LLStdStringHandle region_string = LLXmlTree::addAttributeString("body_region"); -		if (!grand_child->getFastAttributeString(region_string, info->mRegion)) -		{ -			llwarns << "No region supplied for morph mask." << llendl; -			delete info; -			continue; -		} - -		static LLStdStringHandle layer_string = LLXmlTree::addAttributeString("layer"); -		if (!grand_child->getFastAttributeString(layer_string, info->mLayer)) -		{ -			llwarns << "No layer supplied for morph mask." << llendl; -			delete info; -			continue; -		} - -		// optional parameter. don't throw a warning if not present. -		static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert"); -		grand_child->getFastAttributeBOOL(invert_string, info->mInvert); - -		mMorphMaskInfoList.push_back(info); -	} - -	return TRUE; +// virtual +void LLVOAvatar::removeMissingBakedTextures() +{	  }  //virtual @@ -8549,7 +7297,7 @@ void LLVOAvatar::idleUpdateRenderCost()  	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  	{ -		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);  		ETextureIndex tex_index = baked_dict->mTextureIndex;  		if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))  		{ @@ -8629,11 +7377,11 @@ void LLVOAvatar::idleUpdateRenderCost()  		}  		// print any avatar textures we didn't already know about -		for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -			 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +		for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +			 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  			 ++iter)  		{ -			const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +			const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  			// TODO: MULTI-WEARABLE: handle multiple textures for self  			const LLViewerTexture* te_image = getImage(iter->first,0);  			if (!te_image) @@ -8662,26 +7410,26 @@ void LLVOAvatar::idleUpdateRenderCost()  BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index)  {  	if (index < 0 || index >= TEX_NUM_INDICES) return false; -	return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsLocalTexture; +	return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsLocalTexture;  }  // static  BOOL LLVOAvatar::isIndexBakedTexture(ETextureIndex index)  {  	if (index < 0 || index >= TEX_NUM_INDICES) return false; -	return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsBakedTexture; +	return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsBakedTexture;  }  const std::string LLVOAvatar::getBakedStatusForPrintout() const  {  	std::string line; -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		if (texture_dict->mIsBakedTexture)  		{  			line += texture_dict->mName; @@ -8713,7 +7461,7 @@ F32 calc_bouncy_animation(F32 x)  }  //virtual -BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index ) const +BOOL LLVOAvatar::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex te, U32 index ) const  {  	if (isIndexLocalTexture(te))   	{ @@ -8731,7 +7479,7 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index  }  //virtual -BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatar::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const  {  	if (isIndexLocalTexture(type))  	{ @@ -8747,9 +7495,11 @@ BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 ind  }  //virtual -BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +BOOL LLVOAvatar::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const  {  	// non-self avatars don't have wearables  	return FALSE;  } + + diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 1adb680962..4802476e59 100644..100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -25,8 +25,8 @@   * $/LicenseInfo$   */ -#ifndef LL_LLVOAVATAR_H -#define LL_LLVOAVATAR_H +#ifndef LL_VOAVATAR_H +#define LL_VOAVATAR_H  #include <map>  #include <deque> @@ -36,6 +36,7 @@  #include <boost/signals2.hpp>  #include "imageids.h"			// IMG_INVISIBLE +#include "llavatarappearance.h"  #include "llchat.h"  #include "lldrawpoolalpha.h"  #include "llviewerobject.h" @@ -44,9 +45,10 @@  #include "llviewerjointmesh.h"  #include "llviewerjointattachment.h"  #include "llrendertarget.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h"  #include "lltexglobalcolor.h"  #include "lldriverparam.h" +#include "llviewertexlayer.h"  #include "material_codes.h"		// LL_MCODE_END  #include "llviewerstats.h" @@ -62,30 +64,26 @@ extern const LLUUID ANIM_AGENT_PELVIS_FIX;  extern const LLUUID ANIM_AGENT_TARGET;  extern const LLUUID ANIM_AGENT_WALK_ADJUST; -class LLTexLayerSet; +class LLViewerWearable;  class LLVoiceVisualizer;  class LLHUDNameTag;  class LLHUDEffectSpiral;  class LLTexGlobalColor; -class LLVOAvatarBoneInfo; -class LLVOAvatarSkeletonInfo; +class LLViewerJoint;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // LLVOAvatar  //   //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLVOAvatar : +	public LLAvatarAppearance,  	public LLViewerObject, -	public LLCharacter,  	public boost::signals2::trackable  {  	LOG_CLASS(LLVOAvatar);  public:  	friend class LLVOAvatarSelf; -protected: -	struct LLVOAvatarXmlInfo; -	struct LLMaskedMorph;  /********************************************************************************   **                                                                            ** @@ -110,9 +108,6 @@ public:  	virtual void 		initInstance(); // Called after construction to initialize the class.  protected:  	virtual				~LLVOAvatar(); -	BOOL				loadSkeletonNode(); -	BOOL				loadMeshNodes(); -	virtual BOOL		loadLayersets();  /**                    Initialization   **                                                                            ** @@ -127,31 +122,31 @@ protected:  	// LLViewerObject interface and related  	//--------------------------------------------------------------------  public: -	virtual void			updateGL(); -	virtual	LLVOAvatar*		asAvatar(); +	/*virtual*/ void			updateGL(); +	/*virtual*/ LLVOAvatar*		asAvatar();  	virtual U32    	 	 	processUpdateMessage(LLMessageSystem *mesgsys,  													 void **user_data,  													 U32 block_num,  													 const EObjectUpdateType update_type,  													 LLDataPacker *dp);  	virtual void   	 	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); -	virtual BOOL   	 	 	updateLOD(); +	/*virtual*/ BOOL   	 	 	updateLOD();  	BOOL  	 	 	 	 	updateJointLODs();  	void					updateLODRiggedAttachments( void ); -	virtual BOOL   	 	 	isActive() const; // Whether this object needs to do an idleUpdate. -	virtual void   	 	 	updateTextures(); -	virtual S32    	 	 	setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. -	virtual void   	 	 	onShift(const LLVector4a& shift_vector); -	virtual U32    	 	 	getPartitionType() const; -	virtual const  	 	 	LLVector3 getRenderPosition() const; -	virtual void   	 	 	updateDrawable(BOOL force_damped); -	virtual LLDrawable* 	createDrawable(LLPipeline *pipeline); -	virtual BOOL   	 	 	updateGeometry(LLDrawable *drawable); -	virtual void   	 	 	setPixelAreaAndAngle(LLAgent &agent); -	virtual void   	 	 	updateRegion(LLViewerRegion *regionp); -	virtual void   	 	 	updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); -	virtual void   	 	 	getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); -	virtual BOOL   	 	 	lineSegmentIntersect(const LLVector3& start, const LLVector3& end, +	/*virtual*/ BOOL   	 	 	isActive() const; // Whether this object needs to do an idleUpdate. +	/*virtual*/ void   	 	 	updateTextures(); +	/*virtual*/ S32    	 	 	setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. +	/*virtual*/ void   	 	 	onShift(const LLVector4a& shift_vector); +	/*virtual*/ U32    	 	 	getPartitionType() const; +	/*virtual*/ const  	 	 	LLVector3 getRenderPosition() const; +	/*virtual*/ void   	 	 	updateDrawable(BOOL force_damped); +	/*virtual*/ LLDrawable* 	createDrawable(LLPipeline *pipeline); +	/*virtual*/ BOOL   	 	 	updateGeometry(LLDrawable *drawable); +	/*virtual*/ void   	 	 	setPixelAreaAndAngle(LLAgent &agent); +	/*virtual*/ void   	 	 	updateRegion(LLViewerRegion *regionp); +	/*virtual*/ void   	 	 	updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); +	/*virtual*/ void   	 	 	getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); +	/*virtual*/ BOOL   	 	 	lineSegmentIntersect(const LLVector3& start, const LLVector3& end,  												 S32 face = -1,                    // which face to check, -1 = ALL_SIDES  												 BOOL pick_transparent = FALSE,  												 S32* face_hit = NULL,             // which face was hit @@ -172,16 +167,14 @@ public:  	// LLCharacter interface and related  	//--------------------------------------------------------------------  public: -	virtual LLVector3    	getCharacterPosition(); -	virtual LLQuaternion 	getCharacterRotation(); -	virtual LLVector3    	getCharacterVelocity(); -	virtual LLVector3    	getCharacterAngularVelocity(); -	virtual LLJoint*		getCharacterJoint(U32 num); -	virtual BOOL			allocateCharacterJoints(U32 num); - -	virtual LLUUID			remapMotionID(const LLUUID& id); -	virtual BOOL			startMotion(const LLUUID& id, F32 time_offset = 0.f); -	virtual BOOL			stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); +	/*virtual*/ LLVector3    	getCharacterPosition(); +	/*virtual*/ LLQuaternion 	getCharacterRotation(); +	/*virtual*/ LLVector3    	getCharacterVelocity(); +	/*virtual*/ LLVector3    	getCharacterAngularVelocity(); + +	/*virtual*/ LLUUID			remapMotionID(const LLUUID& id); +	/*virtual*/ BOOL			startMotion(const LLUUID& id, F32 time_offset = 0.f); +	/*virtual*/ BOOL			stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE);  	virtual void			stopMotionFromSource(const LLUUID& source_id);  	virtual void			requestStopMotion(LLMotion* motion);  	LLMotion*				findMotion(const LLUUID& id) const; @@ -189,25 +182,18 @@ public:  	void					dumpAnimationState();  	virtual LLJoint*		getJoint(const std::string &name); -	virtual LLJoint*     	getRootJoint() { return &mRoot; }  	void					resetJointPositions( void );  	void					resetJointPositionsToDefault( void );  	void					resetSpecificJointPosition( const std::string& name ); -	virtual const char*		getAnimationPrefix() { return "avatar"; } -	virtual const LLUUID&   getID() const; -	virtual LLVector3		getVolumePos(S32 joint_index, LLVector3& volume_offset); -	virtual LLJoint*		findCollisionVolume(U32 volume_id); -	virtual S32				getCollisionVolumeID(std::string &name); -	virtual void			addDebugText(const std::string& text); -	virtual F32          	getTimeDilation(); -	virtual void			getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); -	virtual F32				getPixelArea() const; -	virtual LLPolyMesh*		getHeadMesh(); -	virtual LLPolyMesh*		getUpperBodyMesh(); -	virtual LLVector3d		getPosGlobalFromAgent(const LLVector3 &position); -	virtual LLVector3		getPosAgentFromGlobal(const LLVector3d &position); +	/*virtual*/ const LLUUID&	getID() const; +	/*virtual*/ void			addDebugText(const std::string& text); +	/*virtual*/ F32				getTimeDilation(); +	/*virtual*/ void			getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); +	/*virtual*/ F32				getPixelArea() const; +	/*virtual*/ LLVector3d		getPosGlobalFromAgent(const LLVector3 &position); +	/*virtual*/ LLVector3		getPosAgentFromGlobal(const LLVector3d &position);  	virtual void			updateVisualParams(); @@ -222,14 +208,10 @@ public:  public:  	virtual bool 	isSelf() const { return false; } // True if this avatar is for this viewer's agent -	bool isBuilt() const { return mIsBuilt; }  private: //aligned members  	LL_ALIGN_16(LLVector4a	mImpostorExtents[2]); -private: -	BOOL			mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients -  	//--------------------------------------------------------------------  	// Updates  	//-------------------------------------------------------------------- @@ -344,82 +326,33 @@ protected:  /**                    State   **                                                                            **   *******************************************************************************/ -  /********************************************************************************   **                                                                            **   **                    SKELETON   **/ +protected: +	/*virtual*/ LLAvatarJoint*	createAvatarJoint(); // Returns LLViewerJoint +	/*virtual*/ LLAvatarJoint*	createAvatarJoint(S32 joint_num); // Returns LLViewerJoint +	/*virtual*/ LLAvatarJointMesh*	createAvatarJointMesh(); // Returns LLViewerJointMesh  public:  	void				updateHeadOffset(); -	F32					getPelvisToFoot() const { return mPelvisToFoot; }  	void				setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ;  	bool				hasPelvisOffset( void ) { return mHasPelvisOffset; }  	void				postPelvisSetRecalc( void );  	void				setPelvisOffset( F32 pelvixFixupAmount ); +	/*virtual*/ BOOL	loadSkeletonNode(); +	/*virtual*/ void	buildCharacter(); +  	bool				mHasPelvisOffset;  	LLVector3			mPelvisOffset;  	F32					mLastPelvisToFoot;  	F32					mPelvisFixup;  	F32					mLastPelvisFixup; -	LLVector3			mHeadOffset; // current head position -	LLViewerJoint		mRoot; - -	typedef std::map<std::string, LLJoint*> joint_map_t; -	joint_map_t			mJointMap; - -protected: -	static BOOL			parseSkeletonFile(const std::string& filename); -	void				buildCharacter(); -	virtual BOOL		loadAvatar(); - -	BOOL				setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); -	BOOL				buildSkeleton(const LLVOAvatarSkeletonInfo *info); -private: -	BOOL				mIsBuilt; // state of deferred character building -	S32					mNumJoints; -	LLViewerJoint*		mSkeleton; -	 -	//-------------------------------------------------------------------- -	// Pelvis height adjustment members. -	//-------------------------------------------------------------------- -public: -	LLVector3			mBodySize;  	S32					mLastSkeletonSerialNum; -private: -	F32					mPelvisToFoot; -	//-------------------------------------------------------------------- -	// Cached pointers to well known joints -	//-------------------------------------------------------------------- -public: -	LLViewerJoint* 		mPelvisp; -	LLViewerJoint* 		mTorsop; -	LLViewerJoint* 		mChestp; -	LLViewerJoint* 		mNeckp; -	LLViewerJoint* 		mHeadp; -	LLViewerJoint* 		mSkullp; -	LLViewerJoint* 		mEyeLeftp; -	LLViewerJoint* 		mEyeRightp; -	LLViewerJoint* 		mHipLeftp; -	LLViewerJoint* 		mHipRightp; -	LLViewerJoint* 		mKneeLeftp; -	LLViewerJoint* 		mKneeRightp; -	LLViewerJoint* 		mAnkleLeftp; -	LLViewerJoint* 		mAnkleRightp; -	LLViewerJoint* 		mFootLeftp; -	LLViewerJoint* 		mFootRightp; -	LLViewerJoint* 		mWristLeftp; -	LLViewerJoint* 		mWristRightp; - -	//-------------------------------------------------------------------- -	// XML parse tree -	//-------------------------------------------------------------------- -private: -	static LLXmlTree 	sXMLTree; // avatar config file -	static LLXmlTree 	sSkeletonXMLTree; // avatar skeleton file  /**                    Skeleton   **                                                                            ** @@ -443,7 +376,6 @@ public:  	static void	deleteCachedImages(bool clearAll=true);  	static void	destroyGL();  	static void	restoreGL(); -	BOOL 		mIsDummy; // for special views  	S32			mSpecialRenderMode; // special lighting  	U32			mAttachmentGeometryBytes; //number of bytes in attached geometry  	F32			mAttachmentSurfaceArea; //estimated surface area of attachments @@ -461,9 +393,15 @@ private:  	// Morph masks  	//--------------------------------------------------------------------  public: -	BOOL 		morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); -	void 		addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer); -	void 		applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); +	/*virtual*/ void	applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); +	BOOL 		morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); + +	 +	//-------------------------------------------------------------------- +	// Global colors +	//-------------------------------------------------------------------- +public: +	/*virtual*/void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake);  	//--------------------------------------------------------------------  	// Visibility @@ -546,10 +484,10 @@ private:  	// Constants  	//--------------------------------------------------------------------  public: -	virtual LLViewerTexture::EBoostLevel 	getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR; } -	virtual LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED; } +	virtual LLViewerTexture::EBoostLevel 	getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; } +	virtual LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; }  	virtual S32 						getTexImageSize() const; -	virtual S32 						getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } +	/*virtual*/ S32						getTexImageArea() const { return getTexImageSize()*getTexImageSize(); }  /**                    Rendering   **                                                                            ** @@ -564,9 +502,9 @@ public:  	// Loading status  	//--------------------------------------------------------------------  public: -	virtual BOOL    isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; -	virtual BOOL	isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; -	virtual BOOL	isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; +	virtual BOOL    isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; +	virtual BOOL	isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; +	virtual BOOL	isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const;  	BOOL			isFullyBaked();  	static BOOL		areAllNearbyInstancesBaked(S32& grey_avatars); @@ -577,6 +515,7 @@ public:  	// Baked textures  	//--------------------------------------------------------------------  public: +	/*virtual*/ LLTexLayerSet*	createTexLayerSet(); // Return LLViewerTexLayerSet  	void			releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY !  protected:  	static void		onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); @@ -584,32 +523,19 @@ protected:  	static void		onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);  	virtual void	removeMissingBakedTextures();  	void			useBakedTexture(const LLUUID& id); +	LLViewerTexLayerSet*  getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet);	} + -	typedef std::deque<LLMaskedMorph *> 	morph_list_t; -	struct BakedTextureData -	{ -		LLUUID								mLastTextureIndex; -		LLTexLayerSet* 						mTexLayerSet; // Only exists for self -		bool								mIsLoaded; -		bool								mIsUsed; -		LLVOAvatarDefines::ETextureIndex 	mTextureIndex; -		U32									mMaskTexName; -		// Stores pointers to the joint meshes that this baked texture deals with -		std::vector< LLViewerJointMesh * > 	mMeshes;  // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts -		morph_list_t						mMaskedMorphs; -	}; -	typedef std::vector<BakedTextureData> 	bakedtexturedata_vec_t; -	bakedtexturedata_vec_t 					mBakedTextureDatas;  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;   	BOOL mLoadedCallbacksPaused;  	//--------------------------------------------------------------------  	// Local Textures  	//--------------------------------------------------------------------  protected: -	virtual void	setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); -	virtual void	addLocalTextureStats(LLVOAvatarDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0); +	virtual void	setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); +	virtual void	addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0);  	// MULTI-WEARABLE: make self-only? -	virtual void	setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0); +	virtual void	setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0);  	//--------------------------------------------------------------------  	// Texture accessors @@ -617,6 +543,7 @@ protected:  private:  	virtual	void				setImage(const U8 te, LLViewerTexture *imagep, const U32 index);   	virtual LLViewerTexture*	getImage(const U8 te, const U32 index) const; +	const std::string 			getImageURL(const U8 te, const LLUUID &uuid);  	virtual const LLTextureEntry* getTexEntry(const U8 te_num) const;  	virtual void setTexEntry(const U8 index, const LLTextureEntry &te); @@ -643,13 +570,11 @@ public:  	// Static texture/mesh/baked dictionary  	//--------------------------------------------------------------------  public: -	static BOOL 	isIndexLocalTexture(LLVOAvatarDefines::ETextureIndex i); -	static BOOL 	isIndexBakedTexture(LLVOAvatarDefines::ETextureIndex i); +	static BOOL 	isIndexLocalTexture(LLAvatarAppearanceDefines::ETextureIndex i); +	static BOOL 	isIndexBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i);  private: -	static const LLVOAvatarDefines::LLVOAvatarDictionary *getDictionary() { return sAvatarDictionary; } -	static LLVOAvatarDefines::LLVOAvatarDictionary* sAvatarDictionary; -	static LLVOAvatarSkeletonInfo* 					sAvatarSkeletonInfo; -	static LLVOAvatarXmlInfo* 						sAvatarXmlInfo; +	static const LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary *getDictionary() { return sAvatarDictionary; } +	static LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* sAvatarDictionary;  	//--------------------------------------------------------------------  	// Messaging @@ -670,22 +595,20 @@ private:   **/  public: -	void 			updateMeshTextures(); +	void			debugColorizeSubMeshes(U32 i, const LLColor4& color); +	virtual void 	updateMeshTextures();  	void 			updateSexDependentLayerSets(BOOL upload_bake); -	void 			dirtyMesh(); // Dirty the avatar mesh +	virtual void	dirtyMesh(); // Dirty the avatar mesh  	void 			updateMeshData();  protected:  	void 			releaseMeshData();  	virtual void restoreMeshData();  private: -	void 			dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority +	virtual void	dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority +	LLViewerJoint*	getViewerJoint(S32 idx);  	S32 			mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD  	BOOL			mMeshTexturesDirty; -	typedef std::multimap<std::string, LLPolyMesh*> polymesh_map_t; -	polymesh_map_t 									mMeshes; -	std::vector<LLViewerJoint *> 					mMeshLOD; -  	//--------------------------------------------------------------------  	// Destroy invisible mesh  	//-------------------------------------------------------------------- @@ -706,35 +629,38 @@ public:  	void 			processAvatarAppearance(LLMessageSystem* mesgsys);  	void 			hideSkirt();  	void			startAppearanceAnimation(); +	/*virtual*/ void bodySizeChanged();  	//--------------------------------------------------------------------  	// Appearance morphing  	//--------------------------------------------------------------------  public:  	BOOL			getIsAppearanceAnimating() const { return mAppearanceAnimating; } + +	// True if we are computing our appearance via local compositing +	// instead of baked textures, as for example during wearable +	// editing or when waiting for a subsequent server rebake. +	/*virtual*/ BOOL	isUsingLocalAppearance() const { return mUseLocalAppearance; } + +	// True if this avatar should fetch its baked textures via the new +	// appearance mechanism. +	/*virtual*/ BOOL	isUsingServerBakes() const { return mUseServerBakes; } +	void 				setIsUsingServerBakes(BOOL newval); + + +	// True if we are currently in appearance editing mode. Often but +	// not always the same as isUsingLocalAppearance(). +	/*virtual*/ BOOL	isEditingAppearance() const { return mIsEditingAppearance; } + +	// FIXME review isUsingLocalAppearance uses, some should be isEditing instead. +  private:  	BOOL			mAppearanceAnimating;  	LLFrameTimer	mAppearanceMorphTimer;  	F32				mLastAppearanceBlendTime; - -	//-------------------------------------------------------------------- -	// Clothing colors (convenience functions to access visual parameters) -	//-------------------------------------------------------------------- -public: -	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); -	LLColor4		getClothesColor(LLVOAvatarDefines::ETextureIndex te); -	static BOOL			teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); - -	//-------------------------------------------------------------------- -	// Global colors -	//-------------------------------------------------------------------- -public: -	LLColor4		getGlobalColor(const std::string& color_name ) const; -	void			onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); -private: -	LLTexGlobalColor* mTexSkinColor; -	LLTexGlobalColor* mTexHairColor; -	LLTexGlobalColor* mTexEyeColor; +	BOOL			mIsEditingAppearance; // flag for if we're actively in appearance editing mode +	BOOL			mUseLocalAppearance; // flag for if we're using a local composite +	BOOL			mUseServerBakes; // flag for if baked textures should be fetched from baking service (false if they're temporary uploads)  	//--------------------------------------------------------------------  	// Visibility @@ -744,7 +670,6 @@ public:  	void			setVisibilityRank(U32 rank);  	U32				getVisibilityRank()  const { return mVisibilityRank; } // unused  	static S32 		sNumVisibleAvatars; // Number of instances of this class -	static LLColor4 getDummyColor();  /**                    Appearance   **                                                                            **   *******************************************************************************/ @@ -754,9 +679,6 @@ public:   **                    WEARABLES   **/ -public: -	virtual BOOL			isWearingWearableType(LLWearableType::EType type ) const; -	  	//--------------------------------------------------------------------  	// Attachments  	//-------------------------------------------------------------------- @@ -766,6 +688,7 @@ public:  	virtual BOOL 		detachObject(LLViewerObject *viewer_object);  	void				cleanupAttachedMesh( LLViewerObject* pVO );  	static LLVOAvatar*  findAvatarFromAttachment(LLViewerObject* obj); +	/*virtual*/ BOOL	isWearingWearableType(LLWearableType::EType type ) const;  protected:  	LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);  	void 				lazyAttach(); @@ -868,15 +791,6 @@ private:  	F32			mSpeed; // misc. animation repeated state  	//-------------------------------------------------------------------- -	// Collision volumes -	//-------------------------------------------------------------------- -public: -  	S32			mNumCollisionVolumes; -	LLViewerJointCollisionVolume* mCollisionVolumes; -protected: -	BOOL		allocateCollisionVolumes(U32 num); - -	//--------------------------------------------------------------------  	// Dimensions  	//--------------------------------------------------------------------  public: @@ -886,7 +800,6 @@ public:  	void 		resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm);  	void 		slamPosition(); // Slam position to transmitted position (for teleport);  protected: -	void 		computeBodySize();  	//--------------------------------------------------------------------  	// Material being stepped on @@ -906,9 +819,9 @@ private:   **/  public: -	virtual BOOL 	setParent(LLViewerObject* parent); -	virtual void 	addChild(LLViewerObject *childp); -	virtual void 	removeChild(LLViewerObject *childp); +	/*virtual*/ BOOL 	setParent(LLViewerObject* parent); +	/*virtual*/ void 	addChild(LLViewerObject *childp); +	/*virtual*/ void 	removeChild(LLViewerObject *childp);  	//--------------------------------------------------------------------  	// Sitting @@ -1012,7 +925,10 @@ private:  	// General  	//--------------------------------------------------------------------  public: -	static void			dumpArchetypeXML(void*); +	void				dumpArchetypeXML(const std::string& prefix, bool group_by_wearables = false); +	void 				dumpAppearanceMsgParams( const std::string& dump_prefix, +												 const std::vector<F32>& paramsForDump, +												 const LLTEContents& tec);  	static void			dumpBakedStatus();  	const std::string 	getBakedStatusForPrintout() const;  	void				dumpAvatarTEs(const std::string& context) const; @@ -1029,6 +945,7 @@ private:  	F32					mMaxPixelArea;  	F32					mAdjustedPixelArea;  	std::string  		mDebugText; +	std::string			mBakedTextureDebugText;  	//-------------------------------------------------------------------- @@ -1053,105 +970,6 @@ protected:  protected: // Shared with LLVOAvatarSelf -	struct LLVOAvatarXmlInfo -	{ -		LLVOAvatarXmlInfo(); -		~LLVOAvatarXmlInfo(); - -		BOOL 	parseXmlSkeletonNode(LLXmlTreeNode* root); -		BOOL 	parseXmlMeshNodes(LLXmlTreeNode* root); -		BOOL 	parseXmlColorNodes(LLXmlTreeNode* root); -		BOOL 	parseXmlLayerNodes(LLXmlTreeNode* root); -		BOOL 	parseXmlDriverNodes(LLXmlTreeNode* root); -		BOOL	parseXmlMorphNodes(LLXmlTreeNode* root); - -		struct LLVOAvatarMeshInfo -		{ -			typedef std::pair<LLPolyMorphTargetInfo*,BOOL> morph_info_pair_t; -			typedef std::vector<morph_info_pair_t> morph_info_list_t; - -			LLVOAvatarMeshInfo() : mLOD(0), mMinPixelArea(.1f) {} -			~LLVOAvatarMeshInfo() -			{ -				morph_info_list_t::iterator iter; -				for (iter = mPolyMorphTargetInfoList.begin(); iter != mPolyMorphTargetInfoList.end(); iter++) -				{ -					delete iter->first; -				} -				mPolyMorphTargetInfoList.clear(); -			} - -			std::string mType; -			S32			mLOD; -			std::string	mMeshFileName; -			std::string	mReferenceMeshName; -			F32			mMinPixelArea; -			morph_info_list_t mPolyMorphTargetInfoList; -		}; -		typedef std::vector<LLVOAvatarMeshInfo*> mesh_info_list_t; -		mesh_info_list_t mMeshInfoList; - -		typedef std::vector<LLPolySkeletalDistortionInfo*> skeletal_distortion_info_list_t; -		skeletal_distortion_info_list_t mSkeletalDistortionInfoList; -	 -		struct LLVOAvatarAttachmentInfo -		{ -			LLVOAvatarAttachmentInfo() -				: mGroup(-1), mAttachmentID(-1), mPieMenuSlice(-1), mVisibleFirstPerson(FALSE), -				  mIsHUDAttachment(FALSE), mHasPosition(FALSE), mHasRotation(FALSE) {} -			std::string mName; -			std::string mJointName; -			LLVector3 mPosition; -			LLVector3 mRotationEuler; -			S32 mGroup; -			S32 mAttachmentID; -			S32 mPieMenuSlice; -			BOOL mVisibleFirstPerson; -			BOOL mIsHUDAttachment; -			BOOL mHasPosition; -			BOOL mHasRotation; -		}; -		typedef std::vector<LLVOAvatarAttachmentInfo*> attachment_info_list_t; -		attachment_info_list_t mAttachmentInfoList; -	 -		LLTexGlobalColorInfo *mTexSkinColorInfo; -		LLTexGlobalColorInfo *mTexHairColorInfo; -		LLTexGlobalColorInfo *mTexEyeColorInfo; - -		typedef std::vector<LLTexLayerSetInfo*> layer_info_list_t; -		layer_info_list_t mLayerInfoList; - -		typedef std::vector<LLDriverParamInfo*> driver_info_list_t; -		driver_info_list_t mDriverInfoList; - -		struct LLVOAvatarMorphInfo -		{ -			LLVOAvatarMorphInfo() -				: mInvert(FALSE) {} -			std::string mName; -			std::string mRegion; -			std::string mLayer; -			BOOL mInvert; -		}; - -		typedef std::vector<LLVOAvatarMorphInfo*> morph_info_list_t; -		morph_info_list_t	mMorphMaskInfoList; -	}; - -	struct LLMaskedMorph -	{ -		LLMaskedMorph(LLPolyMorphTarget *morph_target, BOOL invert, std::string layer) : -			mMorphTarget(morph_target),  -			mInvert(invert), -			mLayer(layer) -		{ -			morph_target->addPendingMorphMask(); -		} -	 -		LLPolyMorphTarget	*mMorphTarget; -		BOOL				mInvert; -		std::string			mLayer; -	};  /**                    Support classes   **                                                                            ** @@ -1161,4 +979,5 @@ protected: // Shared with LLVOAvatarSelf  extern const F32 SELF_ADDITIONAL_PRI;  extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; -#endif // LL_VO_AVATAR_H +#endif // LL_VOAVATAR_H + diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp deleted file mode 100644 index 1ed4e3b61c..0000000000 --- a/indra/newview/llvoavatardefines.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/**  - * @file llvoavatar.cpp - * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject - * - * $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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llvoavatardefines.h" -#include "llviewercontrol.h" // gSavedSettings - -const S32 LLVOAvatarDefines::SCRATCH_TEX_WIDTH = 512; -const S32 LLVOAvatarDefines::SCRATCH_TEX_HEIGHT = 512; -const S32 LLVOAvatarDefines::IMPOSTOR_PERIOD = 2; - -using namespace LLVOAvatarDefines; - -/********************************************************************************* - * Edit this function to add/remove/change textures and mesh definitions for avatars. - */ - -LLVOAvatarDictionary::Textures::Textures() -{ -	addEntry(TEX_HEAD_BODYPAINT,              new TextureEntry("head_bodypaint",   TRUE,  BAKED_NUM_INDICES, "",                          LLWearableType::WT_SKIN)); -	addEntry(TEX_UPPER_SHIRT,                 new TextureEntry("upper_shirt",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultShirtUUID",     LLWearableType::WT_SHIRT)); -	addEntry(TEX_LOWER_PANTS,                 new TextureEntry("lower_pants",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultPantsUUID",     LLWearableType::WT_PANTS)); -	addEntry(TEX_EYES_IRIS,                   new TextureEntry("eyes_iris",        TRUE,  BAKED_NUM_INDICES, "UIImgDefaultEyesUUID",      LLWearableType::WT_EYES)); -	addEntry(TEX_HAIR,                        new TextureEntry("hair_grain",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultHairUUID",      LLWearableType::WT_HAIR)); -	addEntry(TEX_UPPER_BODYPAINT,             new TextureEntry("upper_bodypaint",  TRUE,  BAKED_NUM_INDICES, "",                          LLWearableType::WT_SKIN)); -	addEntry(TEX_LOWER_BODYPAINT,             new TextureEntry("lower_bodypaint",  TRUE,  BAKED_NUM_INDICES, "",                          LLWearableType::WT_SKIN)); -	addEntry(TEX_LOWER_SHOES,                 new TextureEntry("lower_shoes",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultShoesUUID",     LLWearableType::WT_SHOES)); -	addEntry(TEX_LOWER_SOCKS,                 new TextureEntry("lower_socks",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultSocksUUID",     LLWearableType::WT_SOCKS)); -	addEntry(TEX_UPPER_JACKET,                new TextureEntry("upper_jacket",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultJacketUUID",    LLWearableType::WT_JACKET)); -	addEntry(TEX_LOWER_JACKET,                new TextureEntry("lower_jacket",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultJacketUUID",    LLWearableType::WT_JACKET)); -	addEntry(TEX_UPPER_GLOVES,                new TextureEntry("upper_gloves",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID",    LLWearableType::WT_GLOVES)); -	addEntry(TEX_UPPER_UNDERSHIRT,            new TextureEntry("upper_undershirt", TRUE,  BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERSHIRT)); -	addEntry(TEX_LOWER_UNDERPANTS,            new TextureEntry("lower_underpants", TRUE,  BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERPANTS)); -	addEntry(TEX_SKIRT,                       new TextureEntry("skirt",            TRUE,  BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID",     LLWearableType::WT_SKIRT)); - -	addEntry(TEX_LOWER_ALPHA,                 new TextureEntry("lower_alpha",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     LLWearableType::WT_ALPHA)); -	addEntry(TEX_UPPER_ALPHA,                 new TextureEntry("upper_alpha",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     LLWearableType::WT_ALPHA)); -	addEntry(TEX_HEAD_ALPHA,                  new TextureEntry("head_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     LLWearableType::WT_ALPHA)); -	addEntry(TEX_EYES_ALPHA,                  new TextureEntry("eyes_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     LLWearableType::WT_ALPHA)); -	addEntry(TEX_HAIR_ALPHA,                  new TextureEntry("hair_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     LLWearableType::WT_ALPHA)); - -	addEntry(TEX_HEAD_TATTOO,                 new TextureEntry("head_tattoo",      TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO)); -	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO)); -	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO)); - -	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD)); -	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER)); -	addEntry(TEX_LOWER_BAKED,                 new TextureEntry("lower-baked",      FALSE, BAKED_LOWER)); -	addEntry(TEX_EYES_BAKED,                  new TextureEntry("eyes-baked",       FALSE, BAKED_EYES)); -	addEntry(TEX_HAIR_BAKED,                  new TextureEntry("hair-baked",       FALSE, BAKED_HAIR)); -	addEntry(TEX_SKIRT_BAKED,                 new TextureEntry("skirt-baked",      FALSE, BAKED_SKIRT)); -} - -LLVOAvatarDictionary::BakedTextures::BakedTextures() -{ -	// Baked textures -	addEntry(BAKED_HEAD,       new BakedEntry(TEX_HEAD_BAKED,   -											  "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff",  -											  3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, -											  5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); - -	addEntry(BAKED_UPPER,      new BakedEntry(TEX_UPPER_BAKED,  -											  "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4",  -											  7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, -											  TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, -											  8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));											   - -	addEntry(BAKED_LOWER,      new BakedEntry(TEX_LOWER_BAKED,  -											  "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d", -											  8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, -											  TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, -											  9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_PANTS, LLWearableType::WT_SHOES,	 LLWearableType::WT_SOCKS,  LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); - -	addEntry(BAKED_EYES,       new BakedEntry(TEX_EYES_BAKED,   -											  "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788", -											  2, TEX_EYES_IRIS, TEX_EYES_ALPHA, -											  2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA)); - -	addEntry(BAKED_SKIRT,      new BakedEntry(TEX_SKIRT_BAKED, -											  "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63",  -											  1, TEX_SKIRT, -											  1, LLWearableType::WT_SKIRT)); - -	addEntry(BAKED_HAIR,       new BakedEntry(TEX_HAIR_BAKED, -											  "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61",  -											  2, TEX_HAIR, TEX_HAIR_ALPHA, -											  2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA)); -} - -LLVOAvatarDictionary::Meshes::Meshes() -{ -	// Meshes -	addEntry(MESH_ID_HAIR,             new MeshEntry(BAKED_HAIR,  "hairMesh",         6, LLViewerJoint::PN_4)); -	addEntry(MESH_ID_HEAD,             new MeshEntry(BAKED_HEAD,  "headMesh",         5, LLViewerJoint::PN_5)); -	addEntry(MESH_ID_EYELASH,          new MeshEntry(BAKED_HEAD,  "eyelashMesh",      1, LLViewerJoint::PN_0)); // no baked mesh associated currently -	addEntry(MESH_ID_UPPER_BODY,       new MeshEntry(BAKED_UPPER, "upperBodyMesh",    5, LLViewerJoint::PN_1)); -	addEntry(MESH_ID_LOWER_BODY,       new MeshEntry(BAKED_LOWER, "lowerBodyMesh",    5, LLViewerJoint::PN_2)); -	addEntry(MESH_ID_EYEBALL_LEFT,     new MeshEntry(BAKED_EYES,  "eyeBallLeftMesh",  2, LLViewerJoint::PN_3)); -	addEntry(MESH_ID_EYEBALL_RIGHT,    new MeshEntry(BAKED_EYES,  "eyeBallRightMesh", 2, LLViewerJoint::PN_3)); -	addEntry(MESH_ID_SKIRT,            new MeshEntry(BAKED_SKIRT, "skirtMesh",        5, LLViewerJoint::PN_5)); -} - -/* - * - *********************************************************************************/ - -LLVOAvatarDictionary::LLVOAvatarDictionary() -{ -	createAssociations(); -} - -//virtual  -LLVOAvatarDictionary::~LLVOAvatarDictionary() -{ -} - -// Baked textures are composites of textures; for each such composited texture, -// map it to the baked texture. -void LLVOAvatarDictionary::createAssociations() -{ -	for (BakedTextures::const_iterator iter = mBakedTextures.begin(); iter != mBakedTextures.end(); iter++) -	{ -		const EBakedTextureIndex baked_index = (iter->first); -		const BakedEntry *dict = (iter->second); - -		// For each texture that this baked texture index affects, associate those textures -		// with this baked texture index. -		for (texture_vec_t::const_iterator local_texture_iter = dict->mLocalTextures.begin(); -			 local_texture_iter != dict->mLocalTextures.end(); -			 local_texture_iter++) -		{ -			const ETextureIndex local_texture_index = (ETextureIndex) *local_texture_iter; -			mTextures[local_texture_index]->mIsUsedByBakedTexture = true; -			mTextures[local_texture_index]->mBakedTextureIndex = baked_index; -		} -	} -		 -} - -LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name, -												 bool is_local_texture,  -												 EBakedTextureIndex baked_texture_index, -												 const std::string &default_image_name, -												 LLWearableType::EType wearable_type) : -	LLDictionaryEntry(name), -	mIsLocalTexture(is_local_texture), -	mIsBakedTexture(!is_local_texture), -	mIsUsedByBakedTexture(baked_texture_index != BAKED_NUM_INDICES), -	mBakedTextureIndex(baked_texture_index), -	mDefaultImageName(default_image_name), -	mWearableType(wearable_type) -{ -} - -LLVOAvatarDictionary::MeshEntry::MeshEntry(EBakedTextureIndex baked_index,  -										   const std::string &name,  -										   U8 level, -										   LLViewerJoint::PickName pick) : -	LLDictionaryEntry(name), -	mBakedID(baked_index), -	mLOD(level), -	mPickName(pick) -{ -} -LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,  -											 const std::string &name,  -											 const std::string &hash_name, -											 U32 num_local_textures, -											 ... ) : -	LLDictionaryEntry(name), -	mWearablesHashID(LLUUID(hash_name)), -	mTextureIndex(tex_index) -{ -	va_list argp; - -	va_start(argp, num_local_textures); - -	// Read in local textures -	for (U8 i=0; i < num_local_textures; i++) -	{ -		ETextureIndex t = (ETextureIndex)va_arg(argp,int); -		mLocalTextures.push_back(t); -	} - -	// Read in number of wearables -	const U32 num_wearables = (U32)va_arg(argp,int); -	// Read in wearables -	for (U8 i=0; i < num_wearables; i++) -	{ -		LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int); -		mWearables.push_back(t); -	} -} - -// static -ETextureIndex LLVOAvatarDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index) -{ -	return LLVOAvatarDictionary::getInstance()->getBakedTexture(index)->mTextureIndex; -} - -//static  -EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name) -{ -	U8 index = 0; -	while (index < BAKED_NUM_INDICES) -	{ -		const BakedEntry *be = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index); -		if (be && be->mName.compare(name) == 0) -		{ -			// baked texture found -			return (EBakedTextureIndex) index; -		} -		index++; -	} -	// baked texture could not be found -	return BAKED_NUM_INDICES; -} - -//static -const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index) -{ -	const TextureEntry *texture_dict = getInstance()->getTexture(index); -	const std::string &default_image_name = texture_dict->mDefaultImageName; -	if (default_image_name == "") -	{ -		return IMG_DEFAULT_AVATAR; -	} -	else -	{ -		return LLUUID(gSavedSettings.getString(default_image_name)); -	} -} - -// static -LLWearableType::EType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index ) -{ -	return getInstance()->getTexture(index)->mWearableType; -} - diff --git a/indra/newview/llvoavatardefines.h b/indra/newview/llvoavatardefines.h deleted file mode 100644 index 35bb37463a..0000000000 --- a/indra/newview/llvoavatardefines.h +++ /dev/null @@ -1,228 +0,0 @@ -/**  - * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation fo - * LLViewerObject - * - * $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 LLVOAVATAR_DEFINES_H -#define LLVOAVATAR_DEFINES_H - -#include <vector> -#include "llwearable.h" -#include "llviewerjoint.h" -#include "lldictionary.h" - -namespace LLVOAvatarDefines -{ - -extern const S32 SCRATCH_TEX_WIDTH; -extern const S32 SCRATCH_TEX_HEIGHT; -extern const S32 IMPOSTOR_PERIOD; - -//-------------------------------------------------------------------- -// Enums -//-------------------------------------------------------------------- -enum ETextureIndex -{ -	TEX_HEAD_BODYPAINT = 0, -	TEX_UPPER_SHIRT, -	TEX_LOWER_PANTS, -	TEX_EYES_IRIS, -	TEX_HAIR, -	TEX_UPPER_BODYPAINT, -	TEX_LOWER_BODYPAINT, -	TEX_LOWER_SHOES, -	TEX_HEAD_BAKED,		// Pre-composited -	TEX_UPPER_BAKED,	// Pre-composited -	TEX_LOWER_BAKED,	// Pre-composited -	TEX_EYES_BAKED,		// Pre-composited -	TEX_LOWER_SOCKS, -	TEX_UPPER_JACKET, -	TEX_LOWER_JACKET, -	TEX_UPPER_GLOVES, -	TEX_UPPER_UNDERSHIRT, -	TEX_LOWER_UNDERPANTS, -	TEX_SKIRT, -	TEX_SKIRT_BAKED,	// Pre-composited -	TEX_HAIR_BAKED,     // Pre-composited -	TEX_LOWER_ALPHA, -	TEX_UPPER_ALPHA, -	TEX_HEAD_ALPHA, -	TEX_EYES_ALPHA, -	TEX_HAIR_ALPHA, -	TEX_HEAD_TATTOO, -	TEX_UPPER_TATTOO, -	TEX_LOWER_TATTOO, -	TEX_NUM_INDICES -};  - -enum EBakedTextureIndex -{ -	BAKED_HEAD = 0, -	BAKED_UPPER, -	BAKED_LOWER, -	BAKED_EYES, -	BAKED_SKIRT, -	BAKED_HAIR, -	BAKED_NUM_INDICES -}; - -// Reference IDs for each mesh. Used as indices for vector of joints -enum EMeshIndex -{ -	MESH_ID_HAIR = 0, -	MESH_ID_HEAD, -	MESH_ID_EYELASH, -	MESH_ID_UPPER_BODY, -	MESH_ID_LOWER_BODY, -	MESH_ID_EYEBALL_LEFT, -	MESH_ID_EYEBALL_RIGHT, -	MESH_ID_SKIRT, -	MESH_ID_NUM_INDICES -}; - -//-------------------------------------------------------------------- -// Vector Types -//-------------------------------------------------------------------- -typedef std::vector<ETextureIndex> texture_vec_t; -typedef std::vector<EBakedTextureIndex> bakedtexture_vec_t; -typedef std::vector<EMeshIndex> mesh_vec_t; -typedef std::vector<LLWearableType::EType> wearables_vec_t; - -//------------------------------------------------------------------------ -// LLVOAvatarDictionary -//  -// Holds dictionary static entries for textures, baked textures, meshes, etc.; i.e. -// information that is common to all avatars. -//  -// This holds const data - it is initialized once and the contents never change after that. -//------------------------------------------------------------------------ -class LLVOAvatarDictionary : public LLSingleton<LLVOAvatarDictionary> -{ -	//-------------------------------------------------------------------- -	// Constructors and Destructors -	//-------------------------------------------------------------------- -public: -	LLVOAvatarDictionary(); -	virtual ~LLVOAvatarDictionary(); -private: -	void createAssociations(); -	 -	//-------------------------------------------------------------------- -	// Local and baked textures -	//-------------------------------------------------------------------- -public: -	struct TextureEntry : public LLDictionaryEntry -	{ -		TextureEntry(const std::string &name, // this must match the xml name used by LLTexLayerInfo::parseXml -					 bool is_local_texture,  -					 EBakedTextureIndex baked_texture_index = BAKED_NUM_INDICES, -					 const std::string& default_image_name = "", -					 LLWearableType::EType wearable_type = LLWearableType::WT_INVALID); -		const std::string 	mDefaultImageName; -		const LLWearableType::EType mWearableType; -		// It's either a local texture xor baked -		BOOL 				mIsLocalTexture; -		BOOL 				mIsBakedTexture; -		// If it's a local texture, it may be used by a baked texture -		BOOL 				mIsUsedByBakedTexture; -		EBakedTextureIndex 	mBakedTextureIndex; -	}; - -	struct Textures : public LLDictionary<ETextureIndex, TextureEntry> -	{ -		Textures(); -	} mTextures; -	const TextureEntry*		getTexture(ETextureIndex index) const { return mTextures.lookup(index); } -	const Textures&			getTextures() const { return mTextures; } -	 -	//-------------------------------------------------------------------- -	// Meshes -	//-------------------------------------------------------------------- -public: -	struct MeshEntry : public LLDictionaryEntry -	{ -		MeshEntry(EBakedTextureIndex baked_index,  -				  const std::string &name, // names of mesh types as they are used in avatar_lad.xml -				  U8 level, -				  LLViewerJoint::PickName pick); -		// Levels of Detail for each mesh.  Must match levels of detail present in avatar_lad.xml -        // Otherwise meshes will be unable to be found, or levels of detail will be ignored -		const U8 						mLOD; -		const EBakedTextureIndex 		mBakedID; -		const LLViewerJoint::PickName 	mPickName; -	}; - -	struct Meshes : public LLDictionary<EMeshIndex, MeshEntry> -	{ -		Meshes(); -	} mMeshes; -	const MeshEntry*		getMesh(EMeshIndex index) const { return mMeshes.lookup(index); } -	const Meshes&			getMeshes() const { return mMeshes; } - -	//-------------------------------------------------------------------- -	// Baked Textures -	//-------------------------------------------------------------------- -public: -	struct BakedEntry : public LLDictionaryEntry -	{ -		BakedEntry(ETextureIndex tex_index,  -				   const std::string &name, // unused, but necessary for templating. -				   const std::string &hash_name, -				   U32 num_local_textures, ... ); // # local textures, local texture list, # wearables, wearable list -		// Local Textures -		const ETextureIndex mTextureIndex; -		texture_vec_t 		mLocalTextures; -		// Wearables -		const LLUUID 		mWearablesHashID; -		wearables_vec_t 	mWearables; -	}; - -	struct BakedTextures: public LLDictionary<EBakedTextureIndex, BakedEntry> -	{ -		BakedTextures(); -	} mBakedTextures; -	const BakedEntry*		getBakedTexture(EBakedTextureIndex index) const { return mBakedTextures.lookup(index); } -	const BakedTextures&	getBakedTextures() const { return mBakedTextures; } -	 -	//-------------------------------------------------------------------- -	// Convenience Functions -	//-------------------------------------------------------------------- -public: -	// Convert from baked texture to associated texture; e.g. BAKED_HEAD -> TEX_HEAD_BAKED -	static ETextureIndex 		bakedToLocalTextureIndex(EBakedTextureIndex t); - -	// find a baked texture index based on its name -	static EBakedTextureIndex 	findBakedByRegionName(std::string name); - -	static const LLUUID			getDefaultTextureImageID(ETextureIndex index); - -	// Given a texture entry, determine which wearable type owns it. -	static LLWearableType::EType 		getTEWearableType(ETextureIndex index); - -}; // End LLVOAvatarDictionary - -} // End namespace LLVOAvatarDefines - -#endif //LL_VO_AVATARDEFINES_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7a81063f83..77deb5e3bc 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -55,6 +55,8 @@  #include "llviewerobjectlist.h"  #include "llviewerstats.h"  #include "llviewerregion.h" +#include "llviewertexlayer.h" +#include "llviewerwearable.h"  #include "llappearancemgr.h"  #include "llmeshrepository.h"  #include "llvovolume.h" @@ -72,9 +74,7 @@ LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL;  BOOL isAgentAvatarValid()  { -	return (gAgentAvatarp.notNull() && -			(gAgentAvatarp->getRegion() != NULL) && -			(!gAgentAvatarp->isDead())); +	return (gAgentAvatarp.notNull() && gAgentAvatarp->isValid());  }  void selfStartPhase(const std::string& phase_name) @@ -110,7 +110,7 @@ void selfStopAllPhases()  	}  } -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  /*********************************************************************************   **                                                                             ** @@ -188,7 +188,7 @@ void LLVOAvatarSelf::initInstance()  	llinfos << "Self avatar object created. Starting timer." << llendl;  	mDebugSelfLoadTimer.reset();  	// clear all times to -1 for debugging -	for (U32 i =0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) +	for (U32 i =0; i < LLAvatarAppearanceDefines::TEX_NUM_INDICES; ++i)  	{  		for (U32 j = 0; j <= MAX_DISCARD_LEVEL; ++j)  		{ @@ -196,7 +196,7 @@ void LLVOAvatarSelf::initInstance()  		}  	} -	for (U32 i =0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) +	for (U32 i =0; i < LLAvatarAppearanceDefines::BAKED_NUM_INDICES; ++i)  	{  		mDebugBakedTextureTimes[i][0] = -1.0f;  		mDebugBakedTextureTimes[i][1] = -1.0f; @@ -249,13 +249,11 @@ BOOL LLVOAvatarSelf::loadAvatarSelf()  		llwarns << "avatar file: buildSkeleton() failed" << llendl;  		return FALSE;  	} -	// TODO: make loadLayersets() called only by self. -	//success &= loadLayersets();  	return success;  } -BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info) +BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLAvatarSkeletonInfo *info)  {  	LLMemType mt(LLMemType::MTYPE_AVATAR); @@ -343,7 +341,6 @@ BOOL LLVOAvatarSelf::buildMenus()  		}  		else  		{ -			BOOL attachment_found = FALSE;  			for (attachment_map_t::iterator iter = mAttachmentPoints.begin();   				 iter != mAttachmentPoints.end();  				 ++iter) @@ -371,7 +368,6 @@ BOOL LLVOAvatarSelf::buildMenus()  					gAttachPieMenu->addChild(item); -					attachment_found = TRUE;  					break;  				} @@ -384,7 +380,6 @@ BOOL LLVOAvatarSelf::buildMenus()  		}  		else  		{ -			BOOL attachment_found = FALSE;  			for (attachment_map_t::iterator iter = mAttachmentPoints.begin();   				 iter != mAttachmentPoints.end();  				 ++iter) @@ -411,7 +406,6 @@ BOOL LLVOAvatarSelf::buildMenus()  					gDetachPieMenu->addChild(item); -					attachment_found = TRUE;  					break;  				}  			} @@ -585,70 +579,6 @@ LLVOAvatarSelf::~LLVOAvatarSelf()   **                                                                             **   *********************************************************************************/ -//virtual -BOOL LLVOAvatarSelf::loadLayersets() -{ -	BOOL success = TRUE; -	for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator iter = sAvatarXmlInfo->mLayerInfoList.begin(); -		 iter != sAvatarXmlInfo->mLayerInfoList.end();  -		 ++iter) -	{ -		// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such. -		const LLTexLayerSetInfo *info = *iter; -		LLTexLayerSet* layer_set = new LLTexLayerSet( this ); -		 -		if (!layer_set->setInfo(info)) -		{ -			stop_glerror(); -			delete layer_set; -			llwarns << "avatar file: layer_set->parseData() failed" << llendl; -			return FALSE; -		} - -		// scan baked textures and associate the layerset with the appropriate one -		EBakedTextureIndex baked_index = BAKED_NUM_INDICES; -		for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -			 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); -			 ++baked_iter) -		{ -			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; -			if (layer_set->isBodyRegion(baked_dict->mName)) -			{ -				baked_index = baked_iter->first; -				// ensure both structures are aware of each other -				mBakedTextureDatas[baked_index].mTexLayerSet = layer_set; -				layer_set->setBakedTexIndex(baked_index); -				break; -			} -		} -		// if no baked texture was found, warn and cleanup -		if (baked_index == BAKED_NUM_INDICES) -		{ -			llwarns << "<layer_set> has invalid body_region attribute" << llendl; -			delete layer_set; -			return FALSE; -		} - -		// scan morph masks and let any affected layers know they have an associated morph -		for (LLVOAvatar::morph_list_t::const_iterator morph_iter = mBakedTextureDatas[baked_index].mMaskedMorphs.begin(); -			morph_iter != mBakedTextureDatas[baked_index].mMaskedMorphs.end(); -			 ++morph_iter) -		{ -			LLMaskedMorph *morph = *morph_iter; -			LLTexLayerInterface* layer = layer_set->findLayerByName(morph->mLayer); -			if (layer) -			{ -				layer->setHasMorph(TRUE); -			} -			else -			{ -				llwarns << "Could not find layer named " << morph->mLayer << " to set morph flag" << llendl; -				success = FALSE; -			} -		} -	} -	return success; -}  // virtual  BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)  { @@ -668,9 +598,15 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)  }  // virtual +BOOL LLVOAvatarSelf::isValid() const +{ +	return ((getRegion() != NULL) && !isDead()); +} + +// virtual  void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { -	if (isAgentAvatarValid()) +	if (isValid())  	{  		LLVOAvatar::idleUpdate(agent, world, time);  		idleUpdateTractorBeam(); @@ -693,7 +629,7 @@ void LLVOAvatarSelf::resetJointPositions( void )  	return LLVOAvatar::resetJointPositions();  }  // virtual -BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) +BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake )  {  	if (!which_param)  	{ @@ -721,20 +657,28 @@ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bak  	return setParamWeight(param,weight,upload_bake);  } -BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake ) +BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake )  {  	if (!param)  	{  		return FALSE;  	} +#if 0 +	// FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. +	if (isUsingServerBakes() && !isUsingLocalAppearance()) +	{ +		return FALSE; +	} +#endif +  	if (param->getCrossWearable())  	{  		LLWearableType::EType type = (LLWearableType::EType)param->getWearableType();  		U32 size = gAgentWearables.getWearableCount(type);  		for (U32 count = 0; count < size; ++count)  		{ -			LLWearable *wearable = gAgentWearables.getWearable(type,count); +			LLViewerWearable *wearable = gAgentWearables.getViewerWearable(type,count);  			if (wearable)  			{  				wearable->setVisualParamWeight(param->getID(), weight, upload_bake); @@ -763,7 +707,7 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation()  		LLWearable *wearable = gAgentWearables.getTopWearable((LLWearableType::EType)type);  		if (wearable)  		{ -			wearable->writeToAvatar(); +			wearable->writeToAvatar(this);  		}  	} @@ -806,18 +750,21 @@ U32  LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys,  {  	U32 retval = LLVOAvatar::processUpdateMessage(mesgsys,user_data,block_num,update_type,dp); -	if (mInitialBakesLoaded == false && retval == 0x0) +	// FIXME DRANO - skipping in the case of !mFirstAppearanceMessageReceived prevents us from trying to +	// load textures before we know where they come from (ie, from baking service or not); +	// unknown impact on performance. +	if (mInitialBakesLoaded == false && retval == 0x0 && mFirstAppearanceMessageReceived)  	{  		// call update textures to force the images to be created  		updateMeshTextures();  		// unpack the texture UUIDs to the texture slots -		retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); +		retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);  		// need to trigger a few operations to get the avatar to use the new bakes  		for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  		{ -			const LLVOAvatarDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex; +			const LLAvatarAppearanceDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex;  			LLUUID texture_id = getTEImage(te)->getID();  			setNewBakedTexture(te, texture_id);  			mInitialBakeIDs[i] = texture_id; @@ -881,11 +828,15 @@ void LLVOAvatarSelf::removeMissingBakedTextures()  	{  		for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  		{ -			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); -			invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE); +			LLViewerTexLayerSet *layerset = getTexLayerSet(i); +			layerset->setUpdatesEnabled(TRUE); +			invalidateComposite(layerset, FALSE);  		}  		updateMeshTextures(); -		requestLayerSetUploads(); +		if (getRegion() && !getRegion()->getCentralBakeVersion()) +		{ +			requestLayerSetUploads(); +		}  	}  } @@ -942,7 +893,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)  void LLVOAvatarSelf::idleUpdateTractorBeam()  {  	// This is only done for yourself (maybe it should be in the agent?) -	if (!needsRenderBeam() || !mIsBuilt) +	if (!needsRenderBeam() || !isBuilt())  	{  		mBeam = NULL;  	} @@ -1057,11 +1008,6 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)  	}  } -/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(LLWearableType::EType type ) const -{ -	return gAgentWearables.getWearableCount(type) > 0; -} -  //-----------------------------------------------------------------------------  // updatedWearable( LLWearableType::EType type )  // forces an update to any baked textures relevant to type. @@ -1069,26 +1015,27 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)  //-----------------------------------------------------------------------------  void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_result )  { -	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{ -		const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; -		const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first; +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; +		const LLAvatarAppearanceDefines::EBakedTextureIndex index = baked_iter->first;  		if (baked_dict)  		{ -			for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin(); +			for (LLAvatarAppearanceDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();  				type_iter != baked_dict->mWearables.end();  				 ++type_iter)  			{  				const LLWearableType::EType comp_type = *type_iter;  				if (comp_type == type)  				{ -					if (mBakedTextureDatas[index].mTexLayerSet) +					LLViewerTexLayerSet *layerset = getLayerSet(index); +					if (layerset)  					{ -						mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled(true); -						invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result); +						layerset->setUpdatesEnabled(true); +						invalidateComposite(layerset, upload_result);  					}  					break;  				} @@ -1252,7 +1199,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)  		// Make sure the inventory is in sync with the avatar.  		// Update COF contents, don't trigger appearance update. -		if (!isAgentAvatarValid()) +		if (!isValid())  		{  			llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl;  		} @@ -1293,7 +1240,7 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id)  			const LLViewerObject *attached_obj = gAgentAvatarp->getWornAttachment(item_id);  			if (!attached_obj)  			{ -				LLAppearanceMgr::instance().removeCOFItemLinks(item_id, false); +				LLAppearanceMgr::instance().removeCOFItemLinks(item_id);  			}  		}  		return TRUE; @@ -1301,9 +1248,9 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id)  	return FALSE;  } -U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const +U32 LLVOAvatarSelf::getNumWearables(LLAvatarAppearanceDefines::ETextureIndex i) const  { -	LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); +	LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i);  	return gAgentWearables.getWearableCount(type);  } @@ -1334,11 +1281,8 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr  			discard_level < local_tex_obj->getDiscard())  		{  			local_tex_obj->setDiscard(discard_level); -			if (isUsingBakedTextures()) -			{ -				requestLayerSetUpdate(index); -			} -			else +			requestLayerSetUpdate(index); +			if (isEditingAppearance())  			{  				LLVisualParamHint::requestHintUpdates();  			} @@ -1372,11 +1316,11 @@ BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex  	{  		return FALSE;  	} -	*tex_pp = local_tex_obj->getImage(); +	*tex_pp = dynamic_cast<LLViewerTexture*> (local_tex_obj->getImage());  	return TRUE;  } -LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const +LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const  {  	if (!isIndexLocalTexture(type))  	{ @@ -1392,7 +1336,7 @@ LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETe  	{  		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);  	} -	return local_tex_obj->getImage(); +	return dynamic_cast<LLViewerFetchedTexture*> (local_tex_obj->getImage());  }  const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) const @@ -1413,29 +1357,30 @@ const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) c  // Returns true if at least the lowest quality discard level exists for every texture  // in the layerset.  //----------------------------------------------------------------------------- -BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const +BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const  {  	/* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)  	   return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ -	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first;  		if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)  		{  			BOOL ret = true; -			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second;  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ -					ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0); +					BOOL tex_avail = (getLocalDiscardLevel(tex_index, wearable_index) >= 0); +					ret &= tex_avail;  				}  			}  			return ret; @@ -1451,7 +1396,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)  // Returns true if the highest quality discard level exists for every texture  // in the layerset.  //----------------------------------------------------------------------------- -BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const +BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const  {  	const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");   	// const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels. @@ -1460,13 +1405,13 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons  	{  		if (layerset == mBakedTextureDatas[i].mTexLayerSet)  		{ -			const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ @@ -1490,13 +1435,13 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);  		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  			 local_tex_iter != baked_dict->mLocalTextures.end();  			 ++local_tex_iter)  		{  			const ETextureIndex tex_index = *local_tex_iter; -			const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); +			const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index);  			const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  			for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  			{ @@ -1510,22 +1455,22 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  	return TRUE;  } -BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const +BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const  { -	const LLTexLayerSet *layerset = mBakedTextureDatas[index].mTexLayerSet; +	const LLViewerTexLayerSet *layerset = getLayerSet(index);  	if (!layerset) return FALSE; -	const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); +	const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();  	if (!layerset_buffer) return FALSE;  	return !layerset_buffer->uploadNeeded();  } -BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatarSelf::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const  {  	LLUUID id;  	BOOL isDefined = TRUE;  	if (isIndexLocalTexture(type))  	{ -		const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(type); +		const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(type);  		const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  		if (index >= wearable_count)  		{ @@ -1552,7 +1497,7 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32  }  //virtual -BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const  {  	if (isIndexBakedTexture(type))  	{ @@ -1565,7 +1510,7 @@ BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32  }  //virtual -BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const  {  	if (isIndexBakedTexture(type))  	{ @@ -1588,13 +1533,14 @@ void LLVOAvatarSelf::requestLayerSetUploads()  	}  } -void LLVOAvatarSelf::requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i) +void LLVOAvatarSelf::requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i)  {  	ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;  	const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); -	if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet) +	LLViewerTexLayerSet *layerset = getLayerSet(i); +	if (!layer_baked && layerset)  	{ -		mBakedTextureDatas[i].mTexLayerSet->requestUpload(); +		layerset->requestUpload();  	}  } @@ -1608,8 +1554,8 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const  {  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		LLTexLayerSet* layerset = mBakedTextureDatas[i].mTexLayerSet; -		if (layerset && layerset->getComposite() && layerset->getComposite()->uploadPending()) +		LLViewerTexLayerSet* layerset = getTexLayerSet(i); +		if (layerset && layerset->getViewerComposite() && layerset->getViewerComposite()->uploadPending())  		{  			return true;  		} @@ -1619,22 +1565,23 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const  void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )  { -	if( !layerset || !layerset->getUpdatesEnabled() ) +	LLViewerTexLayerSet *layer_set = dynamic_cast<LLViewerTexLayerSet*>(layerset); +	if( !layer_set || !layer_set->getUpdatesEnabled() )  	{  		return;  	}  	// llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl; -	layerset->requestUpdate(); -	layerset->invalidateMorphMasks(); +	layer_set->requestUpdate(); +	layer_set->invalidateMorphMasks(); -	if( upload_result ) +	if( upload_result  && (getRegion() && !getRegion()->getCentralBakeVersion()))  	{  		llassert(isSelf()); -		ETextureIndex baked_te = getBakedTE( layerset ); +		ETextureIndex baked_te = getBakedTE( layer_set );  		setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) ); -		layerset->requestUpload(); +		layer_set->requestUpload();  		updateMeshTextures();  	}  } @@ -1643,7 +1590,8 @@ void LLVOAvatarSelf::invalidateAll()  {  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE); +		LLViewerTexLayerSet *layerset = getTexLayerSet(i); +		invalidateComposite(layerset, TRUE);  	}  	//mDebugSelfLoadTimer.reset();  } @@ -1661,17 +1609,19 @@ void LLVOAvatarSelf::setCompositeUpdatesEnabled( bool b )  void LLVOAvatarSelf::setCompositeUpdatesEnabled(U32 index, bool b)  { -	if (mBakedTextureDatas[index].mTexLayerSet ) +	LLViewerTexLayerSet *layerset = getTexLayerSet(index); +	if (layerset )  	{ -		mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled( b ); +		layerset->setUpdatesEnabled( b );  	}  }  bool LLVOAvatarSelf::isCompositeUpdateEnabled(U32 index)  { -	if (mBakedTextureDatas[index].mTexLayerSet) +	LLViewerTexLayerSet *layerset = getTexLayerSet(index); +	if (layerset)  	{ -		return mBakedTextureDatas[index].mTexLayerSet->getUpdatesEnabled(); +		return layerset->getUpdatesEnabled();  	}  	return false;  } @@ -1682,9 +1632,10 @@ void LLVOAvatarSelf::setupComposites()  	{  		ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;  		BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); -		if (mBakedTextureDatas[i].mTexLayerSet) +		LLViewerTexLayerSet *layerset = getTexLayerSet(i); +		if (layerset)  		{ -			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(!layer_baked); +			layerset->setUpdatesEnabled(!layer_baked);  		}  	}  } @@ -1693,10 +1644,11 @@ void LLVOAvatarSelf::updateComposites()  {  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		if (mBakedTextureDatas[i].mTexLayerSet  +		LLViewerTexLayerSet *layerset = getTexLayerSet(i); +		if (layerset   			&& ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT)))  		{ -			mBakedTextureDatas[i].mTexLayerSet->updateComposite(); +			layerset->updateComposite();  		}  	}  } @@ -1709,11 +1661,12 @@ S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 wearable_index)  	const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, wearable_index);  	if (local_tex_obj)  	{ +		const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );  		if (type >= 0  			&& local_tex_obj->getID() != IMG_DEFAULT_AVATAR -			&& !local_tex_obj->getImage()->isMissingAsset()) +			&& !image->isMissingAsset())  		{ -			return local_tex_obj->getImage()->getDiscardLevel(); +			return image->getDiscardLevel();  		}  		else  		{ @@ -1738,7 +1691,7 @@ void LLVOAvatarSelf::getLocalTextureByteCount(S32* gl_bytes) const  			const LLLocalTextureObject *local_tex_obj = getLocalTextureObject((ETextureIndex) type, num);  			if (local_tex_obj)  			{ -				const LLViewerFetchedTexture* image_gl = local_tex_obj->getImage(); +				const LLViewerFetchedTexture* image_gl = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );  				if (image_gl)  				{  					S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents(); @@ -1773,8 +1726,8 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  			llerrs << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << llendl;  			return;  		} -		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type); -		if (!gAgentWearables.getWearable(wearable_type,index)) +		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(type); +		if (!gAgentWearables.getViewerWearable(wearable_type,index))  		{  			// no wearable is loaded, cannot set the texture.  			return; @@ -1787,10 +1740,10 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  			return;  		} -		LLTexLayerSet *layer_set = getLayerSet(type); +		LLViewerTexLayerSet *layer_set = getLayerSet(type);  		if (layer_set)  		{ -			layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getWearable(wearable_type,index)); +			layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getViewerWearable(wearable_type,index));  		}  	} @@ -1810,15 +1763,12 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					local_tex_obj->setDiscard(tex_discard);  					if (isSelf())  					{ -						if (gAgentAvatarp->isUsingBakedTextures()) -					{  						requestLayerSetUpdate(type); +						if (isEditingAppearance()) +						{ +							LLVisualParamHint::requestHintUpdates(); +						}  					} -						else -					{ -						LLVisualParamHint::requestHintUpdates(); -					} -				}  				}  				else  				{					 @@ -1832,8 +1782,9 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  	local_tex_obj->setID(tex->getID());  	setBakedReady(type,baked_version_ready,index);  } +  //virtual -void LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) +void LLVOAvatarSelf::setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)  {  	if (!isIndexLocalTexture(type)) return;  	LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index); @@ -1852,16 +1803,16 @@ void LLVOAvatarSelf::dumpLocalTextures() const  	/* ETextureIndex baked_equiv[] = {  	   TEX_UPPER_BAKED,  	   if (isTextureDefined(baked_equiv[i])) */ -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{ -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture)  			continue;  		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; -		const ETextureIndex baked_equiv = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex; +		const ETextureIndex baked_equiv = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex;  		const std::string &name = texture_dict->mName;  		const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(iter->first, 0); @@ -1884,7 +1835,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const  			}  			else  			{ -				const LLViewerFetchedTexture* image = local_tex_obj->getImage(); +				const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );  				llinfos << "LocTex " << name << ": "  						<< "Discard " << image->getDiscardLevel() << ", " @@ -1979,14 +1930,14 @@ BOOL LLVOAvatarSelf::getIsCloud() const  	if (!mPreviousFullyLoaded)  	{ -		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) && +		if (!isLocalTextureDataAvailable(getLayerSet(BAKED_LOWER)) &&  			(!isTextureDefined(TEX_LOWER_BAKED, 0)))  		{  			lldebugs << "Lower textures not baked" << llendl;  			return TRUE;  		} -		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) && +		if (!isLocalTextureDataAvailable(getLayerSet(BAKED_UPPER)) &&  			(!isTextureDefined(TEX_UPPER_BAKED, 0)))  		{  			lldebugs << "Upper textures not baked" << llendl; @@ -2057,7 +2008,7 @@ void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL fini  	mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32();  } -const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const +const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const  {  	std::string text=""; @@ -2065,21 +2016,21 @@ const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayer  	/* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)  	   return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ -	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first;  		if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)  		{ -			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second;  			text += llformat("%d-%s ( ",baked_index, baked_dict->mName.c_str());  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				if (wearable_count > 0)  				{ @@ -2106,14 +2057,14 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);  		BOOL is_texture_final = TRUE;  		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  			 local_tex_iter != baked_dict->mLocalTextures.end();  			 ++local_tex_iter)  		{  			const ETextureIndex tex_index = *local_tex_iter; -			const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); +			const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index);  			const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  			for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  			{ @@ -2237,7 +2188,7 @@ const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) c  {  	if (canGrabBakedTexture(baked_index))  	{ -		ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); +		ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index);  		if (tex_index == TEX_NUM_INDICES)  		{  			return LLUUID::null; @@ -2249,7 +2200,7 @@ const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) c  BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  { -	ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); +	ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index);  	if (tex_index == TEX_NUM_INDICES)  	{  		return FALSE; @@ -2268,19 +2219,19 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  	// baked texture.  We don't want people copying people's  	// work via baked textures. -	const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); +	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index);  	for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin();  		 iter != baked_dict->mLocalTextures.end();  		 ++iter)  	{  		const ETextureIndex t_index = (*iter); -		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index); +		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(t_index);  		U32 count = gAgentWearables.getWearableCount(wearable_type);  		lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl;  		for (U32 wearable_index = 0; wearable_index < count; ++wearable_index)  		{ -			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index); +			LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, wearable_index);  			if (wearable)  			{  				const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index); @@ -2326,36 +2277,36 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  {  	if (!isIndexLocalTexture(type)) return; -	if (!covered_by_baked) +	if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0)  	{ -		if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0) +		F32 desired_pixels; +		desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); + +		if (isUsingLocalAppearance())  		{ -			F32 desired_pixels; -			desired_pixels = llmin(mPixelArea, (F32)getTexImageArea());  			imagep->setBoostLevel(getAvatarBoostLevel()); - -			imagep->resetTextureStats(); -			imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); -			imagep->addTextureStats( desired_pixels / texel_area_ratio );  			imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; -			imagep->forceUpdateBindStats() ; -			if (imagep->getDiscardLevel() < 0) -			{ -				mHasGrey = TRUE; // for statistics gathering -			}  		} -		else +		imagep->resetTextureStats(); +		imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); +		imagep->addTextureStats( desired_pixels / texel_area_ratio ); +		imagep->forceUpdateBindStats() ; +		if (imagep->getDiscardLevel() < 0)  		{ -			// texture asset is missing  			mHasGrey = TRUE; // for statistics gathering  		}  	} +	else +	{ +		// texture asset is missing +		mHasGrey = TRUE; // for statistics gathering +	}  } -LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 wearable_index) const +LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 wearable_index) const  { -	LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); -	LLWearable* wearable = gAgentWearables.getWearable(type, wearable_index); +	LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i); +	LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, wearable_index);  	if (wearable)  	{  		return wearable->getLocalTextureObject(i); @@ -2368,7 +2319,7 @@ LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::E  // getBakedTE()  // Used by the LayerSet.  (Layer sets don't in general know what textures depend on them.)  //----------------------------------------------------------------------------- -ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const +ETextureIndex LLVOAvatarSelf::getBakedTE( const LLViewerTexLayerSet* layerset ) const  {  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ @@ -2382,9 +2333,9 @@ ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const  } -void LLVOAvatarSelf::setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid) +void LLVOAvatarSelf::setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex i, const LLUUID &uuid)  { -	ETextureIndex index = LLVOAvatarDictionary::bakedToLocalTextureIndex(i); +	ETextureIndex index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(i);  	setNewBakedTexture(index, uuid);  } @@ -2406,7 +2357,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )  	/* switch(te)  		case TEX_HEAD_BAKED:  			llinfos << "New baked texture: HEAD" << llendl; */ -	const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(te); +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(te);  	if (texture_dict->mIsBakedTexture)  	{  		debugBakedTextureUpload(texture_dict->mBakedTextureIndex, TRUE); // FALSE for start of upload, TRUE for finish. @@ -2471,7 +2422,7 @@ void LLVOAvatarSelf::outputRezDiagnostics() const  	LL_DEBUGS("Avatar") << "\t Time from avatar creation to de-cloud: " << (S32)mDebugTimeAvatarVisible << llendl;  	LL_DEBUGS("Avatar") << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl;  	LL_DEBUGS("Avatar") << "\t Load time for each texture: " << llendl; -	for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) +	for (U32 i = 0; i < LLAvatarAppearanceDefines::TEX_NUM_INDICES; ++i)  	{  		std::stringstream out;  		out << "\t\t (" << i << ") "; @@ -2499,19 +2450,19 @@ void LLVOAvatarSelf::outputRezDiagnostics() const  		}  	}  	LL_DEBUGS("Avatar") << "\t Time points for each upload (start / finish)" << llendl; -	for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) +	for (U32 i = 0; i < LLAvatarAppearanceDefines::BAKED_NUM_INDICES; ++i)  	{  		LL_DEBUGS("Avatar") << "\t\t (" << i << ") \t" << (S32)mDebugBakedTextureTimes[i][0] << " / " << (S32)mDebugBakedTextureTimes[i][1] << llendl;  	} -	for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{ -		const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; -		const LLTexLayerSet *layerset = debugGetLayerSet(baked_index); +		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; +		const LLViewerTexLayerSet *layerset = debugGetLayerSet(baked_index);  		if (!layerset) continue; -		const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); +		const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();  		if (!layerset_buffer) continue;  		LL_DEBUGS("Avatar") << layerset_buffer->dumpTextureInfo() << llendl;  	} @@ -2544,7 +2495,8 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid  				mHeadLayerSet->cancelUpload(); */  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		if ( mBakedTextureDatas[i].mTextureIndex == te && mBakedTextureDatas[i].mTexLayerSet) +		LLViewerTexLayerSet *layerset = getTexLayerSet(i); +		if ( mBakedTextureDatas[i].mTextureIndex == te && layerset)  		{  			if (mInitialBakeIDs[i] != LLUUID::null)  			{ @@ -2558,7 +2510,7 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid  				}  				mInitialBakeIDs[i] = LLUUID::null;  			} -			mBakedTextureDatas[i].mTexLayerSet->cancelUpload(); +			layerset->cancelUpload();  		}  	}  } @@ -2577,17 +2529,17 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)  	/* ETextureIndex baked_texture_indices[BAKED_NUM_INDICES] =  			TEX_HEAD_BAKED,  			TEX_UPPER_BAKED, */ -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		if (texture_dict->mIsBakedTexture)  		{  			if (texture_id == gAgentAvatarp->getTEImage(index)->getID())  			{ -				LLTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index); +				LLViewerTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index);  				if (layer_set)  				{  					llinfos << "TAT: rebake - matched entry " << (S32)index << llendl; @@ -2611,15 +2563,6 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)  	}  } -BOOL LLVOAvatarSelf::isUsingBakedTextures() const -{ -	// Composite textures are used during appearance mode. -	if (gAgentCamera.cameraCustomizeAvatar()) -		return FALSE; - -	return TRUE; -} -  void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)  { @@ -2628,7 +2571,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{  		ETextureIndex baked_index = mBakedTextureDatas[i].mTextureIndex; -		LLTexLayerSet* layer_set = getLayerSet(baked_index); +		LLViewerTexLayerSet* layer_set = getLayerSet(baked_index);  		if (layer_set)  		{  			if (slam_for_debug) @@ -2660,7 +2603,7 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )  		case LOCTEX_UPPER_SHIRT:  			if( mUpperBodyLayerSet )  				mUpperBodyLayerSet->requestUpdate(); */ -	const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index); +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index);  	if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture)  		return;  	const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; @@ -2670,22 +2613,22 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )  	}  } -LLTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const +LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const  { -	/* switch(index) -		case TEX_HEAD_BAKED: -		case TEX_HEAD_BODYPAINT: -			return mHeadLayerSet; */ -	const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index); -	if (texture_dict->mIsUsedByBakedTexture) -	{ -		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; -		return mBakedTextureDatas[baked_index].mTexLayerSet; -	} -	return NULL; +       /* switch(index) +               case TEX_HEAD_BAKED: +               case TEX_HEAD_BODYPAINT: +                       return mHeadLayerSet; */ +       const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); +       if (texture_dict->mIsUsedByBakedTexture) +       { +               const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; +               return getLayerSet(baked_index); +       } +       return NULL;  } -LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const +LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const  {         /* switch(index)                 case TEX_HEAD_BAKED: @@ -2693,26 +2636,59 @@ LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const                         return mHeadLayerSet; */         if (baked_index >= 0 && baked_index < BAKED_NUM_INDICES)         { -                       return mBakedTextureDatas[baked_index].mTexLayerSet; +		   return  getTexLayerSet(baked_index);         }         return NULL;  } + +  // static -void LLVOAvatarSelf::onCustomizeStart() +void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch)  { -	// We're no longer doing any baking or invalidating on entering  -	// appearance editing mode. Leaving function in place in case  -	// further changes require us to do something at this point - Nyx +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->mIsEditingAppearance = true; +		gAgentAvatarp->mUseLocalAppearance = true; + +		if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) +		{ +			gAgentCamera.changeCameraToCustomizeAvatar(); +		} + +#if 0 +		gAgentAvatarp->clearVisualParamWeights(); +		gAgentAvatarp->idleUpdateAppearanceAnimation(); +#endif +		 +		gAgentAvatarp->invalidateAll(); +		gAgentAvatarp->updateMeshTextures(); +	}  }  // static -void LLVOAvatarSelf::onCustomizeEnd() +void LLVOAvatarSelf::onCustomizeEnd(bool disable_camera_switch)  { +  	if (isAgentAvatarValid())  	{ +		gAgentAvatarp->mIsEditingAppearance = false; +		if (gAgentAvatarp->getRegion() && !gAgentAvatarp->getRegion()->getCentralBakeVersion()) +		{ +			// FIXME DRANO - move to sendAgentSetAppearance, make conditional on upload complete. +			gAgentAvatarp->mUseLocalAppearance = false; +		} +  		gAgentAvatarp->invalidateAll(); + +		if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) +		{ +			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView(); +		} + +		LLAppearanceMgr::instance().updateAppearanceFromCOF();  	}  } @@ -2725,12 +2701,12 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  {  	LLUUID texture_id[TEX_NUM_INDICES];  	// pack away current TEs to make sure we don't send them out -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		if (!texture_dict->mIsBakedTexture)  		{  			LLTextureEntry* entry = getTE((U8) index); @@ -2742,12 +2718,12 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  	bool success = packTEMessage(mesgsys);  	// unpack TEs to make sure we don't re-trigger a bake -	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); -		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; -		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; +		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;  		if (!texture_dict->mIsBakedTexture)  		{  			LLTextureEntry* entry = getTE((U8) index); @@ -2803,3 +2779,38 @@ void LLVOAvatarSelf::dumpScratchTextureByteCount()  {  	llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;  } + +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); + +void LLVOAvatarSelf::dumpWearableInfo(LLAPRFile& outfile) +{ +	apr_file_t* file = outfile.getFileHandle(); +	if (!file) +	{ +		return; +	} + +	 +	apr_file_printf( file, "\n<wearable_info>\n" ); + +	LLWearableData *wd = getWearableData(); +	for (S32 type = 0; type < LLWearableType::WT_COUNT; type++) +	{ +		const std::string& type_name = LLWearableType::getTypeName((LLWearableType::EType)type); +		for (U32 j=0; j< wd->getWearableCount((LLWearableType::EType)type); j++) +		{ +			LLViewerWearable *wearable = gAgentWearables.getViewerWearable((LLWearableType::EType)type,j); +			apr_file_printf( file, "\n\t    <wearable type=\"%s\" name=\"%s\"/>\n", +							 type_name.c_str(), wearable->getName().c_str() ); +			LLWearable::visual_param_vec_t v_params; +			wearable->getVisualParams(v_params); +			for (LLWearable::visual_param_vec_t::iterator it = v_params.begin(); +				 it != v_params.end(); ++it) +			{ +				LLVisualParam *param = *it; +				dump_visual_param(file, param, param->getWeight()); +			} +		} +	} +	apr_file_printf( file, "\n</wearable_info>\n" ); +} diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 7bd0c0bf93..eeac5ddaeb 100644..100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -67,9 +67,8 @@ public:  protected:  	/*virtual*/ BOOL		loadAvatar();  	BOOL					loadAvatarSelf(); -	BOOL					buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info); +	BOOL					buildSkeletonSelf(const LLAvatarSkeletonInfo *info);  	BOOL					buildMenus(); -	/*virtual*/ BOOL		loadLayersets();  /**                    Initialization   **                                                                            ** @@ -97,7 +96,7 @@ public:  				void		resetJointPositions( void ); -	/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); +	/*virtual*/ BOOL setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );  	/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );  	/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );  	/*virtual*/ void updateVisualParams(); @@ -111,7 +110,7 @@ public:  private:  	// helper function. Passed in param is assumed to be in avatar's parameter list. -	BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE ); +	BOOL setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE ); @@ -131,6 +130,7 @@ private:  public:  	/*virtual*/ bool 	isSelf() const { return true; } +	/*virtual*/ BOOL	isValid() const;  	//--------------------------------------------------------------------  	// Updates @@ -177,8 +177,8 @@ private:  	// LLVOAvatar Constants  	//--------------------------------------------------------------------  public: -	/*virtual*/ LLViewerTexture::EBoostLevel 	getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_SELF; } -	/*virtual*/ LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED_SELF; } +	/*virtual*/ LLViewerTexture::EBoostLevel 	getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR_SELF; } +	/*virtual*/ LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED_SELF; }  	/*virtual*/ S32 						getTexImageSize() const { return LLVOAvatar::getTexImageSize()*4; }  /**                    Rendering @@ -195,32 +195,32 @@ public:  	//--------------------------------------------------------------------  public:  	/*virtual*/ bool	hasPendingBakedUploads() const; -	S32					getLocalDiscardLevel(LLVOAvatarDefines::ETextureIndex type, U32 index) const; +	S32					getLocalDiscardLevel(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const;  	bool				areTexturesCurrent() const; -	BOOL				isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const; -	BOOL				isLocalTextureDataFinal(const LLTexLayerSet* layerset) const; -	BOOL				isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const; +	BOOL				isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const; +	BOOL				isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const; +	BOOL				isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const;  	// If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index -	/*virtual*/ BOOL    isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const; -	/*virtual*/ BOOL	isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; -	/*virtual*/ BOOL	isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; +	/*virtual*/ BOOL    isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; +	/*virtual*/ BOOL	isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; +	/*virtual*/ BOOL	isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const;  	//--------------------------------------------------------------------  	// Local Textures  	//--------------------------------------------------------------------  public: -	BOOL				getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const; -	LLViewerFetchedTexture*	getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const; -	const LLUUID&		getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const; +	BOOL				getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const; +	LLViewerFetchedTexture*	getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; +	const LLUUID&		getLocalTextureID(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const;  	void				setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index); -	/*virtual*/ void	setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index); +	/*virtual*/ void	setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);  protected: -	/*virtual*/ void	setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index); +	/*virtual*/ void	setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index);  	void				localTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);  	void				getLocalTextureByteCount(S32* gl_byte_count) const; -	/*virtual*/ void	addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index); -	LLLocalTextureObject* getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 index) const; +	/*virtual*/ void	addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index); +	LLLocalTextureObject* getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 index) const;  private:  	static void			onLocalTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); @@ -233,13 +233,12 @@ private:  	// Baked textures  	//--------------------------------------------------------------------  public: -	LLVOAvatarDefines::ETextureIndex getBakedTE(const LLTexLayerSet* layerset ) const; -	void				setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid); -	void				setNewBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid); -	void				setCachedBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid); +	LLAvatarAppearanceDefines::ETextureIndex getBakedTE(const LLViewerTexLayerSet* layerset ) const; +	void				setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex i, const LLUUID &uuid); +	void				setNewBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid); +	void				setCachedBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid);  	void				forceBakeAllTextures(bool slam_for_debug = false);  	static void			processRebakeAvatarTextures(LLMessageSystem* msg, void**); -	BOOL				isUsingBakedTextures() const; // e.g. false if in appearance edit mode  protected:  	/*virtual*/ void	removeMissingBakedTextures(); @@ -248,10 +247,11 @@ protected:  	//--------------------------------------------------------------------  public:  	void 				requestLayerSetUploads(); -	void				requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i); -	void				requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i); -	LLTexLayerSet*		getLayerSet(LLVOAvatarDefines::ETextureIndex index) const; -	LLTexLayerSet* 		getLayerSet(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; +	void				requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i); +	void				requestLayerSetUpdate(LLAvatarAppearanceDefines::ETextureIndex i); +	LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; +	LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::ETextureIndex index) const; +  	//--------------------------------------------------------------------  	// Composites @@ -265,8 +265,8 @@ public:  	void				setupComposites();  	void				updateComposites(); -	const LLUUID&		grabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; -	BOOL				canGrabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; +	const LLUUID&		grabBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; +	BOOL				canGrabBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const;  	//-------------------------------------------------------------------- @@ -300,10 +300,9 @@ protected:   **/  public: -	/*virtual*/ BOOL	isWearingWearableType(LLWearableType::EType type) const;  	void				wearableUpdated(LLWearableType::EType type, BOOL upload_result);  protected: -	U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const; +	U32 getNumWearables(LLAvatarAppearanceDefines::ETextureIndex i) const;  	//--------------------------------------------------------------------  	// Attachments @@ -340,8 +339,8 @@ private:   **/  public: -	static void		onCustomizeStart(); -	static void		onCustomizeEnd(); +	static void		onCustomizeStart(bool disable_camera_switch = false); +	static void		onCustomizeEnd(bool disable_camera_switch = false);  	//--------------------------------------------------------------------  	// Visibility @@ -365,6 +364,7 @@ public:  	static void		dumpTotalLocalTextureByteCount();  	void			dumpLocalTextures() const;  	static void		dumpScratchTextureByteCount(); +	void			dumpWearableInfo(LLAPRFile& outfile);  	//--------------------------------------------------------------------  	// Avatar Rez Metrics @@ -372,25 +372,25 @@ public:  public:	  	struct LLAvatarTexData  	{ -		LLAvatarTexData(const LLUUID& id, LLVOAvatarDefines::ETextureIndex index) :  +		LLAvatarTexData(const LLUUID& id, LLAvatarAppearanceDefines::ETextureIndex index) :   			mAvatarID(id),   			mIndex(index)   		{}  		LLUUID			mAvatarID; -		LLVOAvatarDefines::ETextureIndex	mIndex; +		LLAvatarAppearanceDefines::ETextureIndex	mIndex;  	};  	void 					debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }  	void 					debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }  	void 					outputRezDiagnostics() const;  	void					outputRezTiming(const std::string& msg) const;  	void					reportAvatarRezTime() const; -	void 					debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished); +	void 					debugBakedTextureUpload(LLAvatarAppearanceDefines::EBakedTextureIndex index, BOOL finished);  	static void				debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);  	BOOL					isAllLocalTextureDataFinal() const; -	const LLTexLayerSet*  	debugGetLayerSet(LLVOAvatarDefines::EBakedTextureIndex index) const { return mBakedTextureDatas[index].mTexLayerSet; } -	const std::string		debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer +	const LLViewerTexLayerSet*	debugGetLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex index) const { return (LLViewerTexLayerSet*)(mBakedTextureDatas[index].mTexLayerSet); } +	const std::string		debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer  	const std::string		debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD  	LLSD					metricsData();  	void					sendAppearanceChangeMetrics(); // send data associated with completing a change. @@ -398,8 +398,8 @@ private:  	LLFrameTimer    		mDebugSelfLoadTimer;  	F32						mDebugTimeWearablesLoaded;  	F32 					mDebugTimeAvatarVisible; -	F32 					mDebugTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level -	F32 					mDebugBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture +	F32 					mDebugTextureLoadTimes[LLAvatarAppearanceDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level +	F32 					mDebugBakedTextureTimes[LLAvatarAppearanceDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture  	void					debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);  /**                    Diagnostics diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 566c33c0af..479e871e94 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -102,7 +102,7 @@ void LLVOGrass::updateSpecies()  		SpeciesMap::const_iterator it = sSpeciesTable.begin();  		mSpecies = (*it).first;  	} -	setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +	setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  } diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index 47060720e7..315e618132 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -136,7 +136,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type )  	for (int i=0; i<NUM_VOICE_SYMBOL_WAVES; i++)  	{  		mSoundSymbol.mWaveFadeOutStartTime	[i] = mCurrentTime; -		mSoundSymbol.mTexture				[i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLViewerTexture::BOOST_UI); +		mSoundSymbol.mTexture				[i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLGLTexture::BOOST_UI);  		mSoundSymbol.mWaveActive			[i] = false;  		mSoundSymbol.mWaveOpacity			[i] = 1.0f;  		mSoundSymbol.mWaveExpansion			[i] = 1.0f; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 820d1d73e1..db0fc3dca7 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -2236,7 +2236,8 @@ void LLVivoxVoiceClient::giveUp()  static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel)  { -	F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the  new position and velocity +	F32 nat[3], nup[3], nl[3]; // the new at, up, left vectors and the  new position and velocity +//	F32 nvel[3];   	F64 npos[3];  	// The original XML command was sent like this: @@ -2286,9 +2287,9 @@ static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVe  	npos[1] = pos.mdV[VZ];  	npos[2] = pos.mdV[VY]; -	nvel[0] = vel.mV[VX]; -	nvel[1] = vel.mV[VZ]; -	nvel[2] = vel.mV[VY]; +//	nvel[0] = vel.mV[VX]; +//	nvel[1] = vel.mV[VZ]; +//	nvel[2] = vel.mV[VY];  	for(int i=0;i<3;++i) {  		at.mV[i] = nat[i]; @@ -3942,7 +3943,6 @@ void LLVivoxVoiceClient::messageEvent(  			bool is_busy = gAgent.getBusy();  			bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat);  			bool is_linden = LLMuteList::getInstance()->isLinden(session->mName); -			bool quiet_chat = false;  			LLChat chat;  			chat.mMuted = is_muted && !is_linden; @@ -3955,7 +3955,6 @@ void LLVivoxVoiceClient::messageEvent(  				if(is_busy && !is_linden)  				{ -					quiet_chat = true;  					// TODO: Question: Return busy mode response here?  Or maybe when session is started instead?  				} diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 31358df85f..bf09e6550d 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -298,7 +298,7 @@ void LLSkyTex::create(const F32 brightness)  void LLSkyTex::createGLImage(S32 which)  {	 -	mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerTexture::LOCAL); +	mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLGLTexture::LOCAL);  	mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP);  } @@ -384,9 +384,9 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)  	mSun.setIntensity(SUN_INTENSITY);  	mMoon.setIntensity(0.1f * SUN_INTENSITY); -	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLGLTexture::BOOST_UI);  	mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); -	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLGLTexture::BOOST_UI);  	mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);  	mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);  	mBloomTexturep->setNoDelete() ; @@ -478,9 +478,9 @@ void LLVOSky::restoreGL()  	{  		mSkyTex[i].restoreGL();  	} -	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLGLTexture::BOOST_UI);  	mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); -	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); +	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLGLTexture::BOOST_UI);  	mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);  	mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);  	mBloomTexturep->setNoDelete() ; diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index cb905d02da..de15f0ef43 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -467,7 +467,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,  	S32 vertex_count = 0;  	S32 i, x, y; -	S32 num_vertices, num_indices; +	S32 num_vertices;  	U32 render_stride = mLastStride;  	S32 patch_size = mPatchp->getSurface()->getGridsPerPatchEdge(); @@ -485,7 +485,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,  	if (north_stride == render_stride)  	{  		num_vertices = 2 * length + 1; -		num_indices = length * 6 - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(8, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -536,7 +535,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,  	{  		// North stride is longer (has less vertices)  		num_vertices = length + length/2 + 1; -		num_indices = half_length*9 - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(7, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -595,7 +593,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,  		length = patch_size / north_stride;  		half_length = length / 2;  		num_vertices = length + half_length + 1; -		num_indices = 9*half_length - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(15, 7) + mPatchp->getPointAgent(16, 8))*0.5f; @@ -666,7 +663,7 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,  {  	S32 i, x, y; -	S32 num_vertices, num_indices; +	S32 num_vertices;  	U32 render_stride = mLastStride;  	S32 patch_size = mPatchp->getSurface()->getGridsPerPatchEdge(); @@ -679,7 +676,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,  	if (east_stride == render_stride)  	{  		num_vertices = 2 * length + 1; -		num_indices = length * 6 - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(8, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -728,7 +724,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,  	{  		// East stride is longer (has less vertices)  		num_vertices = length + half_length + 1; -		num_indices = half_length*9 - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(7, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -783,7 +778,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,  		length = patch_size / east_stride;  		half_length = length / 2;  		num_vertices = length + length/2 + 1; -		num_indices = 9*(length/2) - 3;  		facep->mCenterAgent = (mPatchp->getPointAgent(15, 7) + mPatchp->getPointAgent(16, 8))*0.5f; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 6687ce432f..68bb40d727 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -316,7 +316,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,  	//  Load Species-Specific data   	//  	static const S32 MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL = 32 ; //frames. -	mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	mTreeImagep->setMaxVirtualSizeResetInterval(MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); //allow to wait for at most 16 frames to reset virtual size.  	mBranchLength = sSpeciesTable[mSpecies]->mBranchLength; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 5d1c335078..9078cce932 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -370,7 +370,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  		// Unpack texture entry data  		// -		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); +		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);  		if (result & teDirtyBits)  		{  			updateTEData(); @@ -747,7 +747,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)  		{  			F32 area = (F32) camera->getScreenPixelArea();  			vsize = area; -			imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); +			imagep->setBoostLevel(LLGLTexture::BOOST_HUD);   			face->setPixelArea(area); // treat as full screen  			face->setVirtualSize(vsize);  		} @@ -803,7 +803,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)  		if (mSculptTexture.notNull())  		{  			mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), -												(S32)LLViewerTexture::BOOST_SCULPTED)); +												(S32)LLGLTexture::BOOST_SCULPTED));  			mSculptTexture->setForSculpt() ;  			if(!mSculptTexture->isCachedRawImageReady()) @@ -1006,7 +1006,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  	if (is404)  	{ -		setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI)); +		setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLGLTexture::BOOST_UI));  		//render prim proxy when mesh loading attempts give up  		volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_NONE); @@ -1090,7 +1090,7 @@ void LLVOVolume::updateSculptTexture()  		LLUUID id =  sculpt_params->getSculptTexture();  		if (id.notNull())  		{ -			mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +			mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  		}  	}  	else @@ -2731,7 +2731,7 @@ void LLVOVolume::updateSpotLightPriority()  	if (mLightTexture.notNull())  	{  		mLightTexture->addTextureStats(mSpotLightPriority); -		mLightTexture->setBoostLevel(LLViewerTexture::BOOST_CLOUDS); +		mLightTexture->setBoostLevel(LLGLTexture::BOOST_CLOUDS);  	}  } diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index a33f42cf84..01024f4a12 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -724,8 +724,8 @@ void LLVOWLSky::updateStarColors()  	const F32 var = 0.15f;  	const F32 min = 0.5f; //0.75f; -	const F32 sunclose_max = 0.6f; -	const F32 sunclose_range = 1 - sunclose_max; +	//const F32 sunclose_max = 0.6f; +	//const F32 sunclose_range = 1 - sunclose_max;  	//F32 below_horizon = - llmin(0.0f, gSky.mVOSkyp->getToSunLast().mV[2]);  	//F32 brightness_factor = llmin(1.0f, below_horizon * 20); @@ -739,14 +739,14 @@ void LLVOWLSky::updateStarColors()  		U32 x;  		for (x = 0; x < getStarsNumVerts(); ++x)  		{ -			F32 sundir_factor = 1; +			//F32 sundir_factor = 1;  			LLVector3 tostar = *v_p;  			tostar.normVec(); -			const F32 how_close_to_sun = tostar * gSky.mVOSkyp->getToSunLast(); -			if (how_close_to_sun > sunclose_max) -			{ -				sundir_factor = (1 - how_close_to_sun) / sunclose_range; -			} +			//const F32 how_close_to_sun = tostar * gSky.mVOSkyp->getToSunLast(); +			//if (how_close_to_sun > sunclose_max) +			//{ +			//	sundir_factor = (1 - how_close_to_sun) / sunclose_range; +			//}  			intensity = *(v_i);  			F32 alpha = v_c->mV[VALPHA] + (ll_frand() - 0.5f) * var * intensity;  			if (alpha < min * intensity) diff --git a/indra/newview/llwaterparamset.cpp b/indra/newview/llwaterparamset.cpp index 39d366b023..9cc91d2246 100644 --- a/indra/newview/llwaterparamset.cpp +++ b/indra/newview/llwaterparamset.cpp @@ -185,8 +185,6 @@ LLVector3 LLWaterParamSet::getVector3(const std::string& paramName, bool& error)  LLVector2 LLWaterParamSet::getVector2(const std::string& paramName, bool& error)   {  	// test to see if right type -	int ttest; -	ttest = mParamValues.size();  	LLSD cur_val = mParamValues.get(paramName);  	if (!cur_val.isArray() || cur_val.size() != 2)   	{ diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp deleted file mode 100644 index 402504933c..0000000000 --- a/indra/newview/llwearable.cpp +++ /dev/null @@ -1,1285 +0,0 @@ -/**  - * @file llwearable.cpp - * @brief LLWearable class implementation - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llagent.h" -#include "llagentcamera.h" -#include "llagentwearables.h" -#include "lldictionary.h" -#include "llfloatersidepanelcontainer.h" -#include "lllocaltextureobject.h" -#include "llnotificationsutil.h" -#include "llviewertexturelist.h" -#include "llinventorymodel.h" -#include "llinventoryobserver.h" -#include "llsidepanelappearance.h" -#include "lltexlayer.h" -#include "lltexglobalcolor.h" -#include "lltrans.h" -#include "llviewerregion.h" -#include "llvisualparam.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llvoavatardefines.h" -#include "llwearable.h" -#include "llviewercontrol.h" - -using namespace LLVOAvatarDefines; - -// static -S32 LLWearable::sCurrentDefinitionVersion = 1; - -// support class - remove for 2.1 (hackity hack hack) -class LLOverrideBakedTextureUpdate -{ -public: -	LLOverrideBakedTextureUpdate(bool temp_state) -	{ -		U32 num_bakes = (U32) LLVOAvatarDefines::BAKED_NUM_INDICES; -		for( U32 index = 0; index < num_bakes; ++index ) -		{ -			composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); -		} -		gAgentAvatarp->setCompositeUpdatesEnabled(temp_state); -	} - -	~LLOverrideBakedTextureUpdate() -	{ -		U32 num_bakes = (U32)LLVOAvatarDefines::BAKED_NUM_INDICES;		 -		for( U32 index = 0; index < num_bakes; ++index ) -		{ -			gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]); -		} -	} -private: -	bool composite_enabled[LLVOAvatarDefines::BAKED_NUM_INDICES]; -}; - -// Private local functions -static std::string terse_F32_to_string(F32 f); -static std::string asset_id_to_filename(const LLUUID &asset_id); - -LLWearable::LLWearable(const LLTransactionID& transaction_id) : -	mDefinitionVersion(LLWearable::sCurrentDefinitionVersion), -	mType(LLWearableType::WT_INVALID) -{ -	mTransactionID = transaction_id; -	mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); -} - -LLWearable::LLWearable(const LLAssetID& asset_id) : -	mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ), -	mType(LLWearableType::WT_INVALID) -{ -	mAssetID = asset_id; -	mTransactionID.setNull(); -} - -LLWearable::~LLWearable() -{ -} - -const std::string& LLWearable::getTypeLabel() const -{ -	return LLWearableType::getTypeLabel(mType); -} - -const std::string& LLWearable::getTypeName() const -{ -	return LLWearableType::getTypeName(mType); -} - -LLAssetType::EType LLWearable::getAssetType() const -{ -	return LLWearableType::getAssetType(mType); -} - -BOOL LLWearable::exportFile(LLFILE* file) const -{ -	// header and version -	if( fprintf( file, "LLWearable version %d\n", mDefinitionVersion ) < 0 ) -	{ -		return FALSE; -	} - -	// name -	if( fprintf( file, "%s\n", mName.c_str() ) < 0 ) -	{ -		return FALSE; -	} - -	// description -	if( fprintf( file, "%s\n", mDescription.c_str() ) < 0 ) -	{ -		return FALSE; -	} -	 -	// permissions -	if( !mPermissions.exportFile( file ) ) -	{ -		return FALSE; -	} - -	// sale info -	if( !mSaleInfo.exportFile( file ) ) -	{ -		return FALSE; -	} - -	// wearable type -	S32 type = (S32)mType; -	if( fprintf( file, "type %d\n", type ) < 0 ) -	{ -		return FALSE; -	} - -	// parameters -	S32 num_parameters = mVisualParamIndexMap.size(); -	if( fprintf( file, "parameters %d\n", num_parameters ) < 0 ) -	{ -		return FALSE; -	} - -	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); -		 iter != mVisualParamIndexMap.end();  -		 ++iter) -	{ -		S32 param_id = iter->first; -		const LLVisualParam* param = iter->second; -		F32 param_weight = param->getWeight(); -		if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 ) -		{ -			return FALSE; -		} -	} - -	// texture entries -	S32 num_textures = mTEMap.size(); -	if( fprintf( file, "textures %d\n", num_textures ) < 0 ) -	{ -		return FALSE; -	} -	 -	for (te_map_t::const_iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter) -	{ -		S32 te = iter->first; -		const LLUUID& image_id = iter->second->getID(); -		if( fprintf( file, "%d %s\n", te, image_id.asString().c_str()) < 0 ) -		{ -			return FALSE; -		} -	} -	return TRUE; -} - - -void LLWearable::createVisualParams() -{ -	for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  -		 param; -		 param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) -	{ -		if (param->getWearableType() == mType) -		{ -			addVisualParam(param->cloneParam(this)); -		} -	} - -	// resync driver parameters to point to the newly cloned driven parameters -	for (visual_param_index_map_t::iterator param_iter = mVisualParamIndexMap.begin();  -		 param_iter != mVisualParamIndexMap.end();  -		 ++param_iter) -	{ -		LLVisualParam* param = param_iter->second; -		LLVisualParam*(LLWearable::*wearable_function)(S32)const = &LLWearable::getVisualParam;  -		// need this line to disambiguate between versions of LLCharacter::getVisualParam() -		LLVisualParam*(LLVOAvatarSelf::*avatar_function)(S32)const = &LLVOAvatarSelf::getVisualParam;  -		param->resetDrivenParams(); -		if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false)) -		{ -			if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp.get(),_1 ), true)) -			{ -				llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl; -				continue; -			} -		} -	} -} - -BOOL LLWearable::importFile( LLFILE* file ) -{ -	// *NOTE: changing the type or size of this buffer will require -	// changes in the fscanf() code below. You would be better off -	// rewriting this to use streams and not require an open FILE. -	char text_buffer[2048];		/* Flawfinder: ignore */ -	S32 fields_read = 0; - -	// suppress texlayerset updates while wearables are being imported. Layersets will be updated -	// when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. -	LLOverrideBakedTextureUpdate stop_bakes(false); - -	// read header and version  -	fields_read = fscanf( file, "LLWearable version %d\n", &mDefinitionVersion ); -	if( fields_read != 1 ) -	{ -		// Shouldn't really log the asset id for security reasons, but -		// we need it in this case. -		llwarns << "Bad Wearable asset header: " << mAssetID << llendl; -		//gVFS->dumpMap(); -		return FALSE; -	} - - -	// Temoprary hack to allow wearables with definition version 24 to still load. -	// This should only affect lindens and NDA'd testers who have saved wearables in 2.0 -	// the extra check for version == 24 can be removed before release, once internal testers -	// have loaded these wearables again. See hack pt 2 at bottom of function to ensure that -	// these wearables get re-saved with version definition 22. -	if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion && mDefinitionVersion != 24 ) -	{ -		llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; -		return FALSE; -	} - -	// name -	int next_char = fgetc( file );		/* Flawfinder: ignore */ -	if( '\n' == next_char ) -	{ -		// no name -		mName = ""; -	} -	else -	{ -		ungetc( next_char, file ); -		fields_read = fscanf(	/* Flawfinder: ignore */ -			file, -			"%2047[^\n]", -			text_buffer); -		if( (1 != fields_read) || (fgetc( file ) != '\n') )		/* Flawfinder: ignore */ -		{ -			llwarns << "Bad Wearable asset: early end of file" << llendl; -			return FALSE; -		} -		mName = text_buffer; -		LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN ); -	} - -	// description -	next_char = fgetc( file );		/* Flawfinder: ignore */ -	if( '\n' == next_char ) -	{ -		// no description -		mDescription = ""; -	} -	else -	{ -		ungetc( next_char, file ); -		fields_read = fscanf(	/* Flawfinder: ignore */ -			file, -			"%2047[^\n]", -			text_buffer ); -		if( (1 != fields_read) || (fgetc( file ) != '\n') )		/* Flawfinder: ignore */ -		{ -			llwarns << "Bad Wearable asset: early end of file" << llendl; -			return FALSE; -		} -		mDescription = text_buffer; -		LLStringUtil::truncate(mDescription, DB_INV_ITEM_DESC_STR_LEN ); -	} - -	// permissions -	S32 perm_version; -	fields_read = fscanf( file, " permissions %d\n", &perm_version ); -	if( (fields_read != 1) || (perm_version != 0) ) -	{ -		llwarns << "Bad Wearable asset: missing permissions" << llendl; -		return FALSE; -	} -	if( !mPermissions.importFile( file ) ) -	{ -		return FALSE; -	} - -	// sale info -	S32 sale_info_version; -	fields_read = fscanf( file, " sale_info %d\n", &sale_info_version ); -	if( (fields_read != 1) || (sale_info_version != 0) ) -	{ -		llwarns << "Bad Wearable asset: missing sale_info" << llendl; -		return FALSE; -	} -	// Sale info used to contain next owner perm. It is now in the -	// permissions. Thus, we read that out, and fix legacy -	// objects. It's possible this op would fail, but it should pick -	// up the vast majority of the tasks. -	BOOL has_perm_mask = FALSE; -	U32 perm_mask = 0; -	if( !mSaleInfo.importFile(file, has_perm_mask, perm_mask) ) -	{ -		return FALSE; -	} -	if(has_perm_mask) -	{ -		// fair use fix. -		if(!(perm_mask & PERM_COPY)) -		{ -			perm_mask |= PERM_TRANSFER; -		} -		mPermissions.setMaskNext(perm_mask); -	} - -	// wearable type -	S32 type = -1; -	fields_read = fscanf( file, "type %d\n", &type ); -	if( fields_read != 1 ) -	{ -		llwarns << "Bad Wearable asset: bad type" << llendl; -		return FALSE; -	} -	if( 0 <= type && type < LLWearableType::WT_COUNT ) -	{ -		setType((LLWearableType::EType)type); -	} -	else -	{ -		mType = LLWearableType::WT_COUNT; -		llwarns << "Bad Wearable asset: bad type #" << type <<  llendl; -		return FALSE; -	} - -	// parameters header -	S32 num_parameters = 0; -	fields_read = fscanf( file, "parameters %d\n", &num_parameters ); -	if( fields_read != 1 ) -	{ -		llwarns << "Bad Wearable asset: missing parameters block" << llendl; -		return FALSE; -	} - -	if( num_parameters != mVisualParamIndexMap.size() ) -	{ -		llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " <<  mType << llendl; -	} - -	// parameters -	S32 i; -	for( i = 0; i < num_parameters; i++ ) -	{ -		S32 param_id = 0; -		F32 param_weight = 0.f; -		fields_read = fscanf( file, "%d %f\n", ¶m_id, ¶m_weight ); -		if( fields_read != 2 ) -		{ -			llwarns << "Bad Wearable asset: bad parameter, #" << i << llendl; -			return FALSE; -		} -		mSavedVisualParamMap[param_id] = param_weight; -	} - -	// textures header -	S32 num_textures = 0; -	fields_read = fscanf( file, "textures %d\n", &num_textures); -	if( fields_read != 1 ) -	{ -		llwarns << "Bad Wearable asset: missing textures block" << llendl; -		return FALSE; -	} - -	// textures -	for( i = 0; i < num_textures; i++ ) -	{ -		S32 te = 0; -		fields_read = fscanf(	/* Flawfinder: ignore */ -			file, -			"%d %2047s\n", -			&te, text_buffer); -		if( fields_read != 2 ) -		{ -			llwarns << "Bad Wearable asset: bad texture, #" << i << llendl; -			return FALSE; -		} - -		if( !LLUUID::validate( text_buffer ) ) -		{ -			llwarns << "Bad Wearable asset: bad texture uuid: " << text_buffer << llendl; -			return FALSE; -		} -		LLUUID id = LLUUID(text_buffer); -		LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( id ); -		if( mTEMap.find(te) != mTEMap.end() ) -		{ -			delete mTEMap[te]; -		} -		if( mSavedTEMap.find(te) != mSavedTEMap.end() ) -		{ -			delete mSavedTEMap[te]; -		} - -		if(gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime")) -		{ -			image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te), NULL); -		} -		LLUUID textureid(text_buffer); -		mTEMap[te] = new LLLocalTextureObject(image, textureid); -		mSavedTEMap[te] = new LLLocalTextureObject(image, textureid); -		createLayers(te); -	} - -	// copy all saved param values to working params -	revertValues(); - -	return TRUE; -} - - -// Avatar parameter and texture definitions can change over time. -// This function returns true if parameters or textures have been added or removed -// since this wearable was created. -BOOL LLWearable::isOldVersion() const -{ -	if (!isAgentAvatarValid()) return FALSE; - -	if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion ) -	{ -		llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; -		llassert(0); -	} - -	if( LLWearable::sCurrentDefinitionVersion != mDefinitionVersion ) -	{ -		return TRUE; -	} - -	S32 param_count = 0; -	for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  -		param; -		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) -	{ -		if( (param->getWearableType() == mType) && (param->isTweakable() ) ) -		{ -			param_count++; -			if( !is_in_map(mVisualParamIndexMap, param->getID() ) ) -			{ -				return TRUE; -			} -		} -	} -	if( param_count != mVisualParamIndexMap.size() ) -	{ -		return TRUE; -	} - - -	S32 te_count = 0; -	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			te_count++; -			if( !is_in_map(mTEMap, te ) ) -			{ -				return TRUE; -			} -		} -	} -	if( te_count != mTEMap.size() ) -	{ -		return TRUE; -	} - -	return FALSE; -} - -// Avatar parameter and texture definitions can change over time. -// * If parameters or textures have been REMOVED since the wearable was created, -// they're just ignored, so we consider the wearable clean even though isOldVersion() -// will return true.  -// * If parameters or textures have been ADDED since the wearable was created, -// they are taken to have default values, so we consider the wearable clean -// only if those values are the same as the defaults. -BOOL LLWearable::isDirty() const -{ -	if (!isAgentAvatarValid()) return FALSE; - -	for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  -		param; -		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) -	{ -		if( (param->getWearableType() == mType)  -			&& (param->isTweakable() )  -			&& !param->getCrossWearable()) -		{ -			F32 current_weight = getVisualParamWeight(param->getID()); -			current_weight = llclamp( current_weight, param->getMinWeight(), param->getMaxWeight() ); -			F32 saved_weight = get_if_there(mSavedVisualParamMap, param->getID(), param->getDefaultWeight()); -			saved_weight = llclamp( saved_weight, param->getMinWeight(), param->getMaxWeight() ); -			 -			U8 a = F32_to_U8( saved_weight, param->getMinWeight(), param->getMaxWeight() ); -			U8 b = F32_to_U8( current_weight, param->getMinWeight(), param->getMaxWeight() ); -			if( a != b  ) -			{ -				return TRUE; -			} -		} -	} - -	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			te_map_t::const_iterator current_iter = mTEMap.find(te); -			if(current_iter != mTEMap.end()) -			{ - 				const LLUUID& current_image_id = current_iter->second->getID(); -				te_map_t::const_iterator saved_iter = mSavedTEMap.find(te); -				if(saved_iter != mSavedTEMap.end()) -				{ -					const LLUUID& saved_image_id = saved_iter->second->getID(); -					if (saved_image_id != current_image_id) -					{ -						// saved vs current images are different, wearable is dirty -						return TRUE; -					} -				} -				else -				{ -					// image found in current image list but not saved image list -					return TRUE; -				} -			} -		} -	} - -	return FALSE; -} - - -void LLWearable::setParamsToDefaults() -{ -	if (!isAgentAvatarValid()) return; - -	for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) -	{ -		if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->isTweakable() ) ) -		{ -			setVisualParamWeight(param->getID(),param->getDefaultWeight(), FALSE); -		} -	} -} - -void LLWearable::setTexturesToDefaults() -{ -	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			LLUUID id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); -			LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id ); -			if( mTEMap.find(te) == mTEMap.end() ) -			{ -				mTEMap[te] = new LLLocalTextureObject(image, id); -				createLayers(te); -			} -			else -			{ -				// Local Texture Object already created, just set image and UUID -				LLLocalTextureObject *lto = mTEMap[te]; -				lto->setID(id); -				lto->setImage(image); -			} -		} -	} -} - -// Updates the user's avatar's appearance -void LLWearable::writeToAvatar() -{ -	if (!isAgentAvatarValid()) return; - -	ESex old_sex = gAgentAvatarp->getSex(); - -	// Pull params -	for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) -	{ -		// cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the -		// avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way. -		if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (!((LLViewerVisualParam*)param)->getCrossWearable()) ) -		{ -			S32 param_id = param->getID(); -			F32 weight = getVisualParamWeight(param_id); - -			gAgentAvatarp->setVisualParamWeight( param_id, weight, FALSE ); -		} -	} - -	// Pull texture entries -	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			te_map_t::const_iterator iter = mTEMap.find(te); -			LLUUID image_id; -			if(iter != mTEMap.end()) -			{ -				image_id = iter->second->getID(); -			} -			else -			{	 -				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); -			} -			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); -			// MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this. -			gAgentAvatarp->setLocalTextureTE(te, image, 0); -		} -	} - -	ESex new_sex = gAgentAvatarp->getSex(); -	if( old_sex != new_sex ) -	{ -		gAgentAvatarp->updateSexDependentLayerSets( FALSE ); -	}	 -	 -//	if( upload_bake ) -//	{ -//		gAgent.sendAgentSetAppearance(); -//	} -} - - -// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. -// static  -void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ) -{ -	if (!isAgentAvatarValid()) return; - -	// You can't just remove body parts. -	if( (type == LLWearableType::WT_SHAPE) || -		(type == LLWearableType::WT_SKIN) || -		(type == LLWearableType::WT_HAIR) || -		(type == LLWearableType::WT_EYES) ) -	{ -		return; -	} - -	// Pull params -	for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) -	{ -		if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->isTweakable() ) ) -		{ -			S32 param_id = param->getID(); -			gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); -		} -	} - -	if(gAgentCamera.cameraCustomizeAvatar()) -	{ -		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); -	} - -	gAgentAvatarp->updateVisualParams(); -	gAgentAvatarp->wearableUpdated(type, FALSE); - -//	if( upload_bake ) -//	{ -//		gAgent.sendAgentSetAppearance(); -//	} -} - -// Does not copy mAssetID. -// Definition version is current: removes obsolete enties and creates default values for new ones. -void LLWearable::copyDataFrom(const LLWearable* src) -{ -	if (!isAgentAvatarValid()) return; - -	mDefinitionVersion = LLWearable::sCurrentDefinitionVersion; - -	mName = src->mName; -	mDescription = src->mDescription; -	mPermissions = src->mPermissions; -	mSaleInfo = src->mSaleInfo; - -	setType(src->mType); - -	mSavedVisualParamMap.clear(); -	// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) -	for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  -		param; -		param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) -	{ -		if( (param->getWearableType() == mType) ) -		{ -			S32 id = param->getID(); -			F32 weight = src->getVisualParamWeight(id); -			mSavedVisualParamMap[id] = weight; -		} -	} - -	destroyTextures(); -	// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) -	for (S32 te = 0; te < TEX_NUM_INDICES; te++) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			te_map_t::const_iterator iter = src->mTEMap.find(te); -			LLUUID image_id; -			LLViewerFetchedTexture *image = NULL; -			if(iter != src->mTEMap.end()) -			{ -				image = src->getLocalTextureObject(te)->getImage(); -				image_id = src->getLocalTextureObject(te)->getID(); -				mTEMap[te] = new LLLocalTextureObject(image, image_id); -				mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); -				mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady()); -				mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard()); -			} -			else -			{ -				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); -				image = LLViewerTextureManager::getFetchedTexture( image_id ); -				mTEMap[te] = new LLLocalTextureObject(image, image_id); -				mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); -			} -			createLayers(te); -		} -	} - -	// Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable -	// to be the same as the saved values (which were loaded from src at param->cloneParam(this)) -	revertValues(); -} - -void LLWearable::setItemID(const LLUUID& item_id) -{ -	mItemID = item_id; -} - -const LLUUID& LLWearable::getItemID() const -{ -	return mItemID; -} - -void LLWearable::setType(LLWearableType::EType type)  -{  -	mType = type;  -	createVisualParams(); -} - -LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) -{ -	te_map_t::iterator iter = mTEMap.find(index); -	if( iter != mTEMap.end() ) -	{ -		LLLocalTextureObject* lto = iter->second; -		return lto; -	} -	return NULL; -} - -const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const -{ -	te_map_t::const_iterator iter = mTEMap.find(index); -	if( iter != mTEMap.end() ) -	{ -		const LLLocalTextureObject* lto = iter->second; -		return lto; -	} -	return NULL; -} - -std::vector<LLLocalTextureObject*> LLWearable::getLocalTextureListSeq() -{ -	std::vector<LLLocalTextureObject*> result; - -	for(te_map_t::const_iterator iter = mTEMap.begin(); -		iter != mTEMap.end(); iter++) -	{ -		LLLocalTextureObject* lto = iter->second; -		result.push_back(lto); -	} - -	return result; -} - -void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject <o) -{ -	if( mTEMap.find(index) != mTEMap.end() ) -	{ -		mTEMap.erase(index); -	} -	mTEMap[index] = new LLLocalTextureObject(lto); -} - - -void LLWearable::addVisualParam(LLVisualParam *param) -{ -	if( mVisualParamIndexMap[param->getID()] ) -	{ -		delete mVisualParamIndexMap[param->getID()]; -	} -	param->setIsDummy(FALSE); -	mVisualParamIndexMap[param->getID()] = param; -	mSavedVisualParamMap[param->getID()] = param->getDefaultWeight(); -} - -void LLWearable::setVisualParams() -{ -	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++) -	{ -		S32 id = iter->first; -		LLVisualParam *wearable_param = iter->second; -		F32 value = wearable_param->getWeight(); -		gAgentAvatarp->setVisualParamWeight(id, value, FALSE); -	} -} - - -void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake) -{ -	if( is_in_map(mVisualParamIndexMap, param_index ) ) -	{ -		LLVisualParam *wearable_param = mVisualParamIndexMap[param_index]; -		wearable_param->setWeight(value, upload_bake); -	} -	else -	{ -		llerrs << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << llendl; -	} -} - -F32 LLWearable::getVisualParamWeight(S32 param_index) const -{ -	if( is_in_map(mVisualParamIndexMap, param_index ) ) -	{ -		const LLVisualParam *wearable_param = mVisualParamIndexMap.find(param_index)->second; -		return wearable_param->getWeight(); -	} -	else -	{ -		llwarns << "LLWerable::getVisualParam passed invalid parameter index: "  << param_index << " for wearable type: " << this->getName() << llendl; -	} -	return (F32)-1.0; -} - -LLVisualParam* LLWearable::getVisualParam(S32 index) const -{ -	visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(index); -	return (iter == mVisualParamIndexMap.end()) ? NULL : iter->second; -} - - -void LLWearable::getVisualParams(visual_param_vec_t &list) -{ -	visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin(); -	visual_param_index_map_t::iterator end = mVisualParamIndexMap.end(); - -	// add all visual params to the passed-in vector -	for( ; iter != end; ++iter ) -	{ -		list.push_back(iter->second); -	} -} - -void LLWearable::animateParams(F32 delta, BOOL upload_bake) -{ -	for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin(); -		 iter != mVisualParamIndexMap.end(); -		 ++iter) -	{ -		LLVisualParam *param = (LLVisualParam*) iter->second; -		param->animate(delta, upload_bake); -	} -} - -LLColor4 LLWearable::getClothesColor(S32 te) const -{ -	LLColor4 color; -	U32 param_name[3]; -	if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) ) -	{ -		for( U8 index = 0; index < 3; index++ ) -		{ -			color.mV[index] = getVisualParamWeight(param_name[index]); -		} -	} -	return color; -} - -void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ) -{ -	U32 param_name[3]; -	if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) ) -	{ -		for( U8 index = 0; index < 3; index++ ) -		{ -			setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake); -		} -	} -} - -void LLWearable::revertValues() -{ -	//update saved settings so wearable is no longer dirty -	// non-driver params first -	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) -	{ -		S32 id = iter->first; -		F32 value = iter->second; -		LLVisualParam *param = getVisualParam(id); -		if(param &&  !dynamic_cast<LLDriverParam*>(param) ) -		{ -			setVisualParamWeight(id, value, TRUE); -		} -	} - -	//then driver params -	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) -	{ -		S32 id = iter->first; -		F32 value = iter->second; -		LLVisualParam *param = getVisualParam(id); -		if(param &&  dynamic_cast<LLDriverParam*>(param) ) -		{ -			setVisualParamWeight(id, value, TRUE); -		} -	} - -	// make sure that saved values are sane -	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) -	{ -		S32 id = iter->first; -		LLVisualParam *param = getVisualParam(id); -		if( param ) -		{ -			mSavedVisualParamMap[id] = param->getWeight(); -		} -	} - -	syncImages(mSavedTEMap, mTEMap); - - -	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); -	if( panel ) -	{ -		panel->updateScrollingPanelList(); -	} -} - -BOOL LLWearable::isOnTop() const -{  -	return (this == gAgentWearables.getTopWearable(mType)); -} - -void LLWearable::createLayers(S32 te) -{ -	LLTexLayerSet *layer_set = gAgentAvatarp->getLayerSet((ETextureIndex)te); -	if (layer_set) -	{ -		layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this); -	} -	else -	{ -		llerrs << "could not find layerset for LTO in wearable!" << llendl; -	} -} - -void LLWearable::saveValues() -{ -	//update saved settings so wearable is no longer dirty -	mSavedVisualParamMap.clear(); -	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter) -	{ -		S32 id = iter->first; -		LLVisualParam *wearable_param = iter->second; -		F32 value = wearable_param->getWeight(); -		mSavedVisualParamMap[id] = value; -	} - -	// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) -	syncImages(mTEMap, mSavedTEMap); - - -	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); -	if( panel ) -	{ -		panel->updateScrollingPanelList(); -	} -} - -void LLWearable::syncImages(te_map_t &src, te_map_t &dst) -{ -	// Deep copy of src (copies only those tes that are current, filling in defaults where needed) -	for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) -	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) -		{ -			te_map_t::const_iterator iter = src.find(te); -			LLUUID image_id; -			LLViewerFetchedTexture *image = NULL; -			LLLocalTextureObject *lto = NULL; -			if(iter != src.end()) -			{ -				// there's a Local Texture Object in the source image map. Use this to populate the values to store in the destination image map. -				lto = iter->second; -				image = lto->getImage(); -				image_id = lto->getID(); -			} -			else -			{ -				// there is no Local Texture Object in the source image map. Get defaults values for populating the destination image map. -				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); -				image = LLViewerTextureManager::getFetchedTexture( image_id ); -			} - -			if( dst.find(te) != dst.end() ) -			{ -				// there's already an entry in the destination map for the texture. Just update its values. -				dst[te]->setImage(image); -				dst[te]->setID(image_id); -			} -			else -			{ -				// no entry found in the destination map, we need to create a new Local Texture Object -				dst[te] = new LLLocalTextureObject(image, image_id); -			} - -			if( lto ) -			{ -				// If we pulled values from a Local Texture Object in the source map, make sure the proper flags are set in the new (or updated) entry in the destination map. -				dst[te]->setBakedReady(lto->getBakedReady()); -				dst[te]->setDiscard(lto->getDiscard()); -			} -		} -	} -} - -void LLWearable::destroyTextures() -{ -	for( te_map_t::iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter ) -	{ -		LLLocalTextureObject *lto = iter->second; -		delete lto; -	} -	mTEMap.clear(); -	for( te_map_t::iterator iter = mSavedTEMap.begin(); iter != mSavedTEMap.end(); ++iter ) -	{ -		LLLocalTextureObject *lto = iter->second; -		delete lto; -	} -	mSavedTEMap.clear(); -} - -void LLWearable::pullCrossWearableValues() -{ -	// scan through all of the avatar's visual parameters -	for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();  -		 param; -		 param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) -	{ -		if( param ) -		{ -			LLDriverParam *driver_param = dynamic_cast<LLDriverParam*>(param); -			if(driver_param) -			{ -				// parameter is a driver parameter, have it update its  -				driver_param->updateCrossDrivenParams(getType()); -			} -		} -	} -} - - -void LLWearable::setLabelUpdated() const -{  -	gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID()); -} - -void LLWearable::refreshName() -{ -	LLUUID item_id = getItemID(); -	LLInventoryItem* item = gInventory.getItem(item_id); -	if( item ) -	{ -		mName = item->getName(); -	} -} - -struct LLWearableSaveData -{ -	LLWearableType::EType mType; -}; - -void LLWearable::saveNewAsset() const -{ -//	llinfos << "LLWearable::saveNewAsset() type: " << getTypeName() << llendl; -	//llinfos << *this << llendl; - -	const std::string filename = asset_id_to_filename(mAssetID); -	LLFILE* fp = LLFile::fopen(filename, "wb");		/* Flawfinder: ignore */ -	BOOL successful_save = FALSE; -	if(fp && exportFile(fp)) -	{ -		successful_save = TRUE; -	} -	if(fp) -	{ -		fclose(fp); -		fp = NULL; -	} -	if(!successful_save) -	{ -		std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str()); -		llwarns << buffer << llendl; -		 -		LLSD args; -		args["NAME"] = mName; -		LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args); -		return; -	} - -	// save it out to database -	if( gAssetStorage ) -	{ -		 /* -		std::string url = gAgent.getRegion()->getCapability("NewAgentInventory"); -		if (!url.empty()) -		{ -			llinfos << "Update Agent Inventory via capability" << llendl; -			LLSD body; -			body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); -			body["asset_type"] = LLAssetType::lookup(getAssetType()); -			body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); -			body["name"] = getName(); -			body["description"] = getDescription(); -			LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, filename)); -		} -		else -		{ -		} -		 */ -		 LLWearableSaveData* data = new LLWearableSaveData; -		 data->mType = mType; -		 gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), -                                     &LLWearable::onSaveNewAssetComplete, -                                     (void*)data); -	} -} - -// static -void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) -{ -	LLWearableSaveData* data = (LLWearableSaveData*)userdata; -	const std::string& type_name = LLWearableType::getTypeName(data->mType); -	if(0 == status) -	{ -		// Success -		llinfos << "Saved wearable " << type_name << llendl; -	} -	else -	{ -		std::string buffer = llformat("Unable to save %s to central asset store.", type_name.c_str()); -		llwarns << buffer << " Status: " << status << llendl; -		LLSD args; -		args["NAME"] = type_name; -		LLNotificationsUtil::add("CannotSaveToAssetStore", args); -	} - -	// Delete temp file -	const std::string src_filename = asset_id_to_filename(new_asset_id); -	LLFile::remove(src_filename); - -	// delete the context data -	delete data; - -} - -std::ostream& operator<<(std::ostream &s, const LLWearable &w) -{ -	s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n"; -	s << "    Name: " << w.mName << "\n"; -	s << "    Desc: " << w.mDescription << "\n"; -	//w.mPermissions -	//w.mSaleInfo - -	s << "    Params:" << "\n"; -	for (LLWearable::visual_param_index_map_t::const_iterator iter = w.mVisualParamIndexMap.begin(); -		 iter != w.mVisualParamIndexMap.end(); ++iter) -	{ -		S32 param_id = iter->first; -		LLVisualParam *wearable_param = iter->second; -		F32 param_weight = wearable_param->getWeight(); -		s << "        " << param_id << " " << param_weight << "\n"; -	} - -	s << "    Textures:" << "\n"; -	for (LLWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); -		 iter != w.mTEMap.end(); ++iter) -	{ -		S32 te = iter->first; -		const LLUUID& image_id = iter->second->getID(); -		s << "        " << te << " " << image_id << "\n"; -	} -	return s; -} - - -std::string terse_F32_to_string(F32 f) -{ -	std::string r = llformat("%.2f", f); -	S32 len = r.length(); - -    // "1.20"  -> "1.2" -    // "24.00" -> "24." -	while (len > 0 && ('0' == r[len - 1])) -	{ -		r.erase(len-1, 1); -		len--; -	} -	if ('.' == r[len - 1]) -	{ -		// "24." -> "24" -		r.erase(len-1, 1); -	} -	else if (('-' == r[0]) && ('0' == r[1])) -	{ -		// "-0.59" -> "-.59" -		r.erase(1, 1); -	} -	else if ('0' == r[0]) -	{ -		// "0.59" -> ".59" -		r.erase(0, 1); -	} -	return r; -} - -std::string asset_id_to_filename(const LLUUID &asset_id) -{ -	std::string asset_id_string; -	asset_id.toString(asset_id_string); -	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id_string) + ".wbl";	 -	return filename; -} diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h deleted file mode 100644 index 3d8c53a755..0000000000 --- a/indra/newview/llwearable.h +++ /dev/null @@ -1,165 +0,0 @@ -/**  - * @file llwearable.h - * @brief LLWearable class header file - * - * $LicenseInfo:firstyear=2002&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_LLWEARABLE_H -#define LL_LLWEARABLE_H - -#include "lluuid.h" -#include "llstring.h" -#include "llpermissions.h" -#include "llsaleinfo.h" -#include "llassetstorage.h" -#include "llwearabletype.h" -#include "llfile.h" -#include "lllocaltextureobject.h" - -class LLViewerInventoryItem; -class LLVisualParam; -class LLTexGlobalColorInfo; -class LLTexGlobalColor; - -class LLWearable -{ -	friend class LLWearableList; - -	//-------------------------------------------------------------------- -	// Constructors and destructors -	//-------------------------------------------------------------------- -private: -	// Private constructors used by LLWearableList -	LLWearable(const LLTransactionID& transactionID); -	LLWearable(const LLAssetID& assetID); -public: -	virtual ~LLWearable(); - -	//-------------------------------------------------------------------- -	// Accessors -	//-------------------------------------------------------------------- -public: -	const LLUUID&				getItemID() const; -	const LLAssetID&			getAssetID() const { return mAssetID; } -	const LLTransactionID&		getTransactionID() const { return mTransactionID; } -	LLWearableType::EType				getType() const	{ return mType; } -	void						setType(LLWearableType::EType type); -	const std::string&			getName() const	{ return mName; } -	void						setName(const std::string& name) { mName = name; } -	const std::string&			getDescription() const { return mDescription; } -	void						setDescription(const std::string& desc)	{ mDescription = desc; } -	const LLPermissions& 		getPermissions() const { return mPermissions; } -	void						setPermissions(const LLPermissions& p) { mPermissions = p; } -	const LLSaleInfo&			getSaleInfo() const	{ return mSaleInfo; } -	void						setSaleInfo(const LLSaleInfo& info)	{ mSaleInfo = info; } -	const std::string&			getTypeLabel() const; -	const std::string&			getTypeName() const; -	LLAssetType::EType			getAssetType() const; -	S32							getDefinitionVersion() const { return mDefinitionVersion; } -	void						setDefinitionVersion( S32 new_version ) { mDefinitionVersion = new_version; } - -public: -	typedef std::vector<LLVisualParam*> visual_param_vec_t; - -	BOOL				isDirty() const; -	BOOL				isOldVersion() const; - -	void				writeToAvatar(); -	void				removeFromAvatar( BOOL upload_bake )	{ LLWearable::removeFromAvatar( mType, upload_bake ); } -	static void			removeFromAvatar( LLWearableType::EType type, BOOL upload_bake );  - -	BOOL				exportFile(LLFILE* file) const; -	BOOL				importFile(LLFILE* file); -	 -	void				setParamsToDefaults(); -	void				setTexturesToDefaults(); - -	void				saveNewAsset() const; -	static void			onSaveNewAssetComplete( const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status ); - -	void				copyDataFrom(const LLWearable* src); - -	static void			setCurrentDefinitionVersion( S32 version ) { LLWearable::sCurrentDefinitionVersion = version; } - -	friend std::ostream& operator<<(std::ostream &s, const LLWearable &w); -	void				setItemID(const LLUUID& item_id); - -	LLLocalTextureObject* getLocalTextureObject(S32 index); -	const LLLocalTextureObject* getLocalTextureObject(S32 index) const; -	std::vector<LLLocalTextureObject*> getLocalTextureListSeq(); - -	void				setLocalTextureObject(S32 index, LLLocalTextureObject <o); -	void				addVisualParam(LLVisualParam *param); -	void				setVisualParams(); -	void 				setVisualParamWeight(S32 index, F32 value, BOOL upload_bake); -	F32					getVisualParamWeight(S32 index) const; -	LLVisualParam*		getVisualParam(S32 index) const; -	void				getVisualParams(visual_param_vec_t &list); -	void				animateParams(F32 delta, BOOL upload_bake); - -	LLColor4			getClothesColor(S32 te) const; -	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ); - -	void				revertValues(); -	void				saveValues(); -	void				pullCrossWearableValues();		 - -	BOOL				isOnTop() const; - -	// Something happened that requires the wearable's label to be updated (e.g. worn/unworn). -	void				setLabelUpdated() const; - -	// the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem, -	// not the wearable asset itself. -	void				refreshName(); - -private: -	typedef std::map<S32, LLLocalTextureObject*> te_map_t; -	typedef std::map<S32, LLVisualParam *>    visual_param_index_map_t; - -	void 				createLayers(S32 te); -	void 				createVisualParams(); -	void				syncImages(te_map_t &src, te_map_t &dst); -	void				destroyTextures();	 - -	static S32			sCurrentDefinitionVersion;	// Depends on the current state of the avatar_lad.xml. -	S32					mDefinitionVersion;			// Depends on the state of the avatar_lad.xml when this asset was created. -	std::string			mName; -	std::string			mDescription; -	LLPermissions		mPermissions; -	LLSaleInfo			mSaleInfo; -	LLAssetID mAssetID; -	LLTransactionID		mTransactionID; -	LLWearableType::EType		mType; - -	typedef std::map<S32, F32> param_map_t; -	param_map_t mSavedVisualParamMap; // last saved version of visual params - -	visual_param_index_map_t mVisualParamIndexMap; - -	te_map_t mTEMap;				// maps TE to LocalTextureObject -	te_map_t mSavedTEMap;			// last saved version of TEMap -	LLUUID				mItemID;  // ID of the inventory item in the agent's inventory	 -}; - -#endif  // LL_LLWEARABLE_H diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 92697fb2eb..c196d70617 100644..100755 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -34,6 +34,7 @@  #include "llagentwearables.h"  #include "llappearancemgr.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "lltransutil.h"  #include "llviewerattachmenu.h"  #include "llvoavatarself.h" @@ -788,23 +789,24 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  	const uuid_vec_t& ids = mUUIDs;		// selected items IDs  	LLUUID selected_id = ids.front();	// ID of the first selected item -	functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -  	// Register handlers common for all wearable types.  	registrar.add("Wearable.Wear", boost::bind(wear_multiple, ids, true));  	registrar.add("Wearable.Add", boost::bind(wear_multiple, ids, false));  	registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));  	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));  	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); -	registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Wearable.TakeOffDetach",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	// Register handlers for clothing. -	registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Clothing.TakeOff",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	// Register handlers for body parts.  	// Register handlers for attachments. -	registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Attachment.Detach",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));  	registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2)); diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 6f6411ce3c..507ce57e79 100644..100755 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -42,20 +42,23 @@ struct LLWearableArrivedData  {  	LLWearableArrivedData(LLAssetType::EType asset_type,  		const std::string& wearable_name, -		void(*asset_arrived_callback)(LLWearable*, void* userdata), +		LLAvatarAppearance* avatarp, +		void(*asset_arrived_callback)(LLViewerWearable*, void* userdata),  						  void* userdata) :  		mAssetType( asset_type ),  		mCallback( asset_arrived_callback ),   		mUserdata( userdata ),  		mName( wearable_name ), -		mRetries(0) +		mRetries(0), +		mAvatarp(avatarp)  		{}  	LLAssetType::EType mAssetType; -	void	(*mCallback)(LLWearable*, void* userdata); +	void	(*mCallback)(LLViewerWearable*, void* userdata);  	void*	mUserdata;  	std::string mName;  	S32	mRetries; +	LLAvatarAppearance *mAvatarp;  };  //////////////////////////////////////////////////////////////////////////// @@ -72,10 +75,10 @@ void LLWearableList::cleanup()  	mList.clear();  } -void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLWearable*, void* userdata), void* userdata) +void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAvatarAppearance* avatarp, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), void* userdata)  {  	llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) ); -	LLWearable* instance = get_if_there(mList, assetID, (LLWearable*)NULL ); +	LLViewerWearable* instance = get_if_there(mList, assetID, (LLViewerWearable*)NULL );  	if( instance )  	{  		asset_arrived_callback( instance, userdata ); @@ -85,7 +88,7 @@ void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& weara  		gAssetStorage->getAssetData(assetID,  			asset_type,  			LLWearableList::processGetAssetReply, -			(void*)new LLWearableArrivedData( asset_type, wearable_name, asset_arrived_callback, userdata ), +			(void*)new LLWearableArrivedData( asset_type, wearable_name, avatarp, asset_arrived_callback, userdata ),  			TRUE);  	}  } @@ -95,25 +98,31 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  {  	BOOL isNewWearable = FALSE;  	LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; -	LLWearable* wearable = NULL; // NULL indicates failure +	LLViewerWearable* wearable = NULL; // NULL indicates failure +	LLAvatarAppearance *avatarp = data->mAvatarp;  	if( !filename )  	{  		LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL;  	} +	else if(!avatarp) +	{ +		LL_WARNS("Wearable") << "Bad asset request: missing avatar pointer." << LL_ENDL; +	}  	else if (status >= 0)  	{  		// read the file -		LLFILE* fp = LLFile::fopen(std::string(filename), "rb");		/*Flawfinder: ignore*/ -		if( !fp ) +		llifstream ifs(filename, llifstream::binary); +		if( !ifs.is_open() )  		{  			LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL;  		}  		else  		{ -			wearable = new LLWearable(uuid); -			bool res = wearable->importFile( fp ); -			if (!res) +			wearable = new LLViewerWearable(uuid); +			LLWearable::EImportResult result = wearable->importStream( +												ifs, avatarp ); +			if (LLWearable::SUCCESS != result)  			{  				if (wearable->getType() == LLWearableType::WT_COUNT)  				{ @@ -123,9 +132,12 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  				wearable = NULL;  			} -			fclose( fp );  			if(filename)  			{ +				if (ifs.is_open()) +				{ +					ifs.close(); +				}  				LLFile::remove(std::string(filename));  			}  		} @@ -203,11 +215,11 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  } -LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std::string& new_name) +LLViewerWearable* LLWearableList::createCopy(const LLViewerWearable* old_wearable, const std::string& new_name)  {  	lldebugs << "LLWearableList::createCopy()" << llendl; -	LLWearable *wearable = generateNewWearable(); +	LLViewerWearable *wearable = generateNewWearable();  	wearable->copyDataFrom(old_wearable);  	LLPermissions perm(old_wearable->getPermissions()); @@ -222,12 +234,12 @@ LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std  	return wearable;  } -LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type ) +LLViewerWearable* LLWearableList::createNewWearable( LLWearableType::EType type, LLAvatarAppearance *avatarp )  {  	lldebugs << "LLWearableList::createNewWearable()" << llendl; -	LLWearable *wearable = generateNewWearable(); -	wearable->setType( type ); +	LLViewerWearable *wearable = generateNewWearable(); +	wearable->setType( type, avatarp );  	std::string name = LLTrans::getString( LLWearableType::getTypeDefaultNewName(wearable->getType()) );  	wearable->setName( name ); @@ -251,13 +263,13 @@ LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type )  	return wearable;  } -LLWearable *LLWearableList::generateNewWearable() +LLViewerWearable *LLWearableList::generateNewWearable()  {  	LLTransactionID tid;  	tid.generate();  	LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); -	LLWearable* wearable = new LLWearable(tid); +	LLViewerWearable* wearable = new LLViewerWearable(tid);  	mList[new_asset_id] = wearable;  	return wearable;  } diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index 12d0037aee..d6f0fd09a6 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -28,7 +28,7 @@  #define LL_LLWEARABLELIST_H  #include "llmemory.h" -#include "llwearable.h" +#include "llviewerwearable.h"  #include "lluuid.h"  #include "llassetstorage.h" @@ -50,20 +50,21 @@ public:  	void				getAsset(const LLAssetID& assetID,  								 const std::string& wearable_name, +								 LLAvatarAppearance *avatarp,  								 LLAssetType::EType asset_type, -								 void(*asset_arrived_callback)(LLWearable*, void* userdata), +								 void(*asset_arrived_callback)(LLViewerWearable*, void* userdata),  								 void* userdata); -	LLWearable*			createCopy(const LLWearable* old_wearable, const std::string& new_name = std::string()); -	LLWearable*			createNewWearable(LLWearableType::EType type); +	LLViewerWearable*			createCopy(const LLViewerWearable* old_wearable, const std::string& new_name = std::string()); +	LLViewerWearable*			createNewWearable(LLWearableType::EType type, LLAvatarAppearance *avatarp);  	// Callback  	static void	 	    processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status);  protected: -	LLWearable* generateNewWearable(); // used for the create... functions +	LLViewerWearable* generateNewWearable(); // used for the create... functions  private: -	std::map<LLUUID, LLWearable*> mList; +	std::map<LLUUID, LLViewerWearable*> mList;  };  #endif  // LL_LLWEARABLELIST_H diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp deleted file mode 100644 index c090ab5c3d..0000000000 --- a/indra/newview/llwearabletype.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/**  - * @file llwearabletype.cpp - * @brief LLWearableType class implementation - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llwearabletype.h" -#include "llinventoryfunctions.h" -#include "lltrans.h" - -struct WearableEntry : public LLDictionaryEntry -{ -	WearableEntry(const std::string &name, -				  const std::string& default_new_name, -				  LLAssetType::EType assetType, -				  LLInventoryIcon::EIconName iconName, -				  BOOL disable_camera_switch = FALSE, -				  BOOL allow_multiwear = TRUE) : -		LLDictionaryEntry(name), -		mAssetType(assetType), -		mDefaultNewName(default_new_name), -		mLabel(LLTrans::getString(name)), -		mIconName(iconName), -		mDisableCameraSwitch(disable_camera_switch), -		mAllowMultiwear(allow_multiwear) -	{ -		 -	} -	const LLAssetType::EType mAssetType; -	const std::string mLabel; -	const std::string mDefaultNewName; //keep mLabel for backward compatibility -	LLInventoryIcon::EIconName mIconName; -	BOOL mDisableCameraSwitch; -	BOOL mAllowMultiwear; -}; - -class LLWearableDictionary : public LLSingleton<LLWearableDictionary>, -							 public LLDictionary<LLWearableType::EType, WearableEntry> -{ -public: -	LLWearableDictionary(); -}; - -LLWearableDictionary::LLWearableDictionary() -{ -	addEntry(LLWearableType::WT_SHAPE,        new WearableEntry("shape",       "New Shape",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SHAPE, FALSE, FALSE)); -	addEntry(LLWearableType::WT_SKIN,         new WearableEntry("skin",        "New Skin",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SKIN, FALSE, FALSE)); -	addEntry(LLWearableType::WT_HAIR,         new WearableEntry("hair",        "New Hair",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_HAIR, FALSE, FALSE)); -	addEntry(LLWearableType::WT_EYES,         new WearableEntry("eyes",        "New Eyes",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_EYES, FALSE, FALSE)); -	addEntry(LLWearableType::WT_SHIRT,        new WearableEntry("shirt",       "New Shirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE)); -	addEntry(LLWearableType::WT_PANTS,        new WearableEntry("pants",       "New Pants",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PANTS, FALSE, TRUE)); -	addEntry(LLWearableType::WT_SHOES,        new WearableEntry("shoes",       "New Shoes",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHOES, FALSE, TRUE)); -	addEntry(LLWearableType::WT_SOCKS,        new WearableEntry("socks",       "New Socks",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE)); -	addEntry(LLWearableType::WT_JACKET,       new WearableEntry("jacket",      "New Jacket",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_JACKET, FALSE, TRUE)); -	addEntry(LLWearableType::WT_GLOVES,       new WearableEntry("gloves",      "New Gloves",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE)); -	addEntry(LLWearableType::WT_UNDERSHIRT,   new WearableEntry("undershirt",  "New Undershirt",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE)); -	addEntry(LLWearableType::WT_UNDERPANTS,   new WearableEntry("underpants",  "New Underpants",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE)); -	addEntry(LLWearableType::WT_SKIRT,        new WearableEntry("skirt",       "New Skirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE)); -	addEntry(LLWearableType::WT_ALPHA,        new WearableEntry("alpha",       "New Alpha",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); -	addEntry(LLWearableType::WT_TATTOO,       new WearableEntry("tattoo",      "New Tattoo",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); - -	addEntry(LLWearableType::WT_PHYSICS,      new WearableEntry("physics",     "New Physics",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); - -	addEntry(LLWearableType::WT_INVALID,      new WearableEntry("invalid",     "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); -	addEntry(LLWearableType::WT_NONE,      	  new WearableEntry("none",        "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); -} - -// static -LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name) -{ -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const LLWearableType::EType wearable = dict->lookup(type_name); -	return wearable; -} - -// static  -const std::string& LLWearableType::getTypeName(LLWearableType::EType type) -{  -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return getTypeName(WT_INVALID); -	return entry->mName; -} - -//static  -const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType type) -{  -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return getTypeDefaultNewName(WT_INVALID); -	return entry->mDefaultNewName; -} - -// static  -const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type) -{  -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return getTypeLabel(WT_INVALID); -	return entry->mLabel; -} - -// static  -LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type) -{ -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return getAssetType(WT_INVALID); -	return entry->mAssetType; -} - -// static  -LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType type) -{ -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return getIconName(WT_INVALID); -	return entry->mIconName; -}  - -// static  -BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type) -{ -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return FALSE; -	return entry->mDisableCameraSwitch; -} - -// static  -BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type) -{ -	const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); -	const WearableEntry *entry = dict->lookup(type); -	if (!entry) return FALSE; -	return entry->mAllowMultiwear; -} - diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h deleted file mode 100644 index d633b4807e..0000000000 --- a/indra/newview/llwearabletype.h +++ /dev/null @@ -1,76 +0,0 @@ -/**  - * @file llwearabletype.h - * @brief LLWearableType class header file - * - * $LicenseInfo:firstyear=2002&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_LLWEARABLETYPE_H -#define LL_LLWEARABLETYPE_H - -#include "llassettype.h" -#include "lldictionary.h" -#include "llinventoryicon.h" -#include "llsingleton.h" - -class LLWearableType -{ -public:  -	enum EType -	{ -		WT_SHAPE	  = 0, -		WT_SKIN		  = 1, -		WT_HAIR		  = 2, -		WT_EYES		  = 3, -		WT_SHIRT	  = 4, -		WT_PANTS	  = 5, -		WT_SHOES	  = 6, -		WT_SOCKS	  = 7, -		WT_JACKET	  = 8, -		WT_GLOVES	  = 9, -		WT_UNDERSHIRT = 10, -		WT_UNDERPANTS = 11, -		WT_SKIRT	  = 12, -		WT_ALPHA	  = 13, -		WT_TATTOO	  = 14, -		WT_PHYSICS	  = 15, -		WT_COUNT	  = 16, - -		WT_INVALID	  = 255, -		WT_NONE		  = -1, -	}; - -	static const std::string& 			getTypeName(EType type); -	static const std::string& 			getTypeDefaultNewName(EType type); -	static const std::string& 			getTypeLabel(EType type); -	static LLAssetType::EType 			getAssetType(EType type); -	static EType 						typeNameToType(const std::string& type_name); -	static LLInventoryIcon::EIconName 	getIconName(EType type); -	static BOOL 						getDisableCameraSwitch(EType type); -	static BOOL 						getAllowMultiwear(EType type); - -protected: -	LLWearableType() {} -	~LLWearableType() {} -}; - -#endif  // LL_LLWEARABLETYPE_H diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 350ba39b45..4d52f23ddb 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -78,7 +78,7 @@ void LLSimInfo::setLandForSaleImage (LLUUID image_id)  	// Fetch the image  	if (mMapImageID.notNull())  	{ -		mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); +		mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE);  		mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);  	}  	else @@ -92,13 +92,13 @@ LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage ()  	if (mOverlayImage.isNull() && mMapImageID.notNull())  	{  		// Fetch the image if it hasn't been done yet (unlikely but...) -		mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); +		mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE);  		mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);  	}  	if (!mOverlayImage.isNull())  	{  		// Boost the fetch level when we try to access that image -		mOverlayImage->setBoostLevel(LLViewerTexture::BOOST_MAP); +		mOverlayImage->setBoostLevel(LLGLTexture::BOOST_MAP);  	}  	return mOverlayImage;  } @@ -389,7 +389,7 @@ void LLWorldMap::reloadItems(bool force)  // static public  // Insert a region in the region map  // returns true if region inserted, false otherwise -bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U32 region_flags) +bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U64 region_flags)  {  	// This region doesn't exist  	if (accesscode == 255) diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 73530b9694..c17feaa04b 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -102,7 +102,7 @@ public:  	// Setters  	void setName(std::string& name) { mName = name; }  	void setAccess (U32 accesscode) { mAccess = accesscode; } -	void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; } +	void setRegionFlags (U64 region_flags) { mRegionFlags = region_flags; }  	void setLandForSaleImage (LLUUID image_id);  //	void setWaterHeight (F32 water_height) { mWaterHeight = water_height; } @@ -152,7 +152,7 @@ private:  	bool mFirstAgentRequest;	// Init agent request flag  	U32  mAccess;				// Down/up and maturity rating of the region -	U32 mRegionFlags;			// Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage) +	U64 mRegionFlags;			// Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage)  	// Currently not used but might prove useful one day so we comment out   //	F32 mWaterHeight;			// Water height on the region (not actively used) @@ -198,7 +198,7 @@ public:  	// Insert a region and items in the map global instance  	// Note: x_world and y_world in world coordinates (meters) -	static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U32 region_flags); +	static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U64 region_flags);  	static bool insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2);  	// Get info on sims (region) : note that those methods only search the range of loaded sims (the one that are being browsed) diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index a3ccf87cfc..ad4d59d671 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -421,7 +421,7 @@ void LLWorldMapView::draw()  			{  				// Inform the fetch mechanism of the size we need  				S32 draw_size = llround(sMapScale); -				overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); +				overlayimage->setKnownDrawSize(llround(draw_size * LLUI::getScaleFactor().mV[VX]), llround(draw_size * LLUI::getScaleFactor().mV[VY]));  				// Draw something whenever we have enough info  				if (overlayimage->hasGLTexture())  				{ @@ -965,8 +965,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  	S32 text_x = x;  	S32 text_y = (S32)(y - sTrackCircleImage->getHeight()/2 - font->getLineHeight()); -	BOOL is_in_window = true; -  	if(    x < 0   		|| y < 0   		|| x >= getRect().getWidth()  @@ -979,7 +977,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  			text_x = sTrackingArrowX;  			text_y = sTrackingArrowY;  		} -		is_in_window = false;  	}  	else if (LLTracker::getTrackingStatus() == LLTracker::TRACKING_LOCATION &&  		LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING) diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 74ed844376..c9d2a24a4e 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -74,21 +74,21 @@ void LLWorldMipmap::equalizeBoostLevels()  		{  			LLPointer<LLViewerFetchedTexture> img = iter->second;  			S32 current_boost_level = img->getBoostLevel(); -			if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) +			if (current_boost_level == LLGLTexture::BOOST_MAP_VISIBLE)  			{  				// If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high -				img->setBoostLevel(LLViewerTexture::BOOST_MAP); +				img->setBoostLevel(LLGLTexture::BOOST_MAP);  			}  			else  			{  				// If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw   				// so we drop its boost level to BOOST_NONE. -				img->setBoostLevel(LLViewerTexture::BOOST_NONE); +				img->setBoostLevel(LLGLTexture::BOOST_NONE);  			}  #if DEBUG_TILES_STAT  			// Increment some stats if compile option on  			nb_tiles++; -			if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) +			if (current_boost_level == LLGLTexture::BOOST_MAP_VISIBLE)  			{  				nb_visible++;  			} @@ -115,7 +115,7 @@ void LLWorldMipmap::dropBoostLevels()  		for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++)  		{  			LLPointer<LLViewerFetchedTexture> img = iter->second; -			img->setBoostLevel(LLViewerTexture::BOOST_NONE); +			img->setBoostLevel(LLGLTexture::BOOST_NONE);  		}  	}  } @@ -172,7 +172,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32  		// Boost the tile level so to mark it's in use *if* load on  		if (load)  		{ -			img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE); +			img->setBoostLevel(LLGLTexture::BOOST_MAP_VISIBLE);  		}  		return img;  	} @@ -189,8 +189,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32  	// END DEBUG  	//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; -	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -	img->setBoostLevel(LLViewerTexture::BOOST_MAP); +	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	img->setBoostLevel(LLGLTexture::BOOST_MAP);  	// Return the smart pointer  	return img; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ea2dc60b07..b24e94256f 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -72,6 +72,7 @@  #include "llhudtext.h"  #include "lllightconstants.h"  #include "llmeshrepository.h" +#include "llpipelinelistener.h"  #include "llresmgr.h"  #include "llselectmgr.h"  #include "llsky.h" @@ -378,6 +379,8 @@ BOOL    LLPipeline::sMemAllocationThrottled = FALSE;  S32		LLPipeline::sVisibleLightCount = 0;  F32		LLPipeline::sMinRenderSize = 0.f; +// EventHost API LLPipeline listener. +static LLPipelineListener sPipelineListener;  static LLCullResult* sCull = NULL; @@ -494,19 +497,29 @@ void LLPipeline::init()  	LLViewerStats::getInstance()->mTrianglesDrawnStat.reset();  	resetFrameStats(); -	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	if (gSavedSettings.getBOOL("DisableAllRenderFeatures"))  	{ -		mRenderTypeEnabled[i] = TRUE; //all rendering types start enabled +		clearAllRenderDebugFeatures();  	} +	else +	{ +		setAllRenderDebugFeatures(); // By default, all debugging features on +	} +	clearAllRenderDebugDisplays(); // All debug displays off -	mRenderDebugFeatureMask = 0xffffffff; // All debugging features on -	mRenderDebugMask = 0;	// All debug starts off - -	// Don't turn on ground when this is set -	// Mac Books with intel 950s need this -	if(!gSavedSettings.getBOOL("RenderGround")) +	if (gSavedSettings.getBOOL("DisableAllRenderTypes")) +	{ +		clearAllRenderTypes(); +	} +	else  	{ -		toggleRenderType(RENDER_TYPE_GROUND); +		setAllRenderTypes(); // By default, all rendering types start enabled +		// Don't turn on ground when this is set +		// Mac Books with intel 950s need this +		if(!gSavedSettings.getBOOL("RenderGround")) +		{ +			toggleRenderType(RENDER_TYPE_GROUND); +		}  	}  	// make sure RenderPerformanceTest persists (hackity hack hack) @@ -5928,7 +5941,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			if (light->isLightSpotlight() // directional (spot-)light  			    && (LLPipeline::sRenderDeferred || RenderSpotLightsInNondeferred)) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on  			{ -				LLVector3 spotparams = light->getSpotLightParams();  				LLQuaternion quat = light->getRenderRotation();  				LLVector3 at_axis(0,0,-1); // this matches deferred rendering's object light direction  				at_axis *= quat; @@ -6459,6 +6471,22 @@ void LLPipeline::setRenderDebugFeatureControl(U32 bit, bool value)  	}  } +void LLPipeline::pushRenderDebugFeatureMask() +{ +	mRenderDebugFeatureStack.push(mRenderDebugFeatureMask); +} + +void LLPipeline::popRenderDebugFeatureMask() +{ +	if (mRenderDebugFeatureStack.empty()) +	{ +		llerrs << "Depleted render feature stack." << llendl; +	} + +	mRenderDebugFeatureMask = mRenderDebugFeatureStack.top(); +	mRenderDebugFeatureStack.pop(); +} +  // static  void LLPipeline::setRenderScriptedBeacons(BOOL val)  { @@ -9100,9 +9128,6 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  		3,7	  	}; -	LLVector3 center = (max+min)*0.5f; -	LLVector3 size = (max-min)*0.5f; -	  	for (U32 i = 0; i < 12; i++)  	{  		for (U32 j = 0; j < 6; ++j) @@ -9328,7 +9353,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  	mSunOrthoClipPlanes = LLVector4(clip, clip.mV[2]*clip.mV[2]/clip.mV[1]);  	//currently used for amount to extrude frusta corners for constructing shadow frusta -	LLVector3 n = RenderShadowNearDist; +	//LLVector3 n = RenderShadowNearDist;  	//F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };  	//put together a universal "near clip" plane for shadow frusta @@ -10434,6 +10459,22 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...)  	}  } +void LLPipeline::setAllRenderTypes() +{ +	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	{ +		mRenderTypeEnabled[i] = TRUE; +	} +} + +void LLPipeline::clearAllRenderTypes() +{ +	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	{ +		mRenderTypeEnabled[i] = FALSE; +	} +} +  void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color)  {  	DebugBlip blip(position, color); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 7a0ca86231..5e69d4a951 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -307,20 +307,28 @@ public:  	BOOL hasRenderDebugFeatureMask(const U32 mask) const	{ return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }  	BOOL hasRenderDebugMask(const U32 mask) const			{ return (mRenderDebugMask & mask) ? TRUE : FALSE; } -	 - +	void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; } +	void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; } +	void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffff; } +	void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; }  	BOOL hasRenderType(const U32 type) const;  	BOOL hasAnyRenderType(const U32 type, ...) const;  	void setRenderTypeMask(U32 type, ...); -	void orRenderTypeMask(U32 type, ...); +	// This is equivalent to 'setRenderTypeMask' +	//void orRenderTypeMask(U32 type, ...);  	void andRenderTypeMask(U32 type, ...);  	void clearRenderTypeMask(U32 type, ...); +	void setAllRenderTypes(); +	void clearAllRenderTypes();  	void pushRenderTypeMask();  	void popRenderTypeMask(); +	void pushRenderDebugFeatureMask(); +	void popRenderDebugFeatureMask(); +  	static void toggleRenderType(U32 type);  	// For UI control of render features @@ -617,6 +625,7 @@ protected:  	U32						mRenderDebugFeatureMask;  	U32						mRenderDebugMask; +	std::stack<U32>			mRenderDebugFeatureStack;  	U32						mOldRenderDebugMask; diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index df75f3f697..471a896019 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -135,8 +135,8 @@ TOOLNO                  CURSOR                  "llno.cur"  //  VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,1,1,0 - PRODUCTVERSION 2,1,1,0 + FILEVERSION 3,4,1,264760 + PRODUCTVERSION 3,4,1,264760   FILEFLAGSMASK 0x3fL  #ifdef _DEBUG   FILEFLAGS 0x1L @@ -153,12 +153,12 @@ BEGIN          BEGIN              VALUE "CompanyName", "Linden Lab"              VALUE "FileDescription", "Second Life" -            VALUE "FileVersion", "2.1.1.0" +            VALUE "FileVersion", "3.4.1.264760"              VALUE "InternalName", "Second Life"              VALUE "LegalCopyright", "Copyright � 2001-2010, Linden Research, Inc."              VALUE "OriginalFilename", "SecondLife.exe"              VALUE "ProductName", "Second Life" -            VALUE "ProductVersion", "2.1.1.0" +            VALUE "ProductVersion", "3.4.1.264760"          END      END      BLOCK "VarFileInfo" diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 06f8f8c670..03aedae0a9 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -712,9 +712,6 @@ with the same filename but different name    <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />    <texture name="icon_top_pick.tga" /> -  <texture name="inv_folder_mesh.tga"/> -  <texture name="inv_item_mesh.tga"/> -    <texture name="lag_status_critical.tga" />    <texture name="lag_status_good.tga" />    <texture name="lag_status_warning.tga" /> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index b46b62ec4d..46ba4bd29d 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -79,6 +79,14 @@              <menu_item_call.on_visible               function="IsGodCustomerService"/>          </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>  	    <menu_item_call           label="Zoom In"            name="Zoom In"> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index b8128da358..28e032ce5f 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -123,6 +123,14 @@ name="Edit Outfit">      <menu_item_call.on_visible       function="IsGodCustomerService"/>    </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>    <menu_item_separator    layout="topleft" />    <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index 276b5f106f..e7c2b80da2 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -79,6 +79,14 @@              <menu_item_call.on_visible               function="IsGodCustomerService"/>          </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>  	    <menu_item_call           label="Zoom In"            name="Zoom In"> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index d9bdfece38..c1ff026a74 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -261,4 +261,12 @@              <menu_item_call.on_visible               function="IsGodCustomerService"/>      </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 76b188220d..354ddc3109 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -112,6 +112,14 @@      <menu_item_call.on_visible       function="IsGodCustomerService"/>    </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>    <menu_item_call     label="Find On Map"     name="find_on_map"> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 5e7b16ed4a..84815caca9 100644..100755 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -249,4 +249,12 @@      <menu_item_call.on_visible       function="IsGodCustomerService"/>    </menu_item_call> +    <menu_item_call +		 label="Dump XML" +         name="Dump XML"> +            <menu_item_call.on_click +             function="Advanced.AppearanceToXML" /> +            <menu_item_call.on_visible +             function="Advanced.EnableAppearanceToXML"/> +    </menu_item_call>  </toggleable_menu> diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index f8923b9868..f8923b9868 100644..100755 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp index acc6e814bc..3c68890c36 100644 --- a/indra/newview/tests/llworldmap_test.cpp +++ b/indra/newview/tests/llworldmap_test.cpp @@ -47,9 +47,9 @@  // * A simulator for a class can be implemented here. Please comment and document thoroughly.  // Stub image calls -void LLViewerTexture::setBoostLevel(S32 ) { } -void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { } -LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLViewerTexture::EBoostLevel, S8, +void LLGLTexture::setBoostLevel(S32 ) { } +void LLGLTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLGLTexture::EBoostLevel, S8,  																  LLGLint, LLGLenum, LLHost ) { return NULL; }  // Stub related map calls diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp index e7ef017760..22ebf28f55 100644 --- a/indra/newview/tests/llworldmipmap_test.cpp +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -42,8 +42,8 @@  // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)  // * A simulator for a class can be implemented here. Please comment and document thoroughly. -void LLViewerTexture::setBoostLevel(S32 ) { } -LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, BOOL, LLViewerTexture::EBoostLevel, S8,  +void LLGLTexture::setBoostLevel(S32 ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, BOOL, LLGLTexture::EBoostLevel, S8,   																		 LLGLint, LLGLenum, const LLUUID& ) { return NULL; }  LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }  | 
