private unsafe void LoadLayerRle(Mcly layerInfo, int layer) { var ptr = mAlphaDataCompressed.ToPointer(); var counterOut = 0; var startPos = layerInfo.OfsMcal; while (counterOut < 4096) { var indicator = ((byte *)ptr)[startPos++]; if ((indicator & 0x80) != 0) { var value = ((byte *)ptr)[startPos++]; var repeat = indicator & 0x7F; for (var k = 0; k < repeat && counterOut < 4096; ++k) { AlphaValues[counterOut++] |= (uint)value << (layer * 8); } } else { for (var k = 0; k < (indicator & 0x7F) && counterOut < 4096; ++k) { AlphaValues[counterOut++] |= (uint)((byte *)ptr)[startPos++] << (8 * layer); } } } }
private unsafe void LoadUncompressed(Mcly layerInfo, int layer) { var ptr = mAlphaDataCompressed.ToPointer(); var startPos = layerInfo.OfsMcal; for (var i = 0; i < 4096; ++i) { AlphaValues[i] |= (uint)((byte *)ptr)[startPos++] << (8 * layer); } }
protected override int AddTextureLayer(string textureName) { var old = TextureNames; TextureNames = new string[TextureNames.Count + 1]; for (var i = 0; i < old.Count; ++i) { TextureNames[i] = old[i]; } TextureNames[TextureNames.Count - 1] = textureName; MapArea parent; if (mParent.TryGetTarget(out parent) == false) { throw new InvalidOperationException("Couldnt get parent of map chunk"); } var texId = parent.GetOrAddTexture(textureName); var layer = new Mcly { Flags = 0, TextureId = texId, EffectId = -1, OfsMcal = 0, Padding = 0 }; var layers = mLayers; mLayers = new Mcly[layers.Length + 1]; for (var i = 0; i < layers.Length; ++i) { mLayers[i] = layers[i]; } mLayers[layers.Length] = layer; Textures.Add(parent.GetTexture(texId)); SpecularTextures.Add(parent.GetSpecularTexture(texId)); SpecularFactors[SpecularTextures.Count - 1] = parent.IsSpecularTextureLoaded(texId) ? 1 : 0; TexturesChanged = true; return(mLayers.Length - 1); }
private unsafe void LoadLayerCompressed(Mcly layerInfo, int layer) { var ptr = mAlphaDataCompressed.ToPointer(); var startPos = layerInfo.OfsMcal; var counter = 0; for (var k = 0; k < 64; ++k) { for (var j = 0; j < 32; ++j) { var alpha = ((byte *)ptr)[startPos++]; var val1 = alpha & 0xF; var val2 = alpha >> 4; val2 = j == 31 ? val1 : val2; val1 = (byte)((val1 / 15.0f) * 255.0f); val2 = (byte)((val2 / 15.0f) * 255.0f); AlphaValues[counter++] |= (uint)val1 << (8 * layer); AlphaValues[counter++] |= (uint)val2 << (8 * layer); } } }