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; }
public override bool OnTextureTerrain(TextureChangeParameters parameters) { throw new NotImplementedException(); }
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); }