Пример #1
0
		void DrawPuffRing(bool inside)
		{
            /* Skip rendering puff rings */
            if(!inside) {
                Vector3 sz;
                if (Nebula.Zone.Shape is ZoneEllipsoid)
                    sz = ((ZoneEllipsoid)Nebula.Zone.Shape).Size / 2; //we want radius instead of diameter
                else if (Nebula.Zone.Shape is ZoneSphere)
                    sz = new Vector3(((ZoneSphere)Nebula.Zone.Shape).Radius);
                else
                    return;
                var bitRadius = Nebula.ExteriorBitRadius * (1 + Nebula.ExteriorBitRandomVariation);
                var szR = Math.Max(sz.X, Math.Max(sz.Y, sz.Z));
                var sph = new BoundingSphere(Nebula.Zone.Position, (szR + bitRadius) * 1.2f);
                if (camera.Frustum.Contains(sph) == ContainmentType.Disjoint)
                    return;
            }
            /* Actually Render */
			var sd = 1 - MathHelper.Clamp(Nebula.Zone.Shape.ScaledDistance(camera.Position), 0f, 1f);
			var factor = MathHelper.Clamp(sd / Nebula.Zone.EdgeFraction, 0, 1);

			for (int i = 0; i < Exterior.Count; i++)
			{
				var p = Exterior[i];
				var tex = resman.FindTexture(p.Shape.Texture);
				billboards.DrawCustomShader(
					GetPuffShader(billboards),
					_setupPuffDelegate,
					new RenderUserData() { Texture = tex, Color = Nebula.FogColor, Float = factor },
					p.Position,
					p.Size,
					Nebula.ExteriorColor,
					new Vector2(p.Shape.Dimensions.X, p.Shape.Dimensions.Y),
					new Vector2(p.Shape.Dimensions.X + p.Shape.Dimensions.Width, p.Shape.Dimensions.Y),
					new Vector2(p.Shape.Dimensions.X, p.Shape.Dimensions.Y + p.Shape.Dimensions.Height),
					new Vector2(p.Shape.Dimensions.X + p.Shape.Dimensions.Width, p.Shape.Dimensions.Y + p.Shape.Dimensions.Height),
					0,
					inside ? SortLayers.NEBULA_INSIDE : SortLayers.NEBULA_NORMAL
				);
			}
		}