private void DrawSource(WaterOnTerrainSFX.Source source, Matrix4x4 worldToScreenMatrix) { Vector3 v = this.EventPositionForLocalPosition(source.localPosition); v = worldToScreenMatrix.MultiplyPoint3x4(new Vector3(v.x, v.z)); this.DrawTexture(v, WaterOnTerrainSFX.sourceTexture); v = source.eventPosition; v = worldToScreenMatrix.MultiplyPoint3x4(new Vector3(v.x, v.z)); this.DrawTexture(v, WaterOnTerrainSFX.eventTexture); }
private void StopSource(int index) { if (index >= 0 && index < this.sources.Count) { WaterOnTerrainSFX.Source source = this.sources[index]; this.sources.RemoveAt(index); source.Stop(); this.sourcePool.Push(source); } }
private float ScoreForSource(WaterOnTerrainSFX.IntVector position, WaterOnTerrainSFX.Source source) { float num = 0f; if (WaterOnTerrainSFX.IsWithinSampleGrid(position)) { num = this.sampleGrid[position.x, position.y].score; for (int i = 0; i < this.sources.Count; i++) { if (this.sources[i] != source) { float t = (float)((position - this.sources[i].localPosition).squareMagnitude / 5); num *= Mathf.Lerp(0.1f, 1f, t); } } } return(num); }
private void UpdateSources() { float num = this.maximumScore / 5f; int i = 0; while (i < this.sources.Count) { WaterOnTerrainSFX.Source source = this.sources[i]; WaterOnTerrainSFX.IntVector localPosition = source.localPosition; float num2 = this.ScoreForSource(source.localPosition, source); for (int j = 0; j < WaterOnTerrainSFX.NEIGHBOURS.Length; j++) { WaterOnTerrainSFX.IntVector intVector = source.localPosition + WaterOnTerrainSFX.NEIGHBOURS[j]; float num3 = this.ScoreForSource(intVector, source); if (num3 > num2) { num2 = num3; localPosition = intVector; } } if (num2 > num) { source.localPosition = localPosition; source.SetGradient(this.GradientForLocalPosition(source.localPosition)); i++; } else { this.StopSource(i); } } if (!this.centreSource.IsPlaying()) { this.centreSource.Start(this.eventDescription, this.gradientParameterIndex, this.wetnessParameterIndex, WaterOnTerrainSFX.SAMPLE_GRID_CENTRE, base.transform.position, this.GradientForLocalPosition(WaterOnTerrainSFX.SAMPLE_GRID_CENTRE)); } while (this.sourcePool.Count > 0) { WaterOnTerrainSFX.IntVector intVector2 = new WaterOnTerrainSFX.IntVector(0, 0); float num4 = num; WaterOnTerrainSFX.IntVector intVector3; intVector3.x = 0; while (intVector3.x < 21) { intVector3.y = 0; while (intVector3.y < 21) { float num5 = this.ScoreForSource(intVector3, null); if (num5 > num4) { num4 = num5; intVector2 = intVector3; } intVector3.y++; } intVector3.x++; } if (num4 <= num) { break; } WaterOnTerrainSFX.Source source2 = this.sourcePool.Pop(); source2.Start(this.eventDescription, this.gradientParameterIndex, this.wetnessParameterIndex, intVector2, this.EventPositionForLocalPosition(intVector2), this.GradientForLocalPosition(intVector2)); this.sources.Add(source2); } float distance = Time.deltaTime * this.sourceSpeed; this.centreSource.UpdateEvent(base.transform.position, float.MaxValue, WaterOnTerrainSFX.Wetness); for (int k = 0; k < this.sources.Count; k++) { WaterOnTerrainSFX.Source source3 = this.sources[k]; source3.UpdateEvent(this.EventPositionForLocalPosition(source3.localPosition), distance, WaterOnTerrainSFX.Wetness); } }
private void UpdateSampleGrid() { WaterOnTerrainSFX.IntVector intVector = new WaterOnTerrainSFX.IntVector(Mathf.FloorToInt(base.transform.position.x / this.gridCellSize), Mathf.FloorToInt(base.transform.position.z / this.gridCellSize)); if (intVector != this.gridPosition) { WaterOnTerrainSFX.IntVector intVector2 = intVector - this.gridPosition; if (Math.Abs(intVector2.x) < 21 && Math.Abs(intVector2.y) < 21) { this.MoveSampleGridEntries(-intVector2); WaterOnTerrainSFX.IntVector intVector3; WaterOnTerrainSFX.IntVector intVector4; if (intVector2.x < 0) { intVector3.x = 0; intVector4.x = -intVector2.x; } else { intVector3.x = 21 - intVector2.x; intVector4.x = 21; } if (intVector2.y < 0) { intVector3.y = 0; intVector4.y = -intVector2.y; } else { intVector3.y = 21 - intVector2.y; intVector4.y = 21; } this.CacheGradients(intVector, new WaterOnTerrainSFX.IntVector(0, intVector3.y), new WaterOnTerrainSFX.IntVector(21, intVector4.y)); if (intVector3.y > 0) { this.CacheGradients(intVector, new WaterOnTerrainSFX.IntVector(intVector3.x, 0), new WaterOnTerrainSFX.IntVector(intVector4.x, intVector3.y)); } else { this.CacheGradients(intVector, new WaterOnTerrainSFX.IntVector(intVector3.x, intVector4.y), new WaterOnTerrainSFX.IntVector(intVector4.x, 21)); } } else { this.CacheGradients(intVector, new WaterOnTerrainSFX.IntVector(0, 0), new WaterOnTerrainSFX.IntVector(21, 21)); } this.CalculateSampleGridScores(); int i = 0; while (i < this.sources.Count) { WaterOnTerrainSFX.Source source = this.sources[i]; this.sources[i].localPosition -= intVector2; int squareMagnitude = (source.localPosition - WaterOnTerrainSFX.SAMPLE_GRID_CENTRE).squareMagnitude; if (!WaterOnTerrainSFX.IsWithinSampleGrid(source.localPosition) || squareMagnitude > 100) { this.StopSource(i); } else { i++; } } this.gridPosition = intVector; } }