correct clientside bakes

This commit is contained in:
Madpeterz 2021-04-04 10:09:19 +01:00
parent a05a84deb4
commit 7c2326fd8b
2 changed files with 41 additions and 9 deletions

View file

@ -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);
}

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)
@ -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];
}
}
}
}