public void AddFrustum(BoundingFrustumEx frustum, short timer, Color color) { Vector3[] corners = frustum.GetCornersNoCopy(); //Front Lines.Add(new LineHelper(corners[0], corners[1], 1, color, color, this)); Lines.Add(new LineHelper(corners[1], corners[2], 1, color, color, this)); Lines.Add(new LineHelper(corners[2], corners[3], 1, color, color, this)); Lines.Add(new LineHelper(corners[3], corners[0], 1, color, color, this)); //Back Lines.Add(new LineHelper(corners[4], corners[5], 1, color, color, this)); Lines.Add(new LineHelper(corners[5], corners[6], 1, color, color, this)); Lines.Add(new LineHelper(corners[6], corners[7], 1, color, color, this)); Lines.Add(new LineHelper(corners[7], corners[4], 1, color, color, this)); //Between Lines.Add(new LineHelper(corners[4], corners[0], 1, color, color, this)); Lines.Add(new LineHelper(corners[5], corners[1], 1, color, color, this)); Lines.Add(new LineHelper(corners[6], corners[2], 1, color, color, this)); Lines.Add(new LineHelper(corners[7], corners[3], 1, color, color, this)); }
private void TiledLighting(BoundingFrustum frustum, List <PointLight> pointLights, int cols, int rows) { if (TiledList == null || TiledList.Length != cols * rows) { TiledList = new int[cols * rows][]; TiledListLength = new float[cols * rows]; for (var index = 0; index < TiledList.Length; index++) { TiledList[index] = new int[MAXLIGHTSPERTILE]; } } if (_tileFrustum == null) { _tileFrustum = new BoundingFrustumEx(frustum.Matrix); } Vector3[] mainfrustumCorners = frustum.GetCorners(); for (float col = 0; col < cols; col++) { for (float row = 0; row < rows; row++) { //top left _tileFrustumCorners[0] = mainfrustumCorners[0] + (mainfrustumCorners[1] - mainfrustumCorners[0]) * col / cols + (mainfrustumCorners[3] - mainfrustumCorners[0]) * row / rows; //top right _tileFrustumCorners[1] = mainfrustumCorners[0] + (mainfrustumCorners[1] - mainfrustumCorners[0]) * (col + 1) / cols + (mainfrustumCorners[3] - mainfrustumCorners[0]) * row / rows; //bot right _tileFrustumCorners[2] = mainfrustumCorners[0] + (mainfrustumCorners[1] - mainfrustumCorners[0]) * (col + 1) / cols + (mainfrustumCorners[2] - mainfrustumCorners[1]) * (row + 1) / rows; //bot left _tileFrustumCorners[3] = mainfrustumCorners[0] + (mainfrustumCorners[1] - mainfrustumCorners[0]) * (col) / cols + (mainfrustumCorners[2] - mainfrustumCorners[1]) * (row + 1) / rows; _tileFrustumCorners[4] = mainfrustumCorners[4] + (mainfrustumCorners[5] - mainfrustumCorners[4]) * col / cols + (mainfrustumCorners[7] - mainfrustumCorners[4]) * row / rows; _tileFrustumCorners[5] = mainfrustumCorners[4] + (mainfrustumCorners[5] - mainfrustumCorners[4]) * (col + 1) / cols + (mainfrustumCorners[7] - mainfrustumCorners[4]) * row / rows; _tileFrustumCorners[6] = mainfrustumCorners[4] + (mainfrustumCorners[5] - mainfrustumCorners[4]) * (col + 1) / cols + (mainfrustumCorners[6] - mainfrustumCorners[5]) * (row + 1) / rows; _tileFrustumCorners[7] = mainfrustumCorners[4] + (mainfrustumCorners[5] - mainfrustumCorners[4]) * (col) / cols + (mainfrustumCorners[6] - mainfrustumCorners[5]) * (row + 1) / rows; _tileFrustum.SetCorners(ref _tileFrustumCorners); _tileFrustum.CreatePlanesFromCorners(); //Now we are ready to frustum cull... phew int index = (int)(row * cols + col); int numberOfLightsInTile = 0; for (var i = 0; i < pointLights.Count; i++) { var pointLight = pointLights[i]; ContainmentType containmentType = _tileFrustum.Contains(pointLight.BoundingSphere); if (containmentType == ContainmentType.Intersects || containmentType == ContainmentType.Contains) { TiledList[index][numberOfLightsInTile] = i; numberOfLightsInTile++; } if (numberOfLightsInTile >= MAXLIGHTSPERTILE) { break; } } TiledListLength[index] = numberOfLightsInTile; #if SHOWTILES LineHelperManager.AddFrustum(_tileFrustum, 1, numberOfLightsInTile > 1 ? Color.Red : numberOfLightsInTile > 0 ? Color.Blue : Color.Green); #endif } } //Note: This needs a custom monogame version, since the default doesn't like to pass int[]; _tiledListLengthParam.SetValue(TiledListLength); }