Oh gawd this is gonna conflict with Shyotl..
but you people wanted Render Weight for some reason... so here it is... Now we'll send it to the server, rejoice.
This commit is contained in:
@@ -123,6 +123,7 @@ set(viewer_SOURCE_FILES
|
||||
llautoreplace.cpp
|
||||
llavataractions.cpp
|
||||
llavatarpropertiesprocessor.cpp
|
||||
llavatarrenderinfoaccountant.cpp
|
||||
llbox.cpp
|
||||
llcallbacklist.cpp
|
||||
llcallingcard.cpp
|
||||
@@ -654,6 +655,7 @@ set(viewer_HEADER_FILES
|
||||
llautoreplace.h
|
||||
llavataractions.h
|
||||
llavatarpropertiesprocessor.h
|
||||
llavatarrenderinfoaccountant.h
|
||||
llbox.h
|
||||
llcallbacklist.h
|
||||
llcallingcard.h
|
||||
|
||||
@@ -14117,6 +14117,17 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderAutoMuteLogging</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show extra information in viewer logs about avatar rendering costs</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderAutoHideSurfaceAreaLimit</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
#include "llcrashlogger.h"
|
||||
#include "llweb.h"
|
||||
#include "llsecondlifeurls.h"
|
||||
#include "llavatarrenderinfoaccountant.h"
|
||||
|
||||
// Linden library includes
|
||||
#include "llavatarnamecache.h"
|
||||
@@ -4192,6 +4193,9 @@ void LLAppViewer::idle()
|
||||
gObjectList.updateApparentAngles(gAgent);
|
||||
}
|
||||
|
||||
// Update AV render info
|
||||
LLAvatarRenderInfoAccountant::idle();
|
||||
|
||||
// Execute deferred tasks.
|
||||
{
|
||||
LAZY_FT("DeferredTaskRun");
|
||||
|
||||
407
indra/newview/llavatarrenderinfoaccountant.cpp
Normal file
407
indra/newview/llavatarrenderinfoaccountant.cpp
Normal file
@@ -0,0 +1,407 @@
|
||||
/**
|
||||
* @file llavatarrenderinfoaccountant.cpp
|
||||
* @author Dave Simmons
|
||||
* @date 2013-02-28
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2013, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
// Precompiled header
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
// associated header
|
||||
#include "llavatarrenderinfoaccountant.h"
|
||||
// STL headers
|
||||
// std headers
|
||||
// external library headers
|
||||
// other Linden headers
|
||||
#include "llcharacter.h"
|
||||
#include "llhttpclient.h"
|
||||
#include "lltimer.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llworld.h"
|
||||
|
||||
|
||||
static const std::string KEY_AGENTS = "agents"; // map
|
||||
static const std::string KEY_WEIGHT = "weight"; // integer
|
||||
|
||||
static const std::string KEY_IDENTIFIER = "identifier";
|
||||
static const std::string KEY_MESSAGE = "message";
|
||||
static const std::string KEY_ERROR = "error";
|
||||
|
||||
|
||||
// Send data updates about once per minute, only need per-frame resolution
|
||||
LLFrameTimer LLAvatarRenderInfoAccountant::sRenderInfoReportTimer;
|
||||
|
||||
|
||||
// HTTP responder class for GET request for avatar render weight information
|
||||
class LLAvatarRenderInfoGetResponder : public LLHTTPClient::ResponderWithResult
|
||||
{
|
||||
public:
|
||||
LLAvatarRenderInfoGetResponder(U64 region_handle) : mRegionHandle(region_handle)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void httpFailure()
|
||||
{
|
||||
const S32 statusNum = getStatus();
|
||||
const std::string& reason = getReason();
|
||||
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
|
||||
if (regionp)
|
||||
{
|
||||
LL_WARNS() << "HTTP error result for avatar weight GET: " << statusNum
|
||||
<< ", " << reason
|
||||
<< " returned by region " << regionp->getName()
|
||||
<< LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Avatar render weight GET error recieved but region not found for "
|
||||
<< mRegionHandle
|
||||
<< ", error " << statusNum
|
||||
<< ", " << reason
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
virtual void httpSuccess()
|
||||
{
|
||||
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
|
||||
if (regionp)
|
||||
{
|
||||
if (LLAvatarRenderInfoAccountant::logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << LL_ENDL;
|
||||
}
|
||||
|
||||
const LLSD& content = getContent();
|
||||
if (content.isMap())
|
||||
{
|
||||
if (content.has(KEY_AGENTS))
|
||||
{
|
||||
const LLSD & agents = content[KEY_AGENTS];
|
||||
if (agents.isMap())
|
||||
{
|
||||
LLSD::map_const_iterator report_iter = agents.beginMap();
|
||||
while (report_iter != agents.endMap())
|
||||
{
|
||||
LLUUID target_agent_id = LLUUID(report_iter->first);
|
||||
const LLSD & agent_info_map = report_iter->second;
|
||||
LLViewerObject* avatarp = gObjectList.findObject(target_agent_id);
|
||||
if (avatarp &&
|
||||
avatarp->isAvatar() &&
|
||||
agent_info_map.isMap())
|
||||
{ // Extract the data for this avatar
|
||||
|
||||
if (LLAvatarRenderInfoAccountant::logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Agent " << target_agent_id
|
||||
<< ": " << agent_info_map << LL_ENDL;
|
||||
}
|
||||
|
||||
if (agent_info_map.has(KEY_WEIGHT))
|
||||
{
|
||||
((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger());
|
||||
}
|
||||
}
|
||||
report_iter++;
|
||||
}
|
||||
}
|
||||
} // has "agents"
|
||||
else if (content.has(KEY_ERROR))
|
||||
{
|
||||
const LLSD & error = content[KEY_ERROR];
|
||||
LL_WARNS() << "Avatar render info GET error: "
|
||||
<< error[KEY_IDENTIFIER]
|
||||
<< ": " << error[KEY_MESSAGE]
|
||||
<< " from region " << regionp->getName()
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS() << "Avatar render weight info recieved but region not found for "
|
||||
<< mRegionHandle << LL_ENDL;
|
||||
}
|
||||
}
|
||||
/*virtual*/ char const* getName() const { return "This is dumb."; }
|
||||
|
||||
private:
|
||||
U64 mRegionHandle;
|
||||
};
|
||||
|
||||
|
||||
// HTTP responder class for POST request for avatar render weight information
|
||||
class LLAvatarRenderInfoPostResponder : public LLHTTPClient::ResponderWithResult
|
||||
{
|
||||
public:
|
||||
LLAvatarRenderInfoPostResponder(U64 region_handle) : mRegionHandle(region_handle)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void httpFailure()
|
||||
{
|
||||
const S32 statusNum = getStatus();
|
||||
const std::string& reason = getReason();
|
||||
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
|
||||
if (regionp)
|
||||
{
|
||||
LL_WARNS() << "HTTP error result for avatar weight POST: " << statusNum
|
||||
<< ", " << reason
|
||||
<< " returned by region " << regionp->getName()
|
||||
<< LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Avatar render weight POST error recieved but region not found for "
|
||||
<< mRegionHandle
|
||||
<< ", error " << statusNum
|
||||
<< ", " << reason
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void httpSuccess()
|
||||
{
|
||||
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
|
||||
if (regionp)
|
||||
{
|
||||
const LLSD& content = getContent();
|
||||
if (LLAvatarRenderInfoAccountant::logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Result for avatar weights POST for region " << regionp->getName()
|
||||
<< ": " << content << LL_ENDL;
|
||||
}
|
||||
|
||||
if (content.isMap())
|
||||
{
|
||||
if (content.has(KEY_ERROR))
|
||||
{
|
||||
const LLSD & error = content[KEY_ERROR];
|
||||
LL_WARNS() << "Avatar render info POST error: "
|
||||
<< error[KEY_IDENTIFIER]
|
||||
<< ": " << error[KEY_MESSAGE]
|
||||
<< " from region " << regionp->getName()
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS() << "Avatar render weight POST result recieved but region not found for "
|
||||
<< mRegionHandle << LL_ENDL;
|
||||
}
|
||||
}
|
||||
/*virtual*/ char const* getName() const { return "This is also dumb."; }
|
||||
|
||||
private:
|
||||
U64 mRegionHandle;
|
||||
};
|
||||
|
||||
|
||||
// static
|
||||
// Send request for one region, no timer checks
|
||||
void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regionp)
|
||||
{
|
||||
std::string url = regionp->getCapability("AvatarRenderInfo");
|
||||
if (!url.empty())
|
||||
{
|
||||
if (logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Sending avatar render info to region "
|
||||
<< regionp->getName()
|
||||
<< " from " << url
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
// Build the render info to POST to the region
|
||||
LLSD report = LLSD::emptyMap();
|
||||
LLSD agents = LLSD::emptyMap();
|
||||
|
||||
std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
|
||||
while( iter != LLCharacter::sInstances.end() )
|
||||
{
|
||||
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
|
||||
if (avatar &&
|
||||
avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
|
||||
!avatar->isDead() && // Not dead yet
|
||||
avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
|
||||
{
|
||||
avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date
|
||||
|
||||
LLSD info = LLSD::emptyMap();
|
||||
if (avatar->getVisualComplexity() > 0)
|
||||
{
|
||||
info[KEY_WEIGHT] = avatar->getVisualComplexity();
|
||||
agents[avatar->getID().asString()] = info;
|
||||
|
||||
if (logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Sending avatar render info for " << avatar->getID()
|
||||
<< ": " << info << LL_ENDL;
|
||||
LL_INFOS() << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes()
|
||||
<< ", area " << avatar->getAttachmentSurfaceArea()
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
iter++;
|
||||
}
|
||||
|
||||
report[KEY_AGENTS] = agents;
|
||||
if (agents.size() > 0)
|
||||
{
|
||||
LLHTTPClient::post(url, report, new LLAvatarRenderInfoPostResponder(regionp->getHandle()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// static
|
||||
// Send request for one region, no timer checks
|
||||
void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regionp)
|
||||
{
|
||||
std::string url = regionp->getCapability("AvatarRenderInfo");
|
||||
if (!url.empty())
|
||||
{
|
||||
if (logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Requesting avatar render info for region "
|
||||
<< regionp->getName()
|
||||
<< " from " << url
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
// First send a request to get the latest data
|
||||
LLHTTPClient::get(url, new LLAvatarRenderInfoGetResponder(regionp->getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
// Called every frame - send render weight requests to every region
|
||||
void LLAvatarRenderInfoAccountant::idle()
|
||||
{
|
||||
if (sRenderInfoReportTimer.hasExpired())
|
||||
{
|
||||
const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds
|
||||
const F32 SECS_BETWEEN_REGION_REQUEST = 60.0; // Update each region every 60 seconds
|
||||
|
||||
S32 num_avs = LLCharacter::sInstances.size();
|
||||
|
||||
if (logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Scanning all regions and checking for render info updates"
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
// Check all regions and see if it's time to fetch/send data
|
||||
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
|
||||
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
|
||||
{
|
||||
LLViewerRegion* regionp = *iter;
|
||||
if (regionp &&
|
||||
regionp->isAlive() &&
|
||||
regionp->capabilitiesReceived() && // Region has capability URLs available
|
||||
regionp->getRenderInfoRequestTimer().hasExpired()) // Time to make request
|
||||
{
|
||||
sendRenderInfoToRegion(regionp);
|
||||
getRenderInfoFromRegion(regionp);
|
||||
|
||||
// Reset this regions timer, moving to longer intervals if there are lots of avatars around
|
||||
regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST + (2.f * num_avs));
|
||||
}
|
||||
}
|
||||
|
||||
// We scanned all the regions, reset the request timer.
|
||||
sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
|
||||
}
|
||||
|
||||
/* Singu TODO: RenderAutoMuteFunctions
|
||||
static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0);
|
||||
static U32 prev_render_auto_mute_functions = (U32) -1;
|
||||
if (prev_render_auto_mute_functions != render_auto_mute_functions)
|
||||
{
|
||||
prev_render_auto_mute_functions = render_auto_mute_functions;
|
||||
|
||||
// Adjust menus
|
||||
BOOL show_items = (BOOL)(render_auto_mute_functions & 0x04);
|
||||
gMenuAvatarOther->setItemVisible( std::string("Normal"), show_items);
|
||||
gMenuAvatarOther->setItemVisible( std::string("Always use impostor"), show_items);
|
||||
gMenuAvatarOther->setItemVisible( std::string("Never use impostor"), show_items);
|
||||
gMenuAvatarOther->setItemVisible( std::string("Impostor seperator"), show_items);
|
||||
|
||||
gMenuAttachmentOther->setItemVisible( std::string("Normal"), show_items);
|
||||
gMenuAttachmentOther->setItemVisible( std::string("Always use impostor"), show_items);
|
||||
gMenuAttachmentOther->setItemVisible( std::string("Never use impostor"), show_items);
|
||||
gMenuAttachmentOther->setItemVisible( std::string("Impostor seperator"), show_items);
|
||||
|
||||
if (!show_items)
|
||||
{ // Turning off visual muting
|
||||
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
|
||||
iter != LLCharacter::sInstances.end(); ++iter)
|
||||
{ // Make sure all AVs have the setting cleared
|
||||
LLVOAvatar* inst = (LLVOAvatar*) *iter;
|
||||
inst->setCachedVisualMute(false);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
// Make sRenderInfoReportTimer expire so the next call to idle() will scan and query a new region
|
||||
// called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities
|
||||
// are returned for a new LLViewerRegion, and is the earliest time to get render info
|
||||
void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& region_id)
|
||||
{
|
||||
if (logRenderInfo())
|
||||
{
|
||||
LL_INFOS() << "LRI: Viewer has new region capabilities, clearing global render info timer"
|
||||
<< " and timer for region " << region_id
|
||||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
// Reset the global timer so it will scan regions immediately
|
||||
sRenderInfoReportTimer.reset();
|
||||
|
||||
LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);
|
||||
if (regionp)
|
||||
{ // Reset the region's timer so it will request data immediately
|
||||
regionp->getRenderInfoRequestTimer().reset();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLAvatarRenderInfoAccountant::logRenderInfo()
|
||||
{
|
||||
static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false);
|
||||
return render_mute_logging_enabled;
|
||||
}
|
||||
56
indra/newview/llavatarrenderinfoaccountant.h
Normal file
56
indra/newview/llavatarrenderinfoaccountant.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* @file llavatarrenderinfoaccountant.h
|
||||
* @author Dave Simmons
|
||||
* @date 2013-02-28
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2013, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if ! defined(LL_llavatarrenderinfoaccountant_H)
|
||||
#define LL_llavatarrenderinfoaccountant_H
|
||||
|
||||
class LLViewerRegion;
|
||||
|
||||
// Class to gather avatar rendering information
|
||||
// that is sent to or fetched from regions.
|
||||
class LLAvatarRenderInfoAccountant
|
||||
{
|
||||
public:
|
||||
LLAvatarRenderInfoAccountant() {};
|
||||
~LLAvatarRenderInfoAccountant() {};
|
||||
|
||||
static void sendRenderInfoToRegion(LLViewerRegion * regionp);
|
||||
static void getRenderInfoFromRegion(LLViewerRegion * regionp);
|
||||
|
||||
static void expireRenderInfoReportTimer(const LLUUID& region_id);
|
||||
|
||||
static void idle();
|
||||
|
||||
static bool logRenderInfo();
|
||||
|
||||
private:
|
||||
// Send data updates about once per minute, only need per-frame resolution
|
||||
static LLFrameTimer sRenderInfoReportTimer;
|
||||
};
|
||||
|
||||
#endif /* ! defined(LL_llavatarrenderinfoaccountant_H) */
|
||||
@@ -52,6 +52,8 @@
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
|
||||
#include "llavatarrenderinfoaccountant.h"
|
||||
#include "llcallingcard.h"
|
||||
#include "llcaphttpsender.h"
|
||||
#include "llcapabilitylistener.h"
|
||||
@@ -489,6 +491,9 @@ void LLViewerRegion::initPartitions()
|
||||
mImpl->mObjectPartition.push_back(new LLAttachmentPartition()); //PARTITION_ATTACHMENT
|
||||
mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
|
||||
mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE
|
||||
|
||||
mRenderInfoRequestTimer.resetWithExpiry(0.f); // Set timer to be expired
|
||||
setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer, _1));
|
||||
}
|
||||
|
||||
void LLViewerRegion::reInitPartitions()
|
||||
|
||||
@@ -428,8 +428,10 @@ public:
|
||||
// positions stored in the first array so they're maintained separately until
|
||||
// we stop supporting the old CoarseLocationUpdate message.
|
||||
std::vector<U32> mMapAvatars;
|
||||
std::vector<LLUUID> mMapAvatarIDs;
|
||||
uuid_vec_t mMapAvatarIDs;
|
||||
|
||||
|
||||
LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; };
|
||||
private:
|
||||
LLViewerRegionImpl * mImpl;
|
||||
|
||||
@@ -472,7 +474,7 @@ private:
|
||||
std::string mColoName;
|
||||
std::string mProductSKU;
|
||||
std::string mProductName;
|
||||
std::string mHttpUrl ;
|
||||
std::string mHttpUrl;
|
||||
|
||||
// Maps local ids to cache entries.
|
||||
// Regions can have order 10,000 objects, so assume
|
||||
@@ -499,7 +501,7 @@ private:
|
||||
U32 mGamingFlags;
|
||||
// the materials capability throttle
|
||||
LLFrameTimer mMaterialsCapThrottleTimer;
|
||||
LLFrameTimer mRenderInfoRequestTimer;
|
||||
LLFrameTimer mRenderInfoRequestTimer;
|
||||
};
|
||||
|
||||
inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const
|
||||
|
||||
@@ -1053,8 +1053,9 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
LLAvatarAppearance(&gAgentWearables),
|
||||
LLViewerObject(id, pcode, regionp),
|
||||
mSpecialRenderMode(0),
|
||||
mAttachmentGeometryBytes(0),
|
||||
mAttachmentSurfaceArea(0.f),
|
||||
mAttachmentGeometryBytes(-1),
|
||||
mAttachmentSurfaceArea(-1.f),
|
||||
mReportedVisualComplexity(-1),
|
||||
mTurning(FALSE),
|
||||
mFreezeTimeLangolier(false),
|
||||
mFreezeTimeDead(false),
|
||||
@@ -1090,13 +1091,15 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
mFullyLoaded(FALSE),
|
||||
mPreviousFullyLoaded(FALSE),
|
||||
mFullyLoadedInitialized(FALSE),
|
||||
mVisualComplexity(0),
|
||||
mVisualComplexityStale(TRUE),
|
||||
mSupportsAlphaLayers(FALSE),
|
||||
mLoadedCallbacksPaused(FALSE),
|
||||
mHasPelvisOffset( FALSE ),
|
||||
mLastRezzedStatus(-1),
|
||||
mIsEditingAppearance(FALSE),
|
||||
mUseLocalAppearance(FALSE),
|
||||
mUseServerBakes(FALSE), // FIXME DRANO consider using boost::optional, defaulting to unknown.
|
||||
mUseServerBakes(FALSE),
|
||||
mLastUpdateRequestCOFVersion(-1),
|
||||
mLastUpdateReceivedCOFVersion(-1),
|
||||
// <edit>
|
||||
@@ -1117,7 +1120,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
const bool needsSendToSim = false; // currently, this HUD effect doesn't need to pack and unpack data to do its job
|
||||
mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
|
||||
|
||||
LL_DEBUGS() << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
|
||||
LL_DEBUGS("Avatar","Message") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
|
||||
|
||||
mPelvisp = NULL;
|
||||
|
||||
@@ -1219,10 +1222,12 @@ LLVOAvatar::~LLVOAvatar()
|
||||
|
||||
//logPendingPhases();
|
||||
|
||||
LL_DEBUGS() << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << LL_ENDL;
|
||||
LL_DEBUGS("Avatar") << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << LL_ENDL;
|
||||
|
||||
std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer());
|
||||
//mAttachmentPoints.clear();
|
||||
#if USE_LL_APPEARANCE_CODE
|
||||
mAttachmentPoints.clear();
|
||||
#endif
|
||||
|
||||
mDead = TRUE;
|
||||
|
||||
@@ -1382,10 +1387,11 @@ void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts)
|
||||
iter != LLCharacter::sInstances.end(); ++iter)
|
||||
{
|
||||
LLVOAvatar* inst = (LLVOAvatar*) *iter;
|
||||
if (!inst)
|
||||
continue;
|
||||
S32 rez_status = inst->getRezzedStatus();
|
||||
counts[rez_status]++;
|
||||
if (inst)
|
||||
{
|
||||
S32 rez_status = inst->getRezzedStatus();
|
||||
counts[rez_status]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1619,11 +1625,6 @@ void LLVOAvatar::initInstance(void)
|
||||
|
||||
LLAvatarAppearance::initInstance();
|
||||
|
||||
if (gNoRender)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// preload specific motions here
|
||||
createMotion( ANIM_AGENT_CUSTOMIZE);
|
||||
createMotion( ANIM_AGENT_CUSTOMIZE_DONE);
|
||||
@@ -1659,23 +1660,24 @@ LLTexLayerSet* LLVOAvatar::createTexLayerSet()
|
||||
|
||||
const LLVector3 LLVOAvatar::getRenderPosition() const
|
||||
{
|
||||
|
||||
if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
|
||||
{
|
||||
return getPositionAgent();
|
||||
}
|
||||
else if (isRoot() || !mDrawable->getParent())
|
||||
{
|
||||
if ( !mHasPelvisOffset )
|
||||
{
|
||||
return mDrawable->getPositionAgent();
|
||||
}
|
||||
else
|
||||
if ( mHasPelvisOffset )
|
||||
{
|
||||
//Apply a pelvis fixup (as defined by the avs skin)
|
||||
LLVector3 pos = mDrawable->getPositionAgent();
|
||||
pos[VZ] += mPelvisFixup;
|
||||
return pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
return mDrawable->getPositionAgent();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1828,7 +1830,7 @@ void LLVOAvatar::renderCollisionVolumes()
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
LLGLDepthTest gls_depth(GL_FALSE);
|
||||
for (S32 i = 0; i < (S32)mCollisionVolumes.size(); i++)
|
||||
for (size_t i = 0; i < mCollisionVolumes.size(); i++)
|
||||
{
|
||||
mCollisionVolumes[i]->renderCollision();
|
||||
ostr << mCollisionVolumes[i]->getName() << ", ";
|
||||
@@ -2018,6 +2020,7 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
|
||||
}
|
||||
|
||||
|
||||
|
||||
LLVector4a position;
|
||||
if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
|
||||
{
|
||||
@@ -6559,6 +6562,8 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o
|
||||
return 0;
|
||||
}
|
||||
|
||||
mVisualComplexityStale = TRUE;
|
||||
|
||||
if (viewer_object->isSelected())
|
||||
{
|
||||
LLSelectMgr::getInstance()->updateSelectionCenter();
|
||||
@@ -6725,6 +6730,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
|
||||
|
||||
if (attachment->isObjectAttached(viewer_object))
|
||||
{
|
||||
mVisualComplexityStale = TRUE;
|
||||
vector_replace_with_last(mAttachedObjectsVector,std::make_pair(viewer_object,attachment));
|
||||
|
||||
cleanupAttachedMesh( viewer_object );
|
||||
@@ -9068,6 +9074,7 @@ void LLVOAvatar::updateSoftwareSkinnedVertices(const LLMeshSkinInfo* skin, const
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U32 LLVOAvatar::getPartitionType() const
|
||||
{
|
||||
// Avatars merely exist as drawables in the bridge partition
|
||||
@@ -9140,69 +9147,70 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d
|
||||
|
||||
void LLVOAvatar::idleUpdateRenderCost()
|
||||
{
|
||||
static const LLCachedControl<U32> ARC_LIMIT("LiruNewARCLimit", 20000);
|
||||
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
|
||||
{ //set debug text to attachment geometry bytes here so render cost will override
|
||||
setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
|
||||
}
|
||||
|
||||
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
F32 red, green;
|
||||
calculateUpdateRenderCost(); // Update mVisualComplexity if needed
|
||||
|
||||
static LLCachedControl<bool> UseOldARC(gSavedSettings, "LiruSensibleARC", true);
|
||||
if(UseOldARC)
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
|
||||
{
|
||||
U32 shame = 1;
|
||||
|
||||
std::set<LLUUID> textures;
|
||||
|
||||
/*attachment_map_t::const_iterator iter;
|
||||
for (iter = mAttachmentPoints.begin();
|
||||
iter != mAttachmentPoints.end();
|
||||
++iter)
|
||||
static LLCachedControl<bool> UseOldARC(gSavedSettings, "LiruSensibleARC", true);
|
||||
if (UseOldARC)
|
||||
{
|
||||
LLViewerJointAttachment* attachment = iter->second;
|
||||
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
|
||||
attachment_iter != attachment->mAttachedObjects.end();
|
||||
++attachment_iter)
|
||||
U32 shame = 1;
|
||||
std::set<LLUUID> textures;
|
||||
for(auto it = mAttachedObjectsVector.begin();it !=mAttachedObjectsVector.end();++it)
|
||||
{
|
||||
const LLViewerObject* object = (*attachment_iter);*/
|
||||
std::vector<std::pair<LLViewerObject*,LLViewerJointAttachment*> >::iterator attachment_iter = mAttachedObjectsVector.begin();
|
||||
for(;attachment_iter!=mAttachedObjectsVector.end();++attachment_iter)
|
||||
{{
|
||||
const LLViewerObject* object = attachment_iter->first;
|
||||
const LLViewerObject* object = it->first;
|
||||
if (object && !object->isHUDAttachment())
|
||||
{
|
||||
LLDrawable* drawable = object->mDrawable;
|
||||
if (drawable)
|
||||
if (LLDrawable* drawable = object->mDrawable)
|
||||
{
|
||||
shame += 10;
|
||||
LLVOVolume* volume = drawable->getVOVolume();
|
||||
if (volume)
|
||||
{
|
||||
if (LLVOVolume* volume = drawable->getVOVolume())
|
||||
shame += calc_shame(volume, textures);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
shame += textures.size() * 5;
|
||||
|
||||
setDebugText(llformat("%d", shame));
|
||||
F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
|
||||
F32 red = llmin((F32) shame/1024.f, 1.f);
|
||||
mText->setColor(LLColor4(red,green,0,1));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
|
||||
setDebugText(llformat("%s %d", viz_string.c_str(), mVisualComplexity));
|
||||
F32 green = 1.f-llclamp(((F32) mVisualComplexity-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
|
||||
F32 red = llmin((F32) mVisualComplexity/(F32)ARC_LIMIT, 1.f);
|
||||
mText->setColor(LLColor4(red,green,0,1));
|
||||
}
|
||||
|
||||
shame += textures.size() * 5;
|
||||
|
||||
setDebugText(llformat("%d", shame));
|
||||
green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
|
||||
red = llmin((F32) shame/1024.f, 1.f);
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
|
||||
// Calculations for mVisualComplexity value
|
||||
void LLVOAvatar::calculateUpdateRenderCost()
|
||||
{
|
||||
static const U32 ARC_BODY_PART_COST = 200;
|
||||
|
||||
// Diagnostic list of all textures on our avatar
|
||||
static std::set<LLUUID> all_textures;
|
||||
|
||||
if (mVisualComplexityStale)
|
||||
{
|
||||
static const U32 ARC_BODY_PART_COST = 200;
|
||||
static const LLCachedControl<U32> ARC_LIMIT("LiruNewARCLimit", 20000);
|
||||
|
||||
static std::set<LLUUID> all_textures;
|
||||
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
|
||||
{ //set debug text to attachment geometry bytes here so render cost will override
|
||||
setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
|
||||
}
|
||||
|
||||
mVisualComplexityStale = FALSE;
|
||||
U32 cost = 0;
|
||||
LLVOVolume::texture_cost_t textures;
|
||||
|
||||
@@ -9219,7 +9227,6 @@ void LLVOAvatar::idleUpdateRenderCost()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
|
||||
iter != mAttachmentPoints.end();
|
||||
++iter)
|
||||
@@ -9230,7 +9237,7 @@ void LLVOAvatar::idleUpdateRenderCost()
|
||||
++attachment_iter)
|
||||
{
|
||||
const LLViewerObject* attached_object = (*attachment_iter);*/
|
||||
std::vector<std::pair<LLViewerObject*,LLViewerJointAttachment*> >::iterator attachment_iter = mAttachedObjectsVector.begin();
|
||||
auto attachment_iter = mAttachedObjectsVector.begin();
|
||||
for(;attachment_iter!=mAttachedObjectsVector.end();++attachment_iter)
|
||||
{{
|
||||
const LLViewerObject* attached_object = attachment_iter->first;
|
||||
@@ -9310,27 +9317,25 @@ void LLVOAvatar::idleUpdateRenderCost()
|
||||
}
|
||||
}
|
||||
|
||||
std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
|
||||
setDebugText(llformat("%s %d", viz_string.c_str(), cost));
|
||||
mVisualComplexity = cost;
|
||||
green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
|
||||
red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
|
||||
}
|
||||
mText->setColor(LLColor4(red,green,0,1));
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index)
|
||||
{
|
||||
if (index < 0 || index >= TEX_NUM_INDICES) return false;
|
||||
return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsLocalTexture;
|
||||
return (index < 0 || index >= TEX_NUM_INDICES)
|
||||
? false
|
||||
: LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsLocalTexture;
|
||||
}
|
||||
|
||||
// static
|
||||
BOOL LLVOAvatar::isIndexBakedTexture(ETextureIndex index)
|
||||
{
|
||||
if (index < 0 || index >= TEX_NUM_INDICES) return false;
|
||||
return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsBakedTexture;
|
||||
return (index < 0 || index >= TEX_NUM_INDICES)
|
||||
? false
|
||||
: LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsBakedTexture;
|
||||
}
|
||||
|
||||
const std::string LLVOAvatar::getBakedStatusForPrintout() const
|
||||
@@ -9416,104 +9421,57 @@ BOOL LLVOAvatar::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type,
|
||||
|
||||
U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures)
|
||||
{
|
||||
if (!volume)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (!volume) return 0;
|
||||
|
||||
U32 shame = 0;
|
||||
|
||||
U32 invisi = 0;
|
||||
U32 shiny = 0;
|
||||
U32 glow = 0;
|
||||
U32 alpha = 0;
|
||||
U32 flexi = 0;
|
||||
U32 flexi = volume->isFlexible() ? 1 : 0;
|
||||
U32 animtex = 0;
|
||||
U32 particles = 0;
|
||||
U32 scale = 0;
|
||||
U32 particles = volume->isParticleSource() ? 1 : 0;
|
||||
const LLVector3& sc = volume->getScale();
|
||||
U32 scale = U32(sc.mV[0] + sc.mV[1] + sc.mV[2]);
|
||||
U32 bump = 0;
|
||||
U32 planar = 0;
|
||||
|
||||
const LLVector3& sc = volume->getScale();
|
||||
scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
|
||||
|
||||
if (volume->isFlexible())
|
||||
{
|
||||
flexi = 1;
|
||||
}
|
||||
if (volume->isParticleSource())
|
||||
{
|
||||
particles = 1;
|
||||
}
|
||||
|
||||
LLDrawable* drawablep = volume->mDrawable;
|
||||
|
||||
if (volume->isSculpted())
|
||||
{
|
||||
LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
|
||||
LLUUID sculpt_id = sculpt_params->getSculptTexture();
|
||||
textures.insert(sculpt_id);
|
||||
}
|
||||
textures.insert(static_cast<LLSculptParams*>(volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT))->getSculptTexture());
|
||||
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* face = drawablep->getFace(i);
|
||||
const LLTextureEntry* te = face->getTextureEntry();
|
||||
LLViewerTexture* img = face->getTexture();
|
||||
|
||||
textures.insert(img->getID());
|
||||
|
||||
if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
|
||||
{
|
||||
alpha++;
|
||||
}
|
||||
else if (img->getPrimaryFormat() == GL_ALPHA)
|
||||
{
|
||||
++alpha;
|
||||
else if (!invisi && img->getPrimaryFormat() == GL_ALPHA)
|
||||
invisi = 1;
|
||||
}
|
||||
|
||||
if (te)
|
||||
if (const LLTextureEntry* te = face->getTextureEntry())
|
||||
{
|
||||
if (te->getBumpmap())
|
||||
{
|
||||
if (!bump && te->getBumpmap())
|
||||
bump = 1;
|
||||
}
|
||||
if (te->getShiny())
|
||||
{
|
||||
if (!shiny && te->getShiny())
|
||||
shiny = 1;
|
||||
}
|
||||
if (te->getGlow() > 0.f)
|
||||
{
|
||||
if (!glow && te->getGlow() > 0.f)
|
||||
glow = 1;
|
||||
}
|
||||
if (face->mTextureMatrix != NULL)
|
||||
{
|
||||
animtex++;
|
||||
}
|
||||
if (face->mTextureMatrix)
|
||||
++animtex;
|
||||
if (te->getTexGen())
|
||||
{
|
||||
planar++;
|
||||
}
|
||||
++planar;
|
||||
}
|
||||
}
|
||||
|
||||
shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
|
||||
|
||||
LLViewerObject::const_child_list_t& child_list = volume->getChildren();
|
||||
for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
|
||||
iter != child_list.end(); iter++)
|
||||
{
|
||||
LLViewerObject* child_objectp = *iter;
|
||||
LLDrawable* child_drawablep = child_objectp->mDrawable;
|
||||
if (child_drawablep)
|
||||
{
|
||||
LLVOVolume* child_volumep = child_drawablep->getVOVolume();
|
||||
if (child_volumep)
|
||||
{
|
||||
for (LLViewerObject* child_objectp : volume->getChildren())
|
||||
if (LLDrawable* child_drawablep = child_objectp->mDrawable)
|
||||
if (LLVOVolume* child_volumep = child_drawablep->getVOVolume())
|
||||
shame += calc_shame(child_volumep, textures);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return shame;
|
||||
}
|
||||
|
||||
@@ -301,6 +301,19 @@ public:
|
||||
static void invalidateNameTags();
|
||||
void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
|
||||
void idleUpdateRenderCost();
|
||||
void calculateUpdateRenderCost();
|
||||
void updateVisualComplexity() { mVisualComplexityStale = TRUE; }
|
||||
|
||||
S32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV
|
||||
S32 getAttachmentGeometryBytes() { return mAttachmentGeometryBytes; }; // number of bytes in attached geometry
|
||||
F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; // estimated surface area of attachments
|
||||
|
||||
S32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
|
||||
void setReportedVisualComplexity(S32 value) { mReportedVisualComplexity = value; };
|
||||
|
||||
S32 getUpdatePeriod() { return mUpdatePeriod; };
|
||||
|
||||
|
||||
void idleUpdateBelowWater();
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -347,6 +360,7 @@ public:
|
||||
|
||||
S32 mLastRezzedStatus;
|
||||
|
||||
|
||||
void startPhase(const std::string& phase_name);
|
||||
void stopPhase(const std::string& phase_name, bool err_check = true);
|
||||
void clearPhases();
|
||||
@@ -360,6 +374,7 @@ protected:
|
||||
BOOL processFullyLoadedChange(bool loading);
|
||||
void updateRuthTimer(bool loading);
|
||||
F32 calcMorphAmount();
|
||||
|
||||
private:
|
||||
BOOL mFirstFullyVisible;
|
||||
BOOL mFullyLoaded;
|
||||
@@ -367,6 +382,7 @@ private:
|
||||
BOOL mFullyLoadedInitialized;
|
||||
S32 mFullyLoadedFrameCounter;
|
||||
S32 mVisualComplexity;
|
||||
BOOL mVisualComplexityStale;
|
||||
LLFrameTimer mFullyLoadedTimer;
|
||||
LLFrameTimer mRuthTimer;
|
||||
bool mFreezeTimeLangolier; // True when this avatar was created during snapshot FreezeTime mode, and that mode is still active.
|
||||
@@ -435,9 +451,11 @@ public:
|
||||
static void destroyGL();
|
||||
static void restoreGL();
|
||||
S32 mSpecialRenderMode; // special lighting
|
||||
U32 mAttachmentGeometryBytes; //number of bytes in attached geometry
|
||||
S32 mAttachmentGeometryBytes; //number of bytes in attached geometry
|
||||
F32 mAttachmentSurfaceArea; //estimated surface area of attachments
|
||||
|
||||
S32 mReportedVisualComplexity; // Numbers as reported by the SL server
|
||||
|
||||
private:
|
||||
bool shouldAlphaMask();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user