コード例 #1
0
ファイル: MapArea.cs プロジェクト: veserine/Neo
        public override bool OnTextureTerrain(TextureChangeParameters parameters)
        {
            var changed = false;
            foreach (var chunk in mChunks)
            {
                if (chunk == null) continue;

                if (chunk.OnTextureTerrain(parameters))
                    changed = true;
            }

            return changed;
        }
コード例 #2
0
ファイル: MapArea.cs プロジェクト: jimleigh/WoWEditor
 public override bool OnTextureTerrain(TextureChangeParameters parameters)
 {
     throw new NotImplementedException();
 }
コード例 #3
0
ファイル: MapChunk.cs プロジェクト: veserine/Neo
        public bool OnTextureTerrain(TextureChangeParameters parameters)
        {
            var diffVec = new Vector2(mMidPoint.X, mMidPoint.Y) - new Vector2(parameters.Center.X, parameters.Center.Y);
            var dsquare = Vector2.Dot(diffVec, diffVec);

            var maxRadius = parameters.OuterRadius + Metrics.ChunkRadius;

            if (dsquare > maxRadius * maxRadius)
            {
                return(false);
            }

            var layer    = -1;
            var minPos   = BoundingBox.Minimum;
            var maxPos   = BoundingBox.Maximum;
            var changed  = false;
            var inverted = parameters.IsInverted;

            for (var i = 0; i < 64; ++i)
            {
                for (var j = 0; j < 64; ++j)
                {
                    var xpos = minPos.X + j * Metrics.ChunkSize / 64.0f;
                    var ypos = minPos.Y + i * Metrics.ChunkSize / 64.0f;
                    if (mIsYInverted)
                    {
                        ypos = maxPos.Y - i * Metrics.ChunkSize / 64.0f;
                    }

                    var distSq = (xpos - parameters.Center.X) * (xpos - parameters.Center.X) +
                                 (ypos - parameters.Center.Y) * (ypos - parameters.Center.Y);

                    if (distSq > parameters.OuterRadius * parameters.OuterRadius)
                    {
                        continue;
                    }

                    if (layer < 0)
                    {
                        layer = FindTextureLayer(parameters.Texture);
                        if (layer < 0)
                        {
                            return(false);
                        }
                    }

                    changed = true;

                    var dist     = (float)Math.Sqrt(distSq);
                    var pressure = parameters.Amount;
                    if (dist < parameters.OuterRadius && dist >= parameters.InnerRadius)
                    {
                        switch (parameters.FalloffMode)
                        {
                        case TextureFalloffMode.Linear:
                            pressure = 1.0f - ((dist - parameters.InnerRadius) / (parameters.OuterRadius - parameters.InnerRadius));
                            break;

                        case TextureFalloffMode.Trigonometric:
                            pressure = (float)Math.Cos((Math.PI / 2.0f) * (dist - parameters.InnerRadius) / (parameters.OuterRadius - parameters.InnerRadius));
                            break;

                        default:
                            goto case TextureFalloffMode.Linear;
                        }

                        pressure *= parameters.Amount;
                    }

                    if (!inverted)
                    {
                        if (layer > 0)
                        {
                            float cur    = (AlphaValues[i * 64 + j] >> (layer * 8)) & 0xFF;
                            var   newVal = Math.Min(Math.Max((1 - pressure) * cur + pressure * parameters.TargetValue, 0), 255);
                            AlphaValues[i * 64 + j] &= ~(uint)(0xFF << (8 * layer));
                            AlphaValues[i * 64 + j] |= (((uint)newVal) << (8 * layer));
                        }

                        var nLayers = mLayers.Length - 2; // baseLayer and current layer
                        if (nLayers > 0)
                        {
                            /*for (var k = layer + 1; k < mLayers.Length; ++k)
                             * {
                             *  float cur = (AlphaValues[i * 64 + j] >> (k * 8)) & 0xFF;
                             *  var newVal =
                             *      Math.Min(Math.Max((1 - pressure) * cur + pressure * (1 - parameters.TargetValue), 0),
                             *          255);
                             *  AlphaValues[i * 64 + j] &= ~(uint) (0xFF << (8 * k));
                             *  AlphaValues[i * 64 + j] |= (((uint) newVal) << (8 * k));
                             * }*/

                            var tarInverse = (1 - parameters.TargetValue) / nLayers;
                            for (var k = 1; k < mLayers.Length; ++k)
                            {
                                if (k == layer)
                                {
                                    continue;
                                }

                                float cur    = (AlphaValues[i * 64 + j] >> (k * 8)) & 0xFF;
                                var   newVal = Math.Min(Math.Max((1 - pressure) * cur + pressure * tarInverse, 0), 255);
                                AlphaValues[i * 64 + j] &= ~(uint)(0xFF << (8 * k));
                                AlphaValues[i * 64 + j] |= (((uint)newVal) << (8 * k));
                            }
                        }
                    }
                    else
                    {
                        //TODO: Implement texture substraction.
                    }
                }
            }

            if (changed)
            {
                IsAlphaChanged = true;
            }

            return(changed);
        }