Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
        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);
        }