From 7c2326fd8bb2ff7baf345f3427ab554264df34e5 Mon Sep 17 00:00:00 2001 From: Madpeterz <57852827+Madpeterz@users.noreply.github.com> Date: Sun, 4 Apr 2021 10:09:19 +0100 Subject: [PATCH] correct clientside bakes --- LibreMetaverse/AppearanceManager.cs | 18 +++++++++++++--- LibreMetaverse/Imaging/BakeLayer.cs | 32 +++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/LibreMetaverse/AppearanceManager.cs b/LibreMetaverse/AppearanceManager.cs index 17c7406..500c51f 100644 --- a/LibreMetaverse/AppearanceManager.cs +++ b/LibreMetaverse/AppearanceManager.cs @@ -1910,15 +1910,24 @@ namespace OpenMetaverse for (int bakedIndex = 0; bakedIndex < BAKED_TEXTURE_COUNT; bakedIndex++) { 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()) @@ -1975,7 +1984,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) { @@ -2269,9 +2281,9 @@ namespace OpenMetaverse for (uint i = 0; i < Textures.Length; i++) { + Primitive.TextureEntryFace face = te.CreateFace(i); if (Textures[i].TextureID != UUID.Zero) { - Primitive.TextureEntryFace face = te.CreateFace(i); face.TextureID = Textures[i].TextureID; Logger.DebugLog("Sending texture entry for " + (AvatarTextureIndex)i + " to " + Textures[i].TextureID, Client); } diff --git a/LibreMetaverse/Imaging/BakeLayer.cs b/LibreMetaverse/Imaging/BakeLayer.cs index 243c02c..f5be3cd 100644 --- a/LibreMetaverse/Imaging/BakeLayer.cs +++ b/LibreMetaverse/Imaging/BakeLayer.cs @@ -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) @@ -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; + 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]; + } } } }