internal int AddFrustum(BoundingFrustum frustum)
        {
            Debug.Assert(m_reservedFrusta < 32);
            FrustumQuery[m_reservedFrusta].Clear();
            FrustumQuery[m_reservedFrusta].Frustum = frustum;
            var bitmask = 1 << m_reservedFrusta;

            FrustumQuery[m_reservedFrusta].Bitmask = bitmask;
            m_reservedFrusta++;
            return(bitmask);
        }
        internal void Clear()
        {
            Bitmask = 0;
            Frustum = null;

            List.Clear();
            IsInsideList.Clear();

            List2.Clear();
            IsInsideList2.Clear();

            SmallObjects = null;
            Type         = MyFrustumEnum.Unassigned;
        }
        internal static void DrawFrustum(BoundingFrustum frustum, Color color, float alpha)
        {
            var corners = frustum.GetCorners();

            Color c = color;

            c.A = (byte)(alpha * 255);

            DrawQuad(corners[0], corners[1], corners[2], corners[3], c);
            DrawQuad(corners[4], corners[5], corners[6], corners[7], c);

            // top left bottom right
            DrawQuad(corners[0], corners[1], corners[5], corners[4], c);
            DrawQuad(corners[0], corners[3], corners[7], corners[4], c);
            DrawQuad(corners[3], corners[2], corners[6], corners[7], c);
            DrawQuad(corners[2], corners[1], corners[5], corners[6], c);
        }
        internal static void AddShadowCaster(BoundingFrustum frustum, Matrix viewProjectionLocal, MyViewport viewport, DepthStencilView depthTarget, bool isCascade, string debugName)
        {
            var frustumMask = m_cullQuery.AddFrustum(frustum);

            MyDepthPass pass = new MyDepthPass();

            pass.DebugName = debugName;
            pass.Cleanup();
            pass.ProcessingMask = frustumMask;
            pass.ViewProjection = viewProjectionLocal;
            pass.Viewport       = viewport;

            pass.DSV = depthTarget;
            pass.DefaultRasterizer = isCascade ? MyRender11.m_cascadesRasterizerState : MyRender11.m_shadowRasterizerState;

            pass.PerFrame();

            m_wavefront.Add(pass);
        }
Esempio n. 5
0
        internal static void Render()
        {
            m_instance.ViewProjection = MyEnvironment.ViewProjectionAt0;
            m_instance.Viewport       = new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y);
            //m_instance.DepthBuffer = MyRender.MainGbuffer.DepthBuffer.DepthStencil;
            //m_instance.RTs = MyRender.MainGbuffer.GbufferTargets;

            m_instance.PerFrame();
            m_instance.Begin();

            var viewFrustum = new BoundingFrustum(MyEnvironment.ViewProjection);

            foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll())
            {
                if (f.m_owner.CalculateCameraDistance() < MyRender11.RenderSettings.FoliageDetails.GrassDrawDistance() &&
                    viewFrustum.Contains(f.m_owner.Aabb) != VRageMath.ContainmentType.Disjoint)
                {
                    f.Render(m_instance);
                }
            }

            m_instance.End();
        }
Esempio n. 6
0
 internal void AddFrustum(BoundingFrustum bf, Color color)
 {
     Add6FacedConvex(bf.GetCorners(), color);
 }
Esempio n. 7
0
        internal static void DrawFrustum(BoundingFrustum frustum, Color color, float alpha)
        {
            var corners = frustum.GetCorners();

            Draw6FacedConvex(corners, color, alpha);
        }
        internal static void DrawFrustum(BoundingFrustum frustum, Color color, float alpha)
        {
            var corners = frustum.GetCorners();

            Draw6FacedConvexZ(corners, color, alpha);
        }
Esempio n. 9
0
        public static void DebugDrawFrustrum(BoundingFrustrum frustrum, Color color, float alpha, bool depthRead, bool smooth = false)
        {
            var message = MessagePool.Get<MyRenderMessageDebugDrawFrustrum>(MyRenderMessageEnum.DebugDrawFrustrum);

            message.Frustrum = frustrum;
            message.Color = color;
            message.Alpha = alpha;
            message.DepthRead = depthRead;
            message.Smooth = smooth;

            EnqueueMessage(message);
        }
        internal static void Render()
        {
            m_instance.ViewProjection = MyEnvironment.ViewProjectionAt0;
            m_instance.Viewport = new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y);
            //m_instance.DepthBuffer = MyRender.MainGbuffer.DepthBuffer.DepthStencil;
            //m_instance.RTs = MyRender.MainGbuffer.GbufferTargets;

            m_instance.PerFrame();
            m_instance.Begin();

            var viewFrustum = new BoundingFrustum(MyEnvironment.ViewProjection);
            foreach(var f in MyComponentFactory<MyFoliageComponent>.GetAll())
            {
                if (f.m_owner.CalculateCameraDistance() < MyRender11.RenderSettings.FoliageDetails.GrassDrawDistance()
                    && viewFrustum.Contains(f.m_owner.Aabb) != VRageMath.ContainmentType.Disjoint)
                {
                    f.Render(m_instance);
                }
            }

            m_instance.End();
        }
Esempio n. 11
0
 internal void AddFrustum(BoundingFrustum bf, Color color)
 {
     Add6FacedConvex(bf.GetCorners(), color);
 }
Esempio n. 12
0
        public static BoundingSphere ToBoundingSphere(this BoundingFrustum frustum, Vector3[] corners)
        {
            float          num;
            float          num2;
            Vector3        vector;
            float          num3;
            float          num4;
            BoundingSphere sphere;
            Vector3        vector2;
            Vector3        vector3;
            Vector3        vector4;
            Vector3        vector5;
            Vector3        vector6;

            if (corners.Length < 8)
            {
                throw new ArgumentException("Corners length must be at least 8");
            }
            frustum.GetCorners(corners);
            Vector3 vector7 = vector2 = vector3 = vector4 = vector5 = vector6 = corners[0];

            for (int i = 0; i < corners.Length; i++)
            {
                Vector3 vector8 = corners[i];
                if (vector8.X < vector7.X)
                {
                    vector7 = vector8;
                }
                if (vector8.X > vector2.X)
                {
                    vector2 = vector8;
                }
                if (vector8.Y < vector3.Y)
                {
                    vector3 = vector8;
                }
                if (vector8.Y > vector4.Y)
                {
                    vector4 = vector8;
                }
                if (vector8.Z < vector5.Z)
                {
                    vector5 = vector8;
                }
                if (vector8.Z > vector6.Z)
                {
                    vector6 = vector8;
                }
            }
            Vector3.Distance(ref vector2, ref vector7, out num4);
            Vector3.Distance(ref vector4, ref vector3, out num3);
            Vector3.Distance(ref vector6, ref vector5, out num2);
            if (num4 > num3)
            {
                if (num4 > num2)
                {
                    Vector3.Lerp(ref vector2, ref vector7, 0.5f, out vector);
                    num = num4 * 0.5f;
                }
                else
                {
                    Vector3.Lerp(ref vector6, ref vector5, 0.5f, out vector);
                    num = num2 * 0.5f;
                }
            }
            else if (num3 > num2)
            {
                Vector3.Lerp(ref vector4, ref vector3, 0.5f, out vector);
                num = num3 * 0.5f;
            }
            else
            {
                Vector3.Lerp(ref vector6, ref vector5, 0.5f, out vector);
                num = num2 * 0.5f;
            }
            for (int j = 0; j < corners.Length; j++)
            {
                Vector3 vector10;
                Vector3 vector9 = corners[j];
                vector10.X = vector9.X - vector.X;
                vector10.Y = vector9.Y - vector.Y;
                vector10.Z = vector9.Z - vector.Z;
                float num7 = vector10.Length();
                if (num7 > num)
                {
                    num     = (num + num7) * 0.5f;
                    vector += (Vector3)((1f - (num / num7)) * vector10);
                }
            }
            sphere.Center = vector;
            sphere.Radius = num;
            return(sphere);
        }
Esempio n. 13
0
 /// <summary>
 /// Checks whether the current Plane intersects a specified BoundingFrustum.
 /// </summary>
 /// <param name="frustum">The BoundingFrustum to check for intersection with.</param>
 public PlaneIntersectionType Intersects(BoundingFrustum frustum)
 {
     return(frustum.Intersects(this));
 }
Esempio n. 14
0
        /// <summary>
        /// Creates bounding sphere from bounding frustum.
        /// Implementation taken from XNA source, replace IEnumerable with array
        /// </summary>
        /// <param name="frustum">The bounding frustum.</param>
        /// <param name="corners">Temporary memory to save corner when getting from frustum.</param>
        /// <returns>BoundingSphere</returns>
        public static BoundingSphere ToBoundingSphere(this BoundingFrustum frustum, Vector3[] corners)
        {
            float          num;
            float          num2;
            Vector3        vector2;
            float          num4;
            float          num5;
            BoundingSphere sphere;
            Vector3        vector5;
            Vector3        vector6;
            Vector3        vector7;
            Vector3        vector8;
            Vector3        vector9;

            if (corners.Length < 8)
            {
                throw new ArgumentException("Corners length must be at least 8");
            }

            frustum.GetCorners(corners);

            Vector3 vector4 = vector5 = vector6 = vector7 = vector8 = vector9 = corners[0];

            for (int i = 0; i < corners.Length; i++)
            {
                Vector3 vector = corners[i];

                if (vector.X < vector4.X)
                {
                    vector4 = vector;
                }
                if (vector.X > vector5.X)
                {
                    vector5 = vector;
                }
                if (vector.Y < vector6.Y)
                {
                    vector6 = vector;
                }
                if (vector.Y > vector7.Y)
                {
                    vector7 = vector;
                }
                if (vector.Z < vector8.Z)
                {
                    vector8 = vector;
                }
                if (vector.Z > vector9.Z)
                {
                    vector9 = vector;
                }
            }
            Vector3.Distance(ref vector5, ref vector4, out num5);
            Vector3.Distance(ref vector7, ref vector6, out num4);
            Vector3.Distance(ref vector9, ref vector8, out num2);
            if (num5 > num4)
            {
                if (num5 > num2)
                {
                    Vector3.Lerp(ref vector5, ref vector4, 0.5f, out vector2);
                    num = num5 * 0.5f;
                }
                else
                {
                    Vector3.Lerp(ref vector9, ref vector8, 0.5f, out vector2);
                    num = num2 * 0.5f;
                }
            }
            else if (num4 > num2)
            {
                Vector3.Lerp(ref vector7, ref vector6, 0.5f, out vector2);
                num = num4 * 0.5f;
            }
            else
            {
                Vector3.Lerp(ref vector9, ref vector8, 0.5f, out vector2);
                num = num2 * 0.5f;
            }
            for (int i = 0; i < corners.Length; i++)
            {
                Vector3 vector10 = corners[i];

                Vector3 vector3;
                vector3.X = vector10.X - vector2.X;
                vector3.Y = vector10.Y - vector2.Y;
                vector3.Z = vector10.Z - vector2.Z;
                float num3 = vector3.Length();
                if (num3 > num)
                {
                    num      = (num + num3) * 0.5f;
                    vector2 += (Vector3)((1f - (num / num3)) * vector3);
                }
            }
            sphere.Center = vector2;
            sphere.Radius = num;
            return(sphere);
        }
Esempio n. 15
0
 public PlaneIntersectionType Intersects(BoundingFrustum frustum) =>
 frustum.Intersects(this);
 public ContainmentType Contains(BoundingFrustum frustum) =>
 this.ConvertToFrustum().Contains(frustum);
        internal static void DrawFrustum(BoundingFrustum frustum, Color color, float alpha)
        {
            var corners = frustum.GetCorners();

            Color c = color;
            c.A = (byte)(alpha * 255);
            
            DrawQuad(corners[0], corners[1], corners[2], corners[3], c);
            DrawQuad(corners[4], corners[5], corners[6], corners[7], c);

            // top left bottom right
            DrawQuad(corners[0], corners[1], corners[5], corners[4], c);
            DrawQuad(corners[0], corners[3], corners[7], corners[4], c);
            DrawQuad(corners[3], corners[2], corners[6], corners[7], c);
            DrawQuad(corners[2], corners[1], corners[5], corners[6], c);
        }
 // Determine whether the given frustum contains, intersects, or is disjoint from
 // the given oriented box.
 public static ContainmentType Contains(BoundingFrustum frustum, ref MyOrientedBoundingBox obox)
 {
     return(frustum.Contains(obox.ConvertToFrustum()));
 }
 // Returns true if this box intersects the given frustum.
 public bool Intersects(BoundingFrustum frustum)
 {
     return(Contains(frustum) != ContainmentType.Disjoint);
 }
 public bool Intersects(BoundingFrustum frustum) =>
 (this.Contains(frustum) != ContainmentType.Disjoint);