diff options
194 files changed, 12336 insertions, 8470 deletions
@@ -50,6 +50,11 @@ indra/web/doc/asset-upload/plugins/verify-texture  installed.xml  libraries  tarfile_tmp +debian/secondlife-viewer* +debian/secondlife-appearance-utility* +debian/files +build-stamp +configure-stamp  ^indra/lib/python/mulib.*  ^web/locale.*  ^web/secondlife.com.* diff --git a/debian/changelog b/debian/changelog index ce54b54c6f..b3df2fcab3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +secondlife-viewer (0.4) unstable; urgency=low + +  * Adding appearance utility package + + -- Don Kjer <don@lindenlab.com>  Thu, 06 Sep 2012 19:32:55 +0000 +  secondlife-viewer (0.3) unstable; urgency=low    * Initial debian configuration diff --git a/debian/control b/debian/control index 50b9ed9a26..9ebd71df65 100644 --- a/debian/control +++ b/debian/control @@ -14,3 +14,11 @@ Depends: ${shlibs:Depends}, ${misc:Depends},  Description: Second Life Viewer   Second Life is an online virtual world developed by Linden Lab. +Package: secondlife-appearance-utility +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + ia32-libs, + ia32-libs-gtk +Description: Second Life Appearance Utility + Utility for manipulating Second Life avatar appearance. + diff --git a/debian/rules b/debian/rules index c41f02d4fb..10301bf7d3 100755 --- a/debian/rules +++ b/debian/rules @@ -9,11 +9,19 @@  # Uncomment this to turn on verbose mode.  #export DH_VERBOSE=1 -SRCDIR=build-linux-i686/newview/packaged -DESTDIR=$(CURDIR)/debian/secondlife-viewer -BASEDIR=opt/linden/viewer +BASEDIR=opt/linden + +VIEWER_PKG=secondlife-viewer +VIEWER_PACKAGEDIR=build-linux-i686/newview/packaged +VIEWER_DESTDIR=$(CURDIR)/debian/$(VIEWER_PKG)  VIEWER_VERSION:=$(shell dpkg-parsechangelog | grep ^Version | sed 's/^Version: //') -INSTALLDIR:=$(BASEDIR)/SecondLife-i686-$(VIEWER_VERSION) +VIEWER_INSTALLDIR:=$(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION) + +UTILITY_PKG=secondlife-appearance-utility +UTILITY_SRCDIR=indra/appearance_utility +UTILITY_PACKAGEDIR=build-linux-i686/appearance_utility +UTILITY_DESTDIR=$(CURDIR)/debian/$(UTILITY_PKG) +UTILITY_INSTALLDIR:=$(BASEDIR)/utilities  configure: configure-stamp  configure-stamp: @@ -50,24 +58,61 @@ install: build  	dh_installdirs  	# Add here commands to install the package into debian/secondlife-viewer. -	for file in $$(find $(SRCDIR) -type f -o -type l | sed 's~$(SRCDIR)/~~'); do \ +	for file in $$(find $(VIEWER_PACKAGEDIR) -type f -o -type l | sed 's~$(VIEWER_PACKAGEDIR)/~~'); do \ +		# create containing directory \ +		install -v -m 755 -o root -g root -d "$$(dirname "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file")"; \ +		PERM=644; \ +		if [ -x "$(VIEWER_PACKAGEDIR)/$$file" ]; then \ +			PERM=755; \ +		fi; \ +		if [ -L "$(VIEWER_PACKAGEDIR)/$$file" ]; then \ +			REAL="$$( readlink -f $(VIEWER_PACKAGEDIR)/$$file )"; \ +			RELATIVE="$$( echo $$REAL | sed 's~$(CURDIR)/$(VIEWER_PACKAGEDIR)/~~' )"; \ +			echo dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \ +			dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \ +		else \ +			install -v -m $$PERM -o root -g root "$(VIEWER_PACKAGEDIR)/$$file" "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file"; \ +		fi; \ +	done +	dh_link -p $(VIEWER_PKG) /$(VIEWER_INSTALLDIR)/secondlife /usr/bin/secondlife +	dh_link -p $(VIEWER_PKG) $(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION) $(BASEDIR)/viewer/SecondLife + +	# Add here commands to install the package into debian/secondlife-appearance-utility +	# create containing directory +	install -v -m 755 -o root -g root -d "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)" +	# install utility wrapper +	install -v -m 755 -o root -g root "$(UTILITY_SRCDIR)/wrapper.sh" "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/wrapper.sh" +	# install appearance-utility +	install -v -m 755 -o root -g root "$(UTILITY_PACKAGEDIR)/appearance-utility-bin" "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/appearance-utility-bin" +	dh_link -p $(UTILITY_PKG) $(UTILITY_INSTALLDIR)/wrapper.sh $(UTILITY_INSTALLDIR)/appearance-utility +	# install xml/image resources from viewer package +	for file in $$(find $(VIEWER_PACKAGEDIR)/character -name "avatar_*.xml" -o -name "*.tga" | sed 's~$(VIEWER_PACKAGEDIR)/~~'); do \ +		# create containing directory \ +		install -v -m 755 -o root -g root -d "$$(dirname "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/$$file")"; \ +		PERM=644; \ +		if [ -x "$(VIEWER_PACKAGEDIR)/$$file" ]; then \ +			PERM=755; \ +		fi; \ +		install -v -m $$PERM -o root -g root "$(VIEWER_PACKAGEDIR)/$$file" "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/$$file"; \ +	done +	# install viewer libraries +	for file in $$(find $(VIEWER_PACKAGEDIR)/lib -type f -o -type l | sed 's~$(VIEWER_PACKAGEDIR)/~~'); do \  		# create containing directory \ -		install -v -m 755 -o root -g root -d "$$(dirname "$(DESTDIR)/$(INSTALLDIR)/$$file")"; \ +		install -v -m 755 -o root -g root -d "$$(dirname "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/$$file")"; \  		PERM=644; \ -		if [ -x "$(SRCDIR)/$$file" ]; then \ +		if [ -x "$(VIEWER_PACKAGEDIR)/$$file" ]; then \  			PERM=755; \  		fi; \ -		if [ -L "$(SRCDIR)/$$file" ]; then \ -			REAL="$$( readlink -f $(SRCDIR)/$$file )"; \ -			RELATIVE="$$( echo $$REAL | sed 's~$(CURDIR)/$(SRCDIR)/~~' )"; \ -			echo dh_link "$(INSTALLDIR)/$$RELATIVE" "$(INSTALLDIR)/$$file" ; \ -			dh_link "$(INSTALLDIR)/$$RELATIVE" "$(INSTALLDIR)/$$file" ; \ +		if [ -L "$(VIEWER_PACKAGEDIR)/$$file" ]; then \ +			REAL="$$( readlink -f $(VIEWER_PACKAGEDIR)/$$file )"; \ +			RELATIVE="$$( echo $$REAL | sed 's~$(CURDIR)/$(VIEWER_PACKAGEDIR)/~~' )"; \ +			echo dh_link -p $(UTILITY_PKG) "$(UTILITY_INSTALLDIR)/$$RELATIVE" "$(UTILITY_INSTALLDIR)/$$file" ; \ +			dh_link -p $(UTILITY_PKG) "$(UTILITY_INSTALLDIR)/$$RELATIVE" "$(UTILITY_INSTALLDIR)/$$file" ; \  		else \ -			install -v -m $$PERM -o root -g root "$(SRCDIR)/$$file" "$(DESTDIR)/$(INSTALLDIR)/$$file"; \ +			install -v -m $$PERM -o root -g root "$(VIEWER_PACKAGEDIR)/$$file" "$(UTILITY_DESTDIR)/$(UTILITY_INSTALLDIR)/$$file"; \  		fi; \  	done -	dh_link /$(INSTALLDIR)/secondlife /usr/bin/secondlife -	dh_link $(BASEDIR)/SecondLife-i686-$(VIEWER_VERSION) $(BASEDIR)/SecondLife +	dh_link -p $(UTILITY_PKG) /$(UTILITY_INSTALLDIR)/appearance-utility /usr/bin/appearance-utility  # Build architecture-independent files here. diff --git a/debian/secondlife-appearance-utility.substvars b/debian/secondlife-appearance-utility.substvars new file mode 100644 index 0000000000..abd3ebebc3 --- /dev/null +++ b/debian/secondlife-appearance-utility.substvars @@ -0,0 +1 @@ +misc:Depends= diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 1cebb53a07..4e209ff75a 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -41,6 +41,7 @@ endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}  add_subdirectory(cmake)  add_subdirectory(${LIBS_OPEN_PREFIX}llaudio) +add_subdirectory(${LIBS_OPEN_PREFIX}llappearance)  add_subdirectory(${LIBS_OPEN_PREFIX}llcharacter)  add_subdirectory(${LIBS_OPEN_PREFIX}llcommon)  add_subdirectory(${LIBS_OPEN_PREFIX}llimage) @@ -82,6 +83,7 @@ if (VIEWER)    if (LINUX)      add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)      add_subdirectory(${VIEWER_PREFIX}linux_updater) +    add_subdirectory(${VIEWER_PREFIX}appearance_utility)      add_dependencies(viewer linux-crash-logger-strip-target linux-updater)    elseif (DARWIN)      add_subdirectory(${VIEWER_PREFIX}mac_crash_logger) diff --git a/indra/appearance_utility/CMakeLists.txt b/indra/appearance_utility/CMakeLists.txt new file mode 100644 index 0000000000..92898fa48b --- /dev/null +++ b/indra/appearance_utility/CMakeLists.txt @@ -0,0 +1,66 @@ +# -*- cmake -*- + +project(appearance_utility) + +include(00-Common) +include(LLAppearance) +include(LLCharacter) +include(LLCommon) +include(LLImage) +include(LLInventory) +include(LLMath) +include(LLRender) +include(LLVFS) +include(LLXML) +include(Linking) +include(GooglePerfTools) + +include_directories( +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${LLXML_INCLUDE_DIRS} +    ${LLCHARACTER_INCLUDE_DIRS} +    ${LLIMAGE_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLINVENTORY_INCLUDE_DIRS} +    ${LLRENDER_INCLUDE_DIRS} +    ${LLAPPEARANCE_INCLUDE_DIRS} +    ) + +set(appearance_utility_SOURCE_FILES +    appearance_utility.cpp +    llappappearanceutility.cpp +    llbakingavatar.cpp +    llbakingjoint.cpp +    llbakingjointmesh.cpp +    llbakingshadermgr.cpp +    llbakingtexlayer.cpp +    llprocessparams.cpp +    ) + +set(appearance_utility_HEADER_FILES +    CMakeLists.txt +    llappappearanceutility.h +    llbakingavatar.h +    llbakingjoint.h +    llbakingjointmesh.h +    llbakingprocess.h +    llbakingshadermgr.h +    llbakingtexlayer.h +    llprocessparams.h +    ) + +set_source_files_properties(${appearance_utility_HEADER_FILES} +                            PROPERTIES HEADER_FILES_ONLY TRUE) + +list(APPEND appearance_utility_SOURCE_FILES ${appearance_utility_HEADER_FILES}) + +add_executable(appearance-utility-bin ${appearance_utility_SOURCE_FILES}) + +target_link_libraries(appearance-utility-bin +    ${LLAPPEARANCE_LIBRARIES} +    ${TCMALLOC_LIBRARIES} +    ) + +add_custom_target(appearance-utility-bin-target ALL +                  DEPENDS appearance-utility-bin) diff --git a/indra/appearance_utility/appearance_utility.cpp b/indra/appearance_utility/appearance_utility.cpp new file mode 100644 index 0000000000..098c3550de --- /dev/null +++ b/indra/appearance_utility/appearance_utility.cpp @@ -0,0 +1,66 @@ +/** + * @file appearance_utility.cpp + * @author Don Kjer <don@lindenlab.com>, Nyx Linden + * @brief Utility for processing avatar appearance without a full viewer implementation. + * + * $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$ + */ + +// linden includes +#include "linden_common.h" +#include "llapr.h" + +// project includes +#include "llappappearanceutility.h" + +int main(int argc, char** argv) +{ +	// Create an application instance. +	ll_init_apr(); +	LLAppAppearanceUtility* app = new LLAppAppearanceUtility(argc, argv); + +	// Assume success, unless exception is thrown. +	EResult rv = RV_SUCCESS; +	try +	{ +		// Process command line and initialize system. +		if (app->init()) +		{ +			// Run process. +			app->mainLoop(); +		} +	} +	catch (LLAppException& e) +	{ +		// Deal with errors. +		rv = e.getStatusCode(); +	} + +	// Clean up application instance. +	app->cleanup(); +	delete app; +	ll_cleanup_apr(); + +	return (int) rv; +} + + diff --git a/indra/appearance_utility/llappappearanceutility.cpp b/indra/appearance_utility/llappappearanceutility.cpp new file mode 100644 index 0000000000..66e59e1b89 --- /dev/null +++ b/indra/appearance_utility/llappappearanceutility.cpp @@ -0,0 +1,445 @@ +/**  + * @file llappappearanceutility.cpp + * @brief Implementation of LLAppAppearanceUtility class. + * + * $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$ + */ + +#include <iostream> +#include <sstream> +#include <string> + +// linden includes +#include "linden_common.h" + +#include "llapr.h" +#include "llerrorcontrol.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llsdutil.h" + +// appearance includes +#include "llavatarappearance.h" +#include "llwearabletype.h" + +// project includes +#include "llappappearanceutility.h" +#include "llbakingprocess.h" +#include "llprocessparams.h" + +const std::string NOTHING_EXTRA(""); + +//////////////////////////////////////////// +// LLAppException +//////////////////////////////////////////// + +static const std::string MESSAGE_RV_UNKNOWN("Unknown error."); +static const std::string MESSAGE_RV_ARGUMENTS  +("Invalid arguments: "); +static const std::string MESSAGE_RV_UNABLE_OPEN("Unable to open file: "); +static const std::string MESSAGE_RV_UNABLE_TO_PARSE("Unable to parse input LLSD."); +static const std::string MESSAGE_DUPLICATE_MODES = "Cannot specify more than one process mode."; + + +LLAppException::LLAppException(EResult status_code, const std::string& extra) : +	mStatusCode(status_code) +{ +	switch(status_code) +	{ +	case RV_UNKNOWN_ERROR: +		printErrorLLSD("unknown", MESSAGE_RV_UNKNOWN); +	case RV_BAD_ARGUMENTS: +		printErrorLLSD("arguments", MESSAGE_RV_ARGUMENTS + extra); +		break; +	case RV_UNABLE_OPEN: +		printErrorLLSD("file", MESSAGE_RV_UNABLE_OPEN + extra); +		break; +	case RV_UNABLE_TO_PARSE: +		printErrorLLSD("input", MESSAGE_RV_UNABLE_TO_PARSE); +		break; +	default: +		printErrorLLSD("arguments", "Unknown exception."); +		break; +	} +} + +void LLAppException::printErrorLLSD(const std::string& key, const std::string& message) +{ +	LLSD error_llsd; +	error_llsd["success"] = false; +	error_llsd["error"]["key"] = key; +	error_llsd["error"]["message"] = message; + +	std::cerr << LLSDOStreamer<LLSDXMLFormatter>(error_llsd); +} + + + +//////////////////////////////////////////// +// LLAppAppearanceUtility +//////////////////////////////////////////// + +///////// Option Parsing ///////// + +// Simple usage command. +class LLProcessUsage : public LLBakingProcess +{ +public: +	LLProcessUsage(LLAppAppearanceUtility* app) : +		LLBakingProcess(app) {} +	/*virtual*/ void process(LLSD& input, std::ostream& output) +	{ +		mApp->usage(output); +	} +}; + + +static const apr_getopt_option_t APPEARANCE_UTILITY_OPTIONS[] = +{ +	{"params", 'p', 0, "Generate appearance parameters for an agent."}, +	{"output", 'o', 1, "The output file to write to.  Default is stdout"}, +	{"agent-id", 'a', 1, "The agent-id of the user."}, +	//{"grid", 'g', 1, "The grid."}, +	{"help", 'h', 0, "Print the help message."}, +	{0, 0, 0, 0} +}; + +void LLAppAppearanceUtility::usage(std::ostream& ostr) +{ +	ostr << "Utilities for processing agent appearance data." +		<< std::endl << std::endl +		<< "Usage:" << std::endl +		<< "\t" << mAppName << " [options] filename" << std::endl << std::endl +		<< "Will read from stdin if filename is set to '-'." << std::endl << std::endl +		<< "Options:" << std::endl; +	const apr_getopt_option_t* option = &APPEARANCE_UTILITY_OPTIONS[0]; +	while(option->name) +	{ +		ostr << "\t--" << option->name << "\t\t" +			<< option->description << std::endl; +		++option; +	} +	ostr << std::endl << "Return Values:" << std::endl +		<< "\t0\t\tSuccess." << std::endl +		<< "\t1\t\tUnknown error." << std::endl +		<< "\t2\t\tBad arguments." << std::endl +		<< "\t3\t\tUnable to open file. Possibly wrong filename" +		<< " or bad permissions." << std::endl +		<< "\t4\t\tUnable to parse input LLSD." << std::endl +		<< std::endl +		<< "Output:" << std::endl +		<< "If a non-zero status code is returned, additional error information" +		<< " will be returned on stderr." << std::endl +		<< "* This will be in the form of an LLSD document." << std::endl +		<< "* Check ['error']['message'] to get a human readable message." << std::endl +		<< "If a zero status code is returned, processed output will be written" +		<< " to the file specified by --out (or stdout, if not specified)." << std::endl +		<< std::endl +		<< std::endl; +} + + +/////// LLApp Interface //////// + +LLAppAppearanceUtility::LLAppAppearanceUtility(int argc, char** argv) : +	LLApp(), +	mArgc(argc), +	mArgv(argv), +	mProcess(NULL), +	mInput(NULL), +	mOutput(NULL), +	mAppName(argv[0]) +{ +} + +// virtual +LLAppAppearanceUtility::~LLAppAppearanceUtility() +{ +} + +void LLAppAppearanceUtility::verifyNoProcess() +{ +	if (mProcess) +	{ +		std::cerr << "Invalid arguments. " << MESSAGE_DUPLICATE_MODES << std::endl; +		usage(std::cerr); +		throw LLAppException(RV_BAD_ARGUMENTS, MESSAGE_DUPLICATE_MODES); +	} +} + +void LLAppAppearanceUtility::parseArguments() +{ +	////// BEGIN OPTION PARSING ////// +	// Check for '-' as last option, since apr doesn't seem to like that. +	if (std::string(mArgv[mArgc-1]) == "-") +	{ +		mInputFilename.assign("-"); +		mArgc--; +	} + +	apr_status_t apr_err; +	const char* opt_arg = NULL; +	int opt_id = 0; +	apr_getopt_t* os = NULL; +	if(APR_SUCCESS != apr_getopt_init(&os, gAPRPoolp, mArgc, mArgv)) +	{ +		std::cerr << "Unable to initialize apr" << std::endl; +		throw LLAppException(RV_UNKNOWN_ERROR); +	} + +	//std::string grid; +	while(true) +	{ +		apr_err = apr_getopt_long(os, APPEARANCE_UTILITY_OPTIONS, &opt_id, &opt_arg); +		if(APR_STATUS_IS_EOF(apr_err)) break; +		if(apr_err) +		{ +			char buf[MAX_STRING];		/* Flawfinder: ignore */ +			std::cerr << "Error parsing options: " +				<< apr_strerror(apr_err, buf, MAX_STRING) << std::endl; +			usage(std::cerr); +			throw LLAppException(RV_BAD_ARGUMENTS, buf); +		} +		switch (opt_id) +		{ +		case 'h': +			verifyNoProcess(); +			mProcess = new LLProcessUsage(this); +			break; +		case 'p': +			verifyNoProcess(); +			mProcess = new LLProcessParams(this); +			break; +		case 'o': +			mOutputFilename.assign(opt_arg); +			break; +		case 'a': +			mAgentID.set(opt_arg); +			if (mAgentID.isNull()) +			{ +				const char* INVALID_AGENT_ID="agent-id must be a valid uuid."; +				std::cerr << "Invalid arguments. " << INVALID_AGENT_ID << std::endl; +				usage(std::cerr); +				throw LLAppException(RV_BAD_ARGUMENTS, INVALID_AGENT_ID); +			} +			break; +		//case 'g': +		//	grid = opt_arg; +		//	break; +		default: +			usage(std::cerr); +			throw LLAppException(RV_BAD_ARGUMENTS, "Unknown option."); +		} +	} + +	if ("-" != mInputFilename) +	{ +		bool valid_input_filename = false; +		// Try to grab the input filename. +		if (os->argv && os->argv[os->ind]) +		{ +			mInputFilename.assign(os->argv[os->ind]); +			if (! mInputFilename.empty() ) +			{ +				valid_input_filename = true; +			} +		} +		if (!valid_input_filename) +		{ +			const char* INVALID_FILENAME="Must specify input file."; +			std::cerr << "Invalid arguments. " << INVALID_FILENAME << std::endl; +			usage(std::cerr); +			throw LLAppException(RV_BAD_ARGUMENTS, INVALID_FILENAME); +		} +	} + +	////// END OPTION PARSING ////// +} + +void LLAppAppearanceUtility::validateArguments() +{ +	/////  BEGIN ARGUMENT VALIDATION ///// + +	// Make sure we have a command specified. +	if (!mProcess) +	{ +		const char* INVALID_MODE="No process mode specified."; +		std::cerr << "Invalid arguments. " << INVALID_MODE +				  << std::endl; +		usage(std::cerr); +		throw LLAppException(RV_BAD_ARGUMENTS, INVALID_MODE); +	} + +	/////  END ARGUMENT VALIDATION ///// +} + +void LLAppAppearanceUtility::initializeIO() +{ +	/////  BEGIN OPEN INPUT FILE //// + +	if ( "-" == mInputFilename ) +	{ +		// Read unformated data from stdin in to memory. +		std::stringstream* data = new std::stringstream(); +		const S32 BUFFER_SIZE = BUFSIZ; +		char buffer[BUFFER_SIZE]; +		while (true) +		{ +			std::cin.read(buffer, BUFFER_SIZE); +			// Check if anything out of the ordinary happened. +			if (!std::cin) +			{ +				// See if something 'really bad' happened, or if we just +				// used up all of our buffer. +				if (std::cin.bad()) +				{ +					std::cerr << "Problem reading standard input." << std::endl; +					delete data; +					throw (RV_UNKNOWN_ERROR); +				} +				else +				{ +					// Output normally. +					data->write(buffer, std::cin.gcount()); +					if (std::cin.eof()) break; + +					// Clear this problem.  We have handled it. +					std::cin.clear(); +				} +			} +			else +			{ +				data->write(buffer, std::cin.gcount()); +				if (std::cin.eof()) break; +			} +		} +		mInput = data; +	} +	else +	{ +		// Make sure we can open the input file. +		std::ifstream* input_file = new std::ifstream(); +		input_file->open( mInputFilename.c_str(), std::fstream::in ); +		if ( input_file->fail()) +		{ +			std::cerr << "Couldn't open input file '" << mInputFilename << "'." << std::endl; +			delete input_file; +			throw LLAppException(RV_UNABLE_OPEN, mInputFilename); +		} +		mInput = input_file; +	} +	/////  END OPEN INPUT FILE //// + +	/////  BEGIN OPEN OUTPUT FILE //// + +	if ("" == mOutputFilename) +	{ +		mOutput = &std::cout; +	} +	else +	{ +		// Make sure we can open the output file. +		std::fstream* output_file = new std::fstream(); +		output_file->open( mOutputFilename.c_str(), std::fstream::out ); +		if ( output_file->fail() ) +		{ +			std::cerr << "Couldn't open output file '" << mOutputFilename << "'." << std::endl; +			delete output_file; +			throw LLAppException(RV_UNABLE_OPEN, mOutputFilename); +		} +		mOutput = output_file; +	} +	/////  END OPEN OUTPUT FILE //// + +	/////  BEGIN INPUT PARSING //// +	LLSDSerialize::fromXML( mInputData, *mInput ); +	if (mInputData.isUndefined()) +	{ +		throw LLAppException(RV_UNABLE_TO_PARSE); +	} +	/////  END INPUT PARSING //// +} + +class LLPassthroughTranslationBridge : public LLTranslationBridge +{ +public: +	virtual std::string getString(const std::string &xml_desc) +	{ +		// Just pass back the input string. +		return xml_desc; +	} +}; + + +bool LLAppAppearanceUtility::init() +{ +	parseArguments(); + +	bool log_to_stderr = true; +	LLError::initForApplication("", log_to_stderr); +	// *TODO: Add debug mode(s).  Skip this in debug mode. +	LLError::setDefaultLevel(LLError::LEVEL_WARN); + +	validateArguments(); +	initializeIO(); + +	// Initialize classes. +	LLWearableType::initClass(new LLPassthroughTranslationBridge()); + +	// *TODO: Create a texture bridge? +	LLAvatarAppearance::initClass(); + +	return true; +} + +bool LLAppAppearanceUtility::cleanup() +{ +	LLAvatarAppearance::cleanupClass(); +	LLWearableType::cleanupClass(); + +	if (mProcess) +	{ +		delete mProcess; +		mProcess = NULL; +	} +	if ("-" != mInputFilename && mInput) +	{ +		static_cast<std::ifstream*>(mInput)->close(); +	} +	if ("" != mOutputFilename && mOutput) +	{ +		static_cast<std::ofstream*>(mOutput)->close(); +		delete mOutput; +		mOutput = NULL; +	} +	delete mInput; +	mInput = NULL; +	return true; +} + +bool LLAppAppearanceUtility::mainLoop() +{ +	// This isn't really a loop, for this application.  We just execute the requested command. +	mProcess->process(mInputData, *mOutput); +	return true; +} + diff --git a/indra/appearance_utility/llappappearanceutility.h b/indra/appearance_utility/llappappearanceutility.h new file mode 100644 index 0000000000..2a5b8232eb --- /dev/null +++ b/indra/appearance_utility/llappappearanceutility.h @@ -0,0 +1,97 @@ +/**  + * @file llappappearanceutility.h + * @brief Declaration of LLAppAppearanceUtility class. + * + * $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$ + */ + +#ifndef LL_LLAPPAPPEARANCEUTILITY_H +#define LL_LLAPPAPPEARANCEUTILITY_H + +#include <exception> + +#include "llapp.h" + +enum EResult +{ +	RV_SUCCESS = 0, +	RV_UNKNOWN_ERROR, +	RV_BAD_ARGUMENTS, +	RV_UNABLE_OPEN, +	RV_UNABLE_TO_PARSE, +}; + +extern const std::string NOTHING_EXTRA; + +class LLAppAppearanceUtility; +class LLBakingProcess; + +// Translate error status into error messages. +class LLAppException : public std::exception +{ +public: +	LLAppException(EResult status_code, const std::string& extra = NOTHING_EXTRA); +	EResult getStatusCode() { return mStatusCode; } + +private: +	void printErrorLLSD(const std::string& key, const std::string& message); +	EResult mStatusCode; +}; + + +class LLAppAppearanceUtility : public LLApp +{ +public: +	LLAppAppearanceUtility(int argc, char** argv); +	virtual ~LLAppAppearanceUtility(); + +	// LLApp interface. +	/*virtual*/ bool init(); +	/*virtual*/ bool cleanup(); +	/*virtual*/ bool mainLoop(); + +private: +	// Option parsing. +	void verifyNoProcess(); +	void parseArguments(); +	void validateArguments(); +	void initializeIO(); +public: +	void usage(std::ostream& ostr); + + +private: +	int mArgc; +	char** mArgv; +	LLBakingProcess* mProcess; +	std::istream* mInput; +	std::ostream* mOutput; +	std::string mAppName; +	std::string mInputFilename; +	std::string mOutputFilename; +	LLUUID mAgentID; +	LLSD mInputData; +}; + + +#endif /* LL_LLAPPAPPEARANCEUTILITY_H */ + diff --git a/indra/appearance_utility/llbakingavatar.cpp b/indra/appearance_utility/llbakingavatar.cpp new file mode 100644 index 0000000000..0424e8134b --- /dev/null +++ b/indra/appearance_utility/llbakingavatar.cpp @@ -0,0 +1,159 @@ +/**  + * @File llbakingavatar.cpp + * @brief Implementation of LLBakingAvatar class which is a derivation of LLAvatarAppearance + * + * $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$ + */ + +// linden includes +#include "linden_common.h" +#include "v3dmath.h" + +// project includes +#include "llbakingavatar.h" +#include "llbakingjoint.h" +#include "llbakingjointmesh.h" +#include "llbakingtexlayer.h" + +LLBakingAvatar::LLBakingAvatar(LLWearableData* wearable_data) : +	LLAvatarAppearance(wearable_data) +{ +} + +// virtual +LLBakingAvatar::~LLBakingAvatar() +{ +} + +//----------------------------------------------------------------------------- +// Implemented methods +//----------------------------------------------------------------------------- + +LLAvatarJoint* LLBakingAvatar::createAvatarJoint() +{ +	return new LLBakingJoint(); +} + +LLAvatarJoint* LLBakingAvatar::createAvatarJoint(S32 joint_num) +{ +	return new LLBakingJoint(joint_num); +} + +LLAvatarJointMesh* LLBakingAvatar::createAvatarJointMesh() +{ +	return new LLBakingJointMesh(); +} + +LLTexLayerSet* LLBakingAvatar::createTexLayerSet() +{ +	return new LLBakingTexLayerSet(this); +} + +//----------------------------------------------------------------------------- +// (Ignored) Non-implemented methods. +//----------------------------------------------------------------------------- + +void LLBakingAvatar::bodySizeChanged() {} +void LLBakingAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, +		LLAvatarAppearanceDefines::EBakedTextureIndex index) {} +void LLBakingAvatar::invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result) {} +void LLBakingAvatar::updateMeshTextures() {} +void LLBakingAvatar::dirtyMesh() {} +void LLBakingAvatar::dirtyMesh(S32 priority) {} +void LLBakingAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake) {} + +BOOL LLBakingAvatar::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const +{ +	return TRUE; +} + + +//----------------------------------------------------------------------------- +// (LLERR) Non-implemented methods. +//----------------------------------------------------------------------------- + +LLVector3 LLBakingAvatar::getCharacterPosition() +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLVector3::zero; +} + +LLQuaternion LLBakingAvatar::getCharacterRotation() +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLQuaternion::DEFAULT; +} + +LLVector3 LLBakingAvatar::getCharacterVelocity() +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLVector3::zero; +} + +LLVector3 LLBakingAvatar::getCharacterAngularVelocity() +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLVector3::zero; +} + +const LLUUID& LLBakingAvatar::getID() const +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLUUID::null; +} + +void LLBakingAvatar::addDebugText(const std::string& text) +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +} + +F32 LLBakingAvatar::getTimeDilation() +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return 0.0f; +} + +void LLBakingAvatar::getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm) +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +} + +F32 LLBakingAvatar::getPixelArea() const +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return 0.0f; +} + +LLVector3d LLBakingAvatar::getPosGlobalFromAgent(const LLVector3 &position) +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLVector3d::zero; +} + +LLVector3 LLBakingAvatar::getPosAgentFromGlobal(const LLVector3d &position) +{ +	LL_ERRS("AppearanceUtility") << "Not implemented." << LL_ENDL; +	return LLVector3::zero; +} + + + diff --git a/indra/appearance_utility/llbakingavatar.h b/indra/appearance_utility/llbakingavatar.h new file mode 100644 index 0000000000..7f20d31674 --- /dev/null +++ b/indra/appearance_utility/llbakingavatar.h @@ -0,0 +1,125 @@ +/** + * @file llbakingavatar.h + * @brief Declaration of LLBakingAvatar class which is a derivation of LLAvatarAppearance + * + * $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$ + */ + +#ifndef LL_LLBAKINGAVATAR_H +#define LL_LLBAKINGAVATAR_H + +#include "llavatarappearance.h" + +class LLBakingAvatar : public LLAvatarAppearance +{ +	LOG_CLASS(LLBakingAvatar); + +/******************************************************************************** + **                                                                            ** + **                    INITIALIZATION + **/ +public: +	void* operator new(size_t size) +	{ +		return ll_aligned_malloc_16(size); +	} + +	void operator delete(void* ptr) +	{ +		ll_aligned_free_16(ptr); +	} + +	LLBakingAvatar(LLWearableData* wearable_data); +	virtual ~LLBakingAvatar(); + +	static void initClass(); // initializes static members + +/**                    Initialization + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    INHERITED + **/ + +	//-------------------------------------------------------------------- +	// LLCharacter interface +	//-------------------------------------------------------------------- +public: +	/*virtual*/ LLVector3    	getCharacterPosition(); +	/*virtual*/ LLQuaternion 	getCharacterRotation(); +	/*virtual*/ LLVector3    	getCharacterVelocity(); +	/*virtual*/ LLVector3    	getCharacterAngularVelocity(); + +	/*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); + +	//-------------------------------------------------------------------- +	// LLAvatarAppearance interface +	//-------------------------------------------------------------------- +public: +	/*virtual*/ void	bodySizeChanged(); +	/*virtual*/ void	applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, +							LLAvatarAppearanceDefines::EBakedTextureIndex index); +	/*virtual*/ void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); +	/*virtual*/ void 	updateMeshTextures(); +	/*virtual*/ void	dirtyMesh(); // Dirty the avatar mesh +	/*virtual*/ void	onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); +	/*virtual*/ BOOL	isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; +private: +	/*virtual*/ void	dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority + +	// LLAvatarAppearance instance factories: +protected: +	/*virtual*/ LLAvatarJoint*	createAvatarJoint(); +	/*virtual*/ LLAvatarJoint*	createAvatarJoint(S32 joint_num); +	/*virtual*/ LLAvatarJointMesh*	createAvatarJointMesh(); +	/*virtual*/ LLTexLayerSet*	createTexLayerSet(); + + +/**                    Inherited + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    STATE + **/ +public: +	/*virtual*/ bool 	isSelf() const { return true; } +	/*virtual*/ BOOL	isValid() const { return TRUE; } +	/*virtual*/ BOOL	isUsingBakedTextures() const { return TRUE; } + +/**                    State + **                                                                            ** + *******************************************************************************/ + +}; + +#endif /* LL_LLBAKINGAVATAR_H */ + diff --git a/indra/appearance_utility/llbakingjoint.cpp b/indra/appearance_utility/llbakingjoint.cpp new file mode 100644 index 0000000000..96f7b686b2 --- /dev/null +++ b/indra/appearance_utility/llbakingjoint.cpp @@ -0,0 +1,54 @@ +/**  + * @file llbakingjoint.cpp + * @brief Implementation of LLBakingJoint class + * + * $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$ + */ + + +#include "linden_common.h" + +#include "llbakingjoint.h" + + +LLBakingJoint::LLBakingJoint() : +	LLAvatarJoint() +{ +} + +LLBakingJoint::LLBakingJoint(S32 joint_num) : +	LLAvatarJoint(joint_num) +{ +} + +// virtual +LLBakingJoint::~LLBakingJoint() +{ +} + +// virtual +U32 LLBakingJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy) +{ +	llerrs << "LLBakingJoint::render() should never be called!" << llendl; +	return 0; +} + diff --git a/indra/appearance_utility/llbakingjoint.h b/indra/appearance_utility/llbakingjoint.h new file mode 100644 index 0000000000..5247eb7510 --- /dev/null +++ b/indra/appearance_utility/llbakingjoint.h @@ -0,0 +1,44 @@ +/**  + * @file llbakingjoint.h + * @brief Implementation of LLBakingJoint class + * + * $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$ + */ + +#ifndef LL_LLBAKINGJOINT_H +#define LL_LLBAKINGJOINT_H + +#include "llavatarjoint.h" + +class LLBakingJoint : public virtual LLAvatarJoint +{ +public: +	LLBakingJoint(); +	LLBakingJoint(S32 joint_num); +	virtual ~LLBakingJoint(); + +	// LLViewerJoint interface +	virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ); +}; + +#endif /* LL_LLBAKINGJOINT_H */ + diff --git a/indra/appearance_utility/llbakingjointmesh.cpp b/indra/appearance_utility/llbakingjointmesh.cpp new file mode 100644 index 0000000000..877317deb8 --- /dev/null +++ b/indra/appearance_utility/llbakingjointmesh.cpp @@ -0,0 +1,43 @@ +/**  + * @file llbakingjointmesh.cpp + * @brief Implementation of LLBakingJointMesh class + * + * $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$ + */ + + +#include "linden_common.h" + +#include "llbakingjointmesh.h" + + +LLBakingJointMesh::LLBakingJointMesh() : +	LLAvatarJointMesh() +{ +} + +// virtual +LLBakingJointMesh::~LLBakingJointMesh() +{ +} + + diff --git a/indra/appearance_utility/llbakingjointmesh.h b/indra/appearance_utility/llbakingjointmesh.h new file mode 100644 index 0000000000..6252f6cee3 --- /dev/null +++ b/indra/appearance_utility/llbakingjointmesh.h @@ -0,0 +1,43 @@ +/**  + * @file llbakingjoint.h + * @brief Implementation of LLBakingJointMesh class + * + * $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$ + */ + +#ifndef LL_LLBAKINGJOINTMESH_H +#define LL_LLBAKINGJOINTMESH_H + +#include "llavatarjointmesh.h" +#include "llbakingjoint.h" + +class LLBakingJointMesh : public LLAvatarJointMesh, public LLBakingJoint +{ +public: +	LLBakingJointMesh(); +	LLBakingJointMesh(S32 joint_num); +	virtual ~LLBakingJointMesh(); + +}; + +#endif /* LL_LLBAKINGJOINTMESH_H */ + diff --git a/indra/appearance_utility/llbakingprocess.h b/indra/appearance_utility/llbakingprocess.h new file mode 100644 index 0000000000..a32eae6443 --- /dev/null +++ b/indra/appearance_utility/llbakingprocess.h @@ -0,0 +1,55 @@ +/**  + * @file llbakingprocess.h + * @brief Declaration of LLBakingProcess interface. + * + * $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$ + */ + +#ifndef LL_LLBAKINGPROCESS_H +#define LL_LLBAKINGPROCESS_H + +#include <ostream> + +class LLAppAppearanceUtility; +class LLSD; + +// Simple wrapper for various process modes. +class LLBakingProcess +{ +private: +	// Hide default constructor. +	LLBakingProcess() {} +public: +	LLBakingProcess(LLAppAppearanceUtility* app) : +		mApp(app) {} +	virtual ~LLBakingProcess() {} + +	//virtual std::string getProcessName() const = 0; +	virtual void process(LLSD& input, std::ostream& output) = 0; + +protected: +	LLAppAppearanceUtility* mApp; +}; + + +#endif /* LL_LLBAKINGPROCESS_H */ + diff --git a/indra/appearance_utility/llbakingshadermgr.cpp b/indra/appearance_utility/llbakingshadermgr.cpp new file mode 100644 index 0000000000..a858fc760f --- /dev/null +++ b/indra/appearance_utility/llbakingshadermgr.cpp @@ -0,0 +1,226 @@ + +/**  + * @file LLBakingShaderMgr.cpp + * @brief Viewer shader manager implementation. + * + * $LicenseInfo:firstyear=2005&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 "linden_common.h" + +#include "llbakingshadermgr.h" + +#include "lldir.h" +#include "llfile.h" +#include "llrender.h" +#include "llvertexbuffer.h" + +#if LL_DARWIN +#include "OpenGL/OpenGL.h" +#endif + +#ifdef LL_RELEASE_FOR_DOWNLOAD +#define UNIFORM_ERRS LL_WARNS_ONCE("Shader") +#else +#define UNIFORM_ERRS LL_ERRS("Shader") +#endif + +// Lots of STL stuff in here, using namespace std to keep things more readable +using std::vector; +using std::pair; +using std::make_pair; +using std::string; + +BOOL				LLBakingShaderMgr::sInitialized = FALSE; +bool				LLBakingShaderMgr::sSkipReload = false; + +//utility shaders +LLGLSLShader	gAlphaMaskProgram; + + +LLBakingShaderMgr::LLBakingShaderMgr() : +	mVertexShaderLevel(SHADER_COUNT, 0), +	mMaxAvatarShaderLevel(0) +{	 +} + +LLBakingShaderMgr::~LLBakingShaderMgr() +{ +	mVertexShaderLevel.clear(); +	mShaderList.clear(); +} + +// static +LLBakingShaderMgr * LLBakingShaderMgr::instance() +{ +	if(NULL == sInstance) +	{ +		sInstance = new LLBakingShaderMgr(); +	} + +	return static_cast<LLBakingShaderMgr*>(sInstance); +} + +void LLBakingShaderMgr::initAttribsAndUniforms(void) +{ +	if (mReservedAttribs.empty()) +	{ +		LLShaderMgr::initAttribsAndUniforms(); +	}	 +} +	 + +//============================================================================ +// Set Levels + +S32 LLBakingShaderMgr::getVertexShaderLevel(S32 type) +{ +	return mVertexShaderLevel[type]; +} + +//============================================================================ +// Shader Management + +void LLBakingShaderMgr::setShaders() +{ +	//setShaders might be called redundantly by gSavedSettings, so return on reentrance +	static bool reentrance = false; +	 +	if (!sInitialized || reentrance || sSkipReload) +	{ +		return; +	} + +	LLGLSLShader::sIndexedTextureChannels = llmax(gGLManager.mNumTextureImageUnits, 1); + +	//NEVER use more than 16 texture channels (work around for prevalent driver bug) +	LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16); + +	if (gGLManager.mGLSLVersionMajor < 1 || +		(gGLManager.mGLSLVersionMajor == 1 && gGLManager.mGLSLVersionMinor <= 20)) +	{ //NEVER use indexed texture rendering when GLSL version is 1.20 or earlier +		LLGLSLShader::sIndexedTextureChannels = 1; +	} + +	reentrance = true; + +	//setup preprocessor definitions +	LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits); +	 +	// Make sure the compiled shader map is cleared before we recompile shaders. +	mShaderObjects.clear(); +	 +	initAttribsAndUniforms(); + +	// Shaders +	LL_INFOS("ShaderLoading") << "\n~~~~~~~~~~~~~~~~~~\n Loading Shaders:\n~~~~~~~~~~~~~~~~~~" << LL_ENDL; +	LL_INFOS("ShaderLoading") << llformat("Using GLSL %d.%d", gGLManager.mGLSLVersionMajor, gGLManager.mGLSLVersionMinor) << llendl; + +	for (S32 i = 0; i < SHADER_COUNT; i++) +	{ +		mVertexShaderLevel[i] = 0; +	} +	mMaxAvatarShaderLevel = 0; + +	LLGLSLShader::sNoFixedFunction = false; +	LLVertexBuffer::unbind(); +	if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 10) +	{ +		//using shaders, disable fixed function +		LLGLSLShader::sNoFixedFunction = true; + +		//gPipeline.mVertexShadersEnabled = TRUE; +		//gPipeline.mVertexShadersLoaded = 1; + +		loadShadersInterface(); +	} +	else +	{ +		LLGLSLShader::sNoFixedFunction = false; +		//gPipeline.mVertexShadersEnabled = FALSE; +		//gPipeline.mVertexShadersLoaded = 0; +		mVertexShaderLevel[SHADER_LIGHTING] = 0; +		mVertexShaderLevel[SHADER_INTERFACE] = 0; +		mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; +		mVertexShaderLevel[SHADER_WATER] = 0; +		mVertexShaderLevel[SHADER_OBJECT] = 0; +		mVertexShaderLevel[SHADER_EFFECT] = 0; +		mVertexShaderLevel[SHADER_WINDLIGHT] = 0; +		mVertexShaderLevel[SHADER_AVATAR] = 0; +	} +	 +	//gPipeline.createGLBuffers(); + +	reentrance = false; +} + +void LLBakingShaderMgr::unloadShaders() +{ +	gAlphaMaskProgram.unload(); + +	mVertexShaderLevel[SHADER_INTERFACE] = 0; + +	//gPipeline.mVertexShadersLoaded = 0; +} + +BOOL LLBakingShaderMgr::loadShadersInterface() +{ +	BOOL success = TRUE; + +	if (success) +	{ +		gAlphaMaskProgram.mName = "Alpha Mask Shader"; +		gAlphaMaskProgram.mShaderFiles.clear(); +		gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER_ARB)); +		gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if( !success ) +	{ +		mVertexShaderLevel[SHADER_INTERFACE] = 0; +		return FALSE; +	} +	 +	return TRUE; +} + +std::string LLBakingShaderMgr::getShaderDirPrefix(void) +{ +	return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); +} + +void LLBakingShaderMgr::updateShaderUniforms(LLGLSLShader * shader) +{ +} + +LLBakingShaderMgr::shader_iter LLBakingShaderMgr::beginShaders() const +{ +	return mShaderList.begin(); +} + +LLBakingShaderMgr::shader_iter LLBakingShaderMgr::endShaders() const +{ +	return mShaderList.end(); +} diff --git a/indra/appearance_utility/llbakingshadermgr.h b/indra/appearance_utility/llbakingshadermgr.h new file mode 100644 index 0000000000..88d43ab769 --- /dev/null +++ b/indra/appearance_utility/llbakingshadermgr.h @@ -0,0 +1,137 @@ +/**  + * @file llbakingshadermgr.h + * @brief Texture Baking Shader Manager + * + * $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$ + */ + +#ifndef LL_BAKING_SHADER_MGR_H +#define LL_BAKING_SHADER_MGR_H + +#include "llshadermgr.h" + +class LLBakingShaderMgr: public LLShaderMgr +{ +public: +	static BOOL sInitialized; +	static bool sSkipReload; + +	LLBakingShaderMgr(); +	/* virtual */ ~LLBakingShaderMgr(); + +	// singleton pattern implementation +	static LLBakingShaderMgr * instance(); + +	void initAttribsAndUniforms(void); +	void setShaders(); +	void unloadShaders(); +	S32 getVertexShaderLevel(S32 type); +	BOOL loadShadersInterface(); + +	std::vector<S32> mVertexShaderLevel; +	S32	mMaxAvatarShaderLevel; + +	enum EShaderClass +	{ +		SHADER_LIGHTING, +		SHADER_OBJECT, +		SHADER_AVATAR, +		SHADER_ENVIRONMENT, +		SHADER_INTERFACE, +		SHADER_EFFECT, +		SHADER_WINDLIGHT, +		SHADER_WATER, +		SHADER_DEFERRED, +		SHADER_TRANSFORM, +		SHADER_COUNT +	}; + +	// simple model of forward iterator +	// http://www.sgi.com/tech/stl/ForwardIterator.html +	class shader_iter +	{ +	private: +		friend bool operator == (shader_iter const & a, shader_iter const & b); +		friend bool operator != (shader_iter const & a, shader_iter const & b); + +		typedef std::vector<LLGLSLShader *>::const_iterator base_iter_t; +	public: +		shader_iter() +		{ +		} + +		shader_iter(base_iter_t iter) : mIter(iter) +		{ +		} + +		LLGLSLShader & operator * () const +		{ +			return **mIter; +		} + +		LLGLSLShader * operator -> () const +		{ +			return *mIter; +		} + +		shader_iter & operator++ () +		{ +			++mIter; +			return *this; +		} + +		shader_iter operator++ (int) +		{ +			return mIter++; +		} + +	private: +		base_iter_t mIter; +	}; + +	shader_iter beginShaders() const; +	shader_iter endShaders() const; + +	/* virtual */ std::string getShaderDirPrefix(void); + +	/* virtual */ void updateShaderUniforms(LLGLSLShader * shader); + +private: +	 +	// the list of shaders we need to propagate parameters to. +	std::vector<LLGLSLShader *> mShaderList; + +}; //LLBakingShaderMgr + +inline bool operator == (LLBakingShaderMgr::shader_iter const & a, LLBakingShaderMgr::shader_iter const & b) +{ +	return a.mIter == b.mIter; +} + +inline bool operator != (LLBakingShaderMgr::shader_iter const & a, LLBakingShaderMgr::shader_iter const & b) +{ +	return a.mIter != b.mIter; +} + +extern LLVector4			gShinyOrigin; + +#endif // LL_BAKING_SHADER_MGR_H diff --git a/indra/appearance_utility/llbakingtexlayer.cpp b/indra/appearance_utility/llbakingtexlayer.cpp new file mode 100644 index 0000000000..38fbd7c557 --- /dev/null +++ b/indra/appearance_utility/llbakingtexlayer.cpp @@ -0,0 +1,51 @@ +/**  + * @file llbakingtexlayer.cpp + * @brief Implementation of LLBakingTexLayer class + * + * $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$ + */ + +#include "linden_common.h" + +#include "llbakingtexlayer.h" + +LLBakingTexLayerSet::LLBakingTexLayerSet(LLAvatarAppearance* const appearance) : +	LLTexLayerSet(appearance) +{ +} + +// virtual +LLBakingTexLayerSet::~LLBakingTexLayerSet() +{ +} + +// Ignored. +void LLBakingTexLayerSet::requestUpdate() +{ +} + +void LLBakingTexLayerSet::createComposite() +{ +	llerrs << "TODO: Create a composite." << llendl; +} + + diff --git a/indra/appearance_utility/llbakingtexlayer.h b/indra/appearance_utility/llbakingtexlayer.h new file mode 100644 index 0000000000..2ed9863d4a --- /dev/null +++ b/indra/appearance_utility/llbakingtexlayer.h @@ -0,0 +1,43 @@ +/**  + * @file llbakingtexlayer.h + * @brief Declaration of LLBakingTexLayerSet. + * + * $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$ + */ + +#ifndef LL_LLBAKINGTEXLAYER_H +#define LL_LLBAKINGTEXLAYER_H + +#include "lltexlayer.h" + +class LLBakingTexLayerSet : public LLTexLayerSet +{ +public: +	LLBakingTexLayerSet(LLAvatarAppearance* const appearance); +	virtual ~LLBakingTexLayerSet(); + +	/*virtual*/void				requestUpdate(); +	/*virtual*/void				createComposite(); +}; + +#endif /* LL_LLBAKINGTEXLAYER_H */ + diff --git a/indra/appearance_utility/llprocessparams.cpp b/indra/appearance_utility/llprocessparams.cpp new file mode 100644 index 0000000000..723bae0dd6 --- /dev/null +++ b/indra/appearance_utility/llprocessparams.cpp @@ -0,0 +1,53 @@ +/**  + * @file llprocessparams.cpp + * @brief Implementation of LLProcessParams class. + * + * $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$ + */ + +// linden includes +#include "linden_common.h" + +#include "llsd.h" +#include "llsdserialize.h" +#include "llsdutil.h" + +// appearance includes +#include "llwearabledata.h" + +// project includes +#include "llappappearanceutility.h" +#include "llbakingavatar.h" +#include "llprocessparams.h" + +void LLProcessParams::process(LLSD& input, std::ostream& output) +{ +	LLWearableData wearable_data; +	LLBakingAvatar avatar(&wearable_data); +	avatar.initInstance(); + +	LLSD result; +	result["success"] = true; +	result["input"] = input; +	output << LLSDOStreamer<LLSDXMLFormatter>(result); +} + diff --git a/indra/appearance_utility/llprocessparams.h b/indra/appearance_utility/llprocessparams.h new file mode 100644 index 0000000000..d1e64cb4f0 --- /dev/null +++ b/indra/appearance_utility/llprocessparams.h @@ -0,0 +1,42 @@ +/**  + * @file llprocessparams.h + * @brief Declaration of LLProcessParams class. + * + * $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$ + */ + +#ifndef LL_LLPROCESSPARAMS_H +#define LL_LLPROCESSPARAMS_H + +#include "llbakingprocess.h" + +class LLProcessParams : public LLBakingProcess +{ +public: +	LLProcessParams(LLAppAppearanceUtility* app) : +		LLBakingProcess(app) {} + +	/*virtual*/ void process(LLSD& intput, std::ostream& output); +}; + +#endif /* LL_LLPROCESSPARAMS_H */ + diff --git a/indra/appearance_utility/wrapper.sh b/indra/appearance_utility/wrapper.sh new file mode 100755 index 0000000000..87d2179a13 --- /dev/null +++ b/indra/appearance_utility/wrapper.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Simple wrapper for secondlife utilities. + +## - Avoids an often-buggy X feature that doesn't really benefit us anyway. +export SDL_VIDEO_X11_DGAMOUSE=0 + +## - Works around a problem with misconfigured 64-bit systems not finding GL +export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}":/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri + +## - The 'scim' GTK IM module widely crashes the viewer.  Avoid it. +if [ "$GTK_IM_MODULE" = "scim" ]; then +    export GTK_IM_MODULE=xim +fi + +EXECUTABLE="$(basename "$0")-bin" +SCRIPTSRC="$(readlink -f "$0" || echo "$0")" +RUN_PATH="$(dirname "${SCRIPTSRC}" || echo .)" +cd "${RUN_PATH}" + +export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}" + +# Run the program. +"./$EXECUTABLE" "$@" +exit $? diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 569034a6fb..5935eeb192 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -40,6 +40,7 @@ set(cmake_SOURCE_FILES      Hunspell.cmake      JPEG.cmake      LLAddBuildTest.cmake +    LLAppearance.cmake      LLAudio.cmake      LLCharacter.cmake      LLCommon.cmake diff --git a/indra/cmake/LLAppearance.cmake b/indra/cmake/LLAppearance.cmake new file mode 100644 index 0000000000..36cebe9816 --- /dev/null +++ b/indra/cmake/LLAppearance.cmake @@ -0,0 +1,7 @@ +# -*- cmake -*- + +set(LLAPPEARANCE_INCLUDE_DIRS +    ${LIBS_OPEN_DIR}/llappearance +    ) + +set(LLAPPEARANCE_LIBRARIES llappearance) diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt index 4377a6333c..c4e25f4a04 100644 --- a/indra/linux_updater/CMakeLists.txt +++ b/indra/linux_updater/CMakeLists.txt @@ -8,6 +8,7 @@ include(CARes)  include(OpenSSL)  include(UI)  include(LLCommon) +include(LLMessage)  include(LLVFS)  include(LLXML)  include(LLUI) @@ -40,6 +41,7 @@ target_link_libraries(linux-updater      ${CARES_LIBRARIES}      ${OPENSSL_LIBRARIES}      ${CRYPTO_LIBRARIES} +    ${LLMESSAGE_LIBRARIES}      ${UI_LIBRARIES}      ${LLXML_LIBRARIES}      ${LLUI_LIBRARIES} diff --git a/indra/llappearance/CMakeLists.txt b/indra/llappearance/CMakeLists.txt new file mode 100644 index 0000000000..c570f0c93b --- /dev/null +++ b/indra/llappearance/CMakeLists.txt @@ -0,0 +1,102 @@ +# -*- cmake -*- + +project(llappearance) + +include(00-Common) +include(LLCommon) +include(LLCharacter) +include(LLImage) +include(LLInventory) +include(LLMath) +include(LLMessage) +include(LLRender) +include(LLVFS) +include(LLWindow) +include(LLXML) +include(Linking) + +include_directories( +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLCHARACTER_INCLUDE_DIRS} +    ${LLIMAGE_INCLUDE_DIRS} +    ${LLINVENTORY_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLRENDER_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${LLWINDOW_INCLUDE_DIRS} +    ${LLXML_INCLUDE_DIRS} +    ) + +set(llappearance_SOURCE_FILES +    llavatarappearance.cpp +    llavatarjoint.cpp +    llavatarjointmesh.cpp +    lldriverparam.cpp +    lllocaltextureobject.cpp +    llpolyskeletaldistortion.cpp +    llpolymesh.cpp +    llpolymorph.cpp +    lltexglobalcolor.cpp +    lltexlayer.cpp +    lltexlayerparams.cpp +    lltexturemanagerbridge.cpp +    llwearable.cpp +    llwearabledata.cpp +    llwearabletype.cpp +    llviewervisualparam.cpp +    llavatarappearancedefines.cpp +    ) +     +set(llappearance_HEADER_FILES +    CMakeLists.txt + +    llavatarappearance.h +    llavatarjoint.h +    llavatarjointmesh.h +    lldriverparam.h +    lljointpickname.h +    lllocaltextureobject.h +    llpolyskeletaldistortion.h +    llpolymesh.h +    llpolymorph.h +    lltexglobalcolor.h +    lltexlayer.h +    lltexlayerparams.h +    lltexturemanagerbridge.h +    llwearable.h +    llwearabledata.h +    llwearabletype.h +    llviewervisualparam.h +    llavatarappearancedefines.h +    ) + +set_source_files_properties(${llappearance_HEADER_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND llappearance_SOURCE_FILES ${llappearance_HEADER_FILES}) + +add_library (llappearance ${llappearance_SOURCE_FILES}) + +target_link_libraries(llappearance +    ${LLCHARACTER_LIBRARIES} +    ${LLINVENTORY_LIBRARIES} +    ${LLIMAGE_LIBRARIES} +    ${LLRENDER_LIBRARIES} +    ${LLVFS_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLXML_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLCOMMON_LIBRARIES} +    ) + +#add unit tests +#if (LL_TESTS) +#    INCLUDE(LLAddBuildTest) +#    SET(llappearance_TEST_SOURCE_FILES +#      # no real unit tests yet! +#      ) +#    LL_ADD_PROJECT_UNIT_TESTS(llappearance "${llappearance_TEST_SOURCE_FILES}") + +    #set(TEST_DEBUG on) +#    set(test_libs llappearance ${LLCOMMON_LIBRARIES}) +#endif (LL_TESTS) diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp new file mode 100644 index 0000000000..8677a1daff --- /dev/null +++ b/indra/llappearance/llavatarappearance.cpp @@ -0,0 +1,1933 @@ +/**  + * @File llavatarappearance.cpp + * @brief Implementation of LLAvatarAppearance class + * + * $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 LL_MSVC +// disable warning about boost::lexical_cast returning uninitialized data +// when it fails to parse the string +#pragma warning (disable:4701) +#endif + +#include "linden_common.h" + +#include "llavatarappearance.h" +#include "llavatarappearancedefines.h" +#include "llavatarjointmesh.h" +#include "imageids.h" +#include "lldir.h" +#include "lldeleteutils.h" +#include "llpolymorph.h" +#include "llpolymesh.h" +#include "llpolyskeletaldistortion.h" +#include "llstl.h" +#include "lltexglobalcolor.h" +#include "llwearabledata.h" + + +#if LL_MSVC +// disable boost::lexical_cast warning +#pragma warning (disable:4702) +#endif + +#include <boost/lexical_cast.hpp> + +using namespace LLAvatarAppearanceDefines; + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const std::string AVATAR_DEFAULT_CHAR = "avatar"; +const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0); + +/********************************************************************************* + **                                                                             ** + ** Begin private LLAvatarAppearance Support classes + ** + **/ + +//------------------------------------------------------------------------ +// LLAvatarBoneInfo +// Trans/Scale/Rot etc. info about each avatar bone.  Used by LLVOAvatarSkeleton. +//------------------------------------------------------------------------ +class LLAvatarBoneInfo +{ +	friend class LLAvatarAppearance; +	friend class LLAvatarSkeletonInfo; +public: +	LLAvatarBoneInfo() : mIsJoint(FALSE) {} +	~LLAvatarBoneInfo() +	{ +		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<LLAvatarBoneInfo*> child_list_t; +	child_list_t mChildList; +}; + +//------------------------------------------------------------------------ +// LLAvatarSkeletonInfo +// Overall avatar skeleton +//------------------------------------------------------------------------ +class LLAvatarSkeletonInfo +{ +	friend class LLAvatarAppearance; +public: +	LLAvatarSkeletonInfo() : +		mNumBones(0), mNumCollisionVolumes(0) {} +	~LLAvatarSkeletonInfo() +	{ +		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<LLAvatarBoneInfo*> bone_info_list_t; +	bone_info_list_t mBoneInfoList; +}; + +//----------------------------------------------------------------------------- +// LLAvatarXmlInfo +//----------------------------------------------------------------------------- + +LLAvatarAppearance::LLAvatarXmlInfo::LLAvatarXmlInfo() +	: mTexSkinColorInfo(0), mTexHairColorInfo(0), mTexEyeColorInfo(0) +{ +} + +LLAvatarAppearance::LLAvatarXmlInfo::~LLAvatarXmlInfo() +{ +	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()); +} + + +/** + ** + ** End LLAvatarAppearance Support classes + **                                                                             ** + *********************************************************************************/ + +//----------------------------------------------------------------------------- +// Static Data +//----------------------------------------------------------------------------- +LLXmlTree LLAvatarAppearance::sXMLTree; +LLXmlTree LLAvatarAppearance::sSkeletonXMLTree; +LLAvatarSkeletonInfo* LLAvatarAppearance::sAvatarSkeletonInfo = NULL; +LLAvatarAppearance::LLAvatarXmlInfo* LLAvatarAppearance::sAvatarXmlInfo = NULL; + + +LLAvatarAppearance::LLAvatarAppearance(LLWearableData* wearable_data) : +	LLCharacter(), +	mIsDummy(FALSE), +	mTexSkinColor( NULL ), +	mTexHairColor( NULL ), +	mTexEyeColor( NULL ), +	mPelvisToFoot(0.f), +	mHeadOffset(), +	mRoot(NULL), +	mWearableData(wearable_data) +{ +	LLMemType mt(LLMemType::MTYPE_AVATAR); + +	llassert_always(mWearableData); +	mBakedTextureDatas.resize(LLAvatarAppearanceDefines::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 = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((LLAvatarAppearanceDefines::EBakedTextureIndex)i); +	} + +	mIsBuilt = FALSE; + +	mNumCollisionVolumes = 0; +	mCollisionVolumes = NULL; +} + +// virtual +void LLAvatarAppearance::initInstance() +{ +	//------------------------------------------------------------------------- +	// initialize joint, mesh and shape members +	//------------------------------------------------------------------------- +	mRoot = createAvatarJoint(); +	mRoot->setName( "mRoot" ); + +	for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +		 ++iter) +	{ +		const EMeshIndex mesh_index = iter->first; +		const LLAvatarAppearanceDictionary::MeshEntry *mesh_dict = iter->second; +		LLAvatarJoint* joint = createAvatarJoint(); +		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++) +		{ +			LLAvatarJointMesh* mesh = createAvatarJointMesh(); +			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 (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); +		 iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +		 ++iter) +	{ +		const EMeshIndex mesh_index = iter->first; +		const LLAvatarAppearanceDictionary::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 (avatar_joint_mesh_list_t::iterator iter = mMeshLOD[mesh_index]->mMeshParts.begin(); +			 iter != mMeshLOD[mesh_index]->mMeshParts.end();  +			 ++iter) +		{ +			LLAvatarJointMesh* mesh = (*iter); +			mBakedTextureDatas[(int)baked_texture_index].mJointMeshes.push_back(mesh); +		} +	} + +	buildCharacter(); + +} + +// virtual +LLAvatarAppearance::~LLAvatarAppearance() +{ +	deleteAndClear(mTexSkinColor); +	deleteAndClear(mTexHairColor); +	deleteAndClear(mTexEyeColor); + +	for (U32 i = 0; i < mBakedTextureDatas.size(); i++) +	{ +		deleteAndClear(mBakedTextureDatas[i].mTexLayerSet); +		mBakedTextureDatas[i].mJointMeshes.clear(); + +		for (morph_list_t::iterator iter2 = mBakedTextureDatas[i].mMaskedMorphs.begin(); +			 iter2 != mBakedTextureDatas[i].mMaskedMorphs.end(); iter2++) +		{ +			LLMaskedMorph* masked_morph = (*iter2); +			delete masked_morph; +		} +	} + +	if (mRoot) mRoot->removeAllChildren(); +	mJointMap.clear(); + +	clearSkeleton(); +	deleteAndClearArray(mCollisionVolumes); + +	deleteAndClear(mTexSkinColor); +	deleteAndClear(mTexHairColor); +	deleteAndClear(mTexEyeColor); + +	std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer()); +	mPolyMeshes.clear(); + +	for (avatar_joint_list_t::iterator jointIter = mMeshLOD.begin(); +		 jointIter != mMeshLOD.end();  +		 ++jointIter) +	{ +		LLAvatarJoint* joint = *jointIter; +		std::for_each(joint->mMeshParts.begin(), joint->mMeshParts.end(), DeletePointer()); +		joint->mMeshParts.clear(); +	} +	std::for_each(mMeshLOD.begin(), mMeshLOD.end(), DeletePointer()); +	mMeshLOD.clear(); +} + +//static +void LLAvatarAppearance::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 LLAvatarSkeletonInfo; +	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 LLAvatarXmlInfo; +	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; +	} +} + +void LLAvatarAppearance::cleanupClass() +{ +	deleteAndClear(sAvatarXmlInfo); +	// *TODO: What about sAvatarSkeletonInfo ??? +	sSkeletonXMLTree.cleanup(); +	sXMLTree.cleanup(); +} + +using namespace LLAvatarAppearanceDefines; + +//------------------------------------------------------------------------ +// The viewer can only suggest a good size for the agent, +// the simulator will keep it inside a reasonable range. +void LLAvatarAppearance::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; +		bodySizeChanged(); +	} +} + +//----------------------------------------------------------------------------- +// parseSkeletonFile() +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::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 LLAvatarAppearance::setupBone(const LLAvatarBoneInfo* info, LLJoint* parent, S32 &volume_num, S32 &joint_num) +{ +	LLMemType mt(LLMemType::MTYPE_AVATAR); +	 +	LLJoint* joint = NULL; + +	if (info->mIsJoint) +	{ +		joint = 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 = (&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 +	LLAvatarBoneInfo::child_list_t::const_iterator iter; +	for (iter = info->mChildList.begin(); iter != info->mChildList.end(); ++iter) +	{ +		LLAvatarBoneInfo *child_info = *iter; +		if (!setupBone(child_info, joint, volume_num, joint_num)) +		{ +			return FALSE; +		} +	} + +	return TRUE; +} + +//----------------------------------------------------------------------------- +// allocateCharacterJoints() +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::allocateCharacterJoints( U32 num ) +{ +	clearSkeleton(); + +	for(S32 joint_num = 0; joint_num < (S32)num; joint_num++) +	{ +		mSkeleton.push_back(createAvatarJoint(joint_num)); +	} + +	return TRUE; +} + + +//----------------------------------------------------------------------------- +// buildSkeleton() +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::buildSkeleton(const LLAvatarSkeletonInfo *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; +	LLAvatarSkeletonInfo::bone_info_list_t::const_iterator iter; +	for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); ++iter) +	{ +		LLAvatarBoneInfo *info = *iter; +		if (!setupBone(info, NULL, current_volume_num, current_joint_num)) +		{ +			llerrs << "Error parsing bone in skeleton file" << llendl; +			return FALSE; +		} +	} + +	return TRUE; +} + +//----------------------------------------------------------------------------- +// clearSkeleton() +//----------------------------------------------------------------------------- +void LLAvatarAppearance::clearSkeleton() +{ +	std::for_each(mSkeleton.begin(), mSkeleton.end(), DeletePointer()); +	mSkeleton.clear(); +} + +//----------------------------------------------------------------------------- +// LLAvatarAppearance::buildCharacter() +// Deferred initialization and rebuild of the avatar. +//----------------------------------------------------------------------------- +void LLAvatarAppearance::buildCharacter() +{ +	LLMemType mt(LLMemType::MTYPE_AVATAR); +	 +	//------------------------------------------------------------------------- +	// remove all references to our existing skeleton +	// so we can rebuild it +	//------------------------------------------------------------------------- +	flushAllMotions(); + +	//------------------------------------------------------------------------- +	// remove all of mRoot's children +	//------------------------------------------------------------------------- +	mRoot->removeAllChildren(); +	mJointMap.clear(); +	mIsBuilt = FALSE; + +	//------------------------------------------------------------------------- +	// clear mesh data +	//------------------------------------------------------------------------- +	for (avatar_joint_list_t::iterator jointIter = mMeshLOD.begin(); +		 jointIter != mMeshLOD.end(); ++jointIter) +	{ +		LLAvatarJoint* joint = *jointIter; +		for (avatar_joint_mesh_list_t::iterator meshIter = joint->mMeshParts.begin(); +			 meshIter != joint->mMeshParts.end(); ++meshIter) +		{ +			LLAvatarJointMesh * mesh = *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		= mRoot->findJoint("mPelvis"); +	mTorsop			= mRoot->findJoint("mTorso"); +	mChestp			= mRoot->findJoint("mChest"); +	mNeckp			= mRoot->findJoint("mNeck"); +	mHeadp			= mRoot->findJoint("mHead"); +	mSkullp			= mRoot->findJoint("mSkull"); +	mHipLeftp		= mRoot->findJoint("mHipLeft"); +	mHipRightp		= mRoot->findJoint("mHipRight"); +	mKneeLeftp		= mRoot->findJoint("mKneeLeft"); +	mKneeRightp		= mRoot->findJoint("mKneeRight"); +	mAnkleLeftp		= mRoot->findJoint("mAnkleLeft"); +	mAnkleRightp	= mRoot->findJoint("mAnkleRight"); +	mFootLeftp		= mRoot->findJoint("mFootLeft"); +	mFootRightp		= mRoot->findJoint("mFootRight"); +	mWristLeftp		= mRoot->findJoint("mWristLeft"); +	mWristRightp	= mRoot->findJoint("mWristRight"); +	mEyeLeftp		= mRoot->findJoint("mEyeLeft"); +	mEyeRightp		= 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) ); + +	mIsBuilt = TRUE; +	stop_glerror(); + +} + +BOOL LLAvatarAppearance::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 (LLAvatarXmlInfo::morph_info_list_t::iterator iter = sAvatarXmlInfo->mMorphMaskInfoList.begin(); +		 iter != sAvatarXmlInfo->mMorphMaskInfoList.end(); +		 ++iter) +	{ +		LLAvatarXmlInfo::LLAvatarMorphInfo *info = *iter; + +		EBakedTextureIndex baked = LLAvatarAppearanceDictionary::findBakedByRegionName(info->mRegion);  +		if (baked != BAKED_NUM_INDICES) +		{ +			LLVisualParam* morph_param; +			const std::string *name = &info->mName; +			morph_param = 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 (LLAvatarXmlInfo::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*(LLAvatarAppearance::*avatar_function)(S32)const = &LLAvatarAppearance::getVisualParam;  +			if( !driver_param->linkDrivenParams(boost::bind(avatar_function,(LLAvatarAppearance*)this,_1 ), false)) +			{ +				llwarns << "could not link driven params for avatar " << getID().asString() << " param 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 +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::loadSkeletonNode () +{ +	mRoot->addChild( mSkeleton[0] ); + +	// make meshes children before calling parent version of the function +	for (avatar_joint_list_t::iterator iter = mMeshLOD.begin(); +		 iter != mMeshLOD.end();  +		 ++iter) +	{ +		LLAvatarJoint *joint = *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]); + +	LLAvatarJoint *skull = (LLAvatarJoint*)mRoot->findJoint("mSkull"); +	if (skull) +	{ +		skull->addChild(mMeshLOD[MESH_ID_HAIR] ); +	} + +	LLAvatarJoint *eyeL = (LLAvatarJoint*)mRoot->findJoint("mEyeLeft"); +	if (eyeL) +	{ +		eyeL->addChild( mMeshLOD[MESH_ID_EYEBALL_LEFT] ); +	} + +	LLAvatarJoint *eyeR = (LLAvatarJoint*)mRoot->findJoint("mEyeRight"); +	if (eyeR) +	{ +		eyeR->addChild( mMeshLOD[MESH_ID_EYEBALL_RIGHT] ); +	} + +	// SKELETAL DISTORTIONS +	{ +		LLAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter; +		for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin(); +			 iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end();  +			 ++iter) +		{ +			LLPolySkeletalDistortionInfo *info = (LLPolySkeletalDistortionInfo*)*iter; +			LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this); +			if (!param->setInfo(info)) +			{ +				delete param; +				return FALSE; +			} +			else +			{ +				addVisualParam(param); +			}				 +		} +	} + + +	return TRUE; +} + +//----------------------------------------------------------------------------- +// loadMeshNodes(): loads <mesh> nodes from XML tree +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::loadMeshNodes() +{ +	for (LLAvatarXmlInfo::mesh_info_list_t::const_iterator meshinfo_iter = sAvatarXmlInfo->mMeshInfoList.begin(); +		 meshinfo_iter != sAvatarXmlInfo->mMeshInfoList.end();  +		 ++meshinfo_iter) +	{ +		const LLAvatarXmlInfo::LLAvatarMeshInfo *info = *meshinfo_iter; +		const std::string &type = info->mType; +		S32 lod = info->mLOD; + +		LLAvatarJointMesh* mesh = NULL; +		U8 mesh_id = 0; +		BOOL found_mesh_id = FALSE; + +		/* if (type == "hairMesh") +			switch(lod) +			  case 0: +				mesh = &mHairMesh0; */ +		for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator mesh_iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); +			 mesh_iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +			 ++mesh_iter) +		{ +			const EMeshIndex mesh_index = mesh_iter->first; +			const LLAvatarAppearanceDictionary::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( LLColor4::white ); + +		LLPolyMesh *poly_mesh = NULL; + +		if (!info->mReferenceMeshName.empty()) +		{ +			polymesh_map_t::const_iterator polymesh_iter = mPolyMeshes.find(info->mReferenceMeshName); +			if (polymesh_iter != mPolyMeshes.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 +		mPolyMeshes.insert(std::make_pair(info->mMeshFileName, poly_mesh)); +	 +		mesh->setMesh( poly_mesh ); +		mesh->setLOD( info->mMinPixelArea ); + +		for (LLAvatarXmlInfo::LLAvatarMeshInfo::morph_info_list_t::const_iterator xmlinfo_iter = info->mPolyMorphTargetInfoList.begin(); +			 xmlinfo_iter != info->mPolyMorphTargetInfoList.end();  +			 ++xmlinfo_iter) +		{ +			const LLAvatarXmlInfo::LLAvatarMeshInfo::morph_info_pair_t *info_pair = &(*xmlinfo_iter); +			LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh()); +			if (!param->setInfo((LLPolyMorphTargetInfo*)info_pair->first)) +			{ +				delete param; +				return FALSE; +			} +			else +			{ +				if (info_pair->second) +				{ +					addSharedVisualParam(param); +				} +				else +				{ +					addVisualParam(param); +				} +			}				 +		} +	} + +	return TRUE; +} + +//----------------------------------------------------------------------------- +// loadLayerSets() +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::loadLayersets() +{ +	BOOL success = TRUE; +	for (LLAvatarXmlInfo::layer_info_list_t::const_iterator layerset_iter = sAvatarXmlInfo->mLayerInfoList.begin(); +		 layerset_iter != sAvatarXmlInfo->mLayerInfoList.end();  +		 ++layerset_iter) +	{ +		LLTexLayerSetInfo *layerset_info = *layerset_iter; +		if (isSelf()) +		{ +			// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such. +			LLTexLayerSet* layer_set = createTexLayerSet(); +			 +			if (!layer_set->setInfo(layerset_info)) +			{ +				stop_glerror(); +				delete layer_set; +				llwarns << "avatar file: layer_set->setInfo() failed" << llendl; +				return FALSE; +			} + +			// scan baked textures and associate the layerset with the appropriate one +			EBakedTextureIndex baked_index = BAKED_NUM_INDICES; +			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +				 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +				 ++baked_iter) +			{ +				const LLAvatarAppearanceDictionary::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 (LLAvatarAppearance::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; +				} +			} +		} +		else // !isSelf() +		{ +			// 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; +} + +//----------------------------------------------------------------------------- +// getCharacterJoint() +//----------------------------------------------------------------------------- +LLJoint *LLAvatarAppearance::getCharacterJoint( U32 num ) +{ +	if ((S32)num >= mSkeleton.size() +	    || (S32)num < 0) +	{ +		return NULL; +	} +	return mSkeleton[num]; +} + + +//----------------------------------------------------------------------------- +// getVolumePos() +//----------------------------------------------------------------------------- +LLVector3 LLAvatarAppearance::getVolumePos(S32 joint_index, LLVector3& volume_offset) +{ +	if (joint_index > mNumCollisionVolumes) +	{ +		return LLVector3::zero; +	} + +	return mCollisionVolumes[joint_index].getVolumePos(volume_offset); +} + +//----------------------------------------------------------------------------- +// findCollisionVolume() +//----------------------------------------------------------------------------- +LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id) +{ +	if ((S32)volume_id > mNumCollisionVolumes) +	{ +		return NULL; +	} +	 +	return &mCollisionVolumes[volume_id]; +} + +//----------------------------------------------------------------------------- +// findCollisionVolume() +//----------------------------------------------------------------------------- +S32 LLAvatarAppearance::getCollisionVolumeID(std::string &name) +{ +	for (S32 i = 0; i < mNumCollisionVolumes; i++) +	{ +		if (mCollisionVolumes[i].getName() == name) +		{ +			return i; +		} +	} + +	return -1; +} + +//----------------------------------------------------------------------------- +// LLAvatarAppearance::getHeadMesh() +//----------------------------------------------------------------------------- +LLPolyMesh*	LLAvatarAppearance::getHeadMesh() +{ +	return mMeshLOD[MESH_ID_HEAD]->mMeshParts[0]->getMesh(); +} + + +//----------------------------------------------------------------------------- +// LLAvatarAppearance::getUpperBodyMesh() +//----------------------------------------------------------------------------- +LLPolyMesh*	LLAvatarAppearance::getUpperBodyMesh() +{ +	return mMeshLOD[MESH_ID_UPPER_BODY]->mMeshParts[0]->getMesh(); +} + + + +// virtual +BOOL LLAvatarAppearance::isValid() const +{ +	// This should only be called on ourself. +	if (!isSelf()) +	{ +		llerrs << "Called LLAvatarAppearance::isValid() on when isSelf() == false" << llendl; +	} +	return TRUE; +} + + +// adds a morph mask to the appropriate baked texture structure +void LLAvatarAppearance::addMaskedMorph(EBakedTextureIndex index, LLVisualParam* morph_target, BOOL invert, std::string layer) +{ +	if (index < BAKED_NUM_INDICES) +	{ +		LLMaskedMorph *morph = new LLMaskedMorph(morph_target, invert, layer); +		mBakedTextureDatas[index].mMaskedMorphs.push_front(morph); +	} +} + + +//static +BOOL LLAvatarAppearance::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 LLAvatarAppearance::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 LLAvatarAppearance::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 LLAvatarAppearance::getDummyColor() +{ +	return DUMMY_COLOR; +} + +LLColor4 LLAvatarAppearance::getGlobalColor( const std::string& color_name ) const +{ +	if (color_name=="skin_color" && mTexSkinColor) +	{ +		return mTexSkinColor->getColor(); +	} +	else if(color_name=="hair_color" && mTexHairColor) +	{ +		return mTexHairColor->getColor(); +	} +	if(color_name=="eye_color" && mTexEyeColor) +	{ +		return mTexEyeColor->getColor(); +	} +	else +	{ +//		return LLColor4( .5f, .5f, .5f, .5f ); +		return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color +	} +} + +// Unlike most wearable functions, this works for both self and other. +// virtual +BOOL LLAvatarAppearance::isWearingWearableType(LLWearableType::EType type) const +{ +	return mWearableData->getWearableCount(type) > 0; +} + +LLTexLayerSet* LLAvatarAppearance::getAvatarLayerSet(EBakedTextureIndex baked_index) const +{ +	/* switch(index) +		case TEX_HEAD_BAKED: +		case TEX_HEAD_BODYPAINT: +			return mHeadLayerSet; */ +	return mBakedTextureDatas[baked_index].mTexLayerSet; +} + +//----------------------------------------------------------------------------- +// allocateCollisionVolumes() +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num ) +{ +	deleteAndClearArray(mCollisionVolumes); +	mNumCollisionVolumes = 0; + +	mCollisionVolumes = new LLAvatarJointCollisionVolume[num]; +	if (!mCollisionVolumes) +	{ +		return FALSE; +	} + +	mNumCollisionVolumes = num; +	return TRUE; +} + +//----------------------------------------------------------------------------- +// LLAvatarBoneInfo::parseXml() +//----------------------------------------------------------------------------- +BOOL LLAvatarBoneInfo::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() ) +	{ +		LLAvatarBoneInfo *child_info = new LLAvatarBoneInfo; +		if (!child_info->parseXml(child)) +		{ +			delete child_info; +			return FALSE; +		} +		mChildList.push_back(child_info); +	} +	return TRUE; +} + +//----------------------------------------------------------------------------- +// LLAvatarSkeletonInfo::parseXml() +//----------------------------------------------------------------------------- +BOOL LLAvatarSkeletonInfo::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() ) +	{ +		LLAvatarBoneInfo *info = new LLAvatarBoneInfo; +		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 LLAvatarAppearance::LLAvatarXmlInfo::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()) +	{ +		LLAvatarAttachmentInfo* info = new LLAvatarAttachmentInfo(); + +		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 LLAvatarAppearance::LLAvatarXmlInfo::parseXmlMeshNodes(LLXmlTreeNode* root) +{ +	for (LLXmlTreeNode* node = root->getChildByName( "mesh" ); +		 node; +		 node = root->getNextNamedChild()) +	{ +		LLAvatarMeshInfo *info = new LLAvatarMeshInfo; + +		// 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(LLAvatarMeshInfo::morph_info_pair_t(morphinfo, shared)); +		} + +		mMeshInfoList.push_back(info); +	} +	return TRUE; +} + +//----------------------------------------------------------------------------- +// parseXmlColorNodes(): parses <global_color> nodes from XML tree +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::LLAvatarXmlInfo::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 LLAvatarAppearance::LLAvatarXmlInfo::parseXmlLayerNodes(LLXmlTreeNode* root) +{ +	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; +		} +	} +	return TRUE; +} + +//----------------------------------------------------------------------------- +// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::LLAvatarXmlInfo::parseXmlDriverNodes(LLXmlTreeNode* root) +{ +	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; +} + +//----------------------------------------------------------------------------- +// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree +//----------------------------------------------------------------------------- +BOOL LLAvatarAppearance::LLAvatarXmlInfo::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()) +	{ +		LLAvatarMorphInfo* info = new LLAvatarMorphInfo(); + +		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  +LLAvatarAppearance::LLMaskedMorph::LLMaskedMorph(LLVisualParam *morph_target, BOOL invert, std::string layer) : +			mMorphTarget(morph_target),  +			mInvert(invert), +			mLayer(layer) +{ +	LLPolyMorphTarget *target = dynamic_cast<LLPolyMorphTarget*>(morph_target); +	if (target) +	{ +		target->addPendingMorphMask(); +	} +} + + + diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h new file mode 100644 index 0000000000..5726ff62d1 --- /dev/null +++ b/indra/llappearance/llavatarappearance.h @@ -0,0 +1,442 @@ +/** + * @file llavatarappearance.h + * @brief Declaration of LLAvatarAppearance class + * + * $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_AVATAR_APPEARANCE_H +#define LL_AVATAR_APPEARANCE_H + +#include "llcharacter.h" +#include "llavatarappearancedefines.h" +#include "llavatarjointmesh.h" +#include "lldriverparam.h" +#include "lltexlayer.h" +#include "llviewervisualparam.h" +#include "llxmltree.h" + +class LLTexLayerSet; +class LLTexGlobalColor; +class LLWearableData; +class LLAvatarBoneInfo; +class LLAvatarSkeletonInfo; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLAvatarAppearance +//  +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLAvatarAppearance : public LLCharacter +{ +	LOG_CLASS(LLAvatarAppearance); + +protected: +	struct LLAvatarXmlInfo; + +/******************************************************************************** + **                                                                            ** + **                    INITIALIZATION + **/ +private: +	// Hide default constructor. +	LLAvatarAppearance() {} + +public: +	LLAvatarAppearance(LLWearableData* wearable_data); +	virtual ~LLAvatarAppearance(); + +	static void			initClass(); // initializes static members +	static void			cleanupClass();	// Cleanup data that's only init'd once per class. +	virtual void 		initInstance(); // Called after construction to initialize the instance. +	virtual BOOL		loadSkeletonNode(); +	BOOL				loadMeshNodes(); +	BOOL				loadLayersets(); + + +/**                    Initialization + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    INHERITED + **/ + +	//-------------------------------------------------------------------- +	// LLCharacter interface and related +	//-------------------------------------------------------------------- +public: +	/*virtual*/ LLJoint*		getCharacterJoint(U32 num); + +	/*virtual*/ const char*		getAnimationPrefix() { return "avatar"; } +	/*virtual*/ LLVector3		getVolumePos(S32 joint_index, LLVector3& volume_offset); +	/*virtual*/ LLJoint*		findCollisionVolume(U32 volume_id); +	/*virtual*/ S32				getCollisionVolumeID(std::string &name); +	/*virtual*/ LLPolyMesh*		getHeadMesh(); +	/*virtual*/ LLPolyMesh*		getUpperBodyMesh(); + +/**                    Inherited + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    STATE + **/ +public: +	virtual bool 	isSelf() const { return false; } // True if this avatar is for this viewer's agent +	virtual BOOL	isValid() const; +	virtual BOOL	isUsingBakedTextures() const = 0; + +	bool isBuilt() const { return mIsBuilt; } + +	 +/**                    State + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    SKELETON + **/ + +protected: +	virtual LLAvatarJoint*	createAvatarJoint() = 0; +	virtual LLAvatarJoint*	createAvatarJoint(S32 joint_num) = 0; +	virtual LLAvatarJointMesh*	createAvatarJointMesh() = 0; +public: +	F32					getPelvisToFoot() const { return mPelvisToFoot; } +	/*virtual*/ LLJoint*	getRootJoint() { return mRoot; } + +	LLVector3			mHeadOffset; // current head position +	LLAvatarJoint		*mRoot; + +	typedef std::map<std::string, LLJoint*> joint_map_t; +	joint_map_t			mJointMap; + +protected: +	static BOOL			parseSkeletonFile(const std::string& filename); +	virtual void		buildCharacter(); +	virtual BOOL		loadAvatar(); +	virtual void		bodySizeChanged() = 0; +	void 				computeBodySize(); + +	BOOL				setupBone(const LLAvatarBoneInfo* info, LLJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); +	BOOL				allocateCharacterJoints(U32 num); +	BOOL				buildSkeleton(const LLAvatarSkeletonInfo *info); +protected: +	void				clearSkeleton(); +	BOOL				mIsBuilt; // state of deferred character building +	typedef std::vector<LLAvatarJoint*> avatar_joint_list_t; +	avatar_joint_list_t	mSkeleton; +	 +	//-------------------------------------------------------------------- +	// Pelvis height adjustment members. +	//-------------------------------------------------------------------- +public: +	LLVector3			mBodySize; +protected: +	F32					mPelvisToFoot; + +	//-------------------------------------------------------------------- +	// Cached pointers to well known joints +	//-------------------------------------------------------------------- +public: +	LLJoint* 		mPelvisp; +	LLJoint* 		mTorsop; +	LLJoint* 		mChestp; +	LLJoint* 		mNeckp; +	LLJoint* 		mHeadp; +	LLJoint* 		mSkullp; +	LLJoint* 		mEyeLeftp; +	LLJoint* 		mEyeRightp; +	LLJoint* 		mHipLeftp; +	LLJoint* 		mHipRightp; +	LLJoint* 		mKneeLeftp; +	LLJoint* 		mKneeRightp; +	LLJoint* 		mAnkleLeftp; +	LLJoint* 		mAnkleRightp; +	LLJoint* 		mFootLeftp; +	LLJoint* 		mFootRightp; +	LLJoint* 		mWristLeftp; +	LLJoint* 		mWristRightp; + +	//-------------------------------------------------------------------- +	// XML parse tree +	//-------------------------------------------------------------------- +protected: +	static LLXmlTree 	sXMLTree; // avatar config file +	static LLXmlTree 	sSkeletonXMLTree; // avatar skeleton file + +	static LLAvatarSkeletonInfo* 					sAvatarSkeletonInfo; +	static LLAvatarXmlInfo* 						sAvatarXmlInfo; + + +/**                    Skeleton + **                                                                            ** + *******************************************************************************/ + + +/******************************************************************************** + **                                                                            ** + **                    RENDERING + **/ +public: +	BOOL		mIsDummy; // for special views + +	//-------------------------------------------------------------------- +	// Morph masks +	//-------------------------------------------------------------------- +public: +	void 	addMaskedMorph(LLAvatarAppearanceDefines::EBakedTextureIndex index, LLVisualParam* morph_target, BOOL invert, std::string layer); +	virtual void	applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES) = 0; + +/**                    Rendering + **                                                                            ** + *******************************************************************************/ + +	//-------------------------------------------------------------------- +	// Composites +	//-------------------------------------------------------------------- +public: +	virtual void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result) = 0; + +/******************************************************************************** + **                                                                            ** + **                    MESHES + **/ + +public: +	virtual void	updateMeshTextures() = 0; +	virtual void	dirtyMesh() = 0; // Dirty the avatar mesh +protected: +	virtual void	dirtyMesh(S32 priority) = 0; // Dirty the avatar mesh, with priority + +protected: +	typedef std::multimap<std::string, LLPolyMesh*> polymesh_map_t; +	polymesh_map_t 									mPolyMeshes; +	avatar_joint_list_t								mMeshLOD; + +/**                    Meshes + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    APPEARANCE + **/ + +	//-------------------------------------------------------------------- +	// Clothing colors (convenience functions to access visual parameters) +	//-------------------------------------------------------------------- +public: +	void			setClothesColor(LLAvatarAppearanceDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); +	LLColor4		getClothesColor(LLAvatarAppearanceDefines::ETextureIndex te); +	static BOOL		teToColorParams(LLAvatarAppearanceDefines::ETextureIndex te, U32 *param_name); + +	//-------------------------------------------------------------------- +	// Global colors +	//-------------------------------------------------------------------- +public: +	LLColor4		getGlobalColor(const std::string& color_name ) const; +	virtual void	onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake) = 0; +protected: +	LLTexGlobalColor* mTexSkinColor; +	LLTexGlobalColor* mTexHairColor; +	LLTexGlobalColor* mTexEyeColor; + +	//-------------------------------------------------------------------- +	// Visibility +	//-------------------------------------------------------------------- +public: +	static LLColor4 getDummyColor(); +/**                    Appearance + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    WEARABLES + **/ + +public: +	LLWearableData*			getWearableData() { return mWearableData; } +	const LLWearableData*	getWearableData() const { return mWearableData; } +	virtual BOOL isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex te, U32 index = 0 ) const = 0; +	virtual BOOL			isWearingWearableType(LLWearableType::EType type ) const; + +private: +	LLWearableData* mWearableData; + +/******************************************************************************** + **                                                                            ** + **                    BAKED TEXTURES + **/ +public: +	LLTexLayerSet*		getAvatarLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; + +protected: +	virtual LLTexLayerSet*	createTexLayerSet() = 0; + +protected: +	class LLMaskedMorph; +	typedef std::deque<LLMaskedMorph *> 	morph_list_t; +	struct BakedTextureData +	{ +		LLUUID								mLastTextureIndex; +		LLTexLayerSet*		 				mTexLayerSet; // Only exists for self +		bool								mIsLoaded; +		bool								mIsUsed; +		LLAvatarAppearanceDefines::ETextureIndex 	mTextureIndex; +		U32									mMaskTexName; +		// Stores pointers to the joint meshes that this baked texture deals with +		avatar_joint_mesh_list_t			mJointMeshes; +		morph_list_t						mMaskedMorphs; +	}; +	typedef std::vector<BakedTextureData> 	bakedtexturedata_vec_t; +	bakedtexturedata_vec_t 					mBakedTextureDatas; + +/******************************************************************************** + **                                                                            ** + **                    PHYSICS + **/ + +	//-------------------------------------------------------------------- +	// Collision volumes +	//-------------------------------------------------------------------- +public: +  	S32			mNumCollisionVolumes; +	LLAvatarJointCollisionVolume* mCollisionVolumes; +protected: +	BOOL		allocateCollisionVolumes(U32 num); + +/**                    Physics + **                                                                            ** + *******************************************************************************/ + +/******************************************************************************** + **                                                                            ** + **                    SUPPORT CLASSES + **/ + +	struct LLAvatarXmlInfo +	{ +		LLAvatarXmlInfo(); +		~LLAvatarXmlInfo(); + +		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 LLAvatarMeshInfo +		{ +			typedef std::pair<LLViewerVisualParamInfo*,BOOL> morph_info_pair_t; // LLPolyMorphTargetInfo stored here +			typedef std::vector<morph_info_pair_t> morph_info_list_t; + +			LLAvatarMeshInfo() : mLOD(0), mMinPixelArea(.1f) {} +			~LLAvatarMeshInfo() +			{ +				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<LLAvatarMeshInfo*> mesh_info_list_t; +		mesh_info_list_t mMeshInfoList; + +		typedef std::vector<LLViewerVisualParamInfo*> skeletal_distortion_info_list_t; // LLPolySkeletalDistortionInfo stored here +		skeletal_distortion_info_list_t mSkeletalDistortionInfoList; + +		struct LLAvatarAttachmentInfo +		{ +			LLAvatarAttachmentInfo() +				: 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<LLAvatarAttachmentInfo*> 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 LLAvatarMorphInfo +		{ +			LLAvatarMorphInfo() +				: mInvert(FALSE) {} +			std::string mName; +			std::string mRegion; +			std::string mLayer; +			BOOL mInvert; +		}; + +		typedef std::vector<LLAvatarMorphInfo*> morph_info_list_t; +		morph_info_list_t	mMorphMaskInfoList; +	}; + + +	class LLMaskedMorph +	{ +	public: +		LLMaskedMorph(LLVisualParam *morph_target, BOOL invert, std::string layer); + +		LLVisualParam	*mMorphTarget; +		BOOL				mInvert; +		std::string			mLayer; +	}; +/**                    Support Classes + **                                                                            ** + *******************************************************************************/ +}; + +#endif // LL_AVATAR_APPEARANCE_H diff --git a/indra/newview/llvoavatardefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp index ef96a9e923..0416309fc7 100644 --- a/indra/newview/llvoavatardefines.cpp +++ b/indra/llappearance/llavatarappearancedefines.cpp @@ -1,6 +1,6 @@  /**  - * @file llvoavatar.cpp - * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject + * @file llavatarappearancedefines.cpp + * @brief Implementation of LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary    *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code @@ -24,21 +24,20 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" -#include "llvoavatardefines.h" -#include "llviewercontrol.h" // gSavedSettings +#include "linden_common.h" +#include "llavatarappearancedefines.h" -const S32 LLVOAvatarDefines::SCRATCH_TEX_WIDTH = 512; -const S32 LLVOAvatarDefines::SCRATCH_TEX_HEIGHT = 512; -const S32 LLVOAvatarDefines::IMPOSTOR_PERIOD = 2; +const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 512; +const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 512; +const S32 LLAvatarAppearanceDefines::IMPOSTOR_PERIOD = 2; -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  /*********************************************************************************   * Edit this function to add/remove/change textures and mesh definitions for avatars.   */ -LLVOAvatarDictionary::Textures::Textures() +LLAvatarAppearanceDictionary::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)); @@ -74,7 +73,7 @@ LLVOAvatarDictionary::Textures::Textures()  	addEntry(TEX_SKIRT_BAKED,                 new TextureEntry("skirt-baked",      FALSE, BAKED_SKIRT, "skirt"));  } -LLVOAvatarDictionary::BakedTextures::BakedTextures() +LLAvatarAppearanceDictionary::BakedTextures::BakedTextures()  {  	// Baked textures  	addEntry(BAKED_HEAD,       new BakedEntry(TEX_HEAD_BAKED,   @@ -110,36 +109,36 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures()  											  2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA));  } -LLVOAvatarDictionary::Meshes::Meshes() +LLAvatarAppearanceDictionary::MeshEntries::MeshEntries()  { -	// 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)); +	// MeshEntries +	addEntry(MESH_ID_HAIR,             new MeshEntry(BAKED_HAIR,  "hairMesh",         6, PN_4)); +	addEntry(MESH_ID_HEAD,             new MeshEntry(BAKED_HEAD,  "headMesh",         5, PN_5)); +	addEntry(MESH_ID_EYELASH,          new MeshEntry(BAKED_HEAD,  "eyelashMesh",      1, PN_0)); // no baked mesh associated currently +	addEntry(MESH_ID_UPPER_BODY,       new MeshEntry(BAKED_UPPER, "upperBodyMesh",    5, PN_1)); +	addEntry(MESH_ID_LOWER_BODY,       new MeshEntry(BAKED_LOWER, "lowerBodyMesh",    5, PN_2)); +	addEntry(MESH_ID_EYEBALL_LEFT,     new MeshEntry(BAKED_EYES,  "eyeBallLeftMesh",  2, PN_3)); +	addEntry(MESH_ID_EYEBALL_RIGHT,    new MeshEntry(BAKED_EYES,  "eyeBallRightMesh", 2, PN_3)); +	addEntry(MESH_ID_SKIRT,            new MeshEntry(BAKED_SKIRT, "skirtMesh",        5, PN_5));  }  /*   *   *********************************************************************************/ -LLVOAvatarDictionary::LLVOAvatarDictionary() +LLAvatarAppearanceDictionary::LLAvatarAppearanceDictionary()  {  	createAssociations();  }  //virtual  -LLVOAvatarDictionary::~LLVOAvatarDictionary() +LLAvatarAppearanceDictionary::~LLAvatarAppearanceDictionary()  {  }  // Baked textures are composites of textures; for each such composited texture,  // map it to the baked texture. -void LLVOAvatarDictionary::createAssociations() +void LLAvatarAppearanceDictionary::createAssociations()  {  	for (BakedTextures::const_iterator iter = mBakedTextures.begin(); iter != mBakedTextures.end(); iter++)  	{ @@ -160,7 +159,7 @@ void LLVOAvatarDictionary::createAssociations()  } -LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name, +LLAvatarAppearanceDictionary::TextureEntry::TextureEntry(const std::string &name,  												 bool is_local_texture,   												 EBakedTextureIndex baked_texture_index,  												 const std::string &default_image_name, @@ -175,17 +174,17 @@ LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name,  {  } -LLVOAvatarDictionary::MeshEntry::MeshEntry(EBakedTextureIndex baked_index,  +LLAvatarAppearanceDictionary::MeshEntry::MeshEntry(EBakedTextureIndex baked_index,   										   const std::string &name,   										   U8 level, -										   LLViewerJoint::PickName pick) : +										   LLJointPickName pick) :  	LLDictionaryEntry(name),  	mBakedID(baked_index),  	mLOD(level),  	mPickName(pick)  {  } -LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,  +LLAvatarAppearanceDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,   											 const std::string &name,   											 const std::string &hash_name,  											 U32 num_local_textures, @@ -216,18 +215,18 @@ LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,  }  // static -ETextureIndex LLVOAvatarDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index) +ETextureIndex LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index)  { -	return LLVOAvatarDictionary::getInstance()->getBakedTexture(index)->mTextureIndex; +	return LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(index)->mTextureIndex;  }  //static  -EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name) +EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByRegionName(std::string name)  {  	U8 index = 0;  	while (index < BAKED_NUM_INDICES)  	{ -		const BakedEntry *be = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index); +		const BakedEntry *be = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index);  		if (be && be->mName.compare(name) == 0)  		{  			// baked texture found @@ -239,23 +238,8 @@ EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name)  	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 ) +LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIndex index )  {  	return getInstance()->getTexture(index)->mWearableType;  } diff --git a/indra/newview/llvoavatardefines.h b/indra/llappearance/llavatarappearancedefines.h index 35bb37463a..e7c94104cc 100644 --- a/indra/newview/llvoavatardefines.h +++ b/indra/llappearance/llavatarappearancedefines.h @@ -1,6 +1,6 @@  /**  - * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation fo + * @file llavatarappearancedefines.h + * @brief Various LLAvatarAppearance related definitions   * LLViewerObject   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$ @@ -25,15 +25,15 @@   * $/LicenseInfo$   */ -#ifndef LLVOAVATAR_DEFINES_H -#define LLVOAVATAR_DEFINES_H +#ifndef LL_AVATARAPPEARANCE_DEFINES_H +#define LL_AVATARAPPEARANCE_DEFINES_H  #include <vector>  #include "llwearable.h" -#include "llviewerjoint.h" +#include "lljointpickname.h"  #include "lldictionary.h" -namespace LLVOAvatarDefines +namespace LLAvatarAppearanceDefines  {  extern const S32 SCRATCH_TEX_WIDTH; @@ -111,21 +111,21 @@ typedef std::vector<EMeshIndex> mesh_vec_t;  typedef std::vector<LLWearableType::EType> wearables_vec_t;  //------------------------------------------------------------------------ -// LLVOAvatarDictionary +// LLAvatarAppearanceDictionary  //   // 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> +class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictionary>  {  	//--------------------------------------------------------------------  	// Constructors and Destructors  	//--------------------------------------------------------------------  public: -	LLVOAvatarDictionary(); -	virtual ~LLVOAvatarDictionary(); +	LLAvatarAppearanceDictionary(); +	virtual ~LLAvatarAppearanceDictionary();  private:  	void createAssociations(); @@ -166,20 +166,20 @@ public:  		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); +				  LLJointPickName 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; +		const LLJointPickName 	mPickName;  	}; -	struct Meshes : public LLDictionary<EMeshIndex, MeshEntry> +	struct MeshEntries : public LLDictionary<EMeshIndex, MeshEntry>  	{ -		Meshes(); -	} mMeshes; -	const MeshEntry*		getMesh(EMeshIndex index) const { return mMeshes.lookup(index); } -	const Meshes&			getMeshes() const { return mMeshes; } +		MeshEntries(); +	} mMeshEntries; +	const MeshEntry*		getMeshEntry(EMeshIndex index) const { return mMeshEntries.lookup(index); } +	const MeshEntries&		getMeshEntries() const { return mMeshEntries; }  	//--------------------------------------------------------------------  	// Baked Textures @@ -216,13 +216,11 @@ public:  	// 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 LLAvatarAppearanceDictionary -} // End namespace LLVOAvatarDefines +} // End namespace LLAvatarAppearanceDefines -#endif //LL_VO_AVATARDEFINES_H +#endif //LL_AVATARAPPEARANCE_DEFINES_H diff --git a/indra/llappearance/llavatarjoint.cpp b/indra/llappearance/llavatarjoint.cpp new file mode 100644 index 0000000000..eb450485c7 --- /dev/null +++ b/indra/llappearance/llavatarjoint.cpp @@ -0,0 +1,325 @@ +/**  + * @file llavatarjoint.cpp + * @brief Implementation of LLAvatarJoint 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 "llavatarjoint.h" + +#include "llgl.h" +#include "llrender.h" +#include "llmath.h" +#include "llglheaders.h" +#include "llavatarappearance.h" + +const F32 DEFAULT_AVATAR_JOINT_LOD = 0.0f; + +//----------------------------------------------------------------------------- +// Static Data +//----------------------------------------------------------------------------- +BOOL					LLAvatarJoint::sDisableLOD = FALSE; + +//----------------------------------------------------------------------------- +// LLAvatarJoint() +// Class Constructors +//----------------------------------------------------------------------------- +LLAvatarJoint::LLAvatarJoint() : +	LLJoint() +{ +	init(); +} + +LLAvatarJoint::LLAvatarJoint(const std::string &name, LLJoint *parent) : +	LLJoint(name, parent) +{ +	init(); +} + +LLAvatarJoint::LLAvatarJoint(S32 joint_num) : +	LLJoint(joint_num) +{ +	init(); +} + + +void LLAvatarJoint::init() +{ +	mValid = FALSE; +	mComponents = SC_JOINT | SC_BONE | SC_AXES; +	mMinPixelArea = DEFAULT_AVATAR_JOINT_LOD; +	mPickName = PN_DEFAULT; +	mVisible = TRUE; +	mMeshID = 0; +} + + +//----------------------------------------------------------------------------- +// ~LLAvatarJoint() +// Class Destructor +//----------------------------------------------------------------------------- +LLAvatarJoint::~LLAvatarJoint() +{ +} + + +//-------------------------------------------------------------------- +// setValid() +//-------------------------------------------------------------------- +void LLAvatarJoint::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) +		{ +			LLAvatarJoint* joint = (LLAvatarJoint*)(*iter); +			joint->setValid(valid, TRUE); +		} +	} + +} + +//-------------------------------------------------------------------- +// setSkeletonComponents() +//-------------------------------------------------------------------- +void LLAvatarJoint::setSkeletonComponents( U32 comp, BOOL recursive ) +{ +	mComponents = comp; +	if (recursive) +	{ +		for (child_list_t::iterator iter = mChildren.begin(); +			 iter != mChildren.end(); ++iter) +		{ +			LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +			joint->setSkeletonComponents(comp, recursive); +		} +	} +} + +void LLAvatarJoint::setVisible(BOOL visible, BOOL recursive) +{ +	mVisible = visible; + +	if (recursive) +	{ +		for (child_list_t::iterator iter = mChildren.begin(); +			 iter != mChildren.end(); ++iter) +		{ +			LLAvatarJoint* joint = (LLAvatarJoint*)(*iter); +			joint->setVisible(visible, recursive); +		} +	} +} + +void LLAvatarJoint::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area) +{ +	for (child_list_t::iterator iter = mChildren.begin(); +		 iter != mChildren.end(); ++iter) +	{ +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +		joint->updateFaceSizes(num_vertices, num_indices, pixel_area); +	} +} + +void LLAvatarJoint::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind, bool terse_update) +{ +	for (child_list_t::iterator iter = mChildren.begin(); +		 iter != mChildren.end(); ++iter) +	{ +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +		joint->updateFaceData(face, pixel_area, damp_wind, terse_update); +	} +} + +void LLAvatarJoint::updateJointGeometry() +{ +	for (child_list_t::iterator iter = mChildren.begin(); +		 iter != mChildren.end(); ++iter) +	{ +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +		joint->updateJointGeometry(); +	} +} + + +BOOL LLAvatarJoint::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) +	{ +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +		F32 jointLOD = joint->getLOD(); +		 +		if (found_lod || jointLOD == DEFAULT_AVATAR_JOINT_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 LLAvatarJoint::dump() +{ +	for (child_list_t::iterator iter = mChildren.begin(); +		 iter != mChildren.end(); ++iter) +	{ +		LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); +		joint->dump(); +	} +} + + +void LLAvatarJoint::setMeshesToChildren() +{ +	removeAllChildren(); +	for (avatar_joint_mesh_list_t::iterator iter = mMeshParts.begin(); +		iter != mMeshParts.end(); iter++) +	{ +		addChild((*iter)); +	} +} +//----------------------------------------------------------------------------- +// LLAvatarJointCollisionVolume() +//----------------------------------------------------------------------------- + +LLAvatarJointCollisionVolume::LLAvatarJointCollisionVolume() +{ +	mUpdateXform = FALSE; +} + +/*virtual*/ +U32 LLAvatarJointCollisionVolume::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy ) +{ +	llerrs << "Cannot call render() on LLAvatarJointCollisionVolume" << llendl; +	return 0; +} + +LLVector3 LLAvatarJointCollisionVolume::getVolumePos(LLVector3 &offset) +{ +	mUpdateXform = TRUE; +	 +	LLVector3 result = offset; +	result.scaleVec(getScale()); +	result.rotVec(getWorldRotation()); +	result += getWorldPosition(); + +	return result; +} + +void LLAvatarJointCollisionVolume::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(); +} + + +// End diff --git a/indra/llappearance/llavatarjoint.h b/indra/llappearance/llavatarjoint.h new file mode 100644 index 0000000000..1dfbd37456 --- /dev/null +++ b/indra/llappearance/llavatarjoint.h @@ -0,0 +1,139 @@ +/**  + * @file llavatarjoint.h + * @brief Implementation of LLAvatarJoint 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_LLAVATARJOINT_H +#define LL_LLAVATARJOINT_H + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "lljoint.h" +#include "lljointpickname.h" + +class LLFace; +class LLAvatarJointMesh; + +extern const F32 DEFAULT_AVATAR_JOINT_LOD; + +//----------------------------------------------------------------------------- +// class LLViewerJoint +//----------------------------------------------------------------------------- +class LLAvatarJoint : +	public LLJoint +{ +public: +	LLAvatarJoint(); +	LLAvatarJoint(S32 joint_num); +	// *TODO: Only used for LLVOAvatarSelf::mScreenp.  *DOES NOT INITIALIZE mResetAfterRestoreOldXform* +	LLAvatarJoint(const std::string &name, LLJoint *parent = NULL); +	virtual ~LLAvatarJoint(); + +	// Gets the validity of this joint +	BOOL getValid() { return mValid; } + +	// Sets the validity of this joint +	virtual void setValid( BOOL valid, BOOL recursive=FALSE ); + +	// Returns true if this object is transparent. +	// This is used to determine in which order to draw objects. +	virtual BOOL isTransparent() { return FALSE; } + +	// Returns true if this object should inherit scale modifiers from its immediate parent +	virtual BOOL inheritScale() { return FALSE; } + +	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; } + +	void setPickName(LLJointPickName name) { mPickName = name; } +	LLJointPickName getPickName() { return mPickName; } + +	void setVisible( BOOL visible, BOOL recursive ); + +	// Takes meshes in mMeshParts and sets each one as a child joint +	void setMeshesToChildren(); + +	// LLViewerJoint interface +	virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ) = 0; +	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(); +	 + +public: +	static BOOL	sDisableLOD; +	avatar_joint_mesh_list_t mMeshParts; //LLViewerJointMesh* +	void setMeshID( S32 id ) {mMeshID = id;} + +protected: +	void init(); + +	BOOL		mValid; +	U32			mComponents; +	F32			mMinPixelArea; +	LLJointPickName	mPickName; +	BOOL		mVisible; +	S32			mMeshID; +}; + +class LLAvatarJointCollisionVolume : public LLAvatarJoint +{ +public: +	LLAvatarJointCollisionVolume(); +	virtual ~LLAvatarJointCollisionVolume() {}; + +	/*virtual*/ BOOL inheritScale() { return TRUE; } +	/*virtual*/ U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ); + +	void renderCollision(); + +	LLVector3 getVolumePos(LLVector3 &offset); +}; + +#endif // LL_LLAVATARJOINT_H + + diff --git a/indra/llappearance/llavatarjointmesh.cpp b/indra/llappearance/llavatarjointmesh.cpp new file mode 100755 index 0000000000..c611ab7cec --- /dev/null +++ b/indra/llappearance/llavatarjointmesh.cpp @@ -0,0 +1,374 @@ +/**  + * @file LLAvatarJointMesh.cpp + * @brief Implementation of LLAvatarJointMesh 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 "linden_common.h" +#include "imageids.h" +#include "llfasttimer.h" +#include "llrender.h" + +#include "llavatarjointmesh.h" +#include "llavatarappearance.h" +//#include "llapr.h" +//#include "llbox.h" +//#include "lldrawable.h" +//#include "lldrawpoolavatar.h" +//#include "lldrawpoolbump.h" +//#include "lldynamictexture.h" +//#include "llface.h" +//#include "llgldbg.h" +//#include "llglheaders.h" +#include "lltexlayer.h" +//#include "llviewercamera.h" +//#include "llviewercontrol.h" +//#include "llviewertexturelist.h" +//#include "llsky.h" +//#include "pipeline.h" +//#include "llviewershadermgr.h" +#include "llmath.h" +#include "v4math.h" +#include "m3math.h" +#include "m4math.h" +#include "llmatrix4a.h" + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// LLAvatarJointMesh::LLSkinJoint +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// LLSkinJoint +//----------------------------------------------------------------------------- +LLSkinJoint::LLSkinJoint() +{ +	mJoint       = NULL; +} + +//----------------------------------------------------------------------------- +// ~LLSkinJoint +//----------------------------------------------------------------------------- +LLSkinJoint::~LLSkinJoint() +{ +	mJoint = NULL; +} + + +//----------------------------------------------------------------------------- +// LLSkinJoint::setupSkinJoint() +//----------------------------------------------------------------------------- +BOOL LLSkinJoint::setupSkinJoint( LLAvatarJoint *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 = (LLAvatarJoint*)joint->getParent(); +	} + +	mRootToJointSkinOffset = -rootSkinOffset; +	mRootToParentJointSkinOffset = mRootToJointSkinOffset; +	mRootToParentJointSkinOffset += mJoint->getSkinOffset(); + +	return TRUE; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// LLAvatarJointMesh +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + +BOOL LLAvatarJointMesh::sPipelineRender = FALSE; +EAvatarRenderPass LLAvatarJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE; +U32 LLAvatarJointMesh::sClothingMaskImageName = 0; +LLColor4 LLAvatarJointMesh::sClothingInnerColor; + +//----------------------------------------------------------------------------- +// LLAvatarJointMesh() +//----------------------------------------------------------------------------- +LLAvatarJointMesh::LLAvatarJointMesh() +	: +	mTexture( NULL ), +	mLayerSet( NULL ), +	mTestImageName( 0 ), +	mFaceIndexCount(0), +	mIsTransparent(FALSE) +{ + +	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; +} + + +//----------------------------------------------------------------------------- +// ~LLAvatarJointMesh() +// Class Destructor +//----------------------------------------------------------------------------- +LLAvatarJointMesh::~LLAvatarJointMesh() +{ +	mMesh = NULL; +	mTexture = NULL; +	freeSkinData(); +} + + +//----------------------------------------------------------------------------- +// LLAvatarJointMesh::allocateSkinData() +//----------------------------------------------------------------------------- +BOOL LLAvatarJointMesh::allocateSkinData( U32 numSkinJoints ) +{ +	mSkinJoints = new LLSkinJoint[ numSkinJoints ]; +	mNumSkinJoints = numSkinJoints; +	return TRUE; +} + +//----------------------------------------------------------------------------- +// LLAvatarJointMesh::freeSkinData() +//----------------------------------------------------------------------------- +void LLAvatarJointMesh::freeSkinData() +{ +	mNumSkinJoints = 0; +	delete [] mSkinJoints; +	mSkinJoints = NULL; +} + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::getColor() +//-------------------------------------------------------------------- +void LLAvatarJointMesh::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha ) +{ +	*red   = mColor[0]; +	*green = mColor[1]; +	*blue  = mColor[2]; +	*alpha = mColor[3]; +} + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::setColor() +//-------------------------------------------------------------------- +void LLAvatarJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha ) +{ +	mColor[0] = red; +	mColor[1] = green; +	mColor[2] = blue; +	mColor[3] = alpha; +} + +void LLAvatarJointMesh::setColor( const LLColor4& color ) +{ +	mColor = color; +} + + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::getTexture() +//-------------------------------------------------------------------- +//LLViewerTexture *LLAvatarJointMesh::getTexture() +//{ +//	return mTexture; +//} + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::setTexture() +//-------------------------------------------------------------------- +void LLAvatarJointMesh::setTexture( LLGLTexture *texture ) +{ +	mTexture = texture; + +	// texture and dynamic_texture are mutually exclusive +	if( texture ) +	{ +		mLayerSet = NULL; +		//texture->bindTexture(0); +		//texture->setClamp(TRUE, TRUE); +	} +} + + +BOOL LLAvatarJointMesh::hasGLTexture() const +{ +	return mTexture.notNull() && mTexture->hasGLTexture(); +} + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::setLayerSet() +// Sets the shape texture (takes precedence over normal texture) +//-------------------------------------------------------------------- +void LLAvatarJointMesh::setLayerSet( LLTexLayerSet* layer_set ) +{ +	mLayerSet = layer_set; +	 +	// texture and dynamic_texture are mutually exclusive +	if( layer_set ) +	{ +		mTexture = NULL; +	} +} + +BOOL LLAvatarJointMesh::hasComposite() const +{ +	return (mLayerSet && mLayerSet->hasComposite()); +} + + +//-------------------------------------------------------------------- +// LLAvatarJointMesh::getMesh() +//-------------------------------------------------------------------- +LLPolyMesh *LLAvatarJointMesh::getMesh() +{ +	return mMesh; +} + +//----------------------------------------------------------------------------- +// LLAvatarJointMesh::setMesh() +//----------------------------------------------------------------------------- +void LLAvatarJointMesh::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; +			LLAvatarJoint* joint = (LLAvatarJoint*)(getRoot()->findJoint(jointNames[jn]) ); +			mSkinJoints[jn].setupSkinJoint( joint ); +		} +	} + +	// setup joint array +	if (!mMesh->isLOD()) +	{ +		setupJoint((LLAvatarJoint*)getRoot()); +	} + +//	llinfos << "joint render entries: " << mMesh->mJointRenderData.count() << llendl; +} + +//----------------------------------------------------------------------------- +// setupJoint() +//----------------------------------------------------------------------------- +void LLAvatarJointMesh::setupJoint(LLAvatarJoint* 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 +			LLAvatarJoint* 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) +	{ +		LLAvatarJoint* child_joint = (LLAvatarJoint*)(*iter); +		setupJoint(child_joint); +	} +} + + +// End diff --git a/indra/llappearance/llavatarjointmesh.h b/indra/llappearance/llavatarjointmesh.h new file mode 100755 index 0000000000..2aade4d62b --- /dev/null +++ b/indra/llappearance/llavatarjointmesh.h @@ -0,0 +1,149 @@ +/**  + * @file llavatarjointmesh.h + * @brief Declaration of LLAvatarJointMesh 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_LLAVATARJOINTMESH_H +#define LL_LLAVATARJOINTMESH_H + +#include "llavatarjoint.h" +#include "llgltexture.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( LLAvatarJoint *joint); + +	LLAvatarJoint	*mJoint; +	LLVector3		mRootToJointSkinOffset; +	LLVector3		mRootToParentJointSkinOffset; +}; + +//----------------------------------------------------------------------------- +// class LLViewerJointMesh +//----------------------------------------------------------------------------- +class LLAvatarJointMesh : public virtual LLAvatarJoint +{ +protected: +	LLColor4					mColor;			// color value +// 	LLColor4					mSpecular;		// specular color (always white for now) +	F32							mShiny;			// shiny value +	LLPointer<LLGLTexture>		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 +	LLAvatarJointMesh(); + +	// Destructor +	virtual ~LLAvatarJointMesh(); + +	// overloaded from base class +	/*virtual*/ BOOL isTransparent() { return mIsTransparent; } + +	// 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 ); +	void setColor( const LLColor4& color ); + +	// Sets the shininess +	void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; }; + +	// Sets the shape texture +	void setTexture( LLGLTexture *texture ); + +	BOOL hasGLTexture() const; + +	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 ); + +	BOOL hasComposite() const; + +	// Gets the poly mesh +	LLPolyMesh *getMesh(); + +	// Sets the poly mesh +	void setMesh( LLPolyMesh *mesh ); + +	// Sets up joint matrix data for rendering +	void setupJoint(LLAvatarJoint* 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; }	 + +	void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; } + +private: +	// Allocate skin data +	BOOL allocateSkinData( U32 numSkinJoints ); + +	// Free skin data +	void freeSkinData(); +}; + +#endif // LL_LLAVATARJOINTMESH_H diff --git a/indra/newview/lldriverparam.cpp b/indra/llappearance/lldriverparam.cpp index 885cae1737..1092b525d0 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/llappearance/lldriverparam.cpp @@ -24,22 +24,20 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "lldriverparam.h" -#include "llfasttimer.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llagent.h" +#include "llavatarappearance.h"  #include "llwearable.h" -#include "llagentwearables.h" +#include "llwearabledata.h"  //-----------------------------------------------------------------------------  // LLDriverParamInfo  //----------------------------------------------------------------------------- -LLDriverParamInfo::LLDriverParamInfo() +LLDriverParamInfo::LLDriverParamInfo() : +	mDriverParam(NULL)  {  } @@ -112,12 +110,14 @@ void LLDriverParamInfo::toStream(std::ostream &out)  	out << std::endl; -	if(isAgentAvatarValid()) +	if(mDriverParam && mDriverParam->getAvatarAppearance()->isSelf() && +		mDriverParam->getAvatarAppearance()->isValid())  	{  		for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)  		{  			LLDrivenEntryInfo driven = *iter; -			LLViewerVisualParam *param = (LLViewerVisualParam*)gAgentAvatarp->getVisualParam(driven.mDrivenID); +			LLViewerVisualParam *param =  +				(LLViewerVisualParam*)mDriverParam->getAvatarAppearance()->getVisualParam(driven.mDrivenID);  			if (param)  			{  				param->getInfo()->toStream(out); @@ -139,7 +139,9 @@ void LLDriverParamInfo::toStream(std::ostream &out)  			}  			else  			{ -				llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl; +				llwarns << "could not get parameter " << driven.mDrivenID << " from avatar "  +						<< mDriverParam->getAvatarAppearance()  +						<< " for driver parameter " << getID() << llendl;  			}  			out << std::endl;  		} @@ -150,19 +152,16 @@ void LLDriverParamInfo::toStream(std::ostream &out)  // LLDriverParam  //----------------------------------------------------------------------------- -LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) :  +LLDriverParam::LLDriverParam(LLAvatarAppearance *appearance, LLWearable* wearable /* = NULL */) :  	mCurrentDistortionParam( NULL ),  -	mAvatarp(avatarp),  -	mWearablep(NULL) -{ -	mDefaultVec.clear(); -} - -LLDriverParam::LLDriverParam(LLWearable *wearablep) :  -	mCurrentDistortionParam( NULL ),  -	mAvatarp(NULL),  -	mWearablep(wearablep) +	mAvatarAppearance(appearance),  +	mWearablep(wearable)  { +	llassert(mAvatarAppearance); +	if (mWearablep) +	{ +		llassert(mAvatarAppearance->isSelf()); +	}  	mDefaultVec.clear();  } @@ -177,67 +176,21 @@ BOOL LLDriverParam::setInfo(LLDriverParamInfo *info)  		return FALSE;  	mInfo = info;  	mID = info->mID; +	info->mDriverParam = this;  	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); -		} -	} +	llassert(wearable); +	LLDriverParam *new_param = new LLDriverParam(mAvatarAppearance, wearable);  	*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(); @@ -456,6 +409,20 @@ const LLVector4a*	LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly  	return v;  }; +S32 LLDriverParam::getDrivenParamsCount() const +{ +	return mDriven.size(); +} + +const LLViewerVisualParam* LLDriverParam::getDrivenParam(S32 index) const +{ +	if (0 > index || index >= mDriven.size()) +	{ +		return NULL; +	} +	return mDriven[index].mParam; +} +  //-----------------------------------------------------------------------------  // setAnimationTarget()  //----------------------------------------------------------------------------- @@ -555,7 +522,7 @@ void LLDriverParam::updateCrossDrivenParams(LLWearableType::EType driven_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); +		LLWearable *wearable = mAvatarAppearance->getWearableData()->getTopWearable(driver_type);  		if (wearable)  		{  			wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false); @@ -623,13 +590,22 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight  void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)  { -	if(isAgentAvatarValid() && -	   mWearablep &&  -	   driven->mParam->getCrossWearable() && -	   mWearablep->isOnTop()) +	bool use_self = false; +	if(mWearablep && +		mAvatarAppearance->isValid() && +		driven->mParam->getCrossWearable()) +	{ +		LLWearable* wearable = dynamic_cast<LLWearable*> (mWearablep); +		if (mAvatarAppearance->getWearableData()->isOnTop(wearable)) +		{ +			use_self = true; +		} +	} + +	if (use_self)  	{  		// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values -		gAgentAvatarp->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); +		mAvatarAppearance->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );  	}  	else  	{ diff --git a/indra/newview/lldriverparam.h b/indra/llappearance/lldriverparam.h index 7a4d711d4e..30e71daad9 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/llappearance/lldriverparam.h @@ -30,8 +30,8 @@  #include "llviewervisualparam.h"  #include "llwearabletype.h" -class LLPhysicsMotion; -class LLVOAvatar; +class LLAvatarAppearance; +class LLDriverParam;  class LLWearable;  //----------------------------------------------------------------------------- @@ -71,16 +71,18 @@ public:  protected:  	typedef std::deque<LLDrivenEntryInfo> entry_info_list_t;  	entry_info_list_t mDrivenInfoList; +	LLDriverParam* mDriverParam; // backpointer  };  //-----------------------------------------------------------------------------  class LLDriverParam : public LLViewerVisualParam  { -	friend class LLPhysicsMotion; // physics motion needs to access driven params directly. +private: +	// Hide the default constructor.  Force construction with LLAvatarAppearance. +	LLDriverParam() {}  public: -	LLDriverParam(LLVOAvatar *avatarp); -	LLDriverParam(LLWearable *wearablep); +	LLDriverParam(LLAvatarAppearance *appearance, LLWearable* wearable = NULL);  	~LLDriverParam();  	// Special: These functions are overridden by child classes @@ -88,14 +90,14 @@ public:  	//   This sets mInfo and calls initialization functions  	BOOL					setInfo(LLDriverParamInfo *info); -	void					setWearable(LLWearable *wearablep); -	void					setAvatar(LLVOAvatar *avatarp); +	LLAvatarAppearance* getAvatarAppearance() { return mAvatarAppearance; } +	const LLAvatarAppearance* getAvatarAppearance() const { return mAvatarAppearance; } +  	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 ); @@ -111,6 +113,9 @@ public:  	/*virtual*/ const LLVector4a*	getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);  	/*virtual*/ const LLVector4a*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); +	S32								getDrivenParamsCount() const; +	const LLViewerVisualParam*		getDrivenParam(S32 index) const; +  protected:  	F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);  	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake); @@ -121,7 +126,7 @@ protected:  	entry_list_t mDriven;  	LLViewerVisualParam* mCurrentDistortionParam;  	// Backlink only; don't make this an LLPointer. -	LLVOAvatar* mAvatarp; +	LLAvatarAppearance* mAvatarAppearance;  	LLWearable* mWearablep;  }; diff --git a/indra/llappearance/lljointpickname.h b/indra/llappearance/lljointpickname.h new file mode 100644 index 0000000000..1d41a761fc --- /dev/null +++ b/indra/llappearance/lljointpickname.h @@ -0,0 +1,49 @@ +/**  + * @file lljointpickname.h + * @brief Defines OpenGL seleciton stack names + * + * $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_LLJOINTPICKNAME_H +#define LL_LLJOINTPICKNAME_H + +class LLAvatarJointMesh; + +// 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 LLJointPickName +{ +	PN_DEFAULT = -1, +	PN_0 = 0, +	PN_1 = 1, +	PN_2 = 2, +	PN_3 = 3, +	PN_4 = 4, +	PN_5 = 5 +}; + +typedef std::vector<LLAvatarJointMesh*> avatar_joint_mesh_list_t; + +#endif // LL_LLJOINTPICKNAME_H diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/llappearance/lllocaltextureobject.cpp index 07ec0fab95..7e36a06797 100644 --- a/indra/newview/lllocaltextureobject.cpp +++ b/indra/llappearance/lllocaltextureobject.cpp @@ -23,13 +23,14 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "lllocaltextureobject.h" +#include "llimage.h" +#include "llrender.h"  #include "lltexlayer.h" -#include "llviewertexture.h" -#include "lltextureentry.h" +#include "llgltexture.h"  #include "lluuid.h"  #include "llwearable.h" @@ -41,7 +42,7 @@ LLLocalTextureObject::LLLocalTextureObject() :  	mImage = NULL;  } -LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id) : +LLLocalTextureObject::LLLocalTextureObject(LLGLTexture* image, const LLUUID& id) :  	mIsBakedReady(FALSE),  	mDiscard(MAX_DISCARD_LEVEL+1)  { @@ -77,7 +78,7 @@ LLLocalTextureObject::~LLLocalTextureObject()  {  } -LLViewerFetchedTexture* LLLocalTextureObject::getImage() const +LLGLTexture* LLLocalTextureObject::getImage() const  {  	return mImage;  } @@ -126,7 +127,7 @@ BOOL LLLocalTextureObject::getBakedReady() const  	return mIsBakedReady;  } -void LLLocalTextureObject::setImage(LLViewerFetchedTexture* new_image) +void LLLocalTextureObject::setImage(LLGLTexture* new_image)  {  	mImage = new_image;  } diff --git a/indra/newview/lllocaltextureobject.h b/indra/llappearance/lllocaltextureobject.h index b9bfc5472f..6f14448cca 100644 --- a/indra/newview/lllocaltextureobject.h +++ b/indra/llappearance/lllocaltextureobject.h @@ -29,11 +29,11 @@  #include <boost/shared_ptr.hpp> -#include "llviewertexture.h" +#include "llpointer.h" +#include "llgltexture.h"  class LLUUID;  class LLTexLayer; -class LLTextureEntry;  class LLTexLayerTemplate;  class LLWearable; @@ -44,11 +44,11 @@ class LLLocalTextureObject  {  public:  	LLLocalTextureObject(); -	LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id); +	LLLocalTextureObject(LLGLTexture* image, const LLUUID& id);  	LLLocalTextureObject(const LLLocalTextureObject& lto);  	~LLLocalTextureObject(); -	LLViewerFetchedTexture* getImage() const; +	LLGLTexture* getImage() const;  	LLTexLayer* getTexLayer(U32 index) const;  	LLTexLayer* getTexLayer(const std::string &name);  	U32 		getNumTexLayers() const; @@ -56,7 +56,7 @@ public:  	S32			getDiscard() const;  	BOOL		getBakedReady() const; -	void setImage(LLViewerFetchedTexture* new_image); +	void setImage(LLGLTexture* 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); @@ -70,7 +70,7 @@ protected:  private: -	LLPointer<LLViewerFetchedTexture>  			mImage; +	LLPointer<LLGLTexture>			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 diff --git a/indra/newview/llpolymesh.cpp b/indra/llappearance/llpolymesh.cpp index 70f3b5335e..b1370ab1e3 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/llappearance/llpolymesh.cpp @@ -27,25 +27,24 @@  //-----------------------------------------------------------------------------  // Header Files  //----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - +#include "linden_common.h" +#include "llpolymesh.h"  #include "llfasttimer.h"  #include "llmemory.h" -#include "llviewercontrol.h" +//#include "llviewercontrol.h"  #include "llxmltree.h" -#include "llvoavatar.h" +#include "llavatarappearance.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 +//extern LLControlGroup gSavedSettings;                           // read only  LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data,  					     const std::string &name); @@ -1048,250 +1047,4 @@ 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/llappearance/llpolymesh.h index ffb11a3f7e..ef1dfb1adb 100644 --- a/indra/newview/llpolymesh.h +++ b/indra/llappearance/llpolymesh.h @@ -24,8 +24,8 @@   * $/LicenseInfo$   */ -#ifndef LL_LLPOLYMESH_H -#define LL_LLPOLYMESH_H +#ifndef LL_LLPOLYMESHINTERFACE_H +#define LL_LLPOLYMESHINTERFACE_H  #include <string>  #include <map> @@ -39,7 +39,7 @@  //#include "lldarray.h"  class LLSkinJoint; -class LLVOAvatar; +class LLAvatarAppearance;  class LLWearable;  //#define USE_STRIPS	// Use tri-strips for rendering. @@ -319,8 +319,8 @@ public:  	BOOL	isLOD() { return mSharedData && mSharedData->isLOD(); } -	void setAvatar(LLVOAvatar* avatarp) { mAvatarp = avatarp; } -	LLVOAvatar* getAvatar() { return mAvatarp; } +	void setAvatar(LLAvatarAppearance* avatarp) { mAvatarp = avatarp; } +	LLAvatarAppearance* getAvatar() { return mAvatarp; }  	LLDynamicArray<LLJointRenderData*>	mJointRenderData; @@ -362,77 +362,8 @@ protected:  	static LLPolyMeshSharedDataTable sGlobalSharedMeshList;  	// Backlink only; don't make this an LLPointer. -	LLVOAvatar* mAvatarp; +	LLAvatarAppearance* 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(); - -	// 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 +#endif // LL_LLPOLYMESHINTERFACE_H diff --git a/indra/newview/llpolymorph.cpp b/indra/llappearance/llpolymorph.cpp index d25d1420ee..aa680894ff 100644 --- a/indra/newview/llpolymorph.cpp +++ b/indra/llappearance/llpolymorph.cpp @@ -27,13 +27,14 @@  //-----------------------------------------------------------------------------  // Header Files  //----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h"  #include "llpolymorph.h" -#include "llvoavatar.h" +#include "llavatarappearance.h" +#include "llavatarjoint.h"  #include "llwearable.h"  #include "llxmltree.h"  #include "llendianswizzle.h" +#include "llpolymesh.h"  //#include "../tools/imdebug/imdebug.h" @@ -301,7 +302,7 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)  	mID = info->mID;  	setWeight(getDefaultWeight(), FALSE ); -	LLVOAvatar* avatarp = mMesh->getAvatar(); +	LLAvatarAppearance* avatarp = mMesh->getAvatar();  	LLPolyMorphTargetInfo::volume_info_list_t::iterator iter;  	for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++)  	{ diff --git a/indra/newview/llpolymorph.h b/indra/llappearance/llpolymorph.h index 46e23b7792..d6cf9e52ca 100644 --- a/indra/newview/llpolymorph.h +++ b/indra/llappearance/llpolymorph.h @@ -32,10 +32,10 @@  #include "llviewervisualparam.h" +class LLAvatarJointCollisionVolume;  class LLPolyMeshSharedData; -class LLVOAvatar;  class LLVector2; -class LLViewerJointCollisionVolume; +class LLAvatarJointCollisionVolume;  class LLWearable;  //----------------------------------------------------------------------------- @@ -104,10 +104,10 @@ struct LLPolyVolumeMorphInfo  struct LLPolyVolumeMorph  { -	LLPolyVolumeMorph(LLViewerJointCollisionVolume* volume, LLVector3 scale, LLVector3 pos) +	LLPolyVolumeMorph(LLAvatarJointCollisionVolume* volume, LLVector3 scale, LLVector3 pos)  		: mVolume(volume), mScale(scale), mPos(pos) {}; -	LLViewerJointCollisionVolume*	mVolume; +	LLAvatarJointCollisionVolume*	mVolume;  	LLVector3						mScale;  	LLVector3						mPos;  }; diff --git a/indra/llappearance/llpolyskeletaldistortion.cpp b/indra/llappearance/llpolyskeletaldistortion.cpp new file mode 100644 index 0000000000..4ba16691c2 --- /dev/null +++ b/indra/llappearance/llpolyskeletaldistortion.cpp @@ -0,0 +1,293 @@ +/**  + * @file llpolyskeletaldistortion.cpp + * @brief Implementation of LLPolySkeletalDistortion classes + * + * $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 "llpreprocessor.h" +#include "llerrorlegacy.h" +//#include "llcommon.h" +//#include "llmemory.h" +#include "llavatarappearance.h" +#include "llavatarjoint.h" +#include "llpolymorph.h" +//#include "llviewercontrol.h" +//#include "llxmltree.h" +//#include "llvoavatar.h" +#include "llwearable.h" +//#include "lldir.h" +//#include "llvolume.h" +//#include "llendianswizzle.h" + +#include "llpolyskeletaldistortion.h" + +//----------------------------------------------------------------------------- +// 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(LLAvatarAppearance *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) +                { +                        LLAvatarJoint* child_joint = (LLAvatarJoint*)(*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/llappearance/llpolyskeletaldistortion.h b/indra/llappearance/llpolyskeletaldistortion.h new file mode 100644 index 0000000000..040cf841ea --- /dev/null +++ b/indra/llappearance/llpolyskeletaldistortion.h @@ -0,0 +1,119 @@ +/**  + * @file llpolyskeletaldistortion.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_LLPOLYSKELETALDISTORTION_H +#define LL_LLPOLYSKELETALDISTORTION_H + +#include "llcommon.h" + +#include <string> +#include <map> +#include "llstl.h" + +#include "v3math.h" +#include "v2math.h" +#include "llquaternion.h" +//#include "llpolymorph.h" +#include "lljoint.h" +#include "llviewervisualparam.h" +//#include "lldarray.h" + +//class LLSkinJoint; +class LLAvatarAppearance; + +//#define USE_STRIPS	// Use tri-strips for rendering. + +//----------------------------------------------------------------------------- +// 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(LLAvatarAppearance *avatarp); +	~LLPolySkeletalDistortion(); + +	// 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. +	LLAvatarAppearance *mAvatar; +}; + +#endif // LL_LLPOLYSKELETALDISTORTION_H + diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/llappearance/lltexglobalcolor.cpp index ebe5ccd6c0..f38b982104 100644 --- a/indra/newview/lltexglobalcolor.cpp +++ b/indra/llappearance/lltexglobalcolor.cpp @@ -24,20 +24,20 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" -#include "llagent.h" +#include "linden_common.h" +#include "llavatarappearance.h"  #include "lltexlayer.h" -#include "llvoavatar.h" -#include "llwearable.h"  #include "lltexglobalcolor.h" +class LLWearable; +  //-----------------------------------------------------------------------------  // LLTexGlobalColor  //----------------------------------------------------------------------------- -LLTexGlobalColor::LLTexGlobalColor(LLVOAvatar* avatar)  +LLTexGlobalColor::LLTexGlobalColor(LLAvatarAppearance* appearance)  	: -	mAvatar(avatar), +	mAvatarAppearance(appearance),  	mInfo(NULL)  {  } @@ -91,7 +91,7 @@ const std::string& LLTexGlobalColor::getName() const  // LLTexParamGlobalColor  //-----------------------------------------------------------------------------  LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color) : -	LLTexLayerParamColor(tex_global_color->getAvatar()), +	LLTexLayerParamColor(tex_global_color->getAvatarAppearance()),  	mTexGlobalColor(tex_global_color)  {  } @@ -105,7 +105,7 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)  void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake)  { -	mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake); +	mAvatarAppearance->onGlobalColorChanged(mTexGlobalColor, upload_bake);  }  //----------------------------------------------------------------------------- diff --git a/indra/newview/lltexglobalcolor.h b/indra/llappearance/lltexglobalcolor.h index ae04798445..2867479876 100644 --- a/indra/newview/lltexglobalcolor.h +++ b/indra/llappearance/lltexglobalcolor.h @@ -1,6 +1,6 @@  /**    * @file lltexglobalcolor.h - * @brief This is global texture color info used by llvoavatar. + * @brief This is global texture color info used by llavatarappearance.   *   * $LicenseInfo:firstyear=2008&license=viewerlgpl$   * Second Life Viewer Source Code @@ -30,31 +30,31 @@  #include "lltexlayer.h"  #include "lltexlayerparams.h" -class LLVOAvatar; +class LLAvatarAppearance;  class LLWearable;  class LLTexGlobalColorInfo;  class LLTexGlobalColor  {  public: -	LLTexGlobalColor( LLVOAvatar* avatar ); +	LLTexGlobalColor( LLAvatarAppearance* appearance );  	~LLTexGlobalColor();  	LLTexGlobalColorInfo*	getInfo() const { return mInfo; }  	//   This sets mInfo and calls initialization functions  	BOOL					setInfo(LLTexGlobalColorInfo *info); -	LLVOAvatar*				getAvatar()	const			   	{ return mAvatar; } +	LLAvatarAppearance*		getAvatarAppearance()	const	   	{ return mAvatarAppearance; }  	LLColor4				getColor() const;  	const std::string&		getName() const;  private:  	param_color_list_t		mParamGlobalColorList; -	LLVOAvatar*				mAvatar;  // just backlink, don't LLPointer  +	LLAvatarAppearance*		mAvatarAppearance;  // just backlink, don't LLPointer   	LLTexGlobalColorInfo	*mInfo;  }; -// Used by llvoavatar to determine skin/eye/hair color. +// Used by llavatarappearance to determine skin/eye/hair color.  class LLTexGlobalColorInfo  {  	friend class LLTexGlobalColor; diff --git a/indra/newview/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index 467115c928..e90efac36b 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -24,33 +24,29 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "lltexlayer.h" -#include "llagent.h" +#include "llavatarappearance.h" +#include "llcrc.h" +#include "imageids.h"  #include "llimagej2c.h"  #include "llimagetga.h" -#include "llnotificationsutil.h" +#include "lldir.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 "lltexturemanagerbridge.h" +#include "llrender2dutils.h"  #include "llwearable.h" -#include "llviewercontrol.h" -#include "llviewershadermgr.h" +#include "llwearabledata.h" +#include "llvertexbuffer.h"  #include "llviewervisualparam.h"  //#include "../tools/imdebug/imdebug.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  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 @@ -68,7 +64,7 @@ public:  	~LLTexLayerInfo();  	BOOL parseXml(LLXmlTreeNode* node); -	BOOL createVisualParams(LLVOAvatar *avatar); +	BOOL createVisualParams(LLAvatarAppearance *appearance);  	BOOL isUserSettable() { return mLocalTexture != -1;	}  	S32  getLocalTexture() const { return mLocalTexture; }  	BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; } @@ -96,125 +92,17 @@ private:  };  //----------------------------------------------------------------------------- -// 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. +// The composite image that a LLViewerTexLayerSet writes to.  Each LLViewerTexLayerSet 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), +LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner) :  	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 @@ -222,7 +110,7 @@ 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.ortho(0.0f, getCompositeWidth(), 0.0f, getCompositeHeight(), -1.0f, 1.0f);  	gGL.matrixMode(LLRender::MM_MODELVIEW);  	gGL.pushMatrix(); @@ -238,64 +126,24 @@ void LLTexLayerSetBuffer::popProjection() const  	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) +// virtual +void LLTexLayerSetBuffer::preRenderTexLayerSet()  {  	// Set up an ortho projection  	pushProjection(); -	 -	// keep depth buffer, we don't need to clear it -	LLViewerDynamicTexture::preRender(FALSE);  } -void LLTexLayerSetBuffer::postRender(BOOL success) +// virtual +void LLTexLayerSetBuffer::postRenderTexLayerSet(BOOL success)  {  	popProjection(); - -	LLViewerDynamicTexture::postRender(success);  } -BOOL LLTexLayerSetBuffer::render() +BOOL LLTexLayerSetBuffer::renderTexLayerSet()  {  	// 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; @@ -310,37 +158,11 @@ BOOL LLTexLayerSetBuffer::render()  	// Composite the color data  	LLGLSUIDefault gls_ui; -	success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight ); +	success &= mTexLayerSet->render( getCompositeOriginX(), getCompositeOriginY(),  +									 getCompositeWidth(), getCompositeHeight() );  	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(); -	} +	midRenderTexLayerSet(success);  	if (use_shaders)  	{ @@ -353,368 +175,11 @@ BOOL LLTexLayerSetBuffer::render()  	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; -			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 = 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 +// LLTexLayerSetInfo  // An ordered set of texture layers that get composited into a single texture.  //----------------------------------------------------------------------------- @@ -784,7 +249,7 @@ BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node)  }  // creates visual params without generating layersets or layers -void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar) +void LLTexLayerSetInfo::createVisualParams(LLAvatarAppearance *appearance)  {  	//layer_info_list_t		mLayerInfoList;  	for (layer_info_list_t::iterator layer_iter = mLayerInfoList.begin(); @@ -792,7 +257,7 @@ void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)  		 layer_iter++)  	{  		LLTexLayerInfo *layer_info = *layer_iter; -		layer_info->createVisualParams(avatar); +		layer_info->createVisualParams(appearance);  	}  } @@ -803,16 +268,15 @@ void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)  BOOL LLTexLayerSet::sHasCaches = FALSE; -LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) : -	mComposite( NULL ), -	mAvatar( avatar ), -	mUpdatesEnabled( FALSE ), +LLTexLayerSet::LLTexLayerSet(LLAvatarAppearance* const appearance) : +	mAvatarAppearance( appearance ),  	mIsVisible( TRUE ), -	mBakedTexIndex(LLVOAvatarDefines::BAKED_HEAD), +	mBakedTexIndex(LLAvatarAppearanceDefines::BAKED_HEAD),  	mInfo( NULL )  {  } +// virtual  LLTexLayerSet::~LLTexLayerSet()  {  	deleteCaches(); @@ -838,13 +302,13 @@ BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info)  		LLTexLayerInterface *layer = NULL;  		if ( (*iter)->isUserSettable() )  		{ -			layer = new LLTexLayerTemplate( this ); +			layer = new LLTexLayerTemplate( this, getAvatarAppearance() );  		}  		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 +		// this is the first time this layer (of either type) is being created - make sure you add the parameters to the avatar appearance  		if (!layer->setInfo(*iter, NULL))  		{  			mInfo = NULL; @@ -904,21 +368,6 @@ void LLTexLayerSet::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 )  { @@ -1019,43 +468,6 @@ 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()  { @@ -1065,18 +477,6 @@ void LLTexLayerSet::destroyComposite()  	}  } -void LLTexLayerSet::setUpdatesEnabled( BOOL b ) -{ -	mUpdatesEnabled = b;  -} - - -void LLTexLayerSet::updateComposite() -{ -	createComposite(); -	mComposite->requestUpdateImmediate(); -} -  LLTexLayerSetBuffer* LLTexLayerSet::getComposite()  {  	if (!mComposite) @@ -1091,20 +491,6 @@ 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(); @@ -1119,7 +505,7 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,  	{  		gGL.flush();  		{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE); +			LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);  			if( tex )  			{  				LLGLSUIDefault gls_ui; @@ -1176,7 +562,7 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,  void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components)  { -	mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex); +	mAvatarAppearance->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);  }  BOOL LLTexLayerSet::isMorphValid() const @@ -1291,11 +677,11 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)  			/* 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(); +			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 (local_texture_name == texture_dict->mName)  			{  					mLocalTexture = iter->first; @@ -1362,7 +748,7 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)  	return TRUE;  } -BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar) +BOOL LLTexLayerInfo::createVisualParams(LLAvatarAppearance *appearance)  {  	BOOL success = TRUE;  	for (param_color_info_list_t::iterator color_info_iter = mParamColorInfoList.begin(); @@ -1370,7 +756,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)  		 color_info_iter++)  	{  		LLTexLayerParamColorInfo * color_info = *color_info_iter; -		LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar); +		LLTexLayerParamColor* param_color = new LLTexLayerParamColor(appearance);  		if (!param_color->setInfo(color_info, TRUE))  		{  			llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl; @@ -1384,7 +770,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)  		 alpha_info_iter++)  	{  		LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter; -		LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar); +		LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(appearance);  		if (!param_alpha->setInfo(alpha_info, TRUE))  		{  			llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl; @@ -1631,17 +1017,21 @@ void LLTexLayer::calculateTexLayerColor(const param_color_list_t ¶m_list, LL  BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)  {  	LLGLEnable color_mat(GL_COLOR_MATERIAL); -	gPipeline.disableLights(); +	// *TODO: Is this correct? +	//gPipeline.disableLights(); +	stop_glerror(); +	glDisable(GL_LIGHTING); +	stop_glerror();  	bool use_shaders = LLGLSLShader::sNoFixedFunction;  	LLColor4 net_color;  	BOOL color_specified = findNetColor(&net_color); -	if (mTexLayerSet->getAvatar()->mIsDummy) +	if (mTexLayerSet->getAvatarAppearance()->mIsDummy)  	{  		color_specified = true; -		net_color = LLVOAvatar::getDummyColor(); +		net_color = LLAvatarAppearance::getDummyColor();  	}  	BOOL success = TRUE; @@ -1698,7 +1088,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)  	if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly )  	{  		{ -			LLViewerTexture* tex = NULL; +			LLGLTexture* tex = NULL;  			if (mLocalTextureObject && mLocalTextureObject->getImage())  			{  				tex = mLocalTextureObject->getImage(); @@ -1711,7 +1101,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)  			{  				llinfos << "lto not defined or image not defined: " << getInfo()->getLocalTexture() << " lto: " << mLocalTextureObject << llendl;  			} -//			if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) ) +//			if( mTexLayerSet->getAvatarAppearance()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) )  			{  				if( tex )  				{ @@ -1748,7 +1138,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)  	if( !getInfo()->mStaticImageFileName.empty() )  	{  		{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); +			LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);  			if( tex )  			{  				gGL.getTexUnit(0)->bind(tex, TRUE); @@ -1828,7 +1218,7 @@ BOOL LLTexLayer::findNetColor(LLColor4* net_color) const  	{  		if( !getGlobalColor().empty() )  		{ -			net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getInfo()->mGlobalColor ) ); +			net_color->setVec( mTexLayerSet->getAvatarAppearance()->getGlobalColor( getInfo()->mGlobalColor ) );  		}  		else if (getInfo()->mFixedColor.mV[VW])  		{ @@ -1845,7 +1235,7 @@ BOOL LLTexLayer::findNetColor(LLColor4* net_color) const  	if( !getGlobalColor().empty() )  	{ -		net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getGlobalColor() ) ); +		net_color->setVec( mTexLayerSet->getAvatarAppearance()->getGlobalColor( getGlobalColor() ) );  		return TRUE;  	} @@ -1870,7 +1260,7 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)  	if( !getInfo()->mStaticImageFileName.empty() )  	{ -		LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); +		LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );  		if( tex )  		{  			LLGLSNoAlphaTest gls_no_alpha_test; @@ -1895,7 +1285,7 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)  	{  		if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES)  		{ -			LLViewerTexture* tex = mLocalTextureObject->getImage(); +			LLGLTexture* tex = mLocalTextureObject->getImage();  			if (tex)  			{  				LLGLSNoAlphaTest gls_no_alpha_test; @@ -1969,7 +1359,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  	// Accumulate the alpha component of the texture  	if( getInfo()->mLocalTexture != -1 )  	{ -		LLViewerTexture* tex = mLocalTextureObject->getImage(); +		LLGLTexture* tex = mLocalTextureObject->getImage();  		if( tex && (tex->getComponents() == 4) )  		{  			LLGLSNoAlphaTest gls_no_alpha_test; @@ -1987,7 +1377,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  	if( !getInfo()->mStaticImageFileName.empty() )  	{ -		LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); +		LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);  		if( tex )  		{  			if(	(tex->getComponents() == 4) || @@ -2038,7 +1428,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  		if (!alpha_data)  		{  			// clear out a slot if we have filled our cache -			S32 max_cache_entries = getTexLayerSet()->getAvatar()->isSelf() ? 4 : 1; +			S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;  			while ((S32)mAlphaCache.size() >= max_cache_entries)  			{  				alpha_cache_t::iterator iter2 = mAlphaCache.begin(); // arbitrarily grab the first entry @@ -2051,7 +1441,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  			glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);  		} -		getTexLayerSet()->getAvatar()->dirtyMesh(); +		getTexLayerSet()->getAvatarAppearance()->dirtyMesh();  		mMorphMasksValid = TRUE;  		getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1); @@ -2104,7 +1494,7 @@ LLUUID LLTexLayer::getUUID() const  	LLUUID uuid;  	if( getInfo()->mLocalTexture != -1 )  	{ -			LLViewerTexture* tex = mLocalTextureObject->getImage(); +			LLGLTexture* tex = mLocalTextureObject->getImage();  			if (tex)  			{  				uuid = mLocalTextureObject->getID(); @@ -2112,7 +1502,7 @@ LLUUID LLTexLayer::getUUID() const  	}  	if( !getInfo()->mStaticImageFileName.empty() )  	{ -			LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); +			LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);  			if( tex )  			{  				uuid = tex->getID(); @@ -2135,13 +1525,15 @@ LLUUID LLTexLayer::getUUID() const  //			* a texture entry index (TE)  //		* (optional) one or more alpha parameters (weighted alpha textures)  //----------------------------------------------------------------------------- -LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set) : -	LLTexLayerInterface(layer_set) +LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set, LLAvatarAppearance* const appearance) : +	LLTexLayerInterface(layer_set), +	mAvatarAppearance( appearance )  {  }  LLTexLayerTemplate::LLTexLayerTemplate(const LLTexLayerTemplate &layer) : -	LLTexLayerInterface(layer) +	LLTexLayerInterface(layer), +	mAvatarAppearance(layer.getAvatarAppearance())  {  } @@ -2168,12 +1560,12 @@ U32 LLTexLayerTemplate::updateWearableCache() const  		//this isn't a cloneable layer   		return 0;  	} -	LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te); -	U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); +	LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te); +	U32 num_wearables = getAvatarAppearance()->getWearableData()->getWearableCount(wearable_type);  	U32 added = 0;  	for (U32 i = 0; i < num_wearables; i++)  	{ -		LLWearable*  wearable = gAgentWearables.getWearable(wearable_type, i); +		LLWearable*  wearable = getAvatarAppearance()->getWearableData()->getWearable(wearable_type, i);  		if (!wearable)  		{  			continue; @@ -2228,7 +1620,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const  		}  		if (layer)  		{ -			wearable->writeToAvatar(); +			wearable->writeToAvatar(mAvatarAppearance);  			layer->setLTO(lto);  			success &= layer->render(x,y,width,height);  		} @@ -2335,7 +1727,7 @@ LLTexLayerInterface*  LLTexLayerSet::findLayerByName(const std::string& name)  	return NULL;  } -void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable *wearable) +void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::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++ ) @@ -2430,9 +1822,9 @@ LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name)  // 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) +LLGLTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask)  { -	LLPointer<LLViewerTexture> tex; +	LLPointer<LLGLTexture> tex;  	const char *namekey = mImageNames.addString(file_name);  	texture_map_t::const_iterator iter = mStaticImageList.find(namekey); @@ -2442,7 +1834,8 @@ LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_n  	}  	else  	{ -		tex = LLViewerTextureManager::getLocalTexture( FALSE ); +		llassert(gTextureManagerBridgep); +		tex = gTextureManagerBridgep->getLocalTexture( FALSE );  		LLPointer<LLImageRaw> image_raw = new LLImageRaw;  		if( loadImageRaw( file_name, image_raw ) )  		{ @@ -2452,7 +1845,7 @@ LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_n  				// 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); +			tex->createGLTexture(0, image_raw, 0, TRUE, LLGLTexture::LOCAL);  			gGL.getTexUnit(0)->bind(tex);  			tex->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -2486,23 +1879,3 @@ BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLIma  	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/llappearance/lltexlayer.h index 4f43547dae..0d7fad349c 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/llappearance/lltexlayer.h @@ -28,12 +28,12 @@  #define LL_LLTEXLAYER_H  #include <deque> -#include "lldynamictexture.h" -#include "llvoavatardefines.h" +#include "llglslshader.h" +#include "llgltexture.h" +#include "llavatarappearancedefines.h"  #include "lltexlayerparams.h" -class LLVOAvatar; -class LLVOAvatarSelf; +class LLAvatarAppearance;  class LLImageTGA;  class LLImageRaw;  class LLXmlTreeNode; @@ -113,7 +113,7 @@ protected:  class LLTexLayerTemplate : public LLTexLayerInterface  {  public: -	LLTexLayerTemplate(LLTexLayerSet* const layer_set); +	LLTexLayerTemplate(LLTexLayerSet* const layer_set, LLAvatarAppearance* const appearance);  	LLTexLayerTemplate(const LLTexLayerTemplate &layer);  	/*virtual*/ ~LLTexLayerTemplate();  	/*virtual*/ BOOL		render(S32 x, S32 y, S32 width, S32 height); @@ -126,7 +126,9 @@ public:  protected:  	U32 					updateWearableCache() const;  	LLTexLayer* 			getLayer(U32 i) const; +	LLAvatarAppearance*		getAvatarAppearance()	const		{ return mAvatarAppearance; }  private: +	LLAvatarAppearance*	const	mAvatarAppearance; // note: backlink only; don't make this an LLPointer.  	typedef std::vector<LLWearable*> wearable_cache_t;  	mutable wearable_cache_t mWearableCache; // mutable b/c most get- require updating this cache  }; @@ -179,8 +181,13 @@ class LLTexLayerSet  {  	friend class LLTexLayerSetBuffer;  public: -	LLTexLayerSet(LLVOAvatarSelf* const avatar); -	~LLTexLayerSet(); +	LLTexLayerSet(LLAvatarAppearance* const appearance); +	virtual ~LLTexLayerSet(); + +	LLTexLayerSetBuffer*		getComposite(); +	const LLTexLayerSetBuffer* 	getComposite() const; // Do not create one if it doesn't exist. +	virtual void				createComposite() = 0; +	void						destroyComposite();  	const LLTexLayerSetInfo* 	getInfo() const 			{ return mInfo; }  	BOOL						setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions @@ -189,45 +196,32 @@ public:  	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; +	virtual void				requestUpdate() = 0;  	void						invalidateMorphMasks(); +	void						deleteCaches();  	LLTexLayerInterface*		findLayerByName(const std::string& name); -	void						cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); +	void						cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable* wearable); -	LLVOAvatarSelf*		    	getAvatar()	const 			{ return mAvatar; } +	LLAvatarAppearance*			getAvatarAppearance()	const		{ return mAvatarAppearance; }  	const std::string			getBodyRegionName() const;  	BOOL						hasComposite() const 		{ return (mComposite.notNull()); } -	LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } -	void						setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } +	LLAvatarAppearanceDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } +	void						setBakedTexIndex(LLAvatarAppearanceDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }  	BOOL						isVisible() const 			{ return mIsVisible; }  	static BOOL					sHasCaches; -private: +protected:  	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; +	LLAvatarAppearance*	const	mAvatarAppearance; // note: backlink only; don't make this an LLPointer.  	BOOL						mIsVisible; -	LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex; +	LLAvatarAppearanceDefines::EBakedTextureIndex mBakedTexIndex;  	const LLTexLayerSetInfo* 	mInfo;  }; @@ -243,8 +237,10 @@ public:  	LLTexLayerSetInfo();  	~LLTexLayerSetInfo();  	BOOL parseXml(LLXmlTreeNode* node); -	void createVisualParams(LLVOAvatar *avatar); -private: +	void createVisualParams(LLAvatarAppearance *appearance); +	S32 getWidth() const { return mWidth; } +	S32 getHeight() const { return mHeight; } +protected:  	std::string				mBodyRegion;  	S32						mWidth;  	S32						mHeight; @@ -259,78 +255,27 @@ private:  //  // The composite image that a LLTexLayerSet writes to.  Each LLTexLayerSet has one.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSetBuffer : public LLViewerDynamicTexture +class LLTexLayerSetBuffer : public virtual LLRefCount  {  	LOG_CLASS(LLTexLayerSetBuffer);  public: -	LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); +	LLTexLayerSetBuffer(LLTexLayerSet* const owner);  	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; +	virtual void			preRenderTexLayerSet(); +	virtual void			midRenderTexLayerSet(BOOL success) {} +	virtual void			postRenderTexLayerSet(BOOL success); +	virtual S32				getCompositeOriginX() const = 0; +	virtual S32				getCompositeOriginY() const = 0; +	virtual S32				getCompositeWidth() const = 0; +	virtual S32				getCompositeHeight() const = 0; +	BOOL					renderTexLayerSet(); -	//-------------------------------------------------------------------- -	// 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. +	LLTexLayerSet* const	mTexLayerSet;  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -342,7 +287,7 @@ class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>  public:  	LLTexLayerStaticImageList();  	~LLTexLayerStaticImageList(); -	LLViewerTexture*	getTexture(const std::string& file_name, BOOL is_mask); +	LLGLTexture*		getTexture(const std::string& file_name, BOOL is_mask);  	LLImageTGA*			getImageTGA(const std::string& file_name);  	void				deleteCachedImages();  	void				dumpByteCount() const; @@ -350,7 +295,7 @@ protected:  	BOOL				loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);  private:  	LLStringTable 		mImageNames; -	typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t; +	typedef std::map<const char*, LLPointer<LLGLTexture> > texture_map_t;  	texture_map_t 		mStaticImageList;  	typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t;  	image_tga_map_t 	mStaticImageListTGA; @@ -358,23 +303,4 @@ private:  	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/llappearance/lltexlayerparams.cpp index 8972827eff..82c92b5a5e 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/llappearance/lltexlayerparams.cpp @@ -24,27 +24,28 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "lltexlayerparams.h" -#include "llagentcamera.h" +#include "llavatarappearance.h"  #include "llimagetga.h" +#include "llquantize.h"  #include "lltexlayer.h" -#include "llvoavatarself.h" +#include "lltexturemanagerbridge.h" +#include "llrender2dutils.h"  #include "llwearable.h" -#include "llui.h"  //-----------------------------------------------------------------------------  // LLTexLayerParam  //-----------------------------------------------------------------------------  LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :  	mTexLayer(layer), -	mAvatar(NULL) +	mAvatarAppearance(NULL)  {  	if (mTexLayer != NULL)  	{ -		mAvatar = mTexLayer->getTexLayerSet()->getAvatar(); +		mAvatarAppearance = mTexLayer->getTexLayerSet()->getAvatarAppearance();  	}  	else  	{ @@ -52,20 +53,20 @@ LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :  	}  } -LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) : -	mTexLayer(NULL) +LLTexLayerParam::LLTexLayerParam(LLAvatarAppearance *appearance) : +	mTexLayer(NULL), +	mAvatarAppearance(appearance)  { -	mAvatar = avatar;  } -BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  ) -{	 +BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_appearance) +{  	LLViewerVisualParam::setInfo(info); -	if (add_to_avatar) +	if (add_to_appearance)  	{ -		mAvatar->addVisualParam( this); +		mAvatarAppearance->addVisualParam( this);  	}  	return TRUE; @@ -96,7 +97,7 @@ void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)  		 iter != sInstances.end(); iter++)  	{  		LLTexLayerParamAlpha* instance = *iter; -		LLViewerTexture* tex = instance->mCachedProcessedTexture; +		LLGLTexture* tex = instance->mCachedProcessedTexture;  		if (tex)  		{  			S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); @@ -120,8 +121,8 @@ LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :  	sInstances.push_front(this);  } -LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) : -	LLTexLayerParam(avatar), +LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLAvatarAppearance* appearance) : +	LLTexLayerParam(appearance),  	mCachedProcessedTexture(NULL),  	mNeedsCreateTexture(FALSE),  	mStaticImageInvalid(FALSE), @@ -173,13 +174,13 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)  	{  		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 ((mAvatarAppearance->getSex() & getSex()) && (mAvatarAppearance->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.  		{ -			if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) +			if (!mAvatarAppearance->isUsingBakedTextures())  			{  				upload_bake = FALSE;  			} -			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); +			mAvatarAppearance->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);  			mTexLayer->invalidateMorphMasks();  		}  	} @@ -218,11 +219,11 @@ BOOL LLTexLayerParamAlpha::getSkip() const  		return TRUE;  	} -	const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar(); +	const LLAvatarAppearance *appearance = mTexLayer->getTexLayerSet()->getAvatarAppearance();  	if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight)  	{ -		F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); +		F32 effective_weight = (appearance->getSex() & getSex()) ? mCurWeight : getDefaultWeight();  		if (is_approx_zero(effective_weight))   		{  			return TRUE; @@ -230,7 +231,7 @@ BOOL LLTexLayerParamAlpha::getSkip() const  	}  	LLWearableType::EType type = (LLWearableType::EType)getWearableType(); -	if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type)) +	if ((type != LLWearableType::WT_INVALID) && !appearance->isWearingWearableType(type))  	{  		return TRUE;  	} @@ -248,7 +249,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)  		return success;  	} -	F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); +	F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatarAppearance()->getSex() & getSex()) ? mCurWeight : getDefaultWeight();  	BOOL weight_changed = effective_weight != mCachedEffectiveWeight;  	if (getSkip())  	{ @@ -295,7 +296,8 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)  			if (!mCachedProcessedTexture)  			{ -				mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE); +				llassert(gTextureManagerBridgep); +				mCachedProcessedTexture = gTextureManagerBridgep->getLocalTexture(image_tga_width, image_tga_height, 1, FALSE);  				// We now have something in one of our caches  				LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE; @@ -332,7 +334,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)  		// 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()) +		if (!mAvatarAppearance->isSelf())  		{  			mCachedProcessedTexture = NULL;  		} @@ -402,8 +404,8 @@ LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) :  {  } -LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) : -	LLTexLayerParam(avatar), +LLTexLayerParamColor::LLTexLayerParamColor(LLAvatarAppearance *appearance) : +	LLTexLayerParam(appearance),  	mAvgDistortionVec(1.f, 1.f, 1.f)  {  } @@ -425,7 +427,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const  	llassert(info->mNumColors >= 1); -	F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight(); +	F32 effective_weight = (mAvatarAppearance && (mAvatarAppearance->getSex() & getSex())) ? mCurWeight : getDefaultWeight();  	S32 index_last = info->mNumColors - 1;  	F32 scaled_weight = effective_weight * index_last; @@ -470,12 +472,12 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)  			return;  		} -		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. +		if ((mAvatarAppearance->getSex() & getSex()) && (mAvatarAppearance->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); +				mAvatarAppearance->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);  			}  		} diff --git a/indra/newview/lltexlayerparams.h b/indra/llappearance/lltexlayerparams.h index 2c0da60b48..1974a4f7ac 100644 --- a/indra/newview/lltexlayerparams.h +++ b/indra/llappearance/lltexlayerparams.h @@ -27,14 +27,16 @@  #ifndef LL_LLTEXLAYERPARAMS_H  #define LL_LLTEXLAYERPARAMS_H +#include "llpointer.h" +#include "v4color.h"  #include "llviewervisualparam.h" +class LLAvatarAppearance;  class LLImageRaw;  class LLImageTGA;  class LLTexLayer;  class LLTexLayerInterface; -class LLViewerTexture; -class LLVOAvatar; +class LLGLTexture;  class LLWearable;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -45,13 +47,13 @@ class LLTexLayerParam : public LLViewerVisualParam  {  public:   	LLTexLayerParam(LLTexLayerInterface *layer); -	LLTexLayerParam(LLVOAvatar *avatar); -	/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  ); +	LLTexLayerParam(LLAvatarAppearance *appearance); +	/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_appearance);  	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0;  protected:  	LLTexLayerInterface*	mTexLayer; -	LLVOAvatar*             mAvatar; +	LLAvatarAppearance*		mAvatarAppearance;  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -62,7 +64,7 @@ class LLTexLayerParamAlpha : public LLTexLayerParam  {  public:  	LLTexLayerParamAlpha( LLTexLayerInterface* layer ); -	LLTexLayerParamAlpha( LLVOAvatar* avatar ); +	LLTexLayerParamAlpha( LLAvatarAppearance* appearance );  	/*virtual*/ ~LLTexLayerParamAlpha();  	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; @@ -89,7 +91,7 @@ public:  	BOOL					getMultiplyBlend() const;  private: -	LLPointer<LLViewerTexture>	mCachedProcessedTexture; +	LLPointer<LLGLTexture>	mCachedProcessedTexture;  	LLPointer<LLImageTGA>	mStaticImageTGA;  	LLPointer<LLImageRaw>	mStaticImageRaw;  	BOOL					mNeedsCreateTexture; @@ -140,7 +142,7 @@ public:  	};  	LLTexLayerParamColor( LLTexLayerInterface* layer ); -	LLTexLayerParamColor( LLVOAvatar* avatar ); +	LLTexLayerParamColor( LLAvatarAppearance* appearance );  	/* virtual */ ~LLTexLayerParamColor();  	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; diff --git a/indra/llappearance/lltexturemanagerbridge.cpp b/indra/llappearance/lltexturemanagerbridge.cpp new file mode 100644 index 0000000000..33f2185e4f --- /dev/null +++ b/indra/llappearance/lltexturemanagerbridge.cpp @@ -0,0 +1,32 @@ + /**  + * @file lltexturemanagerbridge.cpp + * @brief Defined a null texture manager bridge.  Applications must provide their own bridge implementaton. + * + * $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 "lltexturemanagerbridge.h" + +// Define a null texture manager bridge.  Applications must provide their own bridge implementaton. +LLTextureManagerBridge* gTextureManagerBridgep = NULL; + + diff --git a/indra/llappearance/lltexturemanagerbridge.h b/indra/llappearance/lltexturemanagerbridge.h new file mode 100644 index 0000000000..99c01755d4 --- /dev/null +++ b/indra/llappearance/lltexturemanagerbridge.h @@ -0,0 +1,45 @@ +/**  + * @file lltexturemanagerbridge.h + * @brief Bridge to an application-specific texture manager. + * + * $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_TEXTUREMANAGERBRIDGE_H +#define LL_TEXTUREMANAGERBRIDGE_H + +#include "llpointer.h" +#include "llgltexture.h" + +// Abstract bridge interface +class LLTextureManagerBridge +{ +public: +	virtual LLPointer<LLGLTexture> getLocalTexture(BOOL usemipmaps = TRUE, BOOL generate_gl_tex = TRUE) = 0; +	virtual LLPointer<LLGLTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) = 0; +	virtual LLGLTexture* getFetchedTexture(const LLUUID &image_id) = 0; +}; + +extern LLTextureManagerBridge* gTextureManagerBridgep; + +#endif // LL_TEXTUREMANAGERBRIDGE_H + diff --git a/indra/newview/llviewervisualparam.cpp b/indra/llappearance/llviewervisualparam.cpp index f0cf9b7692..cc81bcf118 100644 --- a/indra/newview/llviewervisualparam.cpp +++ b/indra/llappearance/llviewervisualparam.cpp @@ -27,11 +27,10 @@  //-----------------------------------------------------------------------------  // Header Files  //----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "llviewervisualparam.h"  #include "llxmltree.h" -#include "llui.h"  #include "llwearable.h"  //----------------------------------------------------------------------------- diff --git a/indra/newview/llviewervisualparam.h b/indra/llappearance/llviewervisualparam.h index 3bc95cbfbf..3bc95cbfbf 100644 --- a/indra/newview/llviewervisualparam.h +++ b/indra/llappearance/llviewervisualparam.h diff --git a/indra/llappearance/llwearable.cpp b/indra/llappearance/llwearable.cpp new file mode 100755 index 0000000000..9e73a6669a --- /dev/null +++ b/indra/llappearance/llwearable.cpp @@ -0,0 +1,564 @@ +/**  + * @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 "linden_common.h" + +#include "llavatarappearance.h" +#include "lllocaltextureobject.h" +#include "lltexlayer.h" +#include "lltexturemanagerbridge.h" +#include "llvisualparam.h" +#include "llavatarappearancedefines.h" +#include "llwearable.h" + +using namespace LLAvatarAppearanceDefines; + +// static +S32 LLWearable::sCurrentDefinitionVersion = 1; + +// Private local functions +static std::string terse_F32_to_string(F32 f); + +// virtual +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); +} + +// virtual +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(LLAvatarAppearance *avatarp) +{ +	for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatarp->getFirstVisualParam();  +		 param; +		 param = (LLViewerVisualParam*) avatarp->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*(LLAvatarAppearance::*param_function)(S32)const = &LLAvatarAppearance::getVisualParam;  +		param->resetDrivenParams(); +		if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false)) +		{ +			if( !param->linkDrivenParams(boost::bind(param_function,avatarp,_1 ), true)) +			{ +				llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl; +				continue; +			} +		} +	} +} + +void LLWearable::createLayers(S32 te, LLAvatarAppearance *avatarp) +{ +	LLTexLayerSet *layer_set = NULL; +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)te); +	if (texture_dict->mIsUsedByBakedTexture) +	{ +		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; +		 +		 layer_set = avatarp->getAvatarLayerSet(baked_index); +	} + +	if (layer_set) +	{ +		   layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this); +	} +	else +	{ +		   llerrs << "could not find layerset for LTO in wearable!" << llendl; +	} +} + +// virtual +LLWearable::EImportResult LLWearable::importFile( LLFILE* file, LLAvatarAppearance* avatarp ) +{ +	// *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; + +	// read header and version  +	fields_read = fscanf( file, "LLWearable version %d\n", &mDefinitionVersion ); +	if( fields_read != 1 ) +	{ +		return LLWearable::BAD_HEADER; +	} + +	if(!avatarp) +	{ +		return LLWearable::FAILURE; +	} + + +	// Temporary 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 LLWearable::FAILURE; +	} + +	// 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 LLWearable::FAILURE; +		} +		mName = text_buffer; +	} + +	// 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 LLWearable::FAILURE; +		} +		mDescription = text_buffer; +	} + +	// 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 LLWearable::FAILURE; +	} +	if( !mPermissions.importFile( file ) ) +	{ +		return LLWearable::FAILURE; +	} + +	// 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 LLWearable::FAILURE; +	} +	// 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 LLWearable::FAILURE; +	} +	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 LLWearable::FAILURE; +	} +	if( 0 <= type && type < LLWearableType::WT_COUNT ) +	{ +		setType((LLWearableType::EType)type, avatarp); +	} +	else +	{ +		mType = LLWearableType::WT_COUNT; +		llwarns << "Bad Wearable asset: bad type #" << type <<  llendl; +		return LLWearable::FAILURE; +	} + +	// 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 LLWearable::FAILURE; +	} + +	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 LLWearable::FAILURE; +		} +		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 LLWearable::FAILURE; +	} + +	// 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 LLWearable::FAILURE; +		} +	 +		if( !LLUUID::validate( text_buffer ) ) +		{ +				llwarns << "Bad Wearable asset: bad texture uuid: " << text_buffer << llendl; +				return LLWearable::FAILURE; +		} +		LLUUID id = LLUUID(text_buffer); +		LLGLTexture* image = gTextureManagerBridgep->getFetchedTexture( id ); +		if( mTEMap.find(te) != mTEMap.end() ) +		{ +				delete mTEMap[te]; +		} +		if( mSavedTEMap.find(te) != mSavedTEMap.end() ) +		{ +				delete mSavedTEMap[te]; +		} +	 +		LLUUID textureid(text_buffer); +		mTEMap[te] = new LLLocalTextureObject(image, textureid); +		mSavedTEMap[te] = new LLLocalTextureObject(image, textureid); +		createLayers(te, avatarp); +	} + +	return LLWearable::SUCCESS; +} + + +void LLWearable::setType(LLWearableType::EType type, LLAvatarAppearance *avatarp)  +{  +	mType = type;  +	createVisualParams(avatarp); +} + + +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::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( LLAvatarAppearance::teToColorParams( (LLAvatarAppearanceDefines::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( LLAvatarAppearance::teToColorParams( (LLAvatarAppearanceDefines::ETextureIndex)te, param_name ) ) +	{ +		for( U8 index = 0; index < 3; index++ ) +		{ +			setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake); +		} +	} +} + +void LLWearable::writeToAvatar(LLAvatarAppearance* avatarp) +{ +	if (!avatarp) return; + +	// Pull params +	for( LLVisualParam* param = avatarp->getFirstVisualParam(); param; param = avatarp->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); + +			avatarp->setVisualParamWeight( param_id, weight, FALSE ); +		} +	} +} + + +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; +} + diff --git a/indra/newview/llwearable.h b/indra/llappearance/llwearable.h index 3d8c53a755..b8bbf82a6e 100644 --- a/indra/newview/llwearable.h +++ b/indra/llappearance/llwearable.h @@ -27,31 +27,24 @@  #ifndef LL_LLWEARABLE_H  #define LL_LLWEARABLE_H -#include "lluuid.h" -#include "llstring.h" +#include "llextendedstatus.h"  #include "llpermissions.h"  #include "llsaleinfo.h" -#include "llassetstorage.h"  #include "llwearabletype.h" -#include "llfile.h"  #include "lllocaltextureobject.h" -class LLViewerInventoryItem; +class LLMD5;  class LLVisualParam;  class LLTexGlobalColorInfo;  class LLTexGlobalColor; +class LLAvatarAppearance; +// Abstract class.  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(); @@ -59,11 +52,8 @@ public:  	// 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); +	LLWearableType::EType		getType() const	{ return mType; } +	void						setType(LLWearableType::EType type, LLAvatarAppearance *avatarp);  	const std::string&			getName() const	{ return mName; }  	void						setName(const std::string& name) { mName = name; }  	const std::string&			getDescription() const { return mDescription; } @@ -81,36 +71,23 @@ public:  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 );  +	virtual void	writeToAvatar(LLAvatarAppearance* avatarp); -	BOOL				exportFile(LLFILE* file) const; -	BOOL				importFile(LLFILE* file); -	 -	void				setParamsToDefaults(); -	void				setTexturesToDefaults(); +	enum EImportResult +	{ +		FAILURE = 0, +		SUCCESS, +		BAD_HEADER +	}; +	virtual BOOL				exportFile(LLFILE* file) const; +	virtual EImportResult		importFile(LLFILE* file, LLAvatarAppearance* avatarp); -	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); +	virtual LLLocalTextureObject* getLocalTextureObject(S32 index) = 0;  	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; @@ -120,27 +97,15 @@ public:  	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 to be updated (e.g. worn/unworn). +	virtual void		setUpdated() const = 0; -	// Something happened that requires the wearable's label to be updated (e.g. worn/unworn). -	void				setLabelUpdated() const; +	// Update the baked texture hash. +	virtual void		addToBakedTextureHash(LLMD5& hash) const = 0; -	// 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();	 +protected: +	void			 	createVisualParams(LLAvatarAppearance *avatarp); +	void 				createLayers(S32 te, LLAvatarAppearance *avatarp);  	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. @@ -148,18 +113,17 @@ private:  	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 +	typedef std::map<S32, LLVisualParam *>    visual_param_index_map_t;  	visual_param_index_map_t mVisualParamIndexMap; +	typedef std::map<S32, LLLocalTextureObject*> te_map_t;  	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/llappearance/llwearabledata.cpp b/indra/llappearance/llwearabledata.cpp new file mode 100644 index 0000000000..d70bbf286a --- /dev/null +++ b/indra/llappearance/llwearabledata.cpp @@ -0,0 +1,353 @@ +/**  + * @file llwearabledata.cpp + * @brief LLWearableData 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 "linden_common.h" + +#include "llwearabledata.h" + +#include "llavatarappearance.h" +#include "llavatarappearancedefines.h" +#include "lldriverparam.h" +#include "llmd5.h" + +LLWearableData::LLWearableData() : +	mAvatarAppearance(NULL) +{ +} + +// virtual +LLWearableData::~LLWearableData() +{ +} + +using namespace LLAvatarAppearanceDefines; + +LLWearable* LLWearableData::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 LLWearableData::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable) +{ +	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->setUpdated(); +		const BOOL removed = FALSE; +		wearableUpdated(wearable, removed); +	} +} + +U32 LLWearableData::pushWearable(const LLWearableType::EType type,  +								   LLWearable *wearable, +								   bool trigger_updated /* = true */) +{ +	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); +		if (trigger_updated) +		{ +			const BOOL removed = FALSE; +			wearableUpdated(wearable, removed); +		} +		return mWearableDatas[type].size()-1; +	} +	return MAX_CLOTHING_PER_TYPE; +} + +// virtual +void LLWearableData::wearableUpdated(LLWearable *wearable, BOOL removed) +{ +	wearable->setUpdated(); +	if (!removed) +	{ +		pullCrossWearableValues(wearable->getType()); +	} +} + +void LLWearableData::popWearable(LLWearable *wearable) +{ +	if (wearable == NULL) +	{ +		// nothing to do here. move along. +		return; +	} + +	U32 index = getWearableIndex(wearable); +	const LLWearableType::EType type = wearable->getType(); + +	if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type)) +	{ +		popWearable(type, index); +	} +} + +void LLWearableData::popWearable(const LLWearableType::EType type, U32 index) +{ +	LLWearable *wearable = getWearable(type, index); +	if (wearable) +	{ +		mWearableDatas[type].erase(mWearableDatas[type].begin() + index); +		const BOOL removed = TRUE; +		wearableUpdated(wearable, removed); +	} +} + +void LLWearableData::clearWearableType(const LLWearableType::EType type) +{ +	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); +	if (wearable_iter == mWearableDatas.end()) +	{ +		return; +	} +	wearableentry_vec_t& wearable_vec = wearable_iter->second; +	wearable_vec.clear(); +} + +bool LLWearableData::swapWearables(const LLWearableType::EType type, U32 index_a, U32 index_b) +{ +	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); +	if (wearable_iter == mWearableDatas.end()) +	{ +		return false; +	} + +	wearableentry_vec_t& wearable_vec = wearable_iter->second; +	if (0 > index_a || index_a >= wearable_vec.size()) return false; +	if (0 > index_b || index_b >= wearable_vec.size()) return false; + +	LLWearable* wearable = wearable_vec[index_a]; +	wearable_vec[index_a] = wearable_vec[index_b]; +	wearable_vec[index_b] = wearable; +	return true; +} + +void LLWearableData::pullCrossWearableValues(const LLWearableType::EType type) +{ +	llassert(mAvatarAppearance); +	// scan through all of the avatar's visual parameters +	for (LLViewerVisualParam* param = (LLViewerVisualParam*) mAvatarAppearance->getFirstVisualParam();  +		 param; +		 param = (LLViewerVisualParam*) mAvatarAppearance->getNextVisualParam()) +	{ +		if( param ) +		{ +			LLDriverParam *driver_param = dynamic_cast<LLDriverParam*>(param); +			if(driver_param) +			{ +				// parameter is a driver parameter, have it update its cross-driven params +				driver_param->updateCrossDrivenParams(type); +			} +		} +	} +} + + +U32	LLWearableData::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; +		} +	} + +	return MAX_CLOTHING_PER_TYPE; +} + +BOOL LLWearableData::isOnTop(LLWearable* wearable) const +{ +	if (!wearable) return FALSE; +	const LLWearableType::EType type = wearable->getType(); +	return ( getTopWearable(type) == wearable ); +} + +const LLWearable* LLWearableData::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* LLWearableData::getTopWearable(const LLWearableType::EType type) +{ +	U32 count = getWearableCount(type); +	if ( count == 0) +	{ +		return NULL; +	} + +	return getWearable(type, count-1); +} + +const LLWearable* LLWearableData::getTopWearable(const LLWearableType::EType type) const +{ +	U32 count = getWearableCount(type); +	if ( count == 0) +	{ +		return NULL; +	} + +	return getWearable(type, count-1); +} + +LLWearable* LLWearableData::getBottomWearable(const LLWearableType::EType type) +{ +	if (getWearableCount(type) == 0) +	{ +		return NULL; +	} + +	return getWearable(type, 0); +} + +const LLWearable* LLWearableData::getBottomWearable(const LLWearableType::EType type) const +{ +	if (getWearableCount(type) == 0) +	{ +		return NULL; +	} + +	return getWearable(type, 0); +} + +U32 LLWearableData::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 LLWearableData::getWearableCount(const U32 tex_index) const +{ +	const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((LLAvatarAppearanceDefines::ETextureIndex)tex_index); +	return getWearableCount(wearable_type); +} + +LLUUID LLWearableData::computeBakedTextureHash(LLAvatarAppearanceDefines::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 +{ +	LLUUID hash_id; +	bool hash_computed = false; +	LLMD5 hash; +	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index); + +	for (U8 i=0; i < baked_dict->mWearables.size(); i++) +	{ +		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) +			{ +				wearable->addToBakedTextureHash(hash); +				hash_computed = true; +			} +		} +	} +	if (hash_computed) +	{ +		hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES); + +		if (!generate_valid_hash) +		{ +			invalidateBakedTextureHash(hash); +		} +		hash.finalize(); +		hash.raw_digest(hash_id.mData); +	} + +	return hash_id; +} + + diff --git a/indra/llappearance/llwearabledata.h b/indra/llappearance/llwearabledata.h new file mode 100644 index 0000000000..2931424131 --- /dev/null +++ b/indra/llappearance/llwearabledata.h @@ -0,0 +1,108 @@ +/**  + * @file llwearabledata.h + * @brief LLWearableData class header file + * + * $LicenseInfo:firstyear=20012license=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_WEARABLEDATA_H +#define LL_WEARABLEDATA_H + +#include "llavatarappearancedefines.h" +#include "llerror.h" + +class LLAvatarAppearance; + +class LLWearableData +{ +	// *TODO: Figure out why this is causing compile error. +	//LOG_CLASS(LLWearableData); + +	//-------------------------------------------------------------------- +	// Constructors / destructors / Initializers +	//-------------------------------------------------------------------- +public: +	LLWearableData(); +	virtual ~LLWearableData(); + +	void setAvatarAppearance(LLAvatarAppearance* appearance) { mAvatarAppearance = appearance; } + +protected: +	//-------------------------------------------------------------------- +	// Accessors +	//-------------------------------------------------------------------- +public: +	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); +	const LLWearable*	getTopWearable(const LLWearableType::EType type) const; +	LLWearable*			getBottomWearable(const LLWearableType::EType type); +	const LLWearable*	getBottomWearable(const LLWearableType::EType type) const; +	U32				getWearableCount(const LLWearableType::EType type) const; +	U32				getWearableCount(const U32 tex_index) const; +	U32				getWearableIndex(const LLWearable *wearable) const; + +	BOOL			isOnTop(LLWearable* wearable) const; + +	static const U32 MAX_CLOTHING_PER_TYPE = 5;  + +	//-------------------------------------------------------------------- +	// Setters +	//-------------------------------------------------------------------- +protected: +	// 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,  +								 bool trigger_updated = true); +	virtual void	wearableUpdated(LLWearable *wearable, BOOL removed); +	void 			popWearable(LLWearable *wearable); +	void			popWearable(const LLWearableType::EType type, U32 index); +	void			clearWearableType(const LLWearableType::EType type); +	bool			swapWearables(const LLWearableType::EType type, U32 index_a, U32 index_b); + +private: +	void			pullCrossWearableValues(const LLWearableType::EType type); + +	//-------------------------------------------------------------------- +	// Server Communication +	//-------------------------------------------------------------------- +public: +	LLUUID			computeBakedTextureHash(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index, +											BOOL generate_valid_hash = TRUE); +protected: +	virtual void	invalidateBakedTextureHash(LLMD5& hash) const {} + +	//-------------------------------------------------------------------- +	// Member variables +	//-------------------------------------------------------------------- +private: +	LLAvatarAppearance* mAvatarAppearance; +	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; + +}; + + + +#endif // LL_WEARABLEDATA_H + diff --git a/indra/newview/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp index c090ab5c3d..618e2a1941 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/llappearance/llwearabletype.cpp @@ -24,23 +24,35 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "llwearabletype.h" -#include "llinventoryfunctions.h" -#include "lltrans.h" +#include "llinventorytype.h" + +static LLTranslationBridge* sTrans = NULL; + +// static +void LLWearableType::initClass(LLTranslationBridge* trans) +{ +	sTrans = trans; +} + +void LLWearableType::cleanupClass() +{ +	delete sTrans; +}  struct WearableEntry : public LLDictionaryEntry  {  	WearableEntry(const std::string &name,  				  const std::string& default_new_name,  				  LLAssetType::EType assetType, -				  LLInventoryIcon::EIconName iconName, +				  LLInventoryType::EIconName iconName,  				  BOOL disable_camera_switch = FALSE,  				  BOOL allow_multiwear = TRUE) :  		LLDictionaryEntry(name),  		mAssetType(assetType),  		mDefaultNewName(default_new_name), -		mLabel(LLTrans::getString(name)), +		mLabel(sTrans->getString(name)),  		mIconName(iconName),  		mDisableCameraSwitch(disable_camera_switch),  		mAllowMultiwear(allow_multiwear) @@ -50,7 +62,7 @@ struct WearableEntry : public LLDictionaryEntry  	const LLAssetType::EType mAssetType;  	const std::string mLabel;  	const std::string mDefaultNewName; //keep mLabel for backward compatibility -	LLInventoryIcon::EIconName mIconName; +	LLInventoryType::EIconName mIconName;  	BOOL mDisableCameraSwitch;  	BOOL mAllowMultiwear;  }; @@ -64,26 +76,26 @@ public:  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)); +	addEntry(LLWearableType::WT_SHAPE,        new WearableEntry("shape",       "New Shape",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_SHAPE, FALSE, FALSE)); +	addEntry(LLWearableType::WT_SKIN,         new WearableEntry("skin",        "New Skin",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_SKIN, FALSE, FALSE)); +	addEntry(LLWearableType::WT_HAIR,         new WearableEntry("hair",        "New Hair",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_HAIR, FALSE, FALSE)); +	addEntry(LLWearableType::WT_EYES,         new WearableEntry("eyes",        "New Eyes",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_EYES, FALSE, FALSE)); +	addEntry(LLWearableType::WT_SHIRT,        new WearableEntry("shirt",       "New Shirt",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE)); +	addEntry(LLWearableType::WT_PANTS,        new WearableEntry("pants",       "New Pants",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_PANTS, FALSE, TRUE)); +	addEntry(LLWearableType::WT_SHOES,        new WearableEntry("shoes",       "New Shoes",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_SHOES, FALSE, TRUE)); +	addEntry(LLWearableType::WT_SOCKS,        new WearableEntry("socks",       "New Socks",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE)); +	addEntry(LLWearableType::WT_JACKET,       new WearableEntry("jacket",      "New Jacket",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_JACKET, FALSE, TRUE)); +	addEntry(LLWearableType::WT_GLOVES,       new WearableEntry("gloves",      "New Gloves",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE)); +	addEntry(LLWearableType::WT_UNDERSHIRT,   new WearableEntry("undershirt",  "New Undershirt",	LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE)); +	addEntry(LLWearableType::WT_UNDERPANTS,   new WearableEntry("underpants",  "New Underpants",	LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE)); +	addEntry(LLWearableType::WT_SKIRT,        new WearableEntry("skirt",       "New Skirt",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE)); +	addEntry(LLWearableType::WT_ALPHA,        new WearableEntry("alpha",       "New Alpha",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); +	addEntry(LLWearableType::WT_TATTOO,       new WearableEntry("tattoo",      "New Tattoo",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); + +	addEntry(LLWearableType::WT_PHYSICS,      new WearableEntry("physics",     "New Physics",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); + +	addEntry(LLWearableType::WT_INVALID,      new WearableEntry("invalid",     "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryType::ICONNAME_NONE, FALSE, FALSE)); +	addEntry(LLWearableType::WT_NONE,      	  new WearableEntry("none",        "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryType::ICONNAME_NONE, FALSE, FALSE));  }  // static @@ -131,7 +143,7 @@ LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type)  }  // static  -LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType type) +LLInventoryType::EIconName LLWearableType::getIconName(LLWearableType::EType type)  {  	const LLWearableDictionary *dict = LLWearableDictionary::getInstance();  	const WearableEntry *entry = dict->lookup(type); diff --git a/indra/newview/llwearabletype.h b/indra/llappearance/llwearabletype.h index d633b4807e..e51e6731d3 100644 --- a/indra/newview/llwearabletype.h +++ b/indra/llappearance/llwearabletype.h @@ -29,9 +29,16 @@  #include "llassettype.h"  #include "lldictionary.h" -#include "llinventoryicon.h" +#include "llinventorytype.h"  #include "llsingleton.h" +class LLTranslationBridge +{ +public: +	virtual std::string getString(const std::string &xml_desc) = 0; +}; + +  class LLWearableType  {  public:  @@ -59,12 +66,15 @@ public:  		WT_NONE		  = -1,  	}; +	static void			initClass(LLTranslationBridge* trans); // initializes static members +	static void			cleanupClass(); // initializes static members +  	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 LLInventoryType::EIconName 	getIconName(EType type);  	static BOOL 						getDisableCameraSwitch(EType type);  	static BOOL 						getAllowMultiwear(EType type); diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 632e5d46e3..24d2531106 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -88,6 +88,10 @@ list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES})  add_library (llaudio ${llaudio_SOURCE_FILES})  target_link_libraries(      llaudio +    ${LLCOMMON_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLVFS_LIBRARIES}      ${VORBISENC_LIBRARIES}      ${VORBISFILE_LIBRARIES}      ${VORBIS_LIBRARIES} diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt index a1712699eb..607cdf6d35 100644 --- a/indra/llcharacter/CMakeLists.txt +++ b/indra/llcharacter/CMakeLists.txt @@ -76,6 +76,15 @@ list(APPEND llcharacter_SOURCE_FILES ${llcharacter_HEADER_FILES})  add_library (llcharacter ${llcharacter_SOURCE_FILES}) +target_link_libraries( +    llcharacter +    ${LLCOMMON_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLVFS_LIBRARIES} +    ${LLXML_LIBRARIES} +    ) +  # Add tests  if (LL_TESTS) diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 0a6a8f9fa6..85cf1cd3f5 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -286,7 +286,7 @@ void LLCharacter::removeAnimationData(std::string name)  //-----------------------------------------------------------------------------  // setVisualParamWeight()  //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake) +BOOL LLCharacter::setVisualParamWeight(const LLVisualParam* which_param, F32 weight, BOOL upload_bake)  {  	S32 index = which_param->getID();  	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index); diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 3ebb2bffb0..5740dbce77 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -93,13 +93,6 @@ public:  	// get the height & normal of the ground under a point  	virtual void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm) = 0; -	// allocate an array of joints for the character skeleton -	// this must be overloaded to support joint subclasses, -	// and is called implicitly from buildSkeleton(). -	// Note this must handle reallocation as it will be called -	// each time buildSkeleton() is called. -	virtual BOOL allocateCharacterJoints( U32 num ) = 0; -  	// skeleton joint accessor to support joint subclasses  	virtual LLJoint *getCharacterJoint( U32 i ) = 0; @@ -197,7 +190,7 @@ public:  	void addVisualParam(LLVisualParam *param);  	void addSharedVisualParam(LLVisualParam *param); -	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 ); diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp index 19907933cb..09a7c11a22 100644 --- a/indra/llcharacter/lljoint.cpp +++ b/indra/llcharacter/lljoint.cpp @@ -40,7 +40,9 @@ S32 LLJoint::sNumTouches = 0;  // LLJoint()  // Class Constructor  //----------------------------------------------------------------------------- -LLJoint::LLJoint() + + +void LLJoint::init()  {  	mName = "unnamed";  	mParent = NULL; @@ -48,7 +50,20 @@ LLJoint::LLJoint()  	mXform.setScale(LLVector3(1.0f, 1.0f, 1.0f));  	mDirtyFlags = MATRIX_DIRTY | ROTATION_DIRTY | POSITION_DIRTY;  	mUpdateXform = TRUE; -	mJointNum = -1; +} + +LLJoint::LLJoint() : +	mJointNum(-1) +{ +	init(); +	touch(); +	mResetAfterRestoreOldXform = false; +} + +LLJoint::LLJoint(S32 joint_num) : +	mJointNum(joint_num) +{ +	init();  	touch();  	mResetAfterRestoreOldXform = false;  } @@ -58,15 +73,12 @@ LLJoint::LLJoint()  // LLJoint()  // Class Constructor  //----------------------------------------------------------------------------- -LLJoint::LLJoint(const std::string &name, LLJoint *parent) +LLJoint::LLJoint(const std::string &name, LLJoint *parent) : +	mJointNum(0)  { -	mName = "unnamed"; -	mParent = NULL; -	mXform.setScaleChildOffset(TRUE); -	mXform.setScale(LLVector3(1.0f, 1.0f, 1.0f)); -	mDirtyFlags = MATRIX_DIRTY | ROTATION_DIRTY | POSITION_DIRTY; +	init();  	mUpdateXform = FALSE; -	mJointNum = 0; +	// *TODO: mResetAfterRestoreOldXform is not initialized!!!  	setName(name);  	if (parent) diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h index dc3c58cf64..2b1e2005c6 100644 --- a/indra/llcharacter/lljoint.h +++ b/indra/llcharacter/lljoint.h @@ -105,10 +105,15 @@ public:  public:  	LLJoint(); +	LLJoint(S32 joint_num); +	// *TODO: Only used for LLVOAvatarSelf::mScreenp.  *DOES NOT INITIALIZE mResetAfterRestoreOldXform*  	LLJoint( const std::string &name, LLJoint *parent=NULL ); -  	virtual ~LLJoint(); +private: +	void init(); + +public:  	// set name and parent  	void setup( const std::string &name, LLJoint *parent=NULL ); @@ -178,7 +183,6 @@ public:  	virtual BOOL isAnimatable() const { return TRUE; }  	S32 getJointNum() const { return mJointNum; } -	void setJointNum(S32 joint_num) { mJointNum = joint_num; }  	void restoreOldXform( void );  	void restoreToDefaultXform( void ); diff --git a/indra/llcharacter/tests/lljoint_test.cpp b/indra/llcharacter/tests/lljoint_test.cpp index e92aa832d6..da151808f2 100644 --- a/indra/llcharacter/tests/lljoint_test.cpp +++ b/indra/llcharacter/tests/lljoint_test.cpp @@ -150,11 +150,11 @@ namespace tut  	template<> template<>  	void lljoint_object::test<11>()  	{ -		LLJoint lljoint("parent");  		S32 joint_num = 12; -		lljoint.setJointNum(joint_num); +		LLJoint lljoint(joint_num); +		lljoint.setName("parent");  		S32 jointNum = 	lljoint.getJointNum(); -		ensure("setJointNum()/getJointNum failed ", (jointNum == joint_num)); +		ensure("getJointNum failed ", (jointNum == joint_num));  	}  	template<> template<> diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index ea8c1a1107..706464a770 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -7,6 +7,8 @@ include(LLCommon)  include(LLImage)  include(LLMath)  include(LLVFS) +include(LLKDU) +include(LLImageJ2COJ)  include(ZLIB)  include(LLAddBuildTest)  include(Tut) @@ -56,8 +58,16 @@ list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES})  add_library (llimage ${llimage_SOURCE_FILES})  # Libraries on which this library depends, needed for Linux builds  # Sort by high-level to low-level +if (USE_KDU) +    target_link_libraries(llimage ${LLKDU_LIBRARIES}) +else (USE_KDU) +    target_link_libraries(llimage ${LLIMAGEJ2COJ_LIBRARIES}) +endif (USE_KDU) +  target_link_libraries(llimage -    llcommon +    ${LLVFS_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLCOMMON_LIBRARIES}      ${JPEG_LIBRARIES}      ${PNG_LIBRARIES}      ${ZLIB_LIBRARIES} diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index e45c809e7e..f2dd0b06f5 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -58,6 +58,12 @@ list(APPEND llinventory_SOURCE_FILES ${llinventory_HEADER_FILES})  add_library (llinventory ${llinventory_SOURCE_FILES}) +target_link_libraries(llinventory +    ${LLCOMMON_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLXML_LIBRARIES} +    )  #add unit tests diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index 4d1e0db040..078b773932 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -68,6 +68,53 @@ public:  		IT_NONE = -1  	}; +	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 +	}; + +  	// machine transation between type and strings  	static EType lookup(const std::string& name);  	static const std::string &lookup(EType type); diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt index bdac2eded7..b8f8b420c3 100644 --- a/indra/llkdu/CMakeLists.txt +++ b/indra/llkdu/CMakeLists.txt @@ -41,7 +41,10 @@ set_source_files_properties(${llkdu_HEADER_FILES}  list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES})  if (USE_KDU) -  add_library (${LLKDU_LIBRARIES} ${llkdu_SOURCE_FILES}) +  add_library (llkdu ${llkdu_SOURCE_FILES}) + +  target_link_libraries(llkdu +    ${KDU_LIBRARY})    # Add tests    if (LL_TESTS) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 5865ae030c..a06dea2e9a 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -99,6 +99,10 @@ list(APPEND llmath_SOURCE_FILES ${llmath_HEADER_FILES})  add_library (llmath ${llmath_SOURCE_FILES}) +target_link_libraries(llmath +    ${LLCOMMON_LIBRARIES} +    ) +  # Add tests  if (LL_TESTS)    include(LLAddBuildTest) diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index d98781e9e6..1a90c32fe4 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -218,6 +218,9 @@ add_library (llmessage ${llmessage_SOURCE_FILES})  target_link_libraries(    llmessage    ${CURL_LIBRARIES} +  ${LLCOMMON_LIBRARIES} +  ${LLVFS_LIBRARES} +  ${LLMATH_LIBRARIES}    ${CARES_LIBRARIES}    ${OPENSSL_LIBRARIES}    ${CRYPTO_LIBRARIES} @@ -243,7 +246,7 @@ if (LL_TESTS)      ${LLVFS_LIBRARIES}      ${LLMATH_LIBRARIES}      ${LLCOMMON_LIBRARIES} -      ${GOOGLEMOCK_LIBRARIES} +    ${GOOGLEMOCK_LIBRARIES}      )    LL_ADD_INTEGRATION_TEST( diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index e4d9de7eb6..cf01e10577 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -59,6 +59,15 @@ list(APPEND llprimitive_SOURCE_FILES ${llprimitive_HEADER_FILES})  add_library (llprimitive ${llprimitive_SOURCE_FILES}) +target_link_libraries(llprimitive +    ${LLCOMMON_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLXML_LIBRARIES} +    ${LLPHYSICSEXTENSIONS_LIBRARIES} +    ) + +  #add unit tests  if (LL_TESTS)      INCLUDE(LLAddBuildTest) diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 516af93316..d47129a67b 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -34,12 +34,15 @@ set(llrender_SOURCE_FILES      llfontregistry.cpp      llgldbg.cpp      llglslshader.cpp +    llgltexture.cpp      llimagegl.cpp      llpostprocess.cpp +    llrender2dutils.cpp      llrendernavprim.cpp      llrendersphere.cpp      llshadermgr.cpp      lltexture.cpp +    lluiimage.cpp      llvertexbuffer.cpp      ) @@ -56,14 +59,17 @@ set(llrender_HEADER_FILES      llglheaders.h      llglslshader.h      llglstates.h +    llgltexture.h      llgltypes.h      llimagegl.h      llpostprocess.h      llrender.h +    llrender2dutils.h      llrendernavprim.h      llrendersphere.h      llshadermgr.h      lltexture.h +    lluiimage.h      llvertexbuffer.h      ) @@ -99,6 +105,13 @@ add_library (llrender ${llrender_SOURCE_FILES})  # Libraries on which this library depends, needed for Linux builds  # Sort by high-level to low-level  target_link_libraries(llrender  -    llimage  +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLIMAGE_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLRENDER_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${LLXML_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${LLWINDOW_LIBRARIES}      ${FREETYPE_LIBRARIES}      ${OPENGL_LIBRARIES}) diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 5c68cb46eb..cf21101e35 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -159,6 +159,8 @@ public:  extern LLGLSLShader			gUIProgram;  //output vec4(color.rgb,color.a*tex0[tc0].a)  extern LLGLSLShader			gSolidColorProgram; +//Alpha mask shader (declared here so llappearance can access properly) +extern LLGLSLShader			gAlphaMaskProgram;  #endif diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp new file mode 100644 index 0000000000..d06ed5e57b --- /dev/null +++ b/indra/llrender/llgltexture.cpp @@ -0,0 +1,396 @@ +/**  + * @file llgltexture.cpp + * @brief Opengl texture implementation + * + * $LicenseInfo:firstyear=2000&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 "linden_common.h" +#include "llgltexture.h" + + +// static +S32 LLGLTexture::getTotalNumOfCategories()  +{ +	return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; +} + +// static +//index starts from zero. +S32 LLGLTexture::getIndexFromCategory(S32 category)  +{ +	return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ; +} + +//static  +S32 LLGLTexture::getCategoryFromIndex(S32 index) +{ +	return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ; +} + +LLGLTexture::LLGLTexture(BOOL usemipmaps) +{ +	init(); +	mUseMipMaps = usemipmaps; +} + +LLGLTexture::LLGLTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) +{ +	init(); +	mFullWidth = width ; +	mFullHeight = height ; +	mUseMipMaps = usemipmaps; +	mComponents = components ; +	setTexelsPerImage(); +} + +LLGLTexture::LLGLTexture(const LLImageRaw* raw, BOOL usemipmaps) +{ +	init(); +	mUseMipMaps = usemipmaps ; +	// Create an empty image of the specified size and width +	mGLTexturep = new LLImageGL(raw, usemipmaps) ; +} + +LLGLTexture::~LLGLTexture() +{ +	cleanup(); +} + +void LLGLTexture::init() +{ +	mBoostLevel = LLGLTexture::BOOST_NONE; + +	mFullWidth = 0; +	mFullHeight = 0; +	mTexelsPerImage = 0 ; +	mUseMipMaps = FALSE ; +	mComponents = 0 ; + +	mTextureState = NO_DELETE ; +	mDontDiscard = FALSE; +	mNeedsGLTexture = FALSE ; +} + +void LLGLTexture::cleanup() +{ +	if(mGLTexturep) +	{ +		mGLTexturep->cleanup(); +	} +} + +// virtual +void LLGLTexture::dump() +{ +	if(mGLTexturep) +	{ +		mGLTexturep->dump(); +	} +} + +void LLGLTexture::setBoostLevel(S32 level) +{ +	if(mBoostLevel != level) +	{ +		mBoostLevel = level ; +		if(mBoostLevel != LLGLTexture::BOOST_NONE) +		{ +			setNoDelete() ;		 +		} +	} +} + +void LLGLTexture::forceActive() +{ +	mTextureState = ACTIVE ;  +} + +void LLGLTexture::setActive()  +{  +	if(mTextureState != NO_DELETE) +	{ +		mTextureState = ACTIVE ;  +	} +} + +//set the texture to stay in memory +void LLGLTexture::setNoDelete()  +{  +	mTextureState = NO_DELETE ; +} + +void LLGLTexture::generateGLTexture()  +{	 +	if(mGLTexturep.isNull()) +	{ +		mGLTexturep = new LLImageGL(mFullWidth, mFullHeight, mComponents, mUseMipMaps) ; +	} +} + +LLImageGL* LLGLTexture::getGLTexture() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep ; +} + +BOOL LLGLTexture::createGLTexture()  +{ +	if(mGLTexturep.isNull()) +	{ +		generateGLTexture() ; +	} + +	return mGLTexturep->createGLTexture() ; +} + +BOOL LLGLTexture::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 ; +} + +void LLGLTexture::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 LLGLTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode) +{ +	llassert(mGLTexturep.notNull()) ; +	mGLTexturep->setAddressMode(mode) ; +} +void LLGLTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option) +{ +	llassert(mGLTexturep.notNull()) ; +	mGLTexturep->setFilteringOption(option) ; +} + +//virtual +S32	LLGLTexture::getWidth(S32 discard_level) const +{ +	llassert(mGLTexturep.notNull()) ; +	return mGLTexturep->getWidth(discard_level) ; +} + +//virtual +S32	LLGLTexture::getHeight(S32 discard_level) const +{ +	llassert(mGLTexturep.notNull()) ; +	return mGLTexturep->getHeight(discard_level) ; +} + +S32 LLGLTexture::getMaxDiscardLevel() const +{ +	llassert(mGLTexturep.notNull()) ; +	return mGLTexturep->getMaxDiscardLevel() ; +} +S32 LLGLTexture::getDiscardLevel() const +{ +	llassert(mGLTexturep.notNull()) ; +	return mGLTexturep->getDiscardLevel() ; +} +S8  LLGLTexture::getComponents() const  +{  +	llassert(mGLTexturep.notNull()) ; +	 +	return mGLTexturep->getComponents() ; +} + +LLGLuint LLGLTexture::getTexName() const  +{  +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getTexName() ;  +} + +BOOL LLGLTexture::hasGLTexture() const  +{ +	if(mGLTexturep.notNull()) +	{ +		return mGLTexturep->getHasGLTexture() ; +	} +	return FALSE ; +} + +BOOL LLGLTexture::getBoundRecently() const +{ +	if(mGLTexturep.notNull()) +	{ +		return mGLTexturep->getBoundRecently() ; +	} +	return FALSE ; +} + +LLTexUnit::eTextureType LLGLTexture::getTarget(void) const +{ +	llassert(mGLTexturep.notNull()) ; +	return mGLTexturep->getTarget() ; +} + +BOOL LLGLTexture::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 LLGLTexture::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 LLGLTexture::setGLTextureCreated (bool initialized) +{ +	llassert(mGLTexturep.notNull()) ; + +	mGLTexturep->setGLTextureCreated (initialized) ; +} + +void  LLGLTexture::setCategory(S32 category)  +{ +	llassert(mGLTexturep.notNull()) ; + +	mGLTexturep->setCategory(category) ; +} + +LLTexUnit::eTextureAddressMode LLGLTexture::getAddressMode(void) const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getAddressMode() ; +} + +S32 LLGLTexture::getTextureMemory() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->mTextureMemory ; +} + +LLGLenum LLGLTexture::getPrimaryFormat() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getPrimaryFormat() ; +} + +BOOL LLGLTexture::getIsAlphaMask() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getIsAlphaMask() ; +} + +BOOL LLGLTexture::getMask(const LLVector2 &tc) +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getMask(tc) ; +} + +F32 LLGLTexture::getTimePassedSinceLastBound() +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getTimePassedSinceLastBound() ; +} +BOOL LLGLTexture::getMissed() const  +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getMissed() ; +} + +BOOL LLGLTexture::isJustBound() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->isJustBound() ; +} + +void LLGLTexture::forceUpdateBindStats(void) const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->forceUpdateBindStats() ; +} + +U32 LLGLTexture::getTexelsInAtlas() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getTexelsInAtlas() ; +} + +U32 LLGLTexture::getTexelsInGLTexture() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getTexelsInGLTexture() ; +} + +BOOL LLGLTexture::isGLTextureCreated() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->isGLTextureCreated() ; +} + +S32  LLGLTexture::getDiscardLevelInAtlas() const +{ +	llassert(mGLTexturep.notNull()) ; + +	return mGLTexturep->getDiscardLevelInAtlas() ; +} + +void LLGLTexture::destroyGLTexture()  +{ +	if(mGLTexturep.notNull() && mGLTexturep->getHasGLTexture()) +	{ +		mGLTexturep->destroyGLTexture() ; +		mTextureState = DELETED ; +	} +} + +void LLGLTexture::setTexelsPerImage() +{ +	S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); +	S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); +	mTexelsPerImage = (F32)fullwidth * fullheight; +} + + diff --git a/indra/llrender/llgltexture.h b/indra/llrender/llgltexture.h new file mode 100644 index 0000000000..b1efe77519 --- /dev/null +++ b/indra/llrender/llgltexture.h @@ -0,0 +1,196 @@ +/**  + * @file llglviewertexture.h + * @brief Object for managing opengl textures + * + * $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_GL_TEXTURE_H +#define LL_GL_TEXTURE_H + +#include "lltexture.h" +#include "llgl.h" + +class LLImageRaw; + +// +//this the parent for the class LLViewerTexture +//through the following virtual functions, the class LLViewerTexture can be reached from /llrender. +// +class LLGLTexture : public LLTexture +{ +public: +	enum +	{ +		MAX_IMAGE_SIZE_DEFAULT = 1024, +		INVALID_DISCARD_LEVEL = 0x7fff +	}; + +	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) ; + +protected: +	virtual ~LLGLTexture(); +	LOG_CLASS(LLGLTexture); + +public: +	LLGLTexture(BOOL usemipmaps = TRUE); +	LLGLTexture(const LLImageRaw* raw, BOOL usemipmaps) ; +	LLGLTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) ; + +	virtual void dump();	// debug info to llinfos + +	virtual const LLUUID& getID() const = 0; + +	void setBoostLevel(S32 level); +	S32  getBoostLevel() { return mBoostLevel; } + +	S32 getFullWidth() const { return mFullWidth; } +	S32 getFullHeight() const { return mFullHeight; }	 + +	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 = LLGLTexture::OTHER); + +	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; } +	//-----------------	 + +private: +	void cleanup(); +	void init(); + +protected: +	void setTexelsPerImage(); + +	//note: do not make this function public. +	/*virtual*/ LLImageGL* getGLTexture() const ; + +protected: +	S32 mBoostLevel;				// enum describing priority level +	S32 mFullWidth; +	S32 mFullHeight; +	BOOL mUseMipMaps; +	S8  mComponents; +	F32 mTexelsPerImage;			// Texels per image. +	mutable S8  mNeedsGLTexture; + +	//GL texture +	LLPointer<LLImageGL> mGLTexturep ; +	S8 mDontDiscard;			// Keep full res version of this image (for UI, etc) + +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 ; + + +}; + +#endif // LL_GL_TEXTURE_H + diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp new file mode 100644 index 0000000000..b2679176be --- /dev/null +++ b/indra/llrender/llrender2dutils.cpp @@ -0,0 +1,1621 @@ +/**  + * @file llrender2dutils.cpp + * @brief GL function implementations for immediate-mode gl drawing. + * + * $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 "linden_common.h" + +// Linden library includes +#include "v2math.h" +#include "m3math.h" +#include "v4color.h" +#include "llfontgl.h" +#include "llrender.h" +#include "llrect.h" +#include "llgl.h" +#include "lltexture.h" + +// Project includes +#include "llrender2dutils.h" +#include "lluiimage.h" + + +// +// Globals +// +const LLColor4 UI_VERTEX_COLOR(1.f, 1.f, 1.f, 1.f); +/*static*/ LLVector2		LLRender2D::sGLScaleFactor(1.f, 1.f); +/*static*/ LLImageProviderInterface* LLRender2D::sImageProvider = NULL; + +// +// Functions +// + +BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom) +{ +	if (x < left || right < x) return FALSE; +	if (y < bottom || top < y) return FALSE; +	return TRUE; +} + + +// Puts GL into 2D drawing mode by turning off lighting, setting to an +// orthographic projection, etc. +void gl_state_for_2d(S32 width, S32 height) +{ +	stop_glerror(); +	F32 window_width = (F32) width;//gViewerWindow->getWindowWidth(); +	F32 window_height = (F32) height;//gViewerWindow->getWindowHeight(); + +	gGL.matrixMode(LLRender::MM_PROJECTION); +	gGL.loadIdentity(); +	gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f); +	gGL.matrixMode(LLRender::MM_MODELVIEW); +	gGL.loadIdentity(); +	stop_glerror(); +} + + +void gl_draw_x(const LLRect& rect, const LLColor4& color) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv( color.mV ); + +	gGL.begin( LLRender::LINES ); +		gGL.vertex2i( rect.mLeft,		rect.mTop ); +		gGL.vertex2i( rect.mRight,	rect.mBottom ); +		gGL.vertex2i( rect.mLeft,		rect.mBottom ); +		gGL.vertex2i( rect.mRight,	rect.mTop ); +	gGL.end(); +} + + +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset, BOOL filled) +{ +	gGL.color4fv(color.mV); +	gl_rect_2d_offset_local(left, top, right, bottom, pixel_offset, filled); +} + +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled) +{ +	gGL.pushUIMatrix(); +	left += LLFontGL::sCurOrigin.mX; +	right += LLFontGL::sCurOrigin.mX; +	bottom += LLFontGL::sCurOrigin.mY; +	top += LLFontGL::sCurOrigin.mY; + +	gGL.loadUIIdentity(); +	gl_rect_2d(llfloor((F32)left * LLRender2D::sGLScaleFactor.mV[VX]) - pixel_offset, +				llfloor((F32)top * LLRender2D::sGLScaleFactor.mV[VY]) + pixel_offset, +				llfloor((F32)right * LLRender2D::sGLScaleFactor.mV[VX]) + pixel_offset, +				llfloor((F32)bottom * LLRender2D::sGLScaleFactor.mV[VY]) - pixel_offset, +				filled); +	gGL.popUIMatrix(); +} + + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) +{ +	stop_glerror(); +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	// Counterclockwise quad will face the viewer +	if( filled ) +	{  +		gGL.begin( LLRender::QUADS ); +			gGL.vertex2i(left, top); +			gGL.vertex2i(left, bottom); +			gGL.vertex2i(right, bottom); +			gGL.vertex2i(right, top); +		gGL.end(); +	} +	else +	{ +		if( gGLManager.mATIOffsetVerticalLines ) +		{ +			// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +			gGL.begin( LLRender::LINES ); + +				// Verticals  +				gGL.vertex2i(left + 1, top); +				gGL.vertex2i(left + 1, bottom); + +				gGL.vertex2i(right, bottom); +				gGL.vertex2i(right, top); + +				// Horizontals +				top--; +				right--; +				gGL.vertex2i(left, bottom); +				gGL.vertex2i(right, bottom); + +				gGL.vertex2i(left, top); +				gGL.vertex2i(right, top); +			gGL.end(); +		} +		else +		{ +			top--; +			right--; +			gGL.begin( LLRender::LINE_STRIP ); +				gGL.vertex2i(left, top); +				gGL.vertex2i(left, bottom); +				gGL.vertex2i(right, bottom); +				gGL.vertex2i(right, top); +				gGL.vertex2i(left, top); +			gGL.end(); +		} +	} +	stop_glerror(); +} + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled ) +{ +	gGL.color4fv( color.mV ); +	gl_rect_2d( left, top, right, bottom, filled ); +} + + +void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled ) +{ +	gGL.color4fv( color.mV ); +	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); +} + +// Given a rectangle on the screen, draws a drop shadow _outside_ +// the right and bottom edges of it.  Along the right it has width "lines" +// and along the bottom it has height "lines". +void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines) +{ +	stop_glerror(); +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	 +	// HACK: Overlap with the rectangle by a single pixel. +	right--; +	bottom++; +	lines++; + +	LLColor4 end_color = start_color; +	end_color.mV[VALPHA] = 0.f; + +	gGL.begin(LLRender::QUADS); + +	// Right edge, CCW faces screen +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		top-lines); +	gGL.vertex2i(right,		bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(right+lines, bottom); +	gGL.vertex2i(right+lines, top-lines); + +	// Bottom edge, CCW faces screen +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		bottom); +	gGL.vertex2i(left+lines,	bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(left+lines,	bottom-lines); +	gGL.vertex2i(right,		bottom-lines); + +	// bottom left Corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(left+lines,	bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(left,		bottom); +	// make the bottom left corner not sharp +	gGL.vertex2i(left+1,		bottom-lines+1); +	gGL.vertex2i(left+lines,	bottom-lines); + +	// bottom right corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(right,		bottom-lines); +	// make the rightmost corner not sharp +	gGL.vertex2i(right+lines-1,	bottom-lines+1); +	gGL.vertex2i(right+lines,	bottom); + +	// top right corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i( right,			top-lines ); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i( right+lines,	top-lines ); +	// make the corner not sharp +	gGL.vertex2i( right+lines-1,	top-1 ); +	gGL.vertex2i( right,			top ); + +	gGL.end(); +	stop_glerror(); +} + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 ) +{ +	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) +	{ +		x1++; +		x2++; +		y1++; +		y2++; +	} + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	 +	gGL.begin(LLRender::LINES); +		gGL.vertex2i(x1, y1); +		gGL.vertex2i(x2, y2); +	gGL.end(); +} + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ) +{ +	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) +	{ +		x1++; +		x2++; +		y1++; +		y2++; +	} + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv( color.mV ); + +	gGL.begin(LLRender::LINES); +		gGL.vertex2i(x1, y1); +		gGL.vertex2i(x2, y2); +	gGL.end(); +} + +void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv(color.mV); + +	if (filled) +	{ +		gGL.begin(LLRender::TRIANGLES); +	} +	else +	{ +		gGL.begin(LLRender::LINE_LOOP); +	} +	gGL.vertex2i(x1, y1); +	gGL.vertex2i(x2, y2); +	gGL.vertex2i(x3, y3); +	gGL.end(); +} + +void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	length = llmin((S32)(max_frac*(right - left)), length); +	length = llmin((S32)(max_frac*(top - bottom)), length); +	gGL.begin(LLRender::LINES); +	gGL.vertex2i(left, top); +	gGL.vertex2i(left + length, top); +	 +	gGL.vertex2i(left, top); +	gGL.vertex2i(left, top - length); + +	gGL.vertex2i(left, bottom); +	gGL.vertex2i(left + length, bottom); +	 +	gGL.vertex2i(left, bottom); +	gGL.vertex2i(left, bottom + length); + +	gGL.vertex2i(right, top); +	gGL.vertex2i(right - length, top); + +	gGL.vertex2i(right, top); +	gGL.vertex2i(right, top - length); + +	gGL.vertex2i(right, bottom); +	gGL.vertex2i(right - length, bottom); + +	gGL.vertex2i(right, bottom); +	gGL.vertex2i(right, bottom + length); +	gGL.end(); +} + + +void gl_draw_image( S32 x, S32 y, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect ) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} +	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color, uv_rect ); +} + +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} +	gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect ); +} + +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	// scale screen size of borders down +	F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0); +	F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0); + +	LLRectf scale_rect(border_width_fraction, 1.f - border_height_fraction, 1.f - border_width_fraction, border_height_fraction); +	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect); +} + +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect) +{ +	stop_glerror(); + +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	// add in offset of current image to current UI translation +	const LLVector3 ui_scale = gGL.getUIScale(); +	const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale); + +	F32 uv_width = uv_outer_rect.getWidth(); +	F32 uv_height = uv_outer_rect.getHeight(); + +	// shrink scaling region to be proportional to clipped image region +	LLRectf uv_center_rect( +		uv_outer_rect.mLeft + (center_rect.mLeft * uv_width), +		uv_outer_rect.mBottom + (center_rect.mTop * uv_height), +		uv_outer_rect.mLeft + (center_rect.mRight * uv_width), +		uv_outer_rect.mBottom + (center_rect.mBottom * uv_height)); + +	F32 image_width = image->getWidth(0); +	F32 image_height = image->getHeight(0); + +	S32 image_natural_width = llround(image_width * uv_width); +	S32 image_natural_height = llround(image_height * uv_height); + +	LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width, +								uv_center_rect.mTop * image_height, +								uv_center_rect.mRight * image_width, +								uv_center_rect.mBottom * image_height); + +	{	// scale fixed region of image to drawn region +		draw_center_rect.mRight += width - image_natural_width; +		draw_center_rect.mTop += height - image_natural_height; + +		F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight); +		F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop); + +		F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth())); +		F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight())); + +		F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio); + +		draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]); +		draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]); +		draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]); +		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]); +	} + +	LLRectf draw_outer_rect(ui_translation.mV[VX],  +							ui_translation.mV[VY] + height * ui_scale.mV[VY],  +							ui_translation.mV[VX] + width * ui_scale.mV[VX],  +							ui_translation.mV[VY]); + +	LLGLSUIDefault gls_ui; +	 +	if (solid_color) +	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gSolidColorProgram.bind(); +		} +		else +		{ +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); +		} +	} + +	gGL.getTexUnit(0)->bind(image, true); + +	gGL.color4fv(color.mV); +	 +	const S32 NUM_VERTICES = 9 * 4; // 9 quads +	LLVector2 uv[NUM_VERTICES]; +	LLVector3 pos[NUM_VERTICES]; + +	S32 index = 0; + +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw bottom middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw bottom right +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw left  +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		// draw middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		// draw right  +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		// draw top left +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		// draw top middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		// draw top right +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); +	} +	gGL.end(); + +	if (solid_color) +	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.bind(); +		} +		else +		{ +			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		} +	} +} + +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color, uv_rect ); +} + +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	LLGLSUIDefault gls_ui; + + +	gGL.getTexUnit(0)->bind(image, true); + +	gGL.color4fv(color.mV); + +	if (degrees == 0.f) +	{ +		const S32 NUM_VERTICES = 4; // 9 quads +		LLVector2 uv[NUM_VERTICES]; +		LLVector3 pos[NUM_VERTICES]; + +		gGL.begin(LLRender::QUADS); +		{ +			LLVector3 ui_scale = gGL.getUIScale(); +			LLVector3 ui_translation = gGL.getUITranslation(); +			ui_translation.mV[VX] += x; +			ui_translation.mV[VY] += y; +			ui_translation.scaleVec(ui_scale); +			S32 index = 0; +			S32 scaled_width = llround(width * ui_scale.mV[VX]); +			S32 scaled_height = llround(height * ui_scale.mV[VY]); + +			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); +			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); +			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); +			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); +			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f); +			index++; + +			gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); +		} +		gGL.end(); +	} +	else +	{ +		gGL.pushUIMatrix(); +		gGL.translateUI((F32)x, (F32)y, 0.f); +	 +		F32 offset_x = F32(width/2); +		F32 offset_y = F32(height/2); + +		gGL.translateUI(offset_x, offset_y, 0.f); + +		LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD); +		 +		gGL.getTexUnit(0)->bind(image, true); + +		gGL.color4fv(color.mV); +		 +		gGL.begin(LLRender::QUADS); +		{ +			LLVector3 v; + +			v = LLVector3(offset_x, offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); +			gGL.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(-offset_x, offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); +			gGL.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(-offset_x, -offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); +			gGL.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(offset_x, -offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); +			gGL.vertex2f(v.mV[0], v.mV[1] ); +		} +		gGL.end(); +		gGL.popUIMatrix(); +	} +} + + +void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase ) +{ +	phase = fmod(phase, 1.f); + +	S32 shift = S32(phase * 4.f) % 4; + +	// Stippled line +	LLGLEnable stipple(GL_LINE_STIPPLE); +	 +	gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]); + +	gGL.flush(); +	glLineWidth(2.5f); + +	if (!LLGLSLShader::sNoFixedFunction) +	{ +		glLineStipple(2, 0x3333 << shift); +	} + +	gGL.begin(LLRender::LINES); +	{ +		gGL.vertex3fv( start.mV ); +		gGL.vertex3fv( end.mV ); +	} +	gGL.end(); + +	LLRender2D::setLineWidth(1.f); +} + +void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle) +{ +	if (end_angle < start_angle) +	{ +		end_angle += F_TWO_PI; +	} + +	gGL.pushUIMatrix(); +	{ +		gGL.translateUI(center_x, center_y, 0.f); + +		// Inexact, but reasonably fast. +		F32 delta = (end_angle - start_angle) / steps; +		F32 sin_delta = sin( delta ); +		F32 cos_delta = cos( delta ); +		F32 x = cosf(start_angle) * radius; +		F32 y = sinf(start_angle) * radius; + +		if (filled) +		{ +			gGL.begin(LLRender::TRIANGLE_FAN); +			gGL.vertex2f(0.f, 0.f); +			// make sure circle is complete +			steps += 1; +		} +		else +		{ +			gGL.begin(LLRender::LINE_STRIP); +		} + +		while( steps-- ) +		{ +			// Successive rotations +			gGL.vertex2f( x, y ); +			F32 x_new = x * cos_delta - y * sin_delta; +			y = x * sin_delta +  y * cos_delta; +			x = x_new; +		} +		gGL.end(); +	} +	gGL.popUIMatrix(); +} + +void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled) +{ +	gGL.pushUIMatrix(); +	{ +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.translateUI(center_x, center_y, 0.f); + +		// Inexact, but reasonably fast. +		F32 delta = F_TWO_PI / steps; +		F32 sin_delta = sin( delta ); +		F32 cos_delta = cos( delta ); +		F32 x = radius; +		F32 y = 0.f; + +		if (filled) +		{ +			gGL.begin(LLRender::TRIANGLE_FAN); +			gGL.vertex2f(0.f, 0.f); +			// make sure circle is complete +			steps += 1; +		} +		else +		{ +			gGL.begin(LLRender::LINE_LOOP); +		} + +		while( steps-- ) +		{ +			// Successive rotations +			gGL.vertex2f( x, y ); +			F32 x_new = x * cos_delta - y * sin_delta; +			y = x * sin_delta +  y * cos_delta; +			x = x_new; +		} +		gGL.end(); +	} +	gGL.popUIMatrix(); +} + +// Renders a ring with sides (tube shape) +void gl_deep_circle( F32 radius, F32 depth, S32 steps ) +{ +	F32 x = radius; +	F32 y = 0.f; +	F32 angle_delta = F_TWO_PI / (F32)steps; +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		S32 step = steps + 1; // An extra step to close the circle. +		while( step-- ) +		{ +			gGL.vertex3f( x, y, depth ); +			gGL.vertex3f( x, y, 0.f ); + +			F32 x_new = x * cosf(angle_delta) - y * sinf(angle_delta); +			y = x * sinf(angle_delta) +  y * cosf(angle_delta); +			x = x_new; +		} +	} +	gGL.end(); +} + +void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ) +{ +	gGL.pushUIMatrix(); +	{ +		gGL.translateUI(0.f, 0.f, -width / 2); +		if( render_center ) +		{ +			gGL.color4fv(center_color.mV); +			gGL.diffuseColor4fv(center_color.mV); +			gl_deep_circle( radius, width, steps ); +		} +		else +		{ +			gGL.diffuseColor4fv(side_color.mV); +			gl_washer_2d(radius, radius - width, steps, side_color, side_color); +			gGL.translateUI(0.f, 0.f, width); +			gl_washer_2d(radius - width, radius, steps, side_color, side_color); +		} +	} +	gGL.popUIMatrix(); +} + +// Draw gray and white checkerboard with black border +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha) +{ +	if (!LLGLSLShader::sNoFixedFunction) +	{  +		// Initialize the first time this is called. +		const S32 PIXELS = 32; +		static GLubyte checkerboard[PIXELS * PIXELS]; +		static BOOL first = TRUE; +		if( first ) +		{ +			for( S32 i = 0; i < PIXELS; i++ ) +			{ +				for( S32 j = 0; j < PIXELS; j++ ) +				{ +					checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF; +				} +			} +			first = FALSE; +		} +	 +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +		// ...white squares +		gGL.color4f( 1.f, 1.f, 1.f, alpha ); +		gl_rect_2d(rect); + +		// ...gray squares +		gGL.color4f( .7f, .7f, .7f, alpha ); +		gGL.flush(); + +		glPolygonStipple( checkerboard ); + +		LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE); +		gl_rect_2d(rect); +	} +	else +	{ //polygon stipple is deprecated, use "Checker" texture +		LLPointer<LLUIImage> img = LLRender2D::getUIImage("Checker"); +		gGL.getTexUnit(0)->bind(img->getImage()); +		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); +		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + +		LLColor4 color(1.f, 1.f, 1.f, alpha); +		LLRectf uv_rect(0, 0, rect.getWidth()/32.f, rect.getHeight()/32.f); + +		gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), +			img->getImage(), color, uv_rect); +	} +	 +	gGL.flush(); +} + + +// Draws the area between two concentric circles, like +// a doughnut or washer. +void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) +{ +	const F32 DELTA = F_TWO_PI / steps; +	const F32 SIN_DELTA = sin( DELTA ); +	const F32 COS_DELTA = cos( DELTA ); + +	F32 x1 = outer_radius; +	F32 y1 = 0.f; +	F32 x2 = inner_radius; +	F32 y2 = 0.f; + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		steps += 1; // An extra step to close the circle. +		while( steps-- ) +		{ +			gGL.color4fv(outer_color.mV); +			gGL.vertex2f( x1, y1 ); +			gGL.color4fv(inner_color.mV); +			gGL.vertex2f( x2, y2 ); + +			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; +			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; +			x1 = x1_new; + +			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; +			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; +			x2 = x2_new; +		} +	} +	gGL.end(); +} + +// Draws the area between two concentric circles, like +// a doughnut or washer. +void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) +{ +	const F32 DELTA = (end_radians - start_radians) / steps; +	const F32 SIN_DELTA = sin( DELTA ); +	const F32 COS_DELTA = cos( DELTA ); + +	F32 x1 = outer_radius * cos( start_radians ); +	F32 y1 = outer_radius * sin( start_radians ); +	F32 x2 = inner_radius * cos( start_radians ); +	F32 y2 = inner_radius * sin( start_radians ); + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		steps += 1; // An extra step to close the circle. +		while( steps-- ) +		{ +			gGL.color4fv(outer_color.mV); +			gGL.vertex2f( x1, y1 ); +			gGL.color4fv(inner_color.mV); +			gGL.vertex2f( x2, y2 ); + +			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; +			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; +			x1 = x1_new; + +			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; +			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; +			x2 = x2_new; +		} +	} +	gGL.end(); +} + +void gl_rect_2d_simple_tex( S32 width, S32 height ) +{ +	gGL.begin( LLRender::QUADS ); + +		gGL.texCoord2f(1.f, 1.f); +		gGL.vertex2i(width, height); + +		gGL.texCoord2f(0.f, 1.f); +		gGL.vertex2i(0, height); + +		gGL.texCoord2f(0.f, 0.f); +		gGL.vertex2i(0, 0); + +		gGL.texCoord2f(1.f, 0.f); +		gGL.vertex2i(width, 0); +	 +	gGL.end(); +} + +void gl_rect_2d_simple( S32 width, S32 height ) +{ +	gGL.begin( LLRender::QUADS ); +		gGL.vertex2i(width, height); +		gGL.vertex2i(0, height); +		gGL.vertex2i(0, 0); +		gGL.vertex2i(width, 0); +	gGL.end(); +} + +void gl_segmented_rect_2d_tex(const S32 left,  +							  const S32 top,  +							  const S32 right,  +							  const S32 bottom,  +							  const S32 texture_width,  +							  const S32 texture_height,  +							  const S32 border_size,  +							  const U32 edges) +{ +	S32 width = llabs(right - left); +	S32 height = llabs(top - bottom); + +	gGL.pushUIMatrix(); + +	gGL.translateUI((F32)left, (F32)bottom, 0.f); +	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); + +	if (border_uv_scale.mV[VX] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; +	} +	if (border_uv_scale.mV[VY] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; +	} + +	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); +	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 width_vec((F32)width, 0.f); +	LLVector2 height_vec(0.f, (F32)height); + +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		gGL.texCoord2f(0.f, 0.f); +		gGL.vertex2f(0.f, 0.f); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv(border_width_left.mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv(border_height_bottom.mV); + +		// draw bottom middle +		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv(border_width_left.mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv((width_vec - border_width_right).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		// draw bottom right +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv((width_vec - border_width_right).mV); + +		gGL.texCoord2f(1.f, 0.f); +		gGL.vertex2fv(width_vec.mV); + +		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		// draw left  +		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv(border_height_bottom.mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((height_vec - border_height_top).mV); + +		// draw middle +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		// draw right  +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + border_height_bottom).mV); + +		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		// draw top left +		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((border_width_left + height_vec).mV); + +		gGL.texCoord2f(0.f, 1.f); +		gGL.vertex2fv((height_vec).mV); + +		// draw top middle +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((border_width_left + height_vec).mV); + +		// draw top right +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f, 1.f); +		gGL.vertex2fv((width_vec + height_vec).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); +	} +	gGL.end(); + +	gGL.popUIMatrix(); +} + +//FIXME: rewrite to use scissor? +void gl_segmented_rect_2d_fragment_tex(const S32 left,  +									   const S32 top,  +									   const S32 right,  +									   const S32 bottom,  +									   const S32 texture_width,  +									   const S32 texture_height,  +									   const S32 border_size,  +									   const F32 start_fragment,  +									   const F32 end_fragment,  +									   const U32 edges) +{ +	S32 width = llabs(right - left); +	S32 height = llabs(top - bottom); + +	gGL.pushUIMatrix(); + +	gGL.translateUI((F32)left, (F32)bottom, 0.f); +	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); + +	if (border_uv_scale.mV[VX] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; +	} +	if (border_uv_scale.mV[VY] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; +	} + +	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); +	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 width_vec((F32)width, 0.f); +	LLVector2 height_vec(0.f, (F32)height); + +	F32 middle_start = border_scale / (F32)width; +	F32 middle_end = 1.f - middle_start; + +	F32 u_min; +	F32 u_max; +	LLVector2 x_min; +	LLVector2 x_max; + +	gGL.begin(LLRender::QUADS); +	{ +		if (start_fragment < middle_start) +		{ +			u_min = (start_fragment / middle_start) * border_uv_scale.mV[VX]; +			u_max = llmin(end_fragment / middle_start, 1.f) * border_uv_scale.mV[VX]; +			x_min = (start_fragment / middle_start) * border_width_left; +			x_max = llmin(end_fragment / middle_start, 1.f) * border_width_left; + +			// draw bottom left +			gGL.texCoord2f(u_min, 0.f); +			gGL.vertex2fv(x_min.mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv(x_max.mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw left  +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); +			 +			// draw top left +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(u_min, 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} + +		if (end_fragment > middle_start || start_fragment < middle_end) +		{ +			x_min = border_width_left + ((llclamp(start_fragment, middle_start, middle_end) - middle_start)) * width_vec; +			x_max = border_width_left + ((llclamp(end_fragment, middle_start, middle_end) - middle_start)) * width_vec; + +			// draw bottom middle +			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv(x_min.mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv((x_max).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw middle +			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			// draw top middle +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} + +		if (end_fragment > middle_end) +		{ +			u_min = (1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_uv_scale.mV[VX]; +			u_max = (1.f - ((end_fragment - middle_end) / middle_start)) * border_uv_scale.mV[VX]; +			x_min = width_vec - ((1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_width_right); +			x_max = width_vec - ((1.f - ((end_fragment - middle_end) / middle_start)) * border_width_right); + +			// draw bottom right +			gGL.texCoord2f(u_min, 0.f); +			gGL.vertex2fv((x_min).mV); + +			gGL.texCoord2f(u_max, 0.f); +			gGL.vertex2fv(x_max.mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw right  +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			// draw top right +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(u_min, 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} +	} +	gGL.end(); + +	gGL.popUIMatrix(); +} + +void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width,  +							  const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, +							  const U32 edges) +{ +	LLVector3 left_border_width = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? border_width : LLVector3::zero; +	LLVector3 right_border_width = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? border_width : LLVector3::zero; + +	LLVector3 top_border_height = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? border_height : LLVector3::zero; +	LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero; + + +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		gGL.texCoord2f(0.f, 0.f); +		gGL.vertex3f(0.f, 0.f, 0.f); + +		gGL.texCoord2f(border_scale.mV[VX], 0.f); +		gGL.vertex3fv(left_border_width.mV); + +		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(0.f, border_scale.mV[VY]); +		gGL.vertex3fv(bottom_border_height.mV); + +		// draw bottom middle +		gGL.texCoord2f(border_scale.mV[VX], 0.f); +		gGL.vertex3fv(left_border_width.mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); +		gGL.vertex3fv((width_vec - right_border_width).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + bottom_border_height).mV); + +		// draw bottom right +		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); +		gGL.vertex3fv((width_vec - right_border_width).mV); + +		gGL.texCoord2f(1.f, 0.f); +		gGL.vertex3fv(width_vec.mV); + +		gGL.texCoord2f(1.f, border_scale.mV[VY]); +		gGL.vertex3fv((width_vec + bottom_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); + +		// draw left  +		gGL.texCoord2f(0.f, border_scale.mV[VY]); +		gGL.vertex3fv(bottom_border_height.mV); + +		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((height_vec - top_border_height).mV); + +		// draw middle +		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); + +		// draw right  +		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); + +		gGL.texCoord2f(1.f, border_scale.mV[VY]); +		gGL.vertex3fv((width_vec + bottom_border_height).mV); + +		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); + +		// draw top left +		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((height_vec - top_border_height).mV); + +		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(border_scale.mV[VX], 1.f); +		gGL.vertex3fv((left_border_width + height_vec).mV); + +		gGL.texCoord2f(0.f, 1.f); +		gGL.vertex3fv((height_vec).mV); + +		// draw top middle +		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); +		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); + +		gGL.texCoord2f(border_scale.mV[VX], 1.f); +		gGL.vertex3fv((left_border_width + height_vec).mV); + +		// draw top right +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); + +		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); +		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); + +		gGL.texCoord2f(1.f, 1.f); +		gGL.vertex3fv((width_vec + height_vec).mV); + +		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); +		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); +	} +	gGL.end(); + +} + +void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec) +{ +	gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP); +} + +// static +void LLRender2D::initClass(LLImageProviderInterface* image_provider, +						   const LLVector2* scale_factor) +{ +	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor; +	sImageProvider = image_provider; +} + +// static +void LLRender2D::cleanupClass() +{ +	if(sImageProvider) +	{ +		sImageProvider->cleanUp(); +	} +} + + +//static +void LLRender2D::translate(F32 x, F32 y, F32 z) +{ +	gGL.translateUI(x,y,z); +	LLFontGL::sCurOrigin.mX += (S32) x; +	LLFontGL::sCurOrigin.mY += (S32) y; +	LLFontGL::sCurDepth += z; +} + +//static +void LLRender2D::pushMatrix() +{ +	gGL.pushUIMatrix(); +	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth)); +} + +//static +void LLRender2D::popMatrix() +{ +	gGL.popUIMatrix(); +	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; +	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second; +	LLFontGL::sOriginStack.pop_back(); +} + +//static  +void LLRender2D::loadIdentity() +{ +	gGL.loadUIIdentity();  +	LLFontGL::sCurOrigin.mX = 0; +	LLFontGL::sCurOrigin.mY = 0; +	LLFontGL::sCurDepth = 0.f; +} + +//static +void LLRender2D::setScaleFactor(const LLVector2 &scale_factor) +{ +	sGLScaleFactor = scale_factor; +} + +//static +void LLRender2D::setLineWidth(F32 width) +{ +	gGL.flush(); +	glLineWidth(width * lerp(sGLScaleFactor.mV[VX], sGLScaleFactor.mV[VY], 0.5f)); +} + +//static +LLPointer<LLUIImage> LLRender2D::getUIImageByID(const LLUUID& image_id, S32 priority) +{ +	if (sImageProvider) +	{ +		return sImageProvider->getUIImageByID(image_id, priority); +	} +	else +	{ +		return NULL; +	} +} + +//static  +LLPointer<LLUIImage> LLRender2D::getUIImage(const std::string& name, S32 priority) +{ +	if (!name.empty() && sImageProvider) +		return sImageProvider->getUIImage(name, priority); +	else +		return NULL; +} + diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h new file mode 100644 index 0000000000..4ea2d06d99 --- /dev/null +++ b/indra/llrender/llrender2dutils.h @@ -0,0 +1,164 @@ +/**  + * @file llrender2dutils.h + * @brief GL function declarations for immediate-mode gl drawing. + * + * $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$ + */ + +// All immediate-mode gl drawing should happen here. + + +#ifndef LL_RENDER2DUTILS_H +#define LL_RENDER2DUTILS_H + +#include "llpointer.h"		// LLPointer<> +#include "llrect.h" +#include "llglslshader.h" + +class LLColor4;  +class LLVector3; +class LLVector2; +class LLUIImage; +class LLUUID; + +extern const LLColor4 UI_VERTEX_COLOR; + +BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom); +void gl_state_for_2d(S32 width, S32 height); + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2); +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ); +void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled); +void gl_rect_2d_simple( S32 width, S32 height ); + +void gl_draw_x(const LLRect& rect, const LLColor4& color); + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled = TRUE ); +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled = TRUE ); +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset = 0, BOOL filled = TRUE ); +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE ); +void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE ); +void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE ); +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f); + +void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines); + +void gl_circle_2d(F32 x, F32 y, F32 radius, S32 steps, BOOL filled); +void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle); +void gl_deep_circle( F32 radius, F32 depth ); +void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ); +void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac); +void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); +void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); + +void gl_draw_image(S32 x, S32 y, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); + +void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f );  + +void gl_rect_2d_simple_tex( S32 width, S32 height ); + +// segmented rectangles + +/* +   TL |______TOP_________| TR  +     /|                  |\   +   _/_|__________________|_\_ +   L| |    MIDDLE        | |R +   _|_|__________________|_|_ +    \ |    BOTTOM        | /   +   BL\|__________________|/ BR +      |                  |     +*/ + +typedef enum e_rounded_edge +{ +	ROUNDED_RECT_LEFT	= 0x1,  +	ROUNDED_RECT_TOP	= 0x2,  +	ROUNDED_RECT_RIGHT	= 0x4,  +	ROUNDED_RECT_BOTTOM	= 0x8, +	ROUNDED_RECT_ALL	= 0xf +}ERoundedEdge; + + +void gl_segmented_rect_2d_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const U32 edges = ROUNDED_RECT_ALL); +void gl_segmented_rect_2d_fragment_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const F32 start_fragment, const F32 end_fragment, const U32 edges = ROUNDED_RECT_ALL); +void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, U32 edges = ROUNDED_RECT_ALL); +void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec); + +inline void gl_rect_2d( const LLRect& rect, BOOL filled ) +{ +	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); +} + +inline void gl_rect_2d_offset_local( const LLRect& rect, S32 pixel_offset, BOOL filled) +{ +	gl_rect_2d_offset_local( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, pixel_offset, filled ); +} + +class LLImageProviderInterface; + +class LLRender2D +{ +	LOG_CLASS(LLRender2D); +public: +	static void initClass(LLImageProviderInterface* image_provider, +						  const LLVector2* scale_factor); +	static void cleanupClass(); + +	static void pushMatrix(); +	static void popMatrix(); +	static void loadIdentity(); +	static void translate(F32 x, F32 y, F32 z = 0.0f); + +	static void setLineWidth(F32 width); +	static void setScaleFactor(const LLVector2& scale_factor); + +	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0); +	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0); + +	static LLVector2		sGLScaleFactor; +private: +	static LLImageProviderInterface* sImageProvider; +}; + +class LLImageProviderInterface +{ +protected: +	LLImageProviderInterface() {}; +	virtual ~LLImageProviderInterface() {}; +public: +	virtual LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority) = 0; +	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority) = 0; +	virtual void cleanUp() = 0; +}; + + +extern LLGLSLShader gSolidColorProgram; +extern LLGLSLShader gUIProgram; + +#endif // LL_RENDER2DUTILS_H + diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h index 569a65c2e0..093bac20d1 100644 --- a/indra/llrender/lltexture.h +++ b/indra/llrender/lltexture.h @@ -38,10 +38,9 @@ class LLTexUnit ;  class LLFontGL ;  // -//this is an abstract class as the parent for the class LLViewerTexture -//through the following virtual functions, the class LLViewerTexture can be reached from /llrender. +//this is an abstract class as the parent for the class LLGLTexture  // -class LLTexture : public LLRefCount +class LLTexture : public virtual LLRefCount  {  	friend class LLTexUnit ;  	friend class LLFontGL ; @@ -53,7 +52,7 @@ public:  	LLTexture(){}  	// -	//interfaces to access LLViewerTexture +	//interfaces to access LLGLTexture  	//  	virtual S8         getType() const = 0 ;  	virtual void       setKnownDrawSize(S32 width, S32 height) = 0 ; diff --git a/indra/llui/lluiimage.cpp b/indra/llrender/lluiimage.cpp index 1d9ce29ba9..a632e7ed2f 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llrender/lluiimage.cpp @@ -31,7 +31,7 @@  // Project includes  #include "lluiimage.h" -#include "llui.h" +#include "llrender2dutils.h"  LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image)  :	mName(name), @@ -165,7 +165,7 @@ namespace LLInitParam  			return;  		} -		LLUIImage* imagep =  LLUI::getUIImage(name()); +		LLUIImage* imagep =  LLRender2D::getUIImage(name());  		if (imagep)  		{  			updateValue(imagep); diff --git a/indra/llui/lluiimage.h b/indra/llrender/lluiimage.h index f07e8fa746..f07e8fa746 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llrender/lluiimage.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index d92b6aa1c0..4d4b8edc37 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -109,7 +109,6 @@ set(llui_SOURCE_FILES      lluicolortable.cpp      lluictrl.cpp      lluictrlfactory.cpp -    lluiimage.cpp      lluistring.cpp      llundo.cpp      llurlaction.cpp @@ -219,7 +218,6 @@ set(llui_HEADER_FILES      lluifwd.h      llui.h      lluicolor.h -    lluiimage.h      lluistring.h      llundo.h      llurlaction.h diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 806d2ef3f6..16e79b211d 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -551,7 +551,7 @@ void LLComboBox::showList()  	LLCoordWindow window_size;  	getWindow()->getSize(&window_size);  	//HACK: shouldn't have to know about scale here -	mList->fitContents( 192, llfloor((F32)window_size.mY / LLUI::sGLScaleFactor.mV[VY]) - 50 ); +	mList->fitContents( 192, llfloor((F32)window_size.mY / LLUI::getScaleFactor().mV[VY]) - 50 );  	// Make sure that we can see the whole list  	LLRect root_view_local; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 48d49af588..d1e67a7d6b 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2022,8 +2022,8 @@ void LLLineEditor::draw()  				LLRect screen_pos = calcScreenRect();  				LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - lineeditor_v_pad ); -				ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); -				ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); +				ime_pos.mX = (S32) (ime_pos.mX * LLUI::getScaleFactor().mV[VX]); +				ime_pos.mY = (S32) (ime_pos.mY * LLUI::getScaleFactor().mV[VY]);  				getWindow()->setLanguageTextInput( ime_pos );  			}  		} @@ -2570,7 +2570,7 @@ void LLLineEditor::markAsPreedit(S32 position, S32 length)  S32 LLLineEditor::getPreeditFontSize() const  { -	return llround(mGLFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround(mGLFont->getLineHeight() * LLUI::getScaleFactor().mV[VY]);  }  void LLLineEditor::setReplaceNewlinesWithSpaces(BOOL replace) diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp index 6841301219..f3a526faeb 100644 --- a/indra/llui/lllocalcliprect.cpp +++ b/indra/llui/lllocalcliprect.cpp @@ -88,10 +88,10 @@ void LLScreenClipRect::updateScissorRegion()  	LLRect rect = sClipRectStack.top();  	stop_glerror();  	S32 x,y,w,h; -	x = llfloor(rect.mLeft * LLUI::sGLScaleFactor.mV[VX]); -	y = llfloor(rect.mBottom * LLUI::sGLScaleFactor.mV[VY]); -	w = llmax(0, llceil(rect.getWidth() * LLUI::sGLScaleFactor.mV[VX])) + 1; -	h = llmax(0, llceil(rect.getHeight() * LLUI::sGLScaleFactor.mV[VY])) + 1; +	x = llfloor(rect.mLeft * LLUI::getScaleFactor().mV[VX]); +	y = llfloor(rect.mBottom * LLUI::getScaleFactor().mV[VY]); +	w = llmax(0, llceil(rect.getWidth() * LLUI::getScaleFactor().mV[VX])) + 1; +	h = llmax(0, llceil(rect.getHeight() * LLUI::getScaleFactor().mV[VY])) + 1;  	glScissor( x,y,w,h );  	stop_glerror();  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 3815eec447..abe74c3f20 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -513,8 +513,8 @@ void LLTextBase::drawCursor()  			LLRect screen_pos = calcScreenRect();  			LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_rect.mLeft), screen_pos.mBottom + llfloor(cursor_rect.mTop) ); -			ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); -			ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); +			ime_pos.mX = (S32) (ime_pos.mX * LLUI::getScaleFactor().mV[VX]); +			ime_pos.mY = (S32) (ime_pos.mY * LLUI::getScaleFactor().mV[VY]);  			getWindow()->setLanguageTextInput( ime_pos );  		}  	} diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 144b6960a1..1b22f87823 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2843,7 +2843,7 @@ void LLTextEditor::markAsPreedit(S32 position, S32 length)  S32 LLTextEditor::getPreeditFontSize() const  { -	return llround((F32)mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround((F32)mDefaultFont->getLineHeight() * LLUI::getScaleFactor().mV[VY]);  }  BOOL LLTextEditor::isDirty() const diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 87bf518aa1..d5fdd1d064 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -39,6 +39,7 @@  #include "llrect.h"  #include "lldir.h"  #include "llgl.h" +#include "llsd.h"  // Project includes  #include "llcommandmanager.h" @@ -69,15 +70,12 @@  //  // Globals  // -const LLColor4 UI_VERTEX_COLOR(1.f, 1.f, 1.f, 1.f);  // Language for UI construction  std::map<std::string, std::string> gTranslation;  std::list<std::string> gUntranslated;  /*static*/ LLUI::settings_map_t LLUI::sSettingGroups; -/*static*/ LLImageProviderInterface* LLUI::sImageProvider = NULL;  /*static*/ LLUIAudioCallback LLUI::sAudioCallback = NULL; -/*static*/ LLVector2		LLUI::sGLScaleFactor(1.f, 1.f);  /*static*/ LLWindow*		LLUI::sWindow = NULL;  /*static*/ LLView*			LLUI::sRootView = NULL;  /*static*/ BOOL                         LLUI::sDirty = FALSE; @@ -137,1492 +135,13 @@ void make_ui_sound(const char* namep)  	}  } -BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom) -{ -	if (x < left || right < x) return FALSE; -	if (y < bottom || top < y) return FALSE; -	return TRUE; -} - - -// Puts GL into 2D drawing mode by turning off lighting, setting to an -// orthographic projection, etc. -void gl_state_for_2d(S32 width, S32 height) -{ -	stop_glerror(); -	F32 window_width = (F32) width;//gViewerWindow->getWindowWidth(); -	F32 window_height = (F32) height;//gViewerWindow->getWindowHeight(); - -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.loadIdentity(); -	gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f); -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.loadIdentity(); -	stop_glerror(); -} - - -void gl_draw_x(const LLRect& rect, const LLColor4& color) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv( color.mV ); - -	gGL.begin( LLRender::LINES ); -		gGL.vertex2i( rect.mLeft,		rect.mTop ); -		gGL.vertex2i( rect.mRight,	rect.mBottom ); -		gGL.vertex2i( rect.mLeft,		rect.mBottom ); -		gGL.vertex2i( rect.mRight,	rect.mTop ); -	gGL.end(); -} - - -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset, BOOL filled) -{ -	gGL.color4fv(color.mV); -	gl_rect_2d_offset_local(left, top, right, bottom, pixel_offset, filled); -} - -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled) -{ -	gGL.pushUIMatrix(); -	left += LLFontGL::sCurOrigin.mX; -	right += LLFontGL::sCurOrigin.mX; -	bottom += LLFontGL::sCurOrigin.mY; -	top += LLFontGL::sCurOrigin.mY; - -	gGL.loadUIIdentity(); -	gl_rect_2d(llfloor((F32)left * LLUI::sGLScaleFactor.mV[VX]) - pixel_offset, -				llfloor((F32)top * LLUI::sGLScaleFactor.mV[VY]) + pixel_offset, -				llfloor((F32)right * LLUI::sGLScaleFactor.mV[VX]) + pixel_offset, -				llfloor((F32)bottom * LLUI::sGLScaleFactor.mV[VY]) - pixel_offset, -				filled); -	gGL.popUIMatrix(); -} - - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) -{ -	stop_glerror(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	// Counterclockwise quad will face the viewer -	if( filled ) -	{  -		gGL.begin( LLRender::QUADS ); -			gGL.vertex2i(left, top); -			gGL.vertex2i(left, bottom); -			gGL.vertex2i(right, bottom); -			gGL.vertex2i(right, top); -		gGL.end(); -	} -	else -	{ -		if( gGLManager.mATIOffsetVerticalLines ) -		{ -			// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -			gGL.begin( LLRender::LINES ); - -				// Verticals  -				gGL.vertex2i(left + 1, top); -				gGL.vertex2i(left + 1, bottom); - -				gGL.vertex2i(right, bottom); -				gGL.vertex2i(right, top); - -				// Horizontals -				top--; -				right--; -				gGL.vertex2i(left, bottom); -				gGL.vertex2i(right, bottom); - -				gGL.vertex2i(left, top); -				gGL.vertex2i(right, top); -			gGL.end(); -		} -		else -		{ -			top--; -			right--; -			gGL.begin( LLRender::LINE_STRIP ); -				gGL.vertex2i(left, top); -				gGL.vertex2i(left, bottom); -				gGL.vertex2i(right, bottom); -				gGL.vertex2i(right, top); -				gGL.vertex2i(left, top); -			gGL.end(); -		} -	} -	stop_glerror(); -} - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled ) -{ -	gGL.color4fv( color.mV ); -	gl_rect_2d( left, top, right, bottom, filled ); -} - - -void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled ) -{ -	gGL.color4fv( color.mV ); -	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); -} - -// Given a rectangle on the screen, draws a drop shadow _outside_ -// the right and bottom edges of it.  Along the right it has width "lines" -// and along the bottom it has height "lines". -void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines) -{ -	stop_glerror(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -	// HACK: Overlap with the rectangle by a single pixel. -	right--; -	bottom++; -	lines++; - -	LLColor4 end_color = start_color; -	end_color.mV[VALPHA] = 0.f; - -	gGL.begin(LLRender::QUADS); - -	// Right edge, CCW faces screen -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		top-lines); -	gGL.vertex2i(right,		bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(right+lines, bottom); -	gGL.vertex2i(right+lines, top-lines); - -	// Bottom edge, CCW faces screen -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		bottom); -	gGL.vertex2i(left+lines,	bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(left+lines,	bottom-lines); -	gGL.vertex2i(right,		bottom-lines); - -	// bottom left Corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(left+lines,	bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(left,		bottom); -	// make the bottom left corner not sharp -	gGL.vertex2i(left+1,		bottom-lines+1); -	gGL.vertex2i(left+lines,	bottom-lines); - -	// bottom right corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(right,		bottom-lines); -	// make the rightmost corner not sharp -	gGL.vertex2i(right+lines-1,	bottom-lines+1); -	gGL.vertex2i(right+lines,	bottom); - -	// top right corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i( right,			top-lines ); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i( right+lines,	top-lines ); -	// make the corner not sharp -	gGL.vertex2i( right+lines-1,	top-1 ); -	gGL.vertex2i( right,			top ); - -	gGL.end(); -	stop_glerror(); -} - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 ) -{ -	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) -	{ -		x1++; -		x2++; -		y1++; -		y2++; -	} - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -	gGL.begin(LLRender::LINES); -		gGL.vertex2i(x1, y1); -		gGL.vertex2i(x2, y2); -	gGL.end(); -} - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ) -{ -	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) -	{ -		x1++; -		x2++; -		y1++; -		y2++; -	} - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv( color.mV ); - -	gGL.begin(LLRender::LINES); -		gGL.vertex2i(x1, y1); -		gGL.vertex2i(x2, y2); -	gGL.end(); -} - -void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv(color.mV); - -	if (filled) -	{ -		gGL.begin(LLRender::TRIANGLES); -	} -	else -	{ -		gGL.begin(LLRender::LINE_LOOP); -	} -	gGL.vertex2i(x1, y1); -	gGL.vertex2i(x2, y2); -	gGL.vertex2i(x3, y3); -	gGL.end(); -} - -void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	length = llmin((S32)(max_frac*(right - left)), length); -	length = llmin((S32)(max_frac*(top - bottom)), length); -	gGL.begin(LLRender::LINES); -	gGL.vertex2i(left, top); -	gGL.vertex2i(left + length, top); -	 -	gGL.vertex2i(left, top); -	gGL.vertex2i(left, top - length); - -	gGL.vertex2i(left, bottom); -	gGL.vertex2i(left + length, bottom); -	 -	gGL.vertex2i(left, bottom); -	gGL.vertex2i(left, bottom + length); - -	gGL.vertex2i(right, top); -	gGL.vertex2i(right - length, top); - -	gGL.vertex2i(right, top); -	gGL.vertex2i(right, top - length); - -	gGL.vertex2i(right, bottom); -	gGL.vertex2i(right - length, bottom); - -	gGL.vertex2i(right, bottom); -	gGL.vertex2i(right, bottom + length); -	gGL.end(); -} - - -void gl_draw_image( S32 x, S32 y, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect ) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} -	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color, uv_rect ); -} - -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} -	gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect ); -} - -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	// scale screen size of borders down -	F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0); -	F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0); - -	LLRectf scale_rect(border_width_fraction, 1.f - border_height_fraction, 1.f - border_width_fraction, border_height_fraction); -	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect); -} - -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect) -{ -	stop_glerror(); - -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	// add in offset of current image to current UI translation -	const LLVector3 ui_scale = gGL.getUIScale(); -	const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale); - -	F32 uv_width = uv_outer_rect.getWidth(); -	F32 uv_height = uv_outer_rect.getHeight(); - -	// shrink scaling region to be proportional to clipped image region -	LLRectf uv_center_rect( -		uv_outer_rect.mLeft + (center_rect.mLeft * uv_width), -		uv_outer_rect.mBottom + (center_rect.mTop * uv_height), -		uv_outer_rect.mLeft + (center_rect.mRight * uv_width), -		uv_outer_rect.mBottom + (center_rect.mBottom * uv_height)); - -	F32 image_width = image->getWidth(0); -	F32 image_height = image->getHeight(0); - -	S32 image_natural_width = llround(image_width * uv_width); -	S32 image_natural_height = llround(image_height * uv_height); - -	LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width, -								uv_center_rect.mTop * image_height, -								uv_center_rect.mRight * image_width, -								uv_center_rect.mBottom * image_height); - -	{	// scale fixed region of image to drawn region -		draw_center_rect.mRight += width - image_natural_width; -		draw_center_rect.mTop += height - image_natural_height; - -		F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight); -		F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop); - -		F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth())); -		F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight())); - -		F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio); - -		draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]); -		draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]); -		draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]); -		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]); -	} - -	LLRectf draw_outer_rect(ui_translation.mV[VX],  -							ui_translation.mV[VY] + height * ui_scale.mV[VY],  -							ui_translation.mV[VX] + width * ui_scale.mV[VX],  -							ui_translation.mV[VY]); - -	LLGLSUIDefault gls_ui; -	 -	if (solid_color) -	{ -		if (LLGLSLShader::sNoFixedFunction) -		{ -			gSolidColorProgram.bind(); -		} -		else -		{ -			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); -			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); -		} -	} - -	gGL.getTexUnit(0)->bind(image, true); - -	gGL.color4fv(color.mV); -	 -	const S32 NUM_VERTICES = 9 * 4; // 9 quads -	LLVector2 uv[NUM_VERTICES]; -	LLVector3 pos[NUM_VERTICES]; - -	S32 index = 0; - -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw bottom middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw bottom right -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw left  -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		// draw middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		// draw right  -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		// draw top left -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		// draw top middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		// draw top right -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); -	} -	gGL.end(); - -	if (solid_color) -	{ -		if (LLGLSLShader::sNoFixedFunction) -		{ -			gUIProgram.bind(); -		} -		else -		{ -			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -		} -	} -} - -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color, uv_rect ); -} - -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	LLGLSUIDefault gls_ui; - - -	gGL.getTexUnit(0)->bind(image, true); - -	gGL.color4fv(color.mV); - -	if (degrees == 0.f) -	{ -		const S32 NUM_VERTICES = 4; // 9 quads -		LLVector2 uv[NUM_VERTICES]; -		LLVector3 pos[NUM_VERTICES]; - -		gGL.begin(LLRender::QUADS); -		{ -			LLVector3 ui_scale = gGL.getUIScale(); -			LLVector3 ui_translation = gGL.getUITranslation(); -			ui_translation.mV[VX] += x; -			ui_translation.mV[VY] += y; -			ui_translation.scaleVec(ui_scale); -			S32 index = 0; -			S32 scaled_width = llround(width * ui_scale.mV[VX]); -			S32 scaled_height = llround(height * ui_scale.mV[VY]); - -			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); -			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); -			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); -			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); -			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f); -			index++; - -			gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); -		} -		gGL.end(); -	} -	else -	{ -		gGL.pushUIMatrix(); -		gGL.translateUI((F32)x, (F32)y, 0.f); -	 -		F32 offset_x = F32(width/2); -		F32 offset_y = F32(height/2); - -		gGL.translateUI(offset_x, offset_y, 0.f); - -		LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD); -		 -		gGL.getTexUnit(0)->bind(image, true); - -		gGL.color4fv(color.mV); -		 -		gGL.begin(LLRender::QUADS); -		{ -			LLVector3 v; - -			v = LLVector3(offset_x, offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); -			gGL.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(-offset_x, offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); -			gGL.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(-offset_x, -offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); -			gGL.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(offset_x, -offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); -			gGL.vertex2f(v.mV[0], v.mV[1] ); -		} -		gGL.end(); -		gGL.popUIMatrix(); -	} -} - - -void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase ) -{ -	phase = fmod(phase, 1.f); - -	S32 shift = S32(phase * 4.f) % 4; - -	// Stippled line -	LLGLEnable stipple(GL_LINE_STIPPLE); -	 -	gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]); - -	gGL.flush(); -	glLineWidth(2.5f); - -	if (!LLGLSLShader::sNoFixedFunction) -	{ -		glLineStipple(2, 0x3333 << shift); -	} - -	gGL.begin(LLRender::LINES); -	{ -		gGL.vertex3fv( start.mV ); -		gGL.vertex3fv( end.mV ); -	} -	gGL.end(); - -	LLUI::setLineWidth(1.f); -} - -void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle) -{ -	if (end_angle < start_angle) -	{ -		end_angle += F_TWO_PI; -	} - -	gGL.pushUIMatrix(); -	{ -		gGL.translateUI(center_x, center_y, 0.f); - -		// Inexact, but reasonably fast. -		F32 delta = (end_angle - start_angle) / steps; -		F32 sin_delta = sin( delta ); -		F32 cos_delta = cos( delta ); -		F32 x = cosf(start_angle) * radius; -		F32 y = sinf(start_angle) * radius; - -		if (filled) -		{ -			gGL.begin(LLRender::TRIANGLE_FAN); -			gGL.vertex2f(0.f, 0.f); -			// make sure circle is complete -			steps += 1; -		} -		else -		{ -			gGL.begin(LLRender::LINE_STRIP); -		} - -		while( steps-- ) -		{ -			// Successive rotations -			gGL.vertex2f( x, y ); -			F32 x_new = x * cos_delta - y * sin_delta; -			y = x * sin_delta +  y * cos_delta; -			x = x_new; -		} -		gGL.end(); -	} -	gGL.popUIMatrix(); -} - -void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled) -{ -	gGL.pushUIMatrix(); -	{ -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.translateUI(center_x, center_y, 0.f); - -		// Inexact, but reasonably fast. -		F32 delta = F_TWO_PI / steps; -		F32 sin_delta = sin( delta ); -		F32 cos_delta = cos( delta ); -		F32 x = radius; -		F32 y = 0.f; - -		if (filled) -		{ -			gGL.begin(LLRender::TRIANGLE_FAN); -			gGL.vertex2f(0.f, 0.f); -			// make sure circle is complete -			steps += 1; -		} -		else -		{ -			gGL.begin(LLRender::LINE_LOOP); -		} - -		while( steps-- ) -		{ -			// Successive rotations -			gGL.vertex2f( x, y ); -			F32 x_new = x * cos_delta - y * sin_delta; -			y = x * sin_delta +  y * cos_delta; -			x = x_new; -		} -		gGL.end(); -	} -	gGL.popUIMatrix(); -} - -// Renders a ring with sides (tube shape) -void gl_deep_circle( F32 radius, F32 depth, S32 steps ) -{ -	F32 x = radius; -	F32 y = 0.f; -	F32 angle_delta = F_TWO_PI / (F32)steps; -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		S32 step = steps + 1; // An extra step to close the circle. -		while( step-- ) -		{ -			gGL.vertex3f( x, y, depth ); -			gGL.vertex3f( x, y, 0.f ); - -			F32 x_new = x * cosf(angle_delta) - y * sinf(angle_delta); -			y = x * sinf(angle_delta) +  y * cosf(angle_delta); -			x = x_new; -		} -	} -	gGL.end(); -} - -void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ) -{ -	gGL.pushUIMatrix(); -	{ -		gGL.translateUI(0.f, 0.f, -width / 2); -		if( render_center ) -		{ -			gGL.color4fv(center_color.mV); -			gGL.diffuseColor4fv(center_color.mV); -			gl_deep_circle( radius, width, steps ); -		} -		else -		{ -			gGL.diffuseColor4fv(side_color.mV); -			gl_washer_2d(radius, radius - width, steps, side_color, side_color); -			gGL.translateUI(0.f, 0.f, width); -			gl_washer_2d(radius - width, radius, steps, side_color, side_color); -		} -	} -	gGL.popUIMatrix(); -} - -// Draw gray and white checkerboard with black border -void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha) -{ -	if (!LLGLSLShader::sNoFixedFunction) -	{  -		// Initialize the first time this is called. -		const S32 PIXELS = 32; -		static GLubyte checkerboard[PIXELS * PIXELS]; -		static BOOL first = TRUE; -		if( first ) -		{ -			for( S32 i = 0; i < PIXELS; i++ ) -			{ -				for( S32 j = 0; j < PIXELS; j++ ) -				{ -					checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF; -				} -			} -			first = FALSE; -		} -	 -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -		// ...white squares -		gGL.color4f( 1.f, 1.f, 1.f, alpha ); -		gl_rect_2d(rect); - -		// ...gray squares -		gGL.color4f( .7f, .7f, .7f, alpha ); -		gGL.flush(); - -		glPolygonStipple( checkerboard ); - -		LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE); -		gl_rect_2d(rect); -	} -	else -	{ //polygon stipple is deprecated, use "Checker" texture -		LLPointer<LLUIImage> img = LLUI::getUIImage("Checker"); -		gGL.getTexUnit(0)->bind(img->getImage()); -		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); -		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - -		LLColor4 color(1.f, 1.f, 1.f, alpha); -		LLRectf uv_rect(0, 0, rect.getWidth()/32.f, rect.getHeight()/32.f); - -		gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), -			img->getImage(), color, uv_rect); -	} -	 -	gGL.flush(); -} - - -// Draws the area between two concentric circles, like -// a doughnut or washer. -void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) -{ -	const F32 DELTA = F_TWO_PI / steps; -	const F32 SIN_DELTA = sin( DELTA ); -	const F32 COS_DELTA = cos( DELTA ); - -	F32 x1 = outer_radius; -	F32 y1 = 0.f; -	F32 x2 = inner_radius; -	F32 y2 = 0.f; - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		steps += 1; // An extra step to close the circle. -		while( steps-- ) -		{ -			gGL.color4fv(outer_color.mV); -			gGL.vertex2f( x1, y1 ); -			gGL.color4fv(inner_color.mV); -			gGL.vertex2f( x2, y2 ); - -			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; -			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; -			x1 = x1_new; - -			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; -			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; -			x2 = x2_new; -		} -	} -	gGL.end(); -} - -// Draws the area between two concentric circles, like -// a doughnut or washer. -void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) -{ -	const F32 DELTA = (end_radians - start_radians) / steps; -	const F32 SIN_DELTA = sin( DELTA ); -	const F32 COS_DELTA = cos( DELTA ); - -	F32 x1 = outer_radius * cos( start_radians ); -	F32 y1 = outer_radius * sin( start_radians ); -	F32 x2 = inner_radius * cos( start_radians ); -	F32 y2 = inner_radius * sin( start_radians ); - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		steps += 1; // An extra step to close the circle. -		while( steps-- ) -		{ -			gGL.color4fv(outer_color.mV); -			gGL.vertex2f( x1, y1 ); -			gGL.color4fv(inner_color.mV); -			gGL.vertex2f( x2, y2 ); - -			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; -			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; -			x1 = x1_new; - -			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; -			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; -			x2 = x2_new; -		} -	} -	gGL.end(); -} - -void gl_rect_2d_simple_tex( S32 width, S32 height ) -{ -	gGL.begin( LLRender::QUADS ); - -		gGL.texCoord2f(1.f, 1.f); -		gGL.vertex2i(width, height); - -		gGL.texCoord2f(0.f, 1.f); -		gGL.vertex2i(0, height); - -		gGL.texCoord2f(0.f, 0.f); -		gGL.vertex2i(0, 0); - -		gGL.texCoord2f(1.f, 0.f); -		gGL.vertex2i(width, 0); -	 -	gGL.end(); -} - -void gl_rect_2d_simple( S32 width, S32 height ) -{ -	gGL.begin( LLRender::QUADS ); -		gGL.vertex2i(width, height); -		gGL.vertex2i(0, height); -		gGL.vertex2i(0, 0); -		gGL.vertex2i(width, 0); -	gGL.end(); -} - -void gl_segmented_rect_2d_tex(const S32 left,  -							  const S32 top,  -							  const S32 right,  -							  const S32 bottom,  -							  const S32 texture_width,  -							  const S32 texture_height,  -							  const S32 border_size,  -							  const U32 edges) -{ -	S32 width = llabs(right - left); -	S32 height = llabs(top - bottom); - -	gGL.pushUIMatrix(); - -	gGL.translateUI((F32)left, (F32)bottom, 0.f); -	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); - -	if (border_uv_scale.mV[VX] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; -	} -	if (border_uv_scale.mV[VY] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; -	} - -	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); -	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 width_vec((F32)width, 0.f); -	LLVector2 height_vec(0.f, (F32)height); - -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		gGL.texCoord2f(0.f, 0.f); -		gGL.vertex2f(0.f, 0.f); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv(border_width_left.mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv(border_height_bottom.mV); - -		// draw bottom middle -		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv(border_width_left.mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv((width_vec - border_width_right).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		// draw bottom right -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv((width_vec - border_width_right).mV); - -		gGL.texCoord2f(1.f, 0.f); -		gGL.vertex2fv(width_vec.mV); - -		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		// draw left  -		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv(border_height_bottom.mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((height_vec - border_height_top).mV); - -		// draw middle -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		// draw right  -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + border_height_bottom).mV); - -		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		// draw top left -		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((border_width_left + height_vec).mV); - -		gGL.texCoord2f(0.f, 1.f); -		gGL.vertex2fv((height_vec).mV); - -		// draw top middle -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((border_width_left + height_vec).mV); - -		// draw top right -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f, 1.f); -		gGL.vertex2fv((width_vec + height_vec).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); -	} -	gGL.end(); - -	gGL.popUIMatrix(); -} - -//FIXME: rewrite to use scissor? -void gl_segmented_rect_2d_fragment_tex(const S32 left,  -									   const S32 top,  -									   const S32 right,  -									   const S32 bottom,  -									   const S32 texture_width,  -									   const S32 texture_height,  -									   const S32 border_size,  -									   const F32 start_fragment,  -									   const F32 end_fragment,  -									   const U32 edges) -{ -	S32 width = llabs(right - left); -	S32 height = llabs(top - bottom); - -	gGL.pushUIMatrix(); - -	gGL.translateUI((F32)left, (F32)bottom, 0.f); -	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); - -	if (border_uv_scale.mV[VX] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; -	} -	if (border_uv_scale.mV[VY] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; -	} - -	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); -	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 width_vec((F32)width, 0.f); -	LLVector2 height_vec(0.f, (F32)height); - -	F32 middle_start = border_scale / (F32)width; -	F32 middle_end = 1.f - middle_start; - -	F32 u_min; -	F32 u_max; -	LLVector2 x_min; -	LLVector2 x_max; - -	gGL.begin(LLRender::QUADS); -	{ -		if (start_fragment < middle_start) -		{ -			u_min = (start_fragment / middle_start) * border_uv_scale.mV[VX]; -			u_max = llmin(end_fragment / middle_start, 1.f) * border_uv_scale.mV[VX]; -			x_min = (start_fragment / middle_start) * border_width_left; -			x_max = llmin(end_fragment / middle_start, 1.f) * border_width_left; - -			// draw bottom left -			gGL.texCoord2f(u_min, 0.f); -			gGL.vertex2fv(x_min.mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv(x_max.mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw left  -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); -			 -			// draw top left -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(u_min, 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} - -		if (end_fragment > middle_start || start_fragment < middle_end) -		{ -			x_min = border_width_left + ((llclamp(start_fragment, middle_start, middle_end) - middle_start)) * width_vec; -			x_max = border_width_left + ((llclamp(end_fragment, middle_start, middle_end) - middle_start)) * width_vec; - -			// draw bottom middle -			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv(x_min.mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv((x_max).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw middle -			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			// draw top middle -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} - -		if (end_fragment > middle_end) -		{ -			u_min = (1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_uv_scale.mV[VX]; -			u_max = (1.f - ((end_fragment - middle_end) / middle_start)) * border_uv_scale.mV[VX]; -			x_min = width_vec - ((1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_width_right); -			x_max = width_vec - ((1.f - ((end_fragment - middle_end) / middle_start)) * border_width_right); - -			// draw bottom right -			gGL.texCoord2f(u_min, 0.f); -			gGL.vertex2fv((x_min).mV); - -			gGL.texCoord2f(u_max, 0.f); -			gGL.vertex2fv(x_max.mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw right  -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			// draw top right -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(u_min, 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} -	} -	gGL.end(); - -	gGL.popUIMatrix(); -} - -void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width,  -							  const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, -							  const U32 edges) -{ -	LLVector3 left_border_width = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? border_width : LLVector3::zero; -	LLVector3 right_border_width = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? border_width : LLVector3::zero; - -	LLVector3 top_border_height = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? border_height : LLVector3::zero; -	LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero; - - -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		gGL.texCoord2f(0.f, 0.f); -		gGL.vertex3f(0.f, 0.f, 0.f); - -		gGL.texCoord2f(border_scale.mV[VX], 0.f); -		gGL.vertex3fv(left_border_width.mV); - -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(0.f, border_scale.mV[VY]); -		gGL.vertex3fv(bottom_border_height.mV); - -		// draw bottom middle -		gGL.texCoord2f(border_scale.mV[VX], 0.f); -		gGL.vertex3fv(left_border_width.mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); -		gGL.vertex3fv((width_vec - right_border_width).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); - -		// draw bottom right -		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); -		gGL.vertex3fv((width_vec - right_border_width).mV); - -		gGL.texCoord2f(1.f, 0.f); -		gGL.vertex3fv(width_vec.mV); - -		gGL.texCoord2f(1.f, border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + bottom_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); - -		// draw left  -		gGL.texCoord2f(0.f, border_scale.mV[VY]); -		gGL.vertex3fv(bottom_border_height.mV); - -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((height_vec - top_border_height).mV); - -		// draw middle -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); - -		// draw right  -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); - -		gGL.texCoord2f(1.f, border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + bottom_border_height).mV); - -		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); - -		// draw top left -		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((height_vec - top_border_height).mV); - -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(border_scale.mV[VX], 1.f); -		gGL.vertex3fv((left_border_width + height_vec).mV); - -		gGL.texCoord2f(0.f, 1.f); -		gGL.vertex3fv((height_vec).mV); - -		// draw top middle -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); -		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); - -		gGL.texCoord2f(border_scale.mV[VX], 1.f); -		gGL.vertex3fv((left_border_width + height_vec).mV); - -		// draw top right -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); - -		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); - -		gGL.texCoord2f(1.f, 1.f); -		gGL.vertex3fv((width_vec + height_vec).mV); - -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); -		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); -	} -	gGL.end(); - -} - -void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec) -{ -	gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP); -} -  void LLUI::initClass(const settings_map_t& settings,  					 LLImageProviderInterface* image_provider,  					 LLUIAudioCallback audio_callback,  					 const LLVector2* scale_factor,  					 const std::string& language)  { +	LLRender2D::initClass(image_provider, scale_factor);  	sSettingGroups = settings;  	if ((get_ptr_in_map(sSettingGroups, std::string("config")) == NULL) || @@ -1632,9 +151,7 @@ void LLUI::initClass(const settings_map_t& settings,  		llerrs << "Failure to initialize configuration groups" << llendl;  	} -	sImageProvider = image_provider;  	sAudioCallback = audio_callback; -	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor;  	sWindow = NULL; // set later in startup  	LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow"); @@ -1668,10 +185,7 @@ void LLUI::initClass(const settings_map_t& settings,  void LLUI::cleanupClass()  { -	if(sImageProvider) -	{ -	sImageProvider->cleanUp(); -} +	LLRender2D::cleanupClass();  }  void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup,  const clear_popups_t& clear_popups) @@ -1695,60 +209,12 @@ void LLUI::dirtyRect(LLRect rect)  	}		  } - -//static -void LLUI::translate(F32 x, F32 y, F32 z) -{ -	gGL.translateUI(x,y,z); -	LLFontGL::sCurOrigin.mX += (S32) x; -	LLFontGL::sCurOrigin.mY += (S32) y; -	LLFontGL::sCurDepth += z; -} - -//static -void LLUI::pushMatrix() -{ -	gGL.pushUIMatrix(); -	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth)); -} - -//static -void LLUI::popMatrix() -{ -	gGL.popUIMatrix(); -	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; -	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second; -	LLFontGL::sOriginStack.pop_back(); -} - -//static  -void LLUI::loadIdentity() -{ -	gGL.loadUIIdentity();  -	LLFontGL::sCurOrigin.mX = 0; -	LLFontGL::sCurOrigin.mY = 0; -	LLFontGL::sCurDepth = 0.f; -} - -//static -void LLUI::setScaleFactor(const LLVector2 &scale_factor) -{ -	sGLScaleFactor = scale_factor; -} - -//static -void LLUI::setLineWidth(F32 width) -{ -	gGL.flush(); -	glLineWidth(width * lerp(sGLScaleFactor.mV[VX], sGLScaleFactor.mV[VY], 0.5f)); -} -  //static   void LLUI::setMousePositionScreen(S32 x, S32 y)  {  	S32 screen_x, screen_y; -	screen_x = llround((F32)x * sGLScaleFactor.mV[VX]); -	screen_y = llround((F32)y * sGLScaleFactor.mV[VY]); +	screen_x = llround((F32)x * getScaleFactor().mV[VX]); +	screen_y = llround((F32)y * getScaleFactor().mV[VY]);  	LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());  } @@ -1759,8 +225,8 @@ void LLUI::getMousePositionScreen(S32 *x, S32 *y)  	LLCoordWindow cursor_pos_window;  	getWindow()->getCursorPosition(&cursor_pos_window);  	LLCoordGL cursor_pos_gl(cursor_pos_window.convert()); -	*x = llround((F32)cursor_pos_gl.mX / sGLScaleFactor.mV[VX]); -	*y = llround((F32)cursor_pos_gl.mY / sGLScaleFactor.mV[VX]); +	*x = llround((F32)cursor_pos_gl.mX / getScaleFactor().mV[VX]); +	*y = llround((F32)cursor_pos_gl.mY / getScaleFactor().mV[VX]);  }  //static  @@ -1925,21 +391,21 @@ LLVector2 LLUI::getWindowSize()  	LLCoordWindow window_rect;  	sWindow->getSize(&window_rect); -	return LLVector2(window_rect.mX / sGLScaleFactor.mV[VX], window_rect.mY / sGLScaleFactor.mV[VY]); +	return LLVector2(window_rect.mX / getScaleFactor().mV[VX], window_rect.mY / getScaleFactor().mV[VY]);  }  //static  void LLUI::screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y)  { -	*gl_x = llround((F32)screen_x * sGLScaleFactor.mV[VX]); -	*gl_y = llround((F32)screen_y * sGLScaleFactor.mV[VY]); +	*gl_x = llround((F32)screen_x * getScaleFactor().mV[VX]); +	*gl_y = llround((F32)screen_y * getScaleFactor().mV[VY]);  }  //static  void LLUI::glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y)  { -	*screen_x = llround((F32)gl_x / sGLScaleFactor.mV[VX]); -	*screen_y = llround((F32)gl_y / sGLScaleFactor.mV[VY]); +	*screen_x = llround((F32)gl_x / getScaleFactor().mV[VX]); +	*screen_y = llround((F32)gl_y / getScaleFactor().mV[VY]);  }  //static @@ -1956,27 +422,6 @@ void LLUI::glRectToScreen(const LLRect& gl, LLRect *screen)  	glPointToScreen(gl.mRight, gl.mBottom, &screen->mRight, &screen->mBottom);  } -//static -LLPointer<LLUIImage> LLUI::getUIImageByID(const LLUUID& image_id, S32 priority) -{ -	if (sImageProvider) -	{ -		return sImageProvider->getUIImageByID(image_id, priority); -	} -	else -	{ -		return NULL; -	} -} - -//static  -LLPointer<LLUIImage> LLUI::getUIImage(const std::string& name, S32 priority) -{ -	if (!name.empty() && sImageProvider) -		return sImageProvider->getUIImage(name, priority); -	else -		return NULL; -}  LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname)  { diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 28e84fa444..a38ae9a560 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -1,6 +1,6 @@  /**    * @file llui.h - * @brief GL function declarations and other general static UI services. + * @brief General static UI services.   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code @@ -24,122 +24,37 @@   * $/LicenseInfo$   */ -// All immediate-mode gl drawing should happen here.  #ifndef LL_LLUI_H  #define LL_LLUI_H -#include "llpointer.h"		// LLPointer<>  #include "llrect.h"  #include "llcontrol.h"  #include "llcoord.h" -#include "llglslshader.h" +#include "v2math.h"  #include "llinitparam.h"  #include "llregistry.h" +#include "llrender2dutils.h" +#include "llpointer.h"  #include "lluicolor.h"  #include "lluicolortable.h" +#include "lluiimage.h"  #include <boost/signals2.hpp>  #include "lllazyvalue.h"  #include "llframetimer.h"  #include <limits> -// LLUIFactory -#include "llsd.h" -  // for initparam specialization  #include "llfontgl.h" -class LLColor4;  -class LLVector3; -class LLVector2; -class LLUIImage;  class LLUUID;  class LLWindow;  class LLView;  class LLHelp; -// UI colors -extern const LLColor4 UI_VERTEX_COLOR;  void make_ui_sound(const char* name); -BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom); -void gl_state_for_2d(S32 width, S32 height); - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2); -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ); -void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled); -void gl_rect_2d_simple( S32 width, S32 height ); - -void gl_draw_x(const LLRect& rect, const LLColor4& color); - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled = TRUE ); -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled = TRUE ); -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset = 0, BOOL filled = TRUE ); -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE ); -void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE ); -void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE ); -void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f); - -void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines); - -void gl_circle_2d(F32 x, F32 y, F32 radius, S32 steps, BOOL filled); -void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle); -void gl_deep_circle( F32 radius, F32 depth ); -void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ); -void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac); -void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); -void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); - -void gl_draw_image(S32 x, S32 y, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); - -void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f );  - -void gl_rect_2d_simple_tex( S32 width, S32 height ); - -// segmented rectangles - -/* -   TL |______TOP_________| TR  -     /|                  |\   -   _/_|__________________|_\_ -   L| |    MIDDLE        | |R -   _|_|__________________|_|_ -    \ |    BOTTOM        | /   -   BL\|__________________|/ BR -      |                  |     -*/ - -typedef enum e_rounded_edge -{ -	ROUNDED_RECT_LEFT	= 0x1,  -	ROUNDED_RECT_TOP	= 0x2,  -	ROUNDED_RECT_RIGHT	= 0x4,  -	ROUNDED_RECT_BOTTOM	= 0x8, -	ROUNDED_RECT_ALL	= 0xf -}ERoundedEdge; - - -void gl_segmented_rect_2d_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const U32 edges = ROUNDED_RECT_ALL); -void gl_segmented_rect_2d_fragment_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const F32 start_fragment, const F32 end_fragment, const U32 edges = ROUNDED_RECT_ALL); -void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, U32 edges = ROUNDED_RECT_ALL); -void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec); - -inline void gl_rect_2d( const LLRect& rect, BOOL filled ) -{ -	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); -} - -inline void gl_rect_2d_offset_local( const LLRect& rect, S32 pixel_offset, BOOL filled) -{ -	gl_rect_2d_offset_local( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, pixel_offset, filled ); -} -  class LLImageProviderInterface;  typedef	void (*LLUIAudioCallback)(const LLUUID& uuid); @@ -280,10 +195,10 @@ public:  	static void cleanupClass();  	static void setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t&, const clear_popups_t& ); -	static void pushMatrix(); -	static void popMatrix(); -	static void loadIdentity(); -	static void translate(F32 x, F32 y, F32 z = 0.0f); +	static void pushMatrix() { LLRender2D::pushMatrix(); } +	static void popMatrix() { LLRender2D::popMatrix(); } +	static void loadIdentity() { LLRender2D::loadIdentity(); } +	static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::translate(x, y, z); }  	static LLRect	sDirtyRect;  	static BOOL		sDirty; @@ -333,10 +248,13 @@ public:  	static void getMousePositionScreen(S32 *x, S32 *y);  	static void setMousePositionLocal(const LLView* viewp, S32 x, S32 y);  	static void getMousePositionLocal(const LLView* viewp, S32 *x, S32 *y); -	static void setScaleFactor(const LLVector2& scale_factor); -	static void setLineWidth(F32 width); -	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0); -	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0); +	static LLVector2& getScaleFactor() { return LLRender2D::sGLScaleFactor; } +	static void setScaleFactor(const LLVector2& scale_factor) { LLRender2D::setScaleFactor(scale_factor); } +	static void setLineWidth(F32 width) { LLRender2D::setLineWidth(width); } +	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0) +		{ return LLRender2D::getUIImageByID(image_id, priority); } +	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0) +		{ return LLRender2D::getUIImage(name, priority); }  	static LLVector2 getWindowSize();  	static void screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y);  	static void glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y); @@ -365,12 +283,10 @@ public:  	//  	static settings_map_t sSettingGroups;  	static LLUIAudioCallback sAudioCallback; -	static LLVector2		sGLScaleFactor;  	static LLWindow*		sWindow;  	static LLView*			sRootView;  	static LLHelp*			sHelpImpl;  private: -	static LLImageProviderInterface* sImageProvider;  	static std::vector<std::string> sXUIPaths;  	static LLFrameTimer		sMouseIdleTimer;  	static add_popup_t		sAddPopupFunc; @@ -381,18 +297,6 @@ private:  // Moved LLLocalClipRect to lllocalcliprect.h -//RN: maybe this needs to moved elsewhere? -class LLImageProviderInterface -{ -protected: -	LLImageProviderInterface() {}; -	virtual ~LLImageProviderInterface() {}; -public: -	virtual LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority) = 0; -	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority) = 0; -	virtual void cleanUp() = 0; -}; -  class LLCallbackRegistry  {  public: @@ -603,7 +507,4 @@ namespace LLInitParam  	};  } -extern LLGLSLShader gSolidColorProgram; -extern LLGLSLShader gUIProgram; -  #endif diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 8f0a48018f..6c51024d2c 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -31,7 +31,7 @@  #include "llurlentry_stub.cpp"  #include "lltut.h"  #include "../lluicolortable.h" -#include "../lluiimage.h" +#include "lluiimage.h"  #include <boost/regex.hpp> diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 963473c92a..88a2cfb1e0 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -28,7 +28,7 @@  #include "linden_common.h"  #include "../llurlmatch.h" -#include "../lluiimage.h" +#include "lluiimage.h"  #include "lltut.h"  // link seams diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index a819d12861..80d5dd96e6 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -68,6 +68,7 @@ set(vfs_BOOST_LIBRARIES      )  target_link_libraries(llvfs +    ${LLCOMMON_LIBRARIES}      ${vfs_BOOST_LIBRARIES}      ) diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 341bddfffd..652d5cae5a 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -64,6 +64,13 @@ set(viewer_HEADER_FILES  # Sort by high-level to low-level  if (LINUX AND VIEWER)    set(llwindow_LINK_LIBRARIES +      ${LLCOMMON_LIBRARIES} +      ${LLIMAGE_LIBRARIES} +      ${LLMATH_LIBRARIES} +      ${LLRENDER_LIBRARIES} +      ${LLVFS_LIBRARIES} +      ${LLWINDOW_LIBRARIES} +      ${LLXML_LIBRARIES}        ${UI_LIBRARIES}     # for GTK        ${SDL_LIBRARY}        fontconfig          # For FCInit and other FC* functions. @@ -160,7 +167,8 @@ endif (SERVER AND NOT WINDOWS AND NOT DARWIN)  if (llwindow_HEADER_FILES)    list(APPEND llwindow_SOURCE_FILES ${llwindow_HEADER_FILES})  endif (llwindow_HEADER_FILES) -  list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) + +list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})  if (VIEWER)    add_library (llwindow diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt index beefcda361..ccd8387633 100644 --- a/indra/llxml/CMakeLists.txt +++ b/indra/llxml/CMakeLists.txt @@ -39,9 +39,10 @@ list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES})  add_library (llxml ${llxml_SOURCE_FILES})  # Libraries on which this library depends, needed for Linux builds  # Sort by high-level to low-level -target_link_libraries( llxml -    llvfs -    llmath +target_link_libraries(llxml +    ${LLVFS_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLCOMMON_LIBRARIES}      ${EXPAT_LIBRARIES}      ) diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt index 00dcedecaa..a644984e58 100644 --- a/indra/mac_updater/CMakeLists.txt +++ b/indra/mac_updater/CMakeLists.txt @@ -7,6 +7,7 @@ include(OpenSSL)  include(CURL)  include(CARes)  include(LLCommon) +include(LLMessage)  include(LLVFS)  include(Linking) @@ -52,6 +53,7 @@ set_target_properties(mac-updater    )  target_link_libraries(mac-updater +    ${LLMESSAGE_LIBRARIES}      ${LLVFS_LIBRARIES}      ${OPENSSL_LIBRARIES}      ${CRYPTO_LIBRARIES} diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8c4b7b28c4..b12853b014 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -44,6 +44,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 @@ -80,6 +81,7 @@ include_directories(      ${LIBS_PREBUILD_DIR}/include/hunspell      ${OPENAL_LIB_INCLUDE_DIRS}      ${LIBS_PREBUILT_DIR}/include/collada/1.4 +    ${LLAPPEARANCE_INCLUDE_DIRS}      )  set(viewer_SOURCE_FILES @@ -156,7 +158,6 @@ set(viewer_SOURCE_FILES      lldrawpooltree.cpp      lldrawpoolwater.cpp      lldrawpoolwlsky.cpp -    lldriverparam.cpp      lldynamictexture.cpp      llemote.cpp      llenvmanager.cpp @@ -317,7 +318,6 @@ set(viewer_SOURCE_FILES      lllistcontextmenu.cpp      lllistview.cpp      lllocalbitmaps.cpp -    lllocaltextureobject.cpp      lllocationhistory.cpp      lllocationinputctrl.cpp      lllogchat.cpp @@ -444,8 +444,6 @@ set(viewer_SOURCE_FILES      llplacesinventorybridge.cpp      llplacesinventorypanel.cpp      llpopupview.cpp -    llpolymesh.cpp -    llpolymorph.cpp      llpostcard.cpp      llpreview.cpp      llpreviewanim.cpp @@ -496,9 +494,6 @@ set(viewer_SOURCE_FILES      llsyswellwindow.cpp      llteleporthistory.cpp      llteleporthistorystorage.cpp -    lltexglobalcolor.cpp -    lltexlayer.cpp -    lltexlayerparams.cpp      lltextureatlas.cpp      lltextureatlasmanager.cpp      lltexturecache.cpp @@ -596,18 +591,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 @@ -628,10 +623,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 @@ -733,7 +726,6 @@ set(viewer_HEADER_FILES      lldrawpooltree.h      lldrawpoolwater.h      lldrawpoolwlsky.h -    lldriverparam.h      lldynamictexture.h      llemote.h      llenvmanager.h @@ -894,7 +886,6 @@ set(viewer_HEADER_FILES      lllistcontextmenu.h      lllistview.h      lllocalbitmaps.h -    lllocaltextureobject.h      lllocationhistory.h      lllocationinputctrl.h      lllogchat.h @@ -1009,8 +1000,6 @@ set(viewer_HEADER_FILES      llpipelinelistener.h      llplacesinventorybridge.h      llplacesinventorypanel.h -    llpolymesh.h -    llpolymorph.h      llpopupview.h      llpostcard.h      llpreview.h @@ -1064,9 +1053,6 @@ set(viewer_HEADER_FILES      lltable.h      llteleporthistory.h      llteleporthistorystorage.h -    lltexglobalcolor.h -    lltexlayer.h -    lltexlayerparams.h      lltextureatlas.h      lltextureatlasmanager.h      lltexturecache.h @@ -1165,18 +1151,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 @@ -1197,10 +1183,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 @@ -1837,19 +1821,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/llagent.cpp b/indra/newview/llagent.cpp index 2379c23969..4e05836bca 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -92,7 +92,7 @@  #include "llworldmap.h"  #include "stringize.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  extern LLMenuBarGL* gMenuBarView; @@ -3654,7 +3654,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; @@ -4303,7 +4303,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)) @@ -4326,7 +4326,7 @@ void LLAgent::sendAgentSetAppearance()  		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; @@ -4335,7 +4335,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..f784262e90 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -33,7 +33,7 @@  #include "llagentdata.h" 			// gAgentID, gAgentSessionID  #include "llcharacter.h"  #include "llcoordframe.h"			// for mFrameAgent -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h"  #include <boost/function.hpp>  #include <boost/shared_ptr.hpp> @@ -901,7 +901,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 a544909e66..7f4d33753d 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; @@ -1078,8 +1078,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 +1432,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 +1456,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(); ) @@ -1684,7 +1684,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; diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 53a255fe92..e2304e6db9 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) +LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/)  { -	return (gAgentWearables.getWearableCount(type) > 0); +	return dynamic_cast<LLViewerWearable*> (getWearable(type, index));  } -LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) +const LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) const  { -	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]; -	} +	return dynamic_cast<const LLViewerWearable*> (getWearable(type, index));  } -void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable) -{ - -	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); -	} -} - -U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable *wearable) -{ -	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; -} - -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) -	{ -		// nothing to do here. move along. -		return; -	} - -	U32 index = getWearableIndex(wearable); -	LLWearableType::EType type = wearable->getType(); - -	if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type)) +	if (isAgentAvatarValid())  	{ -		popWearable(type, index); +		const BOOL upload_result = removed; +		gAgentAvatarp->wearableUpdated(wearable->getType(), upload_result);  	} -} -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()) -		{ -		gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE); -		} -		wearable->setLabelUpdated(); -	} -} +	LLWearableData::wearableUpdated(wearable, removed); -U32	LLAgentWearables::getWearableIndex(const LLWearable *wearable) const -{ -	if (wearable == NULL) +	if (!removed)  	{ -		return MAX_CLOTHING_PER_TYPE; -	} +		LLViewerWearable* viewer_wearable = dynamic_cast<LLViewerWearable*>(wearable); +		viewer_wearable->refreshName(); -	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) +		// 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 )  		{ -			return index; +			wearable->setDefinitionVersion(22); +			U32 index = getWearableIndex(wearable); +			llinfos << "forcing wearable type " << wearable->getType() << " to version 22 from 24" << llendl; +			saveWearable(wearable->getType(),index,TRUE);  		} -	} - -	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]; +		checkWearableAgainstInventory(viewer_wearable);  	}  } -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; @@ -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++) -	{ -		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; -			} -		} -	} -	if (hash_computed) +	// Add some garbage into the hash so that it becomes invalid. +	if (isAgentAvatarValid())  	{ -		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); +		hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES);  	} - -	return hash_id;  }  // User has picked "remove from avatar" from a menu. @@ -1875,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; @@ -1903,7 +1712,7 @@ void LLAgentWearables::updateWearablesLoaded()  	}  } -bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const +bool LLAgentWearables::canWearableBeRemoved(const LLViewerWearable* wearable) const  {  	if (!wearable) return false; @@ -1918,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)  			{ @@ -1933,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;  	} @@ -1966,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; @@ -1999,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 550560d7bc..a60fbc969b 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 @@ -244,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; @@ -288,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 f71d9c7704..1e4e00d77d 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -277,7 +277,7 @@ struct LLFoundData  	std::string mName;  	LLAssetType::EType mAssetType;  	LLWearableType::EType mWearableType; -	LLWearable* mWearable; +	LLViewerWearable* mWearable;  	bool mIsReplacement;  }; @@ -301,7 +301,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; @@ -327,7 +327,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;  }; @@ -561,7 +561,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) @@ -609,14 +609,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) @@ -649,7 +649,7 @@ public:  	}  private:  	LLWearableHoldingPattern* mHolder; -	LLWearable *mWearable; +	LLViewerWearable *mWearable;  	LLWearableType::EType mType;  }; @@ -665,7 +665,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); @@ -772,11 +772,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)  			{ @@ -836,7 +836,7 @@ void LLWearableHoldingPattern::resetTime(F32 timeout)  	mWaitTime.setTimerExpirySec(timeout);  } -void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable) +void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)  {  	if (!isMostRecent())  	{ @@ -887,7 +887,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); @@ -1590,7 +1590,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++ ) @@ -1599,7 +1599,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); @@ -1841,6 +1841,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); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index d6187e1cfb..4baee10218 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; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6ca77ba4dd..587435301d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -668,6 +668,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()  {	  	// @@ -679,6 +688,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(); @@ -771,7 +784,7 @@ bool LLAppViewer::init()  	LLUI::initClass(settings_map,  		LLUIImageList::getInstance(),  		ui_audio_callback, -		&LLUI::sGLScaleFactor); +		&LLUI::getScaleFactor());  	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;  	// Setup paths and LLTrans after LLUI::initClass has been called. @@ -1797,6 +1810,8 @@ bool LLAppViewer::cleanup()  	llinfos << "Cleaning up Objects" << llendflush;  	LLViewerObject::cleanupVOClasses(); + +	LLAvatarAppearance::cleanupClass();  	LLPostProcess::cleanupClass(); @@ -2030,6 +2045,8 @@ bool LLAppViewer::cleanup()  	llinfos << "Cleaning up LLProxy." << llendl;  	LLProxy::cleanupClass(); +	LLWearableType::cleanupClass(); +  	LLMainLoopRepeater::instance().stop();  	//release all private memory pools. diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 65bfc990d1..7c423af3c8 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/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/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/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index fa42b157a7..29ad4f34d2 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/llface.cpp b/indra/newview/llface.cpp index 4a0c94df33..947ab84eec 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -560,8 +560,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/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 809d344d01..df802f0a0e 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/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index fa0ad20fdb..ce67c6c65d 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -1097,12 +1097,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/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/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index a071f338ba..dbab15dc9e 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2488,7 +2488,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++ ; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 479bdd5ff7..da773e90ec 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -765,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"); 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/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/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index ddeb33d0ba..4834d8dd70 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" @@ -1510,7 +1511,7 @@ LLUIImagePtr LLItemBridge::getIcon() const  										mIsLink);  	} -	return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT); +	return LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT);  }  PermissionMask LLItemBridge::getPermissionMask() const @@ -5600,7 +5601,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) @@ -5626,7 +5627,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) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 8f36234c39..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 diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 34734d57c5..14efc25fb9 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -24,7 +24,7 @@   * $/LicenseInfo$   */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h"  #include "llinventoryicon.h"  #include "lldictionary.h" @@ -41,7 +41,7 @@ struct IconEntry : public LLDictionaryEntry  };  class LLIconDictionary : public LLSingleton<LLIconDictionary>, -						 public LLDictionary<LLInventoryIcon::EIconName, IconEntry> +						 public LLDictionary<LLInventoryType::EIconName, IconEntry>  {  public:  	LLIconDictionary(); @@ -49,48 +49,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 +102,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 +112,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 +170,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/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 459e52c4f4..834172f58f 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -55,7 +55,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" @@ -440,7 +440,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;  					} @@ -483,7 +483,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(); @@ -495,11 +495,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); @@ -515,10 +515,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)  	{ @@ -526,32 +526,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;  				} @@ -567,9 +567,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; @@ -577,9 +577,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; @@ -587,13 +587,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; @@ -601,9 +601,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; @@ -611,9 +611,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; @@ -621,9 +621,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; @@ -633,20 +633,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;  				} @@ -661,9 +661,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; @@ -671,9 +671,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; @@ -683,20 +683,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;  				} @@ -711,9 +711,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; @@ -721,9 +721,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..ca12fe2045 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -30,9 +30,10 @@  #include "lleventtimer.h"  #include "llwearabletype.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h"  class LLScrollListCtrl; +class LLViewerObject;  class LLLocalBitmap  { @@ -63,7 +64,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/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 7650fe9229..04744ab34c 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 ) @@ -687,7 +687,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)  			{ @@ -770,7 +770,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); @@ -884,14 +884,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/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/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index d8ba2aa659..43bb1f57e0 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); @@ -1069,7 +1069,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)          { @@ -1445,7 +1445,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value                  {                          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.                          { @@ -1505,7 +1505,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 +1513,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 +1557,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 +1575,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/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/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/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index cb6989c9dd..ded7d66022 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); @@ -673,12 +673,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 +756,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/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/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/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index c3c37141ed..24e272c740 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1608,7 +1608,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 +1774,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 +5198,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 9267444534..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; @@ -326,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 @@ -379,7 +379,7 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  	}  } -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)  	{ @@ -389,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)  	{ @@ -445,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/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 06c87e57fc..fadaaf4541 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3574,9 +3574,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); @@ -4028,7 +4028,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));  	}  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6782e3ef8a..ab06b1f5aa 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1247,6 +1247,9 @@ bool idle_startup()  		LLPostProcess::initClass();  		display_startup(); +		LLAvatarAppearance::initClass(); +		display_startup(); +  		LLViewerObject::initVOClasses();  		display_startup(); 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 7adf5212c2..db08c16f15 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -973,11 +973,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 = SEND_HTTP_REQ;  			} diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index c60b4155a0..e9615e2613 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;  	} @@ -418,14 +418,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/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 3b486efd7e..cc697f8510 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1440,7 +1440,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 +1478,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/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 c3f8f42a2a..64454a03d1 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,204 +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; -} - -void LLViewerJointMesh::setColor( const LLColor4& color ) -{ -	mColor = color; -} - - -//-------------------------------------------------------------------- -// 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; @@ -480,21 +201,6 @@ void LLViewerJointMesh::uploadJointMatrices()  }  //-------------------------------------------------------------------- -// LLViewerJointMesh::drawBone() -//-------------------------------------------------------------------- -void LLViewerJointMesh::drawBone() -{ -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::isTransparent() -//-------------------------------------------------------------------- -BOOL LLViewerJointMesh::isTransparent() -{ -	return mIsTransparent; -} - -//--------------------------------------------------------------------  // DrawElementsBLEND and utility code  //-------------------------------------------------------------------- @@ -549,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); @@ -563,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 630981b4a0..ac5aab4ef2 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,45 +50,10 @@ 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 ); -	void setColor( const LLColor4& color ); - -	// 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 );  	/*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area); @@ -141,21 +62,12 @@ public:  	/*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/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index e3e05ef80d..cbd1ac692f 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -122,7 +122,7 @@  #include "llpathfindingmanager.h"  #include "boost/unordered_map.hpp" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines;  typedef LLPointer<LLViewerObject> LLViewerObjectPtr; @@ -7391,7 +7391,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(); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 58f8932cc4..f66172d924 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3290,14 +3290,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) @@ -4044,7 +4044,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);  //	}  } @@ -4070,7 +4070,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, const std:  		uuid == LLUUID::null)  	{  		retval = LLPrimitive::setTETexture(te, uuid); -		mTEImages[te] = LLViewerTextureManager::getFetchedTextureFromUrl  (url, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); +		mTEImages[te] = LLViewerTextureManager::getFetchedTextureFromUrl  (url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid);  		setChanged(TEXTURE);  		if (mDrawable.notNull())  		{ @@ -4087,7 +4087,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/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 d1c6b7ea79..635cda4e27 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/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp new file mode 100644 index 0000000000..f516562c2f --- /dev/null +++ b/indra/newview/llviewertexlayer.cpp @@ -0,0 +1,760 @@ +/**  + * @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->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites. + +	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, 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;  +} + + +void LLViewerTexLayerSet::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, getViewerComposite()->getOriginX(), +								getViewerComposite()->getOriginY(), width, height); +	} +	 +	// Set alpha back to that of our alpha masks. +	renderAlphaMaskTextures(getViewerComposite()->getOriginX(),  +							getViewerComposite()->getOriginY(), width, height, true); +} + +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..95c339a5b0 --- /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 "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; } +	void						gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); + +	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/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 8eb8717de2..a73ce1d115 100644 --- 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,20 +620,10 @@ LLViewerTexture::~LLViewerTexture()  	sImageCount--;  } +// virtual  void LLViewerTexture::init(bool firstinit)  { -	mBoostLevel = LLViewerTexture::BOOST_NONE; - -	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 ;	 @@ -655,38 +644,18 @@ 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  			<< llendl;  } -void LLViewerTexture::setBoostLevel(S32 level) -{ -	if(mBoostLevel != level) -	{ -		mBoostLevel = level ; -		if(mBoostLevel != LLViewerTexture::BOOST_NONE) -		{ -			setNoDelete() ;		 -		} -	} -} - -  bool LLViewerTexture::bindDefaultImage(S32 stage)   {  	if (stage < 0) return false; @@ -879,294 +848,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 ; @@ -1750,7 +1443,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;  	} @@ -2136,7 +1829,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); @@ -2387,7 +2080,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)  		{ @@ -2845,7 +2538,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 ;  		}		 @@ -3218,7 +2911,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)); @@ -3268,7 +2961,7 @@ void LLViewerLODTexture::processTextureStats()  				mCalculatedDiscardLevel = discard_level;  			}  		} -		if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED) +		if (mBoostLevel < LLGLTexture::BOOST_SCULPTED)  		{  			discard_level += sDesiredDiscardBias;  			discard_level *= sDesiredDiscardScale; // scale @@ -3294,7 +2987,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)  			{ @@ -3437,7 +3130,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 2ea9a07e9a..254a0cf92f 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,11 +126,8 @@ 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; } -  	void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const;  	void resetTextureStats();	  	void setMaxVirtualSizeResetInterval(S32 interval)const {mMaxVirtualSizeResetInterval = interval;} @@ -182,8 +137,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 +149,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,35 +163,21 @@ 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 -	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 ; @@ -302,17 +189,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;	 @@ -508,7 +384,7 @@ protected:  	S32 getCurrentDiscardLevelForFetching() ;  private: -	void init(bool firstinit) ; +	void init(bool firstinit) ;	  	void cleanup() ;  	void saveRawImage() ; @@ -731,7 +607,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, @@ -740,7 +616,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, @@ -749,7 +625,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 e4669cde34..b89247ec6f 100644 --- 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); @@ -339,7 +339,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 +430,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 +1361,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 +1434,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 +1534,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 +1545,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 +1572,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/llwearable.cpp b/indra/newview/llviewerwearable.cpp index b924a4471d..e9fa92e8be 100755..100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llviewerwearable.cpp @@ -1,8 +1,8 @@  /**  - * @file llwearable.cpp - * @brief LLWearable class implementation + * @file llviewerwearable.cpp + * @brief LLViewerWearable class implementation   * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * $LicenseInfo:firstyear=2012&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc.   *  @@ -29,29 +29,17 @@  #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 "lltextureentry.h" +#include "llviewertexlayer.h"  #include "llvoavatarself.h" -#include "llvoavatardefines.h" -#include "llwearable.h" +#include "llavatarappearancedefines.h" +#include "llviewerwearable.h"  #include "llviewercontrol.h" -using namespace LLVOAvatarDefines; - -// static -S32 LLWearable::sCurrentDefinitionVersion = 1; +using namespace LLAvatarAppearanceDefines;  // support class - remove for 2.1 (hackity hack hack)  class LLOverrideBakedTextureUpdate @@ -59,7 +47,7 @@ class LLOverrideBakedTextureUpdate  public:  	LLOverrideBakedTextureUpdate(bool temp_state)  	{ -		U32 num_bakes = (U32) LLVOAvatarDefines::BAKED_NUM_INDICES; +		U32 num_bakes = (U32) LLAvatarAppearanceDefines::BAKED_NUM_INDICES;  		for( U32 index = 0; index < num_bakes; ++index )  		{  			composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); @@ -69,397 +57,89 @@ public:  	~LLOverrideBakedTextureUpdate()  	{ -		U32 num_bakes = (U32)LLVOAvatarDefines::BAKED_NUM_INDICES;		 +		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[LLVOAvatarDefines::BAKED_NUM_INDICES]; +	bool composite_enabled[LLAvatarAppearanceDefines::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) +LLViewerWearable::LLViewerWearable(const LLTransactionID& transaction_id) : +	LLWearable()  {  	mTransactionID = transaction_id;  	mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());  } -LLWearable::LLWearable(const LLAssetID& asset_id) : -	mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ), -	mType(LLWearableType::WT_INVALID) +LLViewerWearable::LLViewerWearable(const LLAssetID& asset_id) : +	LLWearable()  {  	mAssetID = asset_id;  	mTransactionID.setNull();  } -LLWearable::~LLWearable() -{ -} - -const std::string& LLWearable::getTypeLabel() const -{ -	return LLWearableType::getTypeLabel(mType); -} - -const std::string& LLWearable::getTypeName() const +// virtual +LLViewerWearable::~LLViewerWearable()  { -	return LLWearableType::getTypeName(mType);  } -LLAssetType::EType LLWearable::getAssetType() const +// virtual +LLWearable::EImportResult LLViewerWearable::importFile( LLFILE* file, LLAvatarAppearance* avatarp )  { -	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 ) +	LLWearable::EImportResult result = LLWearable::importFile(file, 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 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); +		return result;  	} -	// 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; -	} +	LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN ); +	LLStringUtil::truncate(mDescription, DB_INV_ITEM_DESC_STR_LEN ); -	// parameters header -	S32 num_parameters = 0; -	fields_read = fscanf( file, "parameters %d\n", &num_parameters ); -	if( fields_read != 1 ) +	te_map_t::const_iterator iter = mTEMap.begin(); +	te_map_t::const_iterator end = mTEMap.end(); +	for (; iter != end; ++iter)  	{ -		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() ) +		S32 te = iter->first; +		LLLocalTextureObject* lto = iter->second; +		LLUUID textureid = LLUUID::null; +		if (lto)  		{ -			delete mSavedTEMap[te]; +			textureid = lto->getID();  		} +		LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( textureid );  		if(gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime"))  		{ -			image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te), NULL); +			image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(textureid, (LLAvatarAppearanceDefines::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; +	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 LLWearable::isOldVersion() const +BOOL LLViewerWearable::isOldVersion() const  {  	if (!isAgentAvatarValid()) return FALSE; @@ -497,7 +177,7 @@ BOOL LLWearable::isOldVersion() const  	S32 te_count = 0;  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType)  		{  			te_count++;  			if( !is_in_map(mTEMap, te ) ) @@ -521,7 +201,7 @@ BOOL LLWearable::isOldVersion() const  // * 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 +BOOL LLViewerWearable::isDirty() const  {  	if (!isAgentAvatarValid()) return FALSE; @@ -549,7 +229,7 @@ BOOL LLWearable::isDirty() const  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator current_iter = mTEMap.find(te);  			if(current_iter != mTEMap.end()) @@ -578,7 +258,7 @@ BOOL LLWearable::isDirty() const  } -void LLWearable::setParamsToDefaults() +void LLViewerWearable::setParamsToDefaults()  {  	if (!isAgentAvatarValid()) return; @@ -591,18 +271,18 @@ void LLWearable::setParamsToDefaults()  	}  } -void LLWearable::setTexturesToDefaults() +void LLViewerWearable::setTexturesToDefaults()  {  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType)  		{ -			LLUUID id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); +			LLUUID id = getDefaultTextureImageID((ETextureIndex) te);  			LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id );  			if( mTEMap.find(te) == mTEMap.end() )  			{  				mTEMap[te] = new LLLocalTextureObject(image, id); -				createLayers(te); +				createLayers(te, gAgentAvatarp);  			}  			else  			{ @@ -615,37 +295,49 @@ void LLWearable::setTexturesToDefaults()  	}  } + +//static +const LLUUID LLViewerWearable::getDefaultTextureImageID(ETextureIndex index) +{ +	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 -void LLWearable::writeToAvatar() +//virtual +void LLViewerWearable::writeToAvatar(LLAvatarAppearance *avatarp)  { -	if (!isAgentAvatarValid()) return; +	LLVOAvatarSelf* viewer_avatar = dynamic_cast<LLVOAvatarSelf*>(avatarp); + +	if (!avatarp || !viewer_avatar) return; + +	if (!viewer_avatar->isValid()) return; +  #if 1 -	if (!gAgentAvatarp->isUsingLocalAppearance()) +	if (!viewer_avatar->isUsingLocalAppearance())  	{  		return;  	}  #endif -	ESex old_sex = gAgentAvatarp->getSex(); +	ESex old_sex = avatarp->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); +	LLWearable::writeToAvatar(avatarp); -			gAgentAvatarp->setVisualParamWeight( param_id, weight, FALSE ); -		} -	}  	// Pull texture entries  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator iter = mTEMap.find(te);  			LLUUID image_id; @@ -655,18 +347,18 @@ void LLWearable::writeToAvatar()  			}  			else  			{	 -				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); +				image_id = getDefaultTextureImageID((ETextureIndex) te);  			} -			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); +			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. -			gAgentAvatarp->setLocalTextureTE(te, image, 0); +			viewer_avatar->setLocalTextureTE(te, image, 0);  		}  	} -	ESex new_sex = gAgentAvatarp->getSex(); +	ESex new_sex = avatarp->getSex();  	if( old_sex != new_sex )  	{ -		gAgentAvatarp->updateSexDependentLayerSets( FALSE ); +		viewer_avatar->updateSexDependentLayerSets( FALSE );  	}	  //	if( upload_bake ) @@ -678,7 +370,7 @@ void LLWearable::writeToAvatar()  // 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 ) +void LLViewerWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake )  {  	if (!isAgentAvatarValid()) return; @@ -717,7 +409,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake  // Does not copy mAssetID.  // Definition version is current: removes obsolete enties and creates default values for new ones. -void LLWearable::copyDataFrom(const LLWearable* src) +void LLViewerWearable::copyDataFrom(const LLViewerWearable* src)  {  	if (!isAgentAvatarValid()) return; @@ -728,7 +420,7 @@ void LLWearable::copyDataFrom(const LLWearable* src)  	mPermissions = src->mPermissions;  	mSaleInfo = src->mSaleInfo; -	setType(src->mType); +	setType(src->mType, gAgentAvatarp);  	mSavedVisualParamMap.clear();  	// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) @@ -748,14 +440,14 @@ void LLWearable::copyDataFrom(const LLWearable* src)  	// 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) +		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 = src->getLocalTextureObject(te)->getImage(); +				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); @@ -764,12 +456,12 @@ void LLWearable::copyDataFrom(const LLWearable* src)  			}  			else  			{ -				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); +				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); +			createLayers(te, gAgentAvatarp);  		}  	} @@ -778,23 +470,13 @@ void LLWearable::copyDataFrom(const LLWearable* src)  	revertValues();  } -void LLWearable::setItemID(const LLUUID& item_id) +void LLViewerWearable::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) +LLLocalTextureObject* LLViewerWearable::getLocalTextureObject(S32 index)  {  	te_map_t::iterator iter = mTEMap.find(index);  	if( iter != mTEMap.end() ) @@ -805,7 +487,7 @@ LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index)  	return NULL;  } -const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const +const LLLocalTextureObject* LLViewerWearable::getLocalTextureObject(S32 index) const  {  	te_map_t::const_iterator iter = mTEMap.find(index);  	if( iter != mTEMap.end() ) @@ -816,7 +498,7 @@ const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const  	return NULL;  } -std::vector<LLLocalTextureObject*> LLWearable::getLocalTextureListSeq() +std::vector<LLLocalTextureObject*> LLViewerWearable::getLocalTextureListSeq()  {  	std::vector<LLLocalTextureObject*> result; @@ -830,7 +512,7 @@ std::vector<LLLocalTextureObject*> LLWearable::getLocalTextureListSeq()  	return result;  } -void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject <o) +void LLViewerWearable::setLocalTextureObject(S32 index, LLLocalTextureObject <o)  {  	if( mTEMap.find(index) != mTEMap.end() )  	{ @@ -839,19 +521,7 @@ void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject <o)  	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() +void LLViewerWearable::setVisualParams()  {  	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)  	{ @@ -862,91 +532,7 @@ void LLWearable::setVisualParams()  	}  } - -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() +void LLViewerWearable::revertValues()  {  	//update saved settings so wearable is no longer dirty  	// non-driver params first @@ -994,25 +580,7 @@ void LLWearable::revertValues()  	}  } -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() +void LLViewerWearable::saveValues()  {  	//update saved settings so wearable is no longer dirty  	mSavedVisualParamMap.clear(); @@ -1035,12 +603,12 @@ void LLWearable::saveValues()  	}  } -void LLWearable::syncImages(te_map_t &src, te_map_t &dst) +void LLViewerWearable::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) +		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator iter = src.find(te);  			LLUUID image_id; @@ -1050,13 +618,13 @@ void LLWearable::syncImages(te_map_t &src, te_map_t &dst)  			{  				// 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 = dynamic_cast<LLViewerFetchedTexture*> (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_id = getDefaultTextureImageID((ETextureIndex) te);  				image = LLViewerTextureManager::getFetchedTexture( image_id );  			} @@ -1082,7 +650,7 @@ void LLWearable::syncImages(te_map_t &src, te_map_t &dst)  	}  } -void LLWearable::destroyTextures() +void LLViewerWearable::destroyTextures()  {  	for( te_map_t::iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter )  	{ @@ -1098,32 +666,13 @@ void LLWearable::destroyTextures()  	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 +// virtual +void LLViewerWearable::setUpdated() const  {   	gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID());  } -void LLWearable::refreshName() +void LLViewerWearable::refreshName()  {  	LLUUID item_id = getItemID();  	LLInventoryItem* item = gInventory.getItem(item_id); @@ -1133,14 +682,21 @@ void LLWearable::refreshName()  	}  } +// 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 LLWearable::saveNewAsset() const +void LLViewerWearable::saveNewAsset() const  { -//	llinfos << "LLWearable::saveNewAsset() type: " << getTypeName() << llendl; +//	llinfos << "LLViewerWearable::saveNewAsset() type: " << getTypeName() << llendl;  	//llinfos << *this << llendl;  	const std::string filename = asset_id_to_filename(mAssetID); @@ -1189,13 +745,13 @@ void LLWearable::saveNewAsset() const  		 LLWearableSaveData* data = new LLWearableSaveData;  		 data->mType = mType;  		 gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), -                                     &LLWearable::onSaveNewAssetComplete, +                                     &LLViewerWearable::onSaveNewAssetComplete,                                       (void*)data);  	}  }  // static -void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) +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); @@ -1222,7 +778,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda  } -std::ostream& operator<<(std::ostream &s, const LLWearable &w) +std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w)  {  	s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n";  	s << "    Name: " << w.mName << "\n"; @@ -1241,7 +797,7 @@ std::ostream& operator<<(std::ostream &s, const LLWearable &w)  	}  	s << "    Textures:" << "\n"; -	for (LLWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); +	for (LLViewerWearable::te_map_t::const_iterator iter = w.mTEMap.begin();  		 iter != w.mTEMap.end(); ++iter)  	{  		S32 te = iter->first; @@ -1251,37 +807,6 @@ std::ostream& operator<<(std::ostream &s, const LLWearable &w)  	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; diff --git a/indra/newview/llviewerwearable.h b/indra/newview/llviewerwearable.h new file mode 100644 index 0000000000..d8412b1c65 --- /dev/null +++ b/indra/newview/llviewerwearable.h @@ -0,0 +1,112 @@ +/**  + * @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	importFile(LLFILE* file, LLAvatarAppearance* avatarp); +	 +	void				setParamsToDefaults(); +	void				setTexturesToDefaults(); + +	static const LLUUID			getDefaultTextureImageID(LLAvatarAppearanceDefines::ETextureIndex index); + + +	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*/ LLLocalTextureObject* getLocalTextureObject(S32 index); +	const LLLocalTextureObject* getLocalTextureObject(S32 index) const; +	std::vector<LLLocalTextureObject*> getLocalTextureListSeq(); +	void				setLocalTextureObject(S32 index, LLLocalTextureObject <o); +	void				setVisualParams(); + +	void				revertValues(); +	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: +	void				syncImages(te_map_t &src, te_map_t &dst); +	void				destroyTextures();	 +	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 4aabbd6bb6..0cad2e3ec6 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]));  			} @@ -729,7 +729,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)  				{ @@ -1678,7 +1678,7 @@ 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) ; +	LLImageGL::initClass(LLGLTexture::MAX_GL_IMAGE_CATEGORY) ;  	gTextureList.init();  	LLViewerTextureManager::init() ;  	gBumpImageList.init(); @@ -2140,7 +2140,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 @@ -2346,7 +2346,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(); @@ -2360,7 +2360,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 @@ -2408,7 +2408,7 @@ void LLViewerWindow::draw()  				LLFontGL::HCENTER, LLFontGL::TOP);  		} -		LLUI::sGLScaleFactor = old_scale_factor; +		LLUI::setScaleFactor(old_scale_factor);  	}  	LLUI::popMatrix();  	gGL.popMatrix(); @@ -3208,8 +3208,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; diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index ec932501e5..e90a2470d4 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;  		} @@ -463,7 +463,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 bcaf355dd8..bec67c1695 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -24,12 +24,6 @@   * $/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" @@ -78,15 +72,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" @@ -109,16 +104,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 @@ -139,7 +128,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; @@ -193,8 +181,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, @@ -228,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  //----------------------------------------------------------------------------- @@ -601,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; @@ -652,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), @@ -685,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), @@ -714,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; @@ -824,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(); @@ -910,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. @@ -919,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.  			} @@ -1084,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(); @@ -1113,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();  } @@ -1140,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(); @@ -1149,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(); @@ -1162,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"); @@ -1281,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) @@ -1417,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); @@ -1429,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 @@ -1504,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++) @@ -1742,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; @@ -1927,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(); @@ -2090,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);  	} @@ -2184,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  			{ @@ -2258,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(); @@ -2279,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, @@ -2513,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); @@ -2632,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 ); @@ -3373,7 +2774,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); @@ -3387,7 +2788,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));	 @@ -3452,13 +2853,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 @@ -3635,8 +3036,8 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			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() );  		}  		//-------------------------------------------------------------------- @@ -3679,10 +3080,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				  		} @@ -3743,7 +3144,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); @@ -3752,7 +3153,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"); @@ -3838,14 +3239,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());  	}  	//------------------------------------------------------------------------- @@ -3945,7 +3346,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		}  	} -	mRoot.updateWorldMatrixChildren(); +	mRoot->updateWorldMatrixChildren();  	if (!mDebugText.size() && mText.notNull())  	{ @@ -3969,7 +3370,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()) @@ -4007,8 +3408,8 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount,  void LLVOAvatar::postPelvisSetRecalc( void )  {	  	computeBodySize();  -	mRoot.touch(); -	mRoot.updateWorldMatrixChildren();	 +	mRoot->touch(); +	mRoot->updateWorldMatrixChildren();	  	dirtyMesh();  	updateHeadOffset();  } @@ -4242,19 +3643,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; @@ -4371,19 +3797,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;  			}  		} @@ -4416,7 +3854,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);  	} @@ -4430,14 +3872,22 @@ 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)->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) @@ -4481,8 +3931,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) @@ -4576,7 +4034,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);  		const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT); @@ -4586,7 +4044,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)  				{ @@ -4709,7 +4167,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) ;  	} @@ -4747,7 +4205,7 @@ const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid)  	std::string url = "";  	if (mUseServerBakes && !gSavedSettings.getString("AgentAppearanceServiceURL").empty())  	{ -		const LLVOAvatarDictionary::TextureEntry* texture_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)te); +		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(); @@ -5104,48 +4562,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) @@ -5174,7 +4590,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 @@ -5190,10 +4606,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; @@ -5203,7 +4621,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() )  	{ @@ -5225,16 +4643,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(); @@ -5333,23 +4752,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() @@ -5367,61 +4769,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() @@ -5433,215 +4780,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; @@ -5714,144 +4870,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( LLColor4::white ); - -		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() @@ -5864,7 +4882,7 @@ void LLVOAvatar::updateVisualParams()  	{  		computeBodySize();  		mLastSkeletonSerialNum = mSkeletonSerialNum; -		mRoot.updateWorldMatrixChildren(); +		mRoot->updateWorldMatrixChildren();  	}  	dirtyMesh(); @@ -5954,7 +4972,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++; @@ -6044,6 +5067,15 @@ void LLVOAvatar::dirtyMesh(S32 priority)  {  	mDirtyMesh = llmax(mDirtyMesh, priority);  } + +//----------------------------------------------------------------------------- +// getViewerJoint() +//----------------------------------------------------------------------------- +LLViewerJoint*	LLVOAvatar::getViewerJoint(S32 idx) +{ +	return dynamic_cast<LLViewerJoint*>(mMeshLOD[idx]); +} +  //-----------------------------------------------------------------------------  // hideSkirt()  //----------------------------------------------------------------------------- @@ -6357,9 +5389,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); @@ -6405,10 +5437,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); @@ -6460,27 +5492,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 )  { @@ -6490,6 +5549,7 @@ void LLVOAvatar::invalidateAll()  {  } +// virtual  void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )  {  	if (global_color == mTexSkinColor) @@ -6508,9 +5568,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 ); +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh) +				{ +					mesh->setColor( color ); +				}  			}  		}  	}  @@ -6689,6 +5755,7 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const  // updateMeshTextures()  // Uses the current TE values to set the meshes' and layersets' textures.  //----------------------------------------------------------------------------- +// virtual  void LLVOAvatar::updateMeshTextures()  {      // llinfos << "updateMeshTextures" << llendl; @@ -6726,15 +5793,16 @@ void LLVOAvatar::updateMeshTextures()  			// When an avatar is changing clothes and not in Appearance mode,  			// use the last-known good baked texture until it finish the first  			// render of the new layerset. -			const BOOL layerset_invalid = mBakedTextureDatas[i].mTexLayerSet  -										  && ( !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized() -										  || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() ); +			LLViewerTexLayerSet* layerset = getTexLayerSet(i); +			const BOOL layerset_invalid = layerset +										  && ( !layerset->getViewerComposite()->isInitialized() +										  || !layerset->isLocalTextureDataAvailable() );  			use_lkg_baked_layer[i] = (!is_layer_baked[i]   									  && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR)   									  && layerset_invalid);  			if (use_lkg_baked_layer[i])  			{ -				mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); +				layerset->setUpdatesEnabled(TRUE);  			}  		}  		else @@ -6747,13 +5815,14 @@ void LLVOAvatar::updateMeshTextures()  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{ +		LLViewerTexLayerSet* layerset = getTexLayerSet(i);  		if (use_lkg_baked_layer[i] && !mUseLocalAppearance )  		{  			LLViewerFetchedTexture* baked_img;  			const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureIndex);  			if (!url.empty())  			{ -				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureIndex); +				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureIndex);  			}  			else  			{ @@ -6768,12 +5837,18 @@ void LLVOAvatar::updateMeshTextures()  			}  			mBakedTextureDatas[i].mIsUsed = TRUE; -			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]->setTexture( baked_img ); -				if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh)  				{ -					mBakedTextureDatas[i].mMeshes[k]->setColor(LLColor4::red); +					mesh->setTexture( baked_img ); +					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +					{ +						mesh->setColor(LLColor4::red); +					}  				}  			}  		} @@ -6797,27 +5872,39 @@ void LLVOAvatar::updateMeshTextures()  					src_callback_list, paused );  			}  		} -		else if (mBakedTextureDatas[i].mTexLayerSet && mUseLocalAppearance)  +		else if (layerset && mUseLocalAppearance)   		{ -			mBakedTextureDatas[i].mTexLayerSet->createComposite(); -			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); +			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 ); -				if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh)  				{ -					mBakedTextureDatas[i].mMeshes[k]->setColor( LLColor4::yellow ); +					mesh->setLayerSet( layerset ); +					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +					{ +						mesh->setColor( LLColor4::yellow ); +					}  				}  			}  		}  		else  		{ -			for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++) +			if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked"))  			{ -				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)  				{ -					mBakedTextureDatas[i].mMeshes[k]->setColor( LLColor4::blue ); +					LLAvatarJointMesh* mesh = (*iter); +					if (mesh) +					{ +						mesh->setColor( LLColor4::blue ); +					}  				}  			}  		} @@ -6830,20 +5917,26 @@ void LLVOAvatar::updateMeshTextures()  	{  		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 ); -			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(); @@ -6871,7 +5964,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); @@ -6906,18 +5999,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)  	{ @@ -6928,7 +6033,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(); @@ -6943,23 +6048,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 @@ -6982,7 +6070,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) )) @@ -6998,120 +6086,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 ) @@ -7137,48 +6119,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()  //----------------------------------------------------------------------------- @@ -7462,7 +6402,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  			&& 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].mLastTextureIndex, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  		}  	} @@ -7676,12 +6616,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; @@ -7795,19 +6735,25 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  			mBakedTextureDatas[i].mIsLoaded = true;  			mBakedTextureDatas[i].mLastTextureIndex = id;  			mBakedTextureDatas[i].mIsUsed = true; -			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]->setTexture( image_baked ); -				if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +				LLAvatarJointMesh* mesh = (*iter); +				if (mesh)  				{ -					mBakedTextureDatas[i].mMeshes[k]->setColor( LLColor4::green ); +					mesh->setTexture( image_baked ); +					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +					{ +						mesh->setColor( LLColor4::green ); +					}  				}  			}  			if (mBakedTextureDatas[i].mTexLayerSet)  			{  				//mBakedTextureDatas[i].mTexLayerSet->destroyComposite();  			} -			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) @@ -7820,9 +6766,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( LLColor4::white ); +					LLAvatarJointMesh* mesh = (*iter); +					if (mesh) +					{ +						mesh->setColor( LLColor4::white ); +					}  				}  			}  		} @@ -8063,501 +7015,20 @@ 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) -{ -	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; -		} -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlDriverNodes(LLXmlTreeNode* root) +//virtual +void LLVOAvatar::bodySizeChanged()  { -	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; -				} -			} -		} +	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::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 @@ -8733,7 +7204,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)))  		{ @@ -8813,11 +7284,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) @@ -8846,26 +7317,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; @@ -8897,7 +7368,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))   	{ @@ -8909,7 +7380,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))  	{ @@ -8925,9 +7396,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 170072e5c1..96e87279b2 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,7 +208,7 @@ public:  public:  	virtual bool 	isSelf() const { return false; } // True if this avatar is for this viewer's agent -	bool isBuilt() const { return mIsBuilt; } +	/*virtual*/BOOL	isUsingBakedTextures() const { return mUseServerBakes; } // e.g. false if in appearance edit mode		  private: //aligned members  	LL_ALIGN_16(LLVector4a	mImpostorExtents[2]); @@ -341,82 +327,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   **                                                                            ** @@ -440,7 +377,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 @@ -458,9 +394,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 @@ -543,10 +485,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   **                                                                            ** @@ -561,9 +503,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); @@ -574,6 +516,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); @@ -581,32 +524,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 @@ -641,13 +571,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 @@ -668,22 +596,19 @@ private:   **/  public: -	void 			updateMeshTextures(); +	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  	//-------------------------------------------------------------------- @@ -704,13 +629,13 @@ public:  	void 			processAvatarAppearance(LLMessageSystem* mesgsys);  	void 			hideSkirt();  	void			startAppearanceAnimation(); +	/*virtual*/ void bodySizeChanged();  	//--------------------------------------------------------------------  	// Appearance morphing  	//--------------------------------------------------------------------  public:  	BOOL			getIsAppearanceAnimating() const { return mAppearanceAnimating; } -	BOOL			isUsingBakedTextures() const { return mUseServerBakes; } // e.g. false if in appearance edit mode	  	BOOL			isUsingLocalAppearance() const { return mUseLocalAppearance; }  private: @@ -722,25 +647,6 @@ private:  	BOOL			mUseServerBakes; // flag for if baked textures should be fetched from baking service (false if they're temporary uploads)  	//-------------------------------------------------------------------- -	// 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; - -	//--------------------------------------------------------------------  	// Visibility  	//--------------------------------------------------------------------  public: @@ -748,7 +654,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   **                                                                            **   *******************************************************************************/ @@ -758,9 +663,6 @@ public:   **                    WEARABLES   **/ -public: -	virtual BOOL			isWearingWearableType(LLWearableType::EType type ) const; -	  	//--------------------------------------------------------------------  	// Attachments  	//-------------------------------------------------------------------- @@ -770,6 +672,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(); @@ -872,15 +775,6 @@ private:  	F32			mSpeed; // misc. animation repeated state  	//-------------------------------------------------------------------- -	// Collision volumes -	//-------------------------------------------------------------------- -public: -  	S32			mNumCollisionVolumes; -	LLViewerJointCollisionVolume* mCollisionVolumes; -protected: -	BOOL		allocateCollisionVolumes(U32 num); - -	//--------------------------------------------------------------------  	// Dimensions  	//--------------------------------------------------------------------  public: @@ -890,7 +784,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 @@ -910,9 +803,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 @@ -1060,105 +953,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   **                                                                            ** @@ -1168,4 +962,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/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 8791055695..a29b3ff92b 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); @@ -585,70 +583,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 +602,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 +633,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,7 +661,7 @@ 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)  	{ @@ -734,7 +674,7 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL  		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 +703,7 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation()  		LLWearable *wearable = gAgentWearables.getTopWearable((LLWearableType::EType)type);  		if (wearable)  		{ -			wearable->writeToAvatar(); +			wearable->writeToAvatar(this);  		}  	} @@ -817,7 +757,7 @@ U32  LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys,  		// 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,8 +821,9 @@ 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();  		if (getRegion() && !getRegion()->getCentralBakeVersion()) @@ -945,7 +886,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;  	} @@ -1060,11 +1001,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. @@ -1072,26 +1008,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;  				} @@ -1255,7 +1192,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;  		} @@ -1304,9 +1241,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);  } @@ -1375,11 +1312,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))  	{ @@ -1395,7 +1332,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 @@ -1416,25 +1353,25 @@ 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++)  				{ @@ -1454,7 +1391,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. @@ -1463,13 +1400,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++)  				{ @@ -1493,13 +1430,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++)  			{ @@ -1513,22 +1450,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)  		{ @@ -1555,7 +1492,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))  	{ @@ -1568,7 +1505,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))  	{ @@ -1591,13 +1528,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();  	}  } @@ -1611,8 +1549,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;  		} @@ -1620,7 +1558,7 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const  	return false;  } -void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) +void LLVOAvatarSelf::invalidateComposite( LLViewerTexLayerSet* layerset, BOOL upload_result )  {  	if( !layerset || !layerset->getUpdatesEnabled() )  	{ @@ -1646,7 +1584,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();  } @@ -1664,17 +1603,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;  } @@ -1685,9 +1626,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);  		}  	}  } @@ -1696,10 +1638,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();  		}  	}  } @@ -1712,11 +1655,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  		{ @@ -1741,7 +1685,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(); @@ -1776,8 +1720,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; @@ -1790,10 +1734,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));  		}  	} @@ -1814,15 +1758,15 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					if (isSelf())  					{  						if (gAgentAvatarp->isUsingBakedTextures()) -					{ -						requestLayerSetUpdate(type); -					} +						{ +							requestLayerSetUpdate(type); +						}  						else -					{ -						LLVisualParamHint::requestHintUpdates(); +						{ +							LLVisualParamHint::requestHintUpdates(); +						}  					}  				} -				}  				else  				{					  					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL); @@ -1836,7 +1780,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  	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); @@ -1855,16 +1799,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); @@ -1887,7 +1831,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() << ", " @@ -1982,14 +1926,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; @@ -2060,7 +2004,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=""; @@ -2068,21 +2012,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)  				{ @@ -2109,14 +2053,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++)  			{ @@ -2240,7 +2184,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; @@ -2252,7 +2196,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; @@ -2271,19 +2215,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); @@ -2355,10 +2299,10 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  	}  } -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); @@ -2371,7 +2315,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++)  	{ @@ -2385,9 +2329,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);  } @@ -2409,7 +2353,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. @@ -2474,7 +2418,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 << ") "; @@ -2502,19 +2446,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;  	} @@ -2547,7 +2491,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)  			{ @@ -2561,7 +2506,7 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid  				}  				mInitialBakeIDs[i] = LLUUID::null;  			} -			mBakedTextureDatas[i].mTexLayerSet->cancelUpload(); +			layerset->cancelUpload();  		}  	}  } @@ -2580,17 +2525,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; @@ -2622,7 +2567,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) @@ -2654,7 +2599,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; @@ -2664,22 +2609,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: @@ -2687,12 +2632,14 @@ 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(bool disable_camera_switch)  { @@ -2745,12 +2692,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); @@ -2762,12 +2709,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); diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 92d59dc9e1..395874ee62 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,10 +233,10 @@ 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**);  protected: @@ -247,16 +247,17 @@ 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  	//--------------------------------------------------------------------  public: -	/* virtual */ void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); +	/* virtual */ void	invalidateComposite(LLViewerTexLayerSet* layerset, BOOL upload_result);  	/* virtual */ void	invalidateAll();  	/* virtual */ void	setCompositeUpdatesEnabled(bool b); // only works for self  	/* virtual */ void  setCompositeUpdatesEnabled(U32 index, bool b); @@ -264,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;  	//-------------------------------------------------------------------- @@ -299,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 @@ -371,25 +371,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. @@ -397,8 +397,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/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/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 2ad3ff50b8..5e13cd8e70 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -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 @@ -2710,7 +2710,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/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index c7e9215643..c196d70617 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" diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 6f6411ce3c..50beaaec3f 100644 --- 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,12 +98,17 @@ 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 @@ -111,9 +119,9 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  		}  		else  		{ -			wearable = new LLWearable(uuid); -			bool res = wearable->importFile( fp ); -			if (!res) +			wearable = new LLViewerWearable(uuid); +			LLWearable::EImportResult result = wearable->importFile( fp, avatarp ); +			if (LLWearable::SUCCESS != result)  			{  				if (wearable->getType() == LLWearableType::WT_COUNT)  				{ @@ -203,11 +211,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 +230,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 +259,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/llworldmap.cpp b/indra/newview/llworldmap.cpp index cb24e96d5b..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;  } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index a3ccf87cfc..428be8efb9 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())  				{ 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/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) { }  | 
