SH-3267 WIP
parent
5e40435201
commit
27c7b259b4
|
|
@ -1228,11 +1228,113 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, bool fake_images)
|
||||
S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, bool fake_images,
|
||||
LLTEContents& tec)
|
||||
{
|
||||
return(unpackTEMessage(mesgsys,block_name,-1,fake_images));
|
||||
tec.fake_images = fake_images;
|
||||
|
||||
S32 retval = 0;
|
||||
|
||||
if (block_num < 0)
|
||||
{
|
||||
tec.size = mesgsys->getSizeFast(block_name, _PREHASH_TextureEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
tec.size = mesgsys->getSizeFast(block_name, block_num, _PREHASH_TextureEntry);
|
||||
}
|
||||
|
||||
if (tec.size == 0)
|
||||
{
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (block_num < 0)
|
||||
{
|
||||
mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, 0, LLTEContents::MAX_TE_BUFFER);
|
||||
}
|
||||
else
|
||||
{
|
||||
mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, block_num, LLTEContents::MAX_TE_BUFFER);
|
||||
}
|
||||
|
||||
tec.face_count = getNumTEs();
|
||||
|
||||
U8 *cur_ptr = tec.packed_buffer;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_data, 16, tec.face_count, MVT_LLUUID);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.colors, 4, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_s, 4, tec.face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_t, 4, tec.face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_s, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_t, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_rot, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.bump, 1, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.media_flags, 1, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.glow, 1, tec.face_count, MVT_U8);
|
||||
|
||||
retval = 1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
S32 LLPrimitive::unpackParsedTEMessage(LLTEContents& tec)
|
||||
{
|
||||
S32 retval = 0;
|
||||
|
||||
LLColor4 color;
|
||||
LLColor4U coloru;
|
||||
for (U32 i = 0; i < tec.face_count; i++)
|
||||
{
|
||||
LLUUID& req_id = ((LLUUID*)tec.image_data)[i];
|
||||
if (tec.fake_images & (req_id != IMG_DEFAULT) && (req_id != IMG_DEFAULT_AVATAR) && (req_id != IMG_INVISIBLE))
|
||||
{
|
||||
retval |= setTETexture(i, IMG_CHECKERBOARD_RGBA);
|
||||
}
|
||||
else
|
||||
{
|
||||
retval |= setTETexture(i, req_id);
|
||||
}
|
||||
retval |= setTEScale(i, tec.scale_s[i], tec.scale_t[i]);
|
||||
retval |= setTEOffset(i, (F32)tec.offset_s[i] / (F32)0x7FFF, (F32) tec.offset_t[i] / (F32) 0x7FFF);
|
||||
retval |= setTERotation(i, ((F32)tec.image_rot[i] / TEXTURE_ROTATION_PACK_FACTOR) * F_TWO_PI);
|
||||
retval |= setTEBumpShinyFullbright(i, tec.bump[i]);
|
||||
retval |= setTEMediaTexGen(i, tec.media_flags[i]);
|
||||
retval |= setTEGlow(i, (F32)tec.glow[i] / (F32)0xFF);
|
||||
coloru = LLColor4U(tec.colors + 4*i);
|
||||
|
||||
// Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)
|
||||
// as all zeros. However, the subtraction and addition must be done in unsigned
|
||||
// byte space, not in float space, otherwise off-by-one errors occur. JC
|
||||
color.mV[VRED] = F32(255 - coloru.mV[VRED]) / 255.f;
|
||||
color.mV[VGREEN] = F32(255 - coloru.mV[VGREEN]) / 255.f;
|
||||
color.mV[VBLUE] = F32(255 - coloru.mV[VBLUE]) / 255.f;
|
||||
color.mV[VALPHA] = F32(255 - coloru.mV[VALPHA]) / 255.f;
|
||||
|
||||
retval |= setTEColor(i, color);
|
||||
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, bool fake_images)
|
||||
{
|
||||
LLTEContents tec;
|
||||
S32 retval = parseTEMessage(mesgsys, block_name, block_num, fake_images, tec);
|
||||
if (!retval)
|
||||
return retval;
|
||||
return unpackParsedTEMessage(tec);
|
||||
}
|
||||
|
||||
#if 0
|
||||
S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, bool fake_images)
|
||||
{
|
||||
// use a negative block_num to indicate a single-block read (a non-variable block)
|
||||
|
|
@ -1339,6 +1441,7 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_nam
|
|||
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -289,6 +289,34 @@ public:
|
|||
};
|
||||
|
||||
|
||||
struct LLTEContents
|
||||
{
|
||||
LLTEContents()
|
||||
{
|
||||
}
|
||||
|
||||
static const U32 MAX_TES = 32;
|
||||
|
||||
U8 image_data[MAX_TES*16];
|
||||
U8 colors[MAX_TES*4];
|
||||
F32 scale_s[MAX_TES];
|
||||
F32 scale_t[MAX_TES];
|
||||
S16 offset_s[MAX_TES];
|
||||
S16 offset_t[MAX_TES];
|
||||
S16 image_rot[MAX_TES];
|
||||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
|
||||
static const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
|
||||
U32 size;
|
||||
U32 face_count;
|
||||
|
||||
bool fake_images;
|
||||
};
|
||||
|
||||
class LLPrimitive : public LLXform
|
||||
{
|
||||
public:
|
||||
|
|
@ -360,9 +388,10 @@ public:
|
|||
S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type);
|
||||
BOOL packTEMessage(LLMessageSystem *mesgsys) const;
|
||||
BOOL packTEMessage(LLDataPacker &dp) const;
|
||||
S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, bool fake_images = false);
|
||||
S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, bool fake_images = false); // Variable num of blocks
|
||||
BOOL unpackTEMessage(LLDataPacker &dp);
|
||||
S32 parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, bool fake_images,LLTEContents& tec);
|
||||
S32 unpackParsedTEMessage(LLTEContents& tec);
|
||||
|
||||
#ifdef CHECK_FOR_FINITE
|
||||
inline void setPosition(const LLVector3& pos);
|
||||
|
|
|
|||
|
|
@ -2623,8 +2623,11 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
|
|||
if (!url.empty())
|
||||
{
|
||||
LLSD body;
|
||||
body["cof_version"] = getCOFVersion();
|
||||
S32 cof_version = getCOFVersion();
|
||||
body["cof_version"] = cof_version;
|
||||
LLHTTPClient::post(url, body, new RequestAgentUpdateAppearanceResponder);
|
||||
llassert(cof_version >= mLastUpdateRequestCOFVersion);
|
||||
mLastUpdateRequestCOFVersion = cof_version;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2842,7 +2845,8 @@ LLAppearanceMgr::LLAppearanceMgr():
|
|||
mAttachmentInvLinkEnabled(false),
|
||||
mOutfitIsDirty(false),
|
||||
mOutfitLocked(false),
|
||||
mIsInUpdateAppearanceFromCOF(false)
|
||||
mIsInUpdateAppearanceFromCOF(false),
|
||||
mLastUpdateRequestCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
|
||||
{
|
||||
LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
|
||||
|
||||
|
|
|
|||
|
|
@ -95,6 +95,8 @@ public:
|
|||
const LLUUID getCOF() const;
|
||||
S32 getCOFVersion() const;
|
||||
|
||||
S32 mLastUpdateRequestCOFVersion;
|
||||
|
||||
// Finds the folder link to the currently worn outfit
|
||||
const LLViewerInventoryItem *getBaseOutfitLink();
|
||||
bool getBaseOutfitName(std::string &name);
|
||||
|
|
|
|||
|
|
@ -7309,9 +7309,27 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
|||
|
||||
// llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl;
|
||||
// dumpAvatarTEs( "PRE processAvatarAppearance()" );
|
||||
unpackTEMessage(mesgsys, _PREHASH_ObjectData, FALSE);
|
||||
LLTEContents tec;
|
||||
parseTEMessage(mesgsys, _PREHASH_ObjectData, -1, FALSE, tec);
|
||||
// dumpAvatarTEs( "POST processAvatarAppearance()" );
|
||||
|
||||
// Check for stale update.
|
||||
if (isSelf() && LLAppearanceMgr::instance().useServerTextureBaking())
|
||||
{
|
||||
// Extract COF Version field hacked into local texture id.
|
||||
LLUUID texture_id = ((LLUUID*)tec.image_data)[0];
|
||||
S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion;
|
||||
S32 *s_words = (S32*) texture_id.mData;
|
||||
S32 this_update_cof_version = s_words[0];
|
||||
if (this_update_cof_version < last_update_request_cof_version)
|
||||
{
|
||||
llwarns << "Stale appearance update, wanted version " << last_update_request_cof_version
|
||||
<< ", got " << this_update_cof_version << llendl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
unpackParsedTEMessage(tec);
|
||||
|
||||
// prevent the overwriting of valid baked textures with invalid baked textures
|
||||
for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue