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); }
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(); }
internal void AddFrustum(BoundingFrustum bf, Color color) { Add6FacedConvex(bf.GetCorners(), color); }
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); }
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(); }
internal void AddFrustum(BoundingFrustum bf, Color color) { Add6FacedConvex(bf.GetCorners(), color); }
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); }
/// <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)); }
/// <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); }
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);