protected void Bake() { Client.DebugLog("Baking " + BakeType.ToString()); BakedTexture = new AssetTexture(new Image(BakeWidth, BakeHeight, ImageChannels.Color | ImageChannels.Alpha | ImageChannels.Bump)); int i = 0; for (int y = 0; y < BakeHeight; y++) { for (int x = 0; x < BakeWidth; x++) { if (((x ^ y) & 0x10) == 0) { BakedTexture.Image.Red[i] = 255; BakedTexture.Image.Green[i] = 0; BakedTexture.Image.Blue[i] = 0; BakedTexture.Image.Alpha[i] = 255; BakedTexture.Image.Bump[i] = 0; } else { BakedTexture.Image.Red[i] = 0; BakedTexture.Image.Green[i] = 0; BakedTexture.Image.Blue[i] = 255; BakedTexture.Image.Alpha[i] = 255; BakedTexture.Image.Bump[i] = 0; } ++i; } } BakedTexture.Encode(); }
public void Bake() { bakedTexture = new AssetTexture(new ManagedImage(bakeWidth, bakeHeight, ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha | ManagedImage.ImageChannels.Bump)); // Base color for eye bake is white, color of layer0 for others if (bakeType == BakeType.Eyes) { InitBakedLayerColor(Color4.White); } else if (textures.Count > 0) { InitBakedLayerColor(textures[0].Color); } // Do we have skin texture? bool SkinTexture = textures.Count > 0 && textures[0].Texture != null; 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 (!SkinTexture && bakeType == BakeType.UpperBody) { DrawLayer(LoadResourceLayer("upperbody_color.tga"), false); } if (!SkinTexture && bakeType == BakeType.LowerBody) { DrawLayer(LoadResourceLayer("lowerbody_color.tga"), false); } ManagedImage alphaWearableTexture = null; // Layer each texture on top of one other, applying alpha masks as we go for (int i = 0; i < textures.Count; i++) { // Skip if we have no texture on this layer if (textures[i].Texture == null) { continue; } // Is this Alpha wearable and does it have an alpha channel? if (textures[i].TextureIndex >= AvatarTextureIndex.LowerAlpha && textures[i].TextureIndex <= AvatarTextureIndex.HairAlpha) { if (textures[i].Texture.Image.Alpha != null) { alphaWearableTexture = textures[i].Texture.Image.Clone(); } else if (textures[i].TextureID == IMG_INVISIBLE) { alphaWearableTexture = new ManagedImage(bakeWidth, bakeHeight, ManagedImage.ImageChannels.Alpha); } continue; } // Don't draw skin and tattoo on head bake first // For head bake the skin and texture are drawn last, go figure if (bakeType == BakeType.Head && (i == 0 || i == 1)) { continue; } ManagedImage texture = textures[i].Texture.Image.Clone(); //File.WriteAllBytes(bakeType + "-texture-layer-" + i + ".tga", texture.ExportTGA()); // Resize texture to the size of baked layer // FIXME: if texture is smaller than the layer, don't stretch it, tile it if (texture.Width != bakeWidth || texture.Height != bakeHeight) { try { texture.ResizeNearestNeighbor(bakeWidth, bakeHeight); } catch (Exception) { continue; } } // Special case for hair layer for the head bake // If we don't have skin texture, we discard hair alpha // and apply hair(i==2) pattern over the texture if (!SkinTexture && bakeType == BakeType.Head && i == 2) { if (texture.Alpha != null) { for (int j = 0; j < texture.Alpha.Length; j++) { texture.Alpha[j] = (byte)255; } } MultiplyLayerFromAlpha(texture, LoadResourceLayer("head_hair.tga")); } // Aply tint and alpha masks except for skin that has a texture // on layer 0 which always overrides other skin settings if (!(IsSkin && i == 0)) { ApplyTint(texture, textures[i].Color); // For hair bake, we skip all alpha masks // and use one from the texture, for both // alpha and morph layers if (bakeType == BakeType.Hair) { if (texture.Alpha != null) { bakedTexture.Image.Bump = texture.Alpha; } else { for (int j = 0; j < bakedTexture.Image.Bump.Length; j++) { bakedTexture.Image.Bump[j] = byte.MaxValue; } } } // Apply parametrized alpha masks else if (textures[i].AlphaMasks != null && textures[i].AlphaMasks.Count > 0) { // Combined mask for the layer, fully transparent to begin with ManagedImage combinedMask = new ManagedImage(bakeWidth, bakeHeight, ManagedImage.ImageChannels.Alpha); int addedMasks = 0; // First add mask in normal blend mode foreach (KeyValuePair <VisualAlphaParam, float> kvp in textures[i].AlphaMasks) { if (!MaskBelongsToBake(kvp.Key.TGAFile)) { continue; } if (kvp.Key.MultiplyBlend == false && (kvp.Value > 0f || !kvp.Key.SkipIfZero)) { ApplyAlpha(combinedMask, kvp.Key, kvp.Value); //File.WriteAllBytes(bakeType + "-layer-" + i + "-mask-" + addedMasks + ".tga", combinedMask.ExportTGA()); addedMasks++; } } // If there were no mask in normal blend mode make aplha fully opaque if (addedMasks == 0) { for (int l = 0; l < combinedMask.Alpha.Length; l++) { combinedMask.Alpha[l] = 255; } } // Add masks in multiply blend mode foreach (KeyValuePair <VisualAlphaParam, float> kvp in textures[i].AlphaMasks) { if (!MaskBelongsToBake(kvp.Key.TGAFile)) { continue; } if (kvp.Key.MultiplyBlend == true && (kvp.Value > 0f || !kvp.Key.SkipIfZero)) { ApplyAlpha(combinedMask, kvp.Key, kvp.Value); //File.WriteAllBytes(bakeType + "-layer-" + i + "-mask-" + addedMasks + ".tga", combinedMask.ExportTGA()); addedMasks++; } } if (addedMasks > 0) { // Apply combined alpha mask to the cloned texture AddAlpha(texture, combinedMask); } // Is this layer used for morph mask? If it is, use its // alpha as the morth for the whole bake if (Textures[i].TextureIndex == AppearanceManager.MorphLayerForBakeType(bakeType)) { bakedTexture.Image.Bump = texture.Alpha; } //File.WriteAllBytes(bakeType + "-masked-texture-" + i + ".tga", texture.ExportTGA()); } } bool useAlpha = i == 0 && (BakeType == BakeType.Skirt || BakeType == BakeType.Hair); DrawLayer(texture, useAlpha); //File.WriteAllBytes(bakeType + "-layer-" + i + ".tga", texture.ExportTGA()); } // For head and tattoo, we add skin last if (IsSkin && bakeType == BakeType.Head) { ManagedImage texture; if (textures[0].Texture != null) { texture = textures[0].Texture.Image.Clone(); if (texture.Width != bakeWidth || texture.Height != bakeHeight) { try { texture.ResizeNearestNeighbor(bakeWidth, bakeHeight); } catch (Exception) { } } DrawLayer(texture, false); } // Add head tattoo here (if available, order-dependant) if (textures.Count > 1 && textures[1].Texture != null) { texture = textures[1].Texture.Image.Clone(); if (texture.Width != bakeWidth || texture.Height != bakeHeight) { try { texture.ResizeNearestNeighbor(bakeWidth, bakeHeight); } catch (Exception) { } } DrawLayer(texture, false); } } // Apply any alpha wearable textures to make parts of the avatar disappear if (alphaWearableTexture != null) { AddAlpha(bakedTexture.Image, alphaWearableTexture); } // We are done, encode asset for finalized bake bakedTexture.Encode(); //File.WriteAllBytes(bakeType + ".tga", bakedTexture.Image.ExportTGA()); }
protected void Bake() { _bakedTexture = new AssetTexture(new ManagedImage(_bakeWidth, _bakeHeight, ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha | ManagedImage.ImageChannels.Bump)); if (_bakeType == AppearanceManager.BakeType.Eyes) { InitBakedLayerColor(255, 255, 255); if (!DrawLayer(AppearanceManager.TextureIndex.EyesIris)) { Logger.Log("Missing texture for EYES - unable to bake layer", Helpers.LogLevel.Warning, _client); } } else if (_bakeType == AppearanceManager.BakeType.Head) { // FIXME: Need to use the visual parameters to determine the base skin color in RGB but // it's not apparent how to define RGB levels from the skin color parameters, so // for now use a grey foundation for the skin InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.HeadBodypaint); // HACK: Bake the eyelashes in if we have them ManagedImage eyelashes = LoadAlphaLayer("head_alpha.tga"); if (eyelashes != null) { Logger.DebugLog("Loaded head_alpha.tga, baking in eyelashes"); DrawLayer(eyelashes, true); } else { Logger.Log("head_alpha.tga resource not found, skipping eyelashes", Helpers.LogLevel.Info); } } else if (_bakeType == AppearanceManager.BakeType.Skirt) { float skirtRed = 1.0f, skirtGreen = 1.0f, skirtBlue = 1.0f; try { _paramValues.TryGetValue(VisualParams.Find("skirt_red", "skirt").ParamID, out skirtRed); _paramValues.TryGetValue(VisualParams.Find("skirt_green", "skirt").ParamID, out skirtGreen); _paramValues.TryGetValue(VisualParams.Find("skirt_blue", "skirt").ParamID, out skirtBlue); } catch { Logger.Log("Unable to determine skirt color from visual params", Helpers.LogLevel.Warning, _client); } InitBakedLayerColor((byte)(skirtRed * 255.0f), (byte)(skirtGreen * 255.0f), (byte)(skirtBlue * 255.0f)); DrawLayer(AppearanceManager.TextureIndex.Skirt); } else if (_bakeType == AppearanceManager.BakeType.UpperBody) { InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.UpperBodypaint); DrawLayer(AppearanceManager.TextureIndex.UpperUndershirt); DrawLayer(AppearanceManager.TextureIndex.UpperGloves); DrawLayer(AppearanceManager.TextureIndex.UpperShirt); DrawLayer(AppearanceManager.TextureIndex.UpperJacket); } else if (_bakeType == AppearanceManager.BakeType.LowerBody) { InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.LowerBodypaint); DrawLayer(AppearanceManager.TextureIndex.LowerUnderpants); DrawLayer(AppearanceManager.TextureIndex.LowerSocks); DrawLayer(AppearanceManager.TextureIndex.LowerShoes); DrawLayer(AppearanceManager.TextureIndex.LowerPants); DrawLayer(AppearanceManager.TextureIndex.LowerJacket); } _bakedTexture.Encode(); }
protected void oldBake() { Client.DebugLog("Baking " + BakeType.ToString()); BakedTexture = new AssetTexture(new Image(BakeWidth, BakeHeight, ImageChannels.Color | ImageChannels.Alpha | ImageChannels.Bump)); int i = 0; for (int y = 0; y < BakeHeight; y++) { for (int x = 0; x < BakeWidth; x++) { if (((x ^ y) & 0x10) == 0) { BakedTexture.Image.Red[i] = 255; BakedTexture.Image.Green[i] = 0; BakedTexture.Image.Blue[i] = 0; BakedTexture.Image.Alpha[i] = 255; BakedTexture.Image.Bump[i] = 0; } else { BakedTexture.Image.Red[i] = 0; BakedTexture.Image.Green[i] = 0; BakedTexture.Image.Blue[i] = 255; BakedTexture.Image.Alpha[i] = 255; BakedTexture.Image.Bump[i] = 0; } ++i; } } BakedTexture.Encode(); }
protected void Bake() { BakedTexture = new AssetTexture(new Image(BakeWidth, BakeHeight, ImageChannels.Color | ImageChannels.Alpha | ImageChannels.Bump)); if (BakeType == AppearanceManager.BakeType.Eyes) { if (!DrawLayer(AppearanceManager.TextureIndex.EyesIris)) oldBake(); } else if (BakeType == AppearanceManager.BakeType.Head) { if (!DrawLayer(AppearanceManager.TextureIndex.HeadBodypaint)) oldBake(); } else if (BakeType == AppearanceManager.BakeType.Skirt) { if (!DrawLayer(AppearanceManager.TextureIndex.Skirt)) oldBake(); } else if (BakeType == AppearanceManager.BakeType.UpperBody) { if (!DrawLayer(AppearanceManager.TextureIndex.UpperBodypaint)) oldBake(); DrawLayer(AppearanceManager.TextureIndex.UpperUndershirt); DrawLayer(AppearanceManager.TextureIndex.UpperGloves); DrawLayer(AppearanceManager.TextureIndex.UpperShirt); DrawLayer(AppearanceManager.TextureIndex.UpperJacket); } else if (BakeType == AppearanceManager.BakeType.LowerBody) { if (!DrawLayer(AppearanceManager.TextureIndex.LowerBodypaint)) oldBake(); DrawLayer(AppearanceManager.TextureIndex.LowerUnderpants); DrawLayer(AppearanceManager.TextureIndex.LowerSocks); DrawLayer(AppearanceManager.TextureIndex.LowerShoes); DrawLayer(AppearanceManager.TextureIndex.LowerPants); DrawLayer(AppearanceManager.TextureIndex.LowerJacket); } BakedTexture.Encode(); }
protected void Bake() { _bakedTexture = new AssetTexture(new ManagedImage(_bakeWidth, _bakeHeight, ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha | ManagedImage.ImageChannels.Bump)); if (_bakeType == AppearanceManager.BakeType.Eyes) { InitBakedLayerColor(255, 255, 255); if (!DrawLayer(AppearanceManager.TextureIndex.EyesIris)) { Logger.Log("Missing texture for EYES - unable to bake layer", Helpers.LogLevel.Warning, _client); } } else if (_bakeType == AppearanceManager.BakeType.Head) { // FIXME: Need to use the visual parameters to determine the base skin color in RGB but // it's not apparent how to define RGB levels from the skin color parameters, so // for now use a grey foundation for the skin InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.HeadBodypaint); // HACK: Bake the eyelashes in if we have them ManagedImage eyelashes = LoadAlphaLayer("head_alpha.tga"); if (eyelashes != null) { Logger.DebugLog("Loaded head_alpha.tga, baking in eyelashes"); DrawLayer(eyelashes, true); } else { Logger.Log("head_alpha.tga resource not found, skipping eyelashes", Helpers.LogLevel.Info); } } else if (_bakeType == AppearanceManager.BakeType.Skirt) { float skirtRed = 1.0f, skirtGreen = 1.0f, skirtBlue = 1.0f; try { _paramValues.TryGetValue(VisualParams.Find("skirt_red", "skirt").ParamID, out skirtRed); _paramValues.TryGetValue(VisualParams.Find("skirt_green", "skirt").ParamID, out skirtGreen); _paramValues.TryGetValue(VisualParams.Find("skirt_blue", "skirt").ParamID, out skirtBlue); } catch { Logger.Log("Unable to determine skirt color from visual params", Helpers.LogLevel.Warning, _client); } InitBakedLayerColor((byte)(skirtRed * 255.0f), (byte)(skirtGreen * 255.0f), (byte)(skirtBlue * 255.0f)); DrawLayer(AppearanceManager.TextureIndex.Skirt); } else if (_bakeType == AppearanceManager.BakeType.UpperBody) { InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.UpperBodypaint); DrawLayer(AppearanceManager.TextureIndex.UpperUndershirt); DrawLayer(AppearanceManager.TextureIndex.UpperGloves); DrawLayer(AppearanceManager.TextureIndex.UpperShirt); DrawLayer(AppearanceManager.TextureIndex.UpperJacket); } else if (_bakeType == AppearanceManager.BakeType.LowerBody) { InitBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.LowerBodypaint); DrawLayer(AppearanceManager.TextureIndex.LowerUnderpants); DrawLayer(AppearanceManager.TextureIndex.LowerSocks); DrawLayer(AppearanceManager.TextureIndex.LowerShoes); DrawLayer(AppearanceManager.TextureIndex.LowerPants); DrawLayer(AppearanceManager.TextureIndex.LowerJacket); } _bakedTexture.Encode(); }
protected void Bake() { BakedTexture = new AssetTexture(new Image(BakeWidth, BakeHeight, ImageChannels.Color | ImageChannels.Alpha | ImageChannels.Bump)); if (BakeType == AppearanceManager.BakeType.Eyes) { initBakedLayerColor(255, 255, 255); if (!DrawLayer(AppearanceManager.TextureIndex.EyesIris)) { Client.Log("Missing texture for EYES - unable to bake layer", Helpers.LogLevel.Warning); } } else if (BakeType == AppearanceManager.BakeType.Head) { // need to use the visual parameters to determine the base skin color in RGB but // it's not apparent how to define RGB levels from the skin color parameters, so // for now use a grey foundation for the skin and skirt layers initBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.HeadBodypaint); } else if (BakeType == AppearanceManager.BakeType.Skirt) { float skirtRed = 1.0f, skirtGreen = 1.0f, skirtBlue = 1.0f; try { ParamValues.TryGetValue(VisualParams.Find("skirt_red", "skirt").ParamID, out skirtRed); ParamValues.TryGetValue(VisualParams.Find("skirt_green", "skirt").ParamID, out skirtGreen); ParamValues.TryGetValue(VisualParams.Find("skirt_blue", "skirt").ParamID, out skirtBlue); } catch { Client.Log("Unable to determine skirt color from visual params", Helpers.LogLevel.Warning); } initBakedLayerColor((int)(skirtRed * 255.0f), (int)(skirtGreen * 255.0f), (int)(skirtBlue * 255.0f)); DrawLayer(AppearanceManager.TextureIndex.Skirt); } else if (BakeType == AppearanceManager.BakeType.UpperBody) { initBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.UpperBodypaint); DrawLayer(AppearanceManager.TextureIndex.UpperUndershirt); DrawLayer(AppearanceManager.TextureIndex.UpperGloves); DrawLayer(AppearanceManager.TextureIndex.UpperShirt); DrawLayer(AppearanceManager.TextureIndex.UpperJacket); } else if (BakeType == AppearanceManager.BakeType.LowerBody) { initBakedLayerColor(128, 128, 128); DrawLayer(AppearanceManager.TextureIndex.LowerBodypaint); DrawLayer(AppearanceManager.TextureIndex.LowerUnderpants); DrawLayer(AppearanceManager.TextureIndex.LowerSocks); DrawLayer(AppearanceManager.TextureIndex.LowerShoes); DrawLayer(AppearanceManager.TextureIndex.LowerPants); DrawLayer(AppearanceManager.TextureIndex.LowerJacket); } BakedTexture.Encode(); }