Exemplo n.º 1
0
 public override void TextureTerrain(Game.Logic.TextureChangeParam param)
 {
     foreach (var chunk in mChunks)
     {
         chunk.textureTerrain(param);
     }
 }
Exemplo n.º 2
0
 public static void TextureTerrain(Game.Logic.TextureChangeParam param)
 {
     foreach (var file in mActiveFiles)
     {
         file.TextureTerrain(param);
     }
 }
Exemplo n.º 3
0
        public void textureTerrain(Game.Logic.TextureChangeParam param)
        {
            // check if we actually have something to change
            float xdiff = mHeader.position.X - param.ActionSource.X + Utils.Metrics.Chunksize / 2;
            float zdiff = mHeader.position.Y - param.ActionSource.Y + Utils.Metrics.Chunksize / 2;

            float dist = (float)Math.Sqrt(xdiff * xdiff + zdiff * zdiff);

            if (dist > (param.OuterRadius + Utils.Metrics.ChunkRadius))
            {
                return;
            }

            int layer = getTextureLayer(param.TextureName);

            if (layer == -1)
            {
                layer = addTextureLayer(param.TextureName);
                if (layer == -1)
                {
                    return;
                }
            }

            // doesnt make no sense to texture the ground layer, its opaque by default!
            if (layer == 0)
            {
                return;
            }

            // ground layer uses channel 3 of the rgba
            // layer 1 uses channel 0, layer 2 uses channel 1 and layer 3 uses channel 3
            int alphaLayer = layer - 1;

            for (int i = 0; i < 64; ++i)
            {
                for (int j = 0; j < 64; ++j)
                {
                    float posX = j * (Utils.Metrics.Chunksize / 64.0f) + mHeader.position.X;
                    float posY = i * (Utils.Metrics.Chunksize / 64.0f) + mHeader.position.Y;

                    xdiff = posX - param.ActionSource.X;
                    zdiff = posY - param.ActionSource.Y;

                    dist = (float)Math.Sqrt(xdiff * xdiff + zdiff * zdiff);

                    if (dist > param.OuterRadius)
                    {
                        continue;
                    }

                    if (dist <= param.InnerRadius)
                    {
                        float newVal = 0.0f;
                        switch (param.Falloff)
                        {
                        case Game.Logic.TextureChangeParam.FalloffMode.Cosinus:
                            newVal = Utils.SharpMath.CosinusInterpolate(param.Strength, param.FalloffTreshold, (dist / param.InnerRadius));
                            break;

                        case Game.Logic.TextureChangeParam.FalloffMode.Linear:
                            newVal = Utils.SharpMath.Lerp(param.Strength, param.FalloffTreshold, (dist / param.InnerRadius));
                            break;

                        case Game.Logic.TextureChangeParam.FalloffMode.Flat:
                            newVal = param.Strength;
                            break;
                        }

                        newVal += AlphaFloats[(i * 64 + j), alphaLayer];
                        if (newVal >= 65535.0f)
                        {
                            newVal = 65535.0f;
                        }

                        AlphaFloats[(i * 64 + j), alphaLayer] = (ushort)newVal;
                        if (AlphaFloats[(i * 64 + j), alphaLayer] > param.AlphaCap)
                        {
                            AlphaFloats[(i * 64 + j), alphaLayer] = (ushort)param.AlphaCap;
                        }

                        AlphaData[(i * 64 + j) * 4 + alphaLayer] = (byte)((AlphaFloats[(i * 64 + j), alphaLayer] / 65535.0f) * 255.0f);
                    }
                    else if (dist <= param.OuterRadius)
                    {
                        float newVal = Utils.SharpMath.Lerp((param.Falloff == Game.Logic.TextureChangeParam.FalloffMode.Flat ? param.Strength : param.FalloffTreshold), 0, (dist - param.InnerRadius) / (param.OuterRadius - param.InnerRadius));
                        newVal += AlphaFloats[(i * 64 + j), alphaLayer];
                        if (newVal >= 65535.0f)
                        {
                            newVal = 65535.0f;
                        }

                        AlphaFloats[(i * 64 + j), alphaLayer] = (ushort)newVal;
                        if (AlphaFloats[(i * 64 + j), alphaLayer] > param.AlphaCap)
                        {
                            AlphaFloats[(i * 64 + j), alphaLayer] = (ushort)param.AlphaCap;
                        }

                        AlphaData[(i * 64 + j) * 4 + alphaLayer] = (byte)((AlphaFloats[(i * 64 + j), alphaLayer] / 65535.0f) * 255.0f);
                    }

                    mAlphaDirty = true;
                }
            }
        }
Exemplo n.º 4
0
 public override void TextureTerrain(Game.Logic.TextureChangeParam param)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 5
0
 public abstract void TextureTerrain(Game.Logic.TextureChangeParam param);