public override void TextureTerrain(Game.Logic.TextureChangeParam param) { foreach (var chunk in mChunks) { chunk.textureTerrain(param); } }
public static void TextureTerrain(Game.Logic.TextureChangeParam param) { foreach (var file in mActiveFiles) { file.TextureTerrain(param); } }
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; } } }
public override void TextureTerrain(Game.Logic.TextureChangeParam param) { throw new NotImplementedException(); }
public abstract void TextureTerrain(Game.Logic.TextureChangeParam param);