Merge pull request #46 from Madpeterz/Appearance-opensim-tweaks

Corrects failing local bakes and adds extra debug info
This commit is contained in:
¡Cinder! ㊝
2021-06-27 09:06:41 -05:00
committed by GitHub
2 changed files with 99 additions and 53 deletions

View File

@@ -367,7 +367,7 @@ namespace OpenMetaverse
/// <summary>Visual parameters last sent to the sim</summary>
public byte[] MyVisualParameters;
/// <summary>Textures about this client sent to the sim</summary>
public Primitive.TextureEntry MyTextures;
@@ -414,7 +414,7 @@ namespace OpenMetaverse
{
MaxDegreeOfParallelism = MAX_CONCURRENT_DOWNLOADS
};
#endregion Private Members
/// <summary>
@@ -485,7 +485,7 @@ namespace OpenMetaverse
// This is the first time setting appearance, run through the entire sequence
AppearanceThread = new Thread(
delegate()
delegate ()
{
var cancellationToken = CancellationTokenSource.Token;
bool success = true;
@@ -495,7 +495,7 @@ namespace OpenMetaverse
{
// Set all of the baked textures to UUID.Zero to force rebaking
for (int bakedIndex = 0; bakedIndex < BAKED_TEXTURE_COUNT; bakedIndex++)
Textures[(int) BakeTypeToAgentTextureIndex((BakeType) bakedIndex)].TextureID = UUID.Zero;
Textures[(int)BakeTypeToAgentTextureIndex((BakeType)bakedIndex)].TextureID = UUID.Zero;
}
// FIXME: we really need to make this better...
@@ -700,7 +700,7 @@ namespace OpenMetaverse
new AgentCachedTexturePacket.WearableDataBlock
{
ID = hash,
TextureIndex = (byte) bakedIndex
TextureIndex = (byte)bakedIndex
};
hashes.Add(block);
@@ -737,8 +737,8 @@ namespace OpenMetaverse
[Obsolete]
public UUID GetWearableAsset(WearableType type)
{
return Wearables.TryGetValue(type, out var wearableList)
? wearableList.First().AssetID
return Wearables.TryGetValue(type, out var wearableList)
? wearableList.First().AssetID
: UUID.Zero;
}
@@ -804,7 +804,8 @@ namespace OpenMetaverse
ItemID = wearableItem.UUID,
WearableType = wearableItem.WearableType
};
if (replace || wearableItem.AssetType == AssetType.Bodypart) {
if (replace || wearableItem.AssetType == AssetType.Bodypart)
{
// Dump everything from the key
Wearables.Remove(wearableItem.WearableType);
}
@@ -830,7 +831,7 @@ namespace OpenMetaverse
/// <param name="wearableItem">Wearable to be removed from the outfit</param>
public void RemoveFromOutfit(InventoryItem wearableItem)
{
List<InventoryItem> wearableItems = new List<InventoryItem> {wearableItem};
List<InventoryItem> wearableItems = new List<InventoryItem> { wearableItem };
RemoveFromOutfit(wearableItems);
}
@@ -915,7 +916,7 @@ namespace OpenMetaverse
for (int i = 0; i < WEARABLE_COUNT; i++)
{
WearableType wearableType = (WearableType)i;
if (WearableTypeToAssetType(wearableType) == AssetType.Bodypart
if (WearableTypeToAssetType(wearableType) == AssetType.Bodypart
&& !Wearables.ContainsKey(wearableType))
{
needsCurrentWearables = true;
@@ -1060,15 +1061,15 @@ namespace OpenMetaverse
{
AttachmentPt =
replace
? (byte) attachment.AttachmentPoint
: (byte) (ATTACHMENT_ADD | (byte) attachment.AttachmentPoint),
EveryoneMask = (uint) attachment.Permissions.EveryoneMask,
GroupMask = (uint) attachment.Permissions.GroupMask,
ItemFlags = (uint) attachment.Flags,
? (byte)attachment.AttachmentPoint
: (byte)(ATTACHMENT_ADD | (byte)attachment.AttachmentPoint),
EveryoneMask = (uint)attachment.Permissions.EveryoneMask,
GroupMask = (uint)attachment.Permissions.GroupMask,
ItemFlags = (uint)attachment.Flags,
ItemID = attachment.UUID,
Name = Utils.StringToBytes(attachment.Name),
Description = Utils.StringToBytes(attachment.Description),
NextOwnerMask = (uint) attachment.Permissions.NextOwnerMask,
NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask,
OwnerID = attachment.OwnerID
};
@@ -1081,14 +1082,14 @@ namespace OpenMetaverse
InventoryObject attachment = (InventoryObject)attachments[i];
attachmentsPacket.ObjectData[i] = new RezMultipleAttachmentsFromInvPacket.ObjectDataBlock
{
AttachmentPt = replace ? (byte) 0 : ATTACHMENT_ADD,
EveryoneMask = (uint) attachment.Permissions.EveryoneMask,
GroupMask = (uint) attachment.Permissions.GroupMask,
ItemFlags = (uint) attachment.Flags,
AttachmentPt = replace ? (byte)0 : ATTACHMENT_ADD,
EveryoneMask = (uint)attachment.Permissions.EveryoneMask,
GroupMask = (uint)attachment.Permissions.GroupMask,
ItemFlags = (uint)attachment.Flags,
ItemID = attachment.UUID,
Name = Utils.StringToBytes(attachment.Name),
Description = Utils.StringToBytes(attachment.Description),
NextOwnerMask = (uint) attachment.Permissions.NextOwnerMask,
NextOwnerMask = (uint)attachment.Permissions.NextOwnerMask,
OwnerID = attachment.OwnerID
};
@@ -1365,7 +1366,7 @@ namespace OpenMetaverse
WearableType type = (WearableType)i;
wearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock
{
WearableType = (byte) i,
WearableType = (byte)i,
// This appears to be hacked on SL server side to support multi-layers
ItemID = Wearables.ContainsKey(type) ?
(Wearables[type].First()?.ItemID ?? UUID.Zero)
@@ -1414,9 +1415,12 @@ namespace OpenMetaverse
WearableType = wearableItem.WearableType
};
// Body cannot be layered. Overwrite when multiple are selected.
if (wearableItem.AssetType == AssetType.Bodypart) {
if (wearableItem.AssetType == AssetType.Bodypart)
{
bodyparts[wearableItem.WearableType] = wd;
} else {
}
else
{
newWearables.Add(wearableItem.WearableType, wd);
}
}
@@ -1428,7 +1432,7 @@ namespace OpenMetaverse
}
// heavy handed body part sanity check
if (newWearables.ContainsKey(WearableType.Shape) &&
if (newWearables.ContainsKey(WearableType.Shape) &&
newWearables.ContainsKey(WearableType.Skin) &&
newWearables.ContainsKey(WearableType.Eyes) &&
newWearables.ContainsKey(WearableType.Hair))
@@ -1741,7 +1745,7 @@ namespace OpenMetaverse
foreach (var wearable in wearables)
{
if (wearable.Asset == null) continue;
DecodeWearableParams(wearable, ref Textures);
--pendingWearables;
}
@@ -1750,7 +1754,7 @@ namespace OpenMetaverse
return true;
Logger.DebugLog("Downloading " + pendingWearables + " wearable assets");
Parallel.ForEach(wearables, _parallelOptions,
wearable =>
{
@@ -1759,7 +1763,7 @@ namespace OpenMetaverse
// Fetch this wearable asset
Client.Assets.RequestAsset(wearable.AssetID, wearable.AssetType, true,
delegate(AssetDownload transfer, Asset asset)
delegate (AssetDownload transfer, Asset asset)
{
if (transfer.Success && asset is AssetWearable assetWearable)
{
@@ -1862,7 +1866,7 @@ namespace OpenMetaverse
AutoResetEvent downloadEvent = new AutoResetEvent(false);
Client.Assets.RequestImage(textureId,
delegate(TextureRequestState state, AssetTexture assetTexture)
delegate (TextureRequestState state, AssetTexture assetTexture)
{
if (state == TextureRequestState.Finished)
{
@@ -1889,7 +1893,7 @@ namespace OpenMetaverse
catch (Exception e)
{
Logger.Log(
$"Download of texture {textureId} failed with exception {e}",
$"Download of texture {textureId} failed with exception {e}",
Helpers.LogLevel.Warning, Client);
}
}
@@ -1911,14 +1915,23 @@ namespace OpenMetaverse
{
AvatarTextureIndex textureIndex = BakeTypeToAgentTextureIndex((BakeType)bakedIndex);
if (Textures[(int)textureIndex].TextureID == UUID.Zero)
{
// If this is the skirt layer and we're not wearing a skirt then skip it
if (bakedIndex == (int)BakeType.Skirt && !Wearables.ContainsKey(WearableType.Skirt))
{
Logger.DebugLog("texture: " + (AvatarTextureIndex)textureIndex + " skipping not attached");
continue;
}
Logger.DebugLog("texture: " + (AvatarTextureIndex)textureIndex + " is needed adding to pending Bakes");
pendingBakes.Add((BakeType)bakedIndex);
}
else
{
Logger.DebugLog("texture: " + (AvatarTextureIndex)textureIndex + " is ready");
}
}
if (pendingBakes.Any())
@@ -1939,7 +1952,7 @@ namespace OpenMetaverse
{
Textures[i].Texture = null;
}
return success;
}
@@ -1975,7 +1988,10 @@ namespace OpenMetaverse
--retries;
}
Textures[(int)BakeTypeToAgentTextureIndex(bakeType)].TextureID = newAssetID;
int bakeIndex = (int)BakeTypeToAgentTextureIndex(bakeType);
Logger.DebugLog("Saving back to " + (AvatarTextureIndex)bakeIndex);
Textures[bakeIndex].TextureID = newAssetID;
if (newAssetID == UUID.Zero)
{
@@ -1997,7 +2013,7 @@ namespace OpenMetaverse
var uploadEvent = new AutoResetEvent(false);
Client.Assets.RequestUploadBakedTexture(textureData,
delegate(UUID newAssetID)
delegate (UUID newAssetID)
{
bakeID = newAssetID;
uploadEvent.Set();
@@ -2082,7 +2098,7 @@ namespace OpenMetaverse
// TODO: create Current Outfit Folder
}
OSDMap request = new OSDMap(1) {["cof_version"] = COF.Version};
OSDMap request = new OSDMap(1) { ["cof_version"] = COF.Version };
string msg = "Setting server side baking failed";
@@ -2196,16 +2212,16 @@ namespace OpenMetaverse
bool found = false;
foreach (var wearableList in Wearables)
{
if(wearableList.Value.Any(wearable => wearable.Asset != null &&
wearable.Asset.Params
.TryGetValue(vp.ParamID, out paramValue)))
if (wearableList.Value.Any(wearable => wearable.Asset != null &&
wearable.Asset.Params
.TryGetValue(vp.ParamID, out paramValue)))
{
found = true;
break;
}
}
// Try and find this value in our collection of downloaded wearables
@@ -2249,13 +2265,16 @@ namespace OpenMetaverse
break;
}
if (vpIndex <= nrParams) break;
if (vpIndex >= nrParams) break;
}
MyVisualParameters = new byte[set.VisualParam.Length];
for (int i = 0; i < set.VisualParam.Length; i++)
{
MyVisualParameters[i] = set.VisualParam[i].ParamValue;
if (set.VisualParam[i] != null)
{
MyVisualParameters[i] = set.VisualParam[i].ParamValue;
}
}
#endregion VisualParam
@@ -2267,8 +2286,15 @@ namespace OpenMetaverse
for (uint i = 0; i < Textures.Length; i++)
{
Primitive.TextureEntryFace face = te.CreateFace(i);
face.TextureID = Textures[i].TextureID;
Logger.DebugLog("Sending texture entry for " + (AvatarTextureIndex)i + " to " + Textures[i].TextureID, Client);
if (Textures[i].TextureID != UUID.Zero)
{
face.TextureID = Textures[i].TextureID;
Logger.DebugLog("Sending texture entry for " + (AvatarTextureIndex)i + " to " + Textures[i].TextureID, Client);
}
else
{
Logger.DebugLog("Skipping texture entry for " + (AvatarTextureIndex)i + " its null", Client);
}
}
set.ObjectData.TextureEntry = te.GetBytes();
@@ -2562,7 +2588,7 @@ namespace OpenMetaverse
CancellationTokenSource.Dispose();
CancellationTokenSource = null;
}
if (AppearanceThread != null)
{
AppearanceThread = null;

View File

@@ -160,9 +160,16 @@ namespace OpenMetaverse.Imaging
if (bakeType == BakeType.Head)
{
DrawLayer(LoadResourceLayer("head_color.tga"), false);
AddAlpha(bakedTexture.Image, LoadResourceLayer("head_alpha.tga"));
MultiplyLayerFromAlpha(bakedTexture.Image, LoadResourceLayer("head_skingrain.tga"));
if (DrawLayer(LoadResourceLayer("head_color.tga"), false) == true)
{
AddAlpha(bakedTexture.Image, LoadResourceLayer("head_alpha.tga"));
MultiplyLayerFromAlpha(bakedTexture.Image, LoadResourceLayer("head_skingrain.tga"));
Logger.Log("[Bake]: created head master bake", Helpers.LogLevel.Debug);
}
else
{
Logger.Log("[Bake]: Unable to draw layer from texture file", Helpers.LogLevel.Debug);
}
}
if (skinTexture.Texture == null)
@@ -421,8 +428,8 @@ namespace OpenMetaverse.Imaging
private bool MaskBelongsToBake(string mask)
{
return (bakeType != BakeType.LowerBody || !mask.Contains("upper"))
&& (bakeType != BakeType.LowerBody || !mask.Contains("shirt"))
return (bakeType != BakeType.LowerBody || !mask.Contains("upper"))
&& (bakeType != BakeType.LowerBody || !mask.Contains("shirt"))
&& (bakeType != BakeType.UpperBody || !mask.Contains("lower"));
}
@@ -457,16 +464,20 @@ namespace OpenMetaverse.Imaging
byte[] sourceAlpha = sourceHasAlpha ? source.Alpha : null;
byte[] sourceBump = sourceHasBump ? source.Bump : null;
bool loadedAlpha = false;
for (int y = 0; y < bakeHeight; y++)
{
for (int x = 0; x < bakeWidth; x++)
{
loadedAlpha = false;
alpha = 0;
alphaInv = 0;
alphaInv = 0;
if (sourceHasAlpha)
{
if (sourceAlpha.Length > i)
{
loadedAlpha = true;
alpha = sourceAlpha[i];
alphaInv = (byte)(Byte.MaxValue - alpha);
}
@@ -478,9 +489,18 @@ namespace OpenMetaverse.Imaging
{
if ((sourceRed.Length > i) && (sourceGreen.Length > i) && (sourceBlue.Length > i))
{
bakedRed[i] = (byte)((bakedRed[i] * alphaInv + sourceRed[i] * alpha) >> 8);
bakedGreen[i] = (byte)((bakedGreen[i] * alphaInv + sourceGreen[i] * alpha) >> 8);
bakedBlue[i] = (byte)((bakedBlue[i] * alphaInv + sourceBlue[i] * alpha) >> 8);
if (loadedAlpha == true)
{
bakedRed[i] = (byte)((bakedRed[i] * alphaInv + sourceRed[i] * alpha) >> 8);
bakedGreen[i] = (byte)((bakedGreen[i] * alphaInv + sourceGreen[i] * alpha) >> 8);
bakedBlue[i] = (byte)((bakedBlue[i] * alphaInv + sourceBlue[i] * alpha) >> 8);
}
else
{
bakedRed[i] = sourceRed[i];
bakedGreen[i] = sourceGreen[i];
bakedBlue[i] = sourceBlue[i];
}
}
}
}