private void LateUpdate() { Rect cameraRect = MapCamera.GetComponent <CameraController>().GetCameraRect(); float pixelWidth = MapCamera.GetComponent <CameraController>().GetPixelWidth(); float masterAlpha = Mathf.Lerp(1, 0, (MapCamera.GetComponent <Camera>().orthographicSize - StartAlpha) / (EndAlpha - StartAlpha)); Rect[,] spriteRects = Helpers.SubdivideRect(cameraRect, SpriteColumns, SpriteRows); for (int spriteColumn = 0; spriteColumn < SpriteColumns; spriteColumn++) { for (int spriteRow = 0; spriteRow < SpriteRows; spriteRow++) { Sprites[spriteColumn, spriteRow].transform.position = spriteRects[spriteColumn, spriteRow].min; Sprites[spriteColumn, spriteRow].transform.localScale = spriteRects[spriteColumn, spriteRow].size; Rect[,] shaderRects = Helpers.SubdivideRect(spriteRects[spriteColumn, spriteRow], ColumnsPerShader, RowsPerShader); for (int shaderColumn = 0; shaderColumn < ColumnsPerShader; shaderColumn++) { for (int shaderRow = 0; shaderRow < RowsPerShader; shaderRow++) { int offset = RowsPerShader * shaderColumn + shaderRow; int count = 0; Contents.GetLocalBodies(shaderRects[shaderColumn, shaderRow], BodyVectors[spriteColumn, spriteRow], MaxObjectsPerShaderSegment * offset, ref count); NumberOfBodies[spriteColumn, spriteRow][offset] = count; } } Sprites[spriteColumn, spriteRow].GetComponent <SpriteRenderer>().material.SetVectorArray("bodies", BodyVectors[spriteColumn, spriteRow]); Sprites[spriteColumn, spriteRow].GetComponent <SpriteRenderer>().material.SetFloatArray("numberOfBodies", NumberOfBodies[spriteColumn, spriteRow]); Sprites[spriteColumn, spriteRow].GetComponent <SpriteRenderer>().material.SetFloat("pixelWidth", pixelWidth); Sprites[spriteColumn, spriteRow].GetComponent <SpriteRenderer>().material.SetFloat("masterAlpha", masterAlpha); } } }
/// <summary> /// Get all bodies who's rect overlaps with the provided worldRect (Cull). /// </summary> /// <param name="worldRect"></param> /// <param name="minimumSize"></param> /// <returns></returns> public void GetLocalBodies(Rect worldRect, Vector4[] output, int offset, ref int index) { foreach (Vector4 celestialBody in Contents) { float top = celestialBody.y + celestialBody.z; float bottom = celestialBody.y - celestialBody.z; float left = celestialBody.x - celestialBody.z; float right = celestialBody.x + celestialBody.z; if (top > worldRect.yMin && bottom < worldRect.yMax && left < worldRect.xMax && right > worldRect.xMin) { if (index < 100) { output[offset + index++] = celestialBody; } else { return; } } } if (QuadOne != null) { if (QuadOne.Rect.Overlaps(worldRect)) { QuadOne.GetLocalBodies(worldRect, output, offset, ref index); } if (QuadTwo.Rect.Overlaps(worldRect)) { QuadTwo.GetLocalBodies(worldRect, output, offset, ref index); } if (QuadThree.Rect.Overlaps(worldRect)) { QuadThree.GetLocalBodies(worldRect, output, offset, ref index); } if (QuadFour.Rect.Overlaps(worldRect)) { QuadFour.GetLocalBodies(worldRect, output, offset, ref index); } } }