Esempio n. 1
0
        public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "")
            : base(objectToAlign, positionToAlignTo, name)
        {
            AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox();

            if (IsSet(boundingFacesToAlign, Face.Left, Face.Right))
            {
                positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x;
            }
            if (IsSet(boundingFacesToAlign, Face.Right, Face.Left))
            {
                positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x - (bounds.maxXYZ.x - bounds.minXYZ.x);
            }
            if (IsSet(boundingFacesToAlign, Face.Front, Face.Back))
            {
                positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y;
            }
            if (IsSet(boundingFacesToAlign, Face.Back, Face.Front))
            {
                positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y - (bounds.maxXYZ.y - bounds.minXYZ.y);
            }
            if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top))
            {
                positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z;
            }
            if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom))
            {
                positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z - (bounds.maxXYZ.z - bounds.minXYZ.z);
            }

            base.Translation = positionToAlignTo;
        }
Esempio n. 2
0
        public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "")
            : base(objectToAlign, positionToAlignTo, name)
        {
            AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox();

            if (IsSet(boundingFacesToAlign, Face.Left, Face.Right))
            {
                positionToAlignTo.X = positionToAlignTo.X - bounds.minXYZ.X;
            }
            if (IsSet(boundingFacesToAlign, Face.Right, Face.Left))
            {
                positionToAlignTo.X = positionToAlignTo.X - bounds.minXYZ.X - (bounds.maxXYZ.X - bounds.minXYZ.X);
            }
            if (IsSet(boundingFacesToAlign, Face.Front, Face.Back))
            {
                positionToAlignTo.Y = positionToAlignTo.Y - bounds.minXYZ.Y;
            }
            if (IsSet(boundingFacesToAlign, Face.Back, Face.Front))
            {
                positionToAlignTo.Y = positionToAlignTo.Y - bounds.minXYZ.Y - (bounds.maxXYZ.Y - bounds.minXYZ.Y);
            }
            if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top))
            {
                positionToAlignTo.Z = positionToAlignTo.Z - bounds.minXYZ.Z;
            }
            if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom))
            {
                positionToAlignTo.Z = positionToAlignTo.Z - bounds.minXYZ.Z - (bounds.maxXYZ.Z - bounds.minXYZ.Z);
            }

            base.Translation = positionToAlignTo;
        }
Esempio n. 3
0
		public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "")
			: base(objectToAlign, positionToAlignTo, name)
		{
			AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox();

			if (IsSet(boundingFacesToAlign, Face.Left, Face.Right))
			{
				positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x;
			}
			if (IsSet(boundingFacesToAlign, Face.Right, Face.Left))
			{
				positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x - (bounds.maxXYZ.x - bounds.minXYZ.x);
			}
			if (IsSet(boundingFacesToAlign, Face.Front, Face.Back))
			{
				positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y;
			}
			if (IsSet(boundingFacesToAlign, Face.Back, Face.Front))
			{
				positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y - (bounds.maxXYZ.y - bounds.minXYZ.y);
			}
			if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top))
			{
				positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z;
			}
			if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom))
			{
				positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z - (bounds.maxXYZ.z - bounds.minXYZ.z);
			}

			base.Translation = positionToAlignTo;
		}
Esempio n. 4
0
        public static Vector3 GetPositionToAlignTo(CsgObject objectToAlignTo, Face boundingFacesToAlignTo, Vector3 extraOffset)
        {
            Vector3 positionToAlignTo = new Vector3();

            if (IsSet(boundingFacesToAlignTo, Face.Left, Face.Right))
            {
                positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.x;
            }
            if (IsSet(boundingFacesToAlignTo, Face.Right, Face.Left))
            {
                positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.x;
            }
            if (IsSet(boundingFacesToAlignTo, Face.Front, Face.Back))
            {
                positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.y;
            }
            if (IsSet(boundingFacesToAlignTo, Face.Back, Face.Front))
            {
                positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.y;
            }
            if (IsSet(boundingFacesToAlignTo, Face.Bottom, Face.Top))
            {
                positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.z;
            }
            if (IsSet(boundingFacesToAlignTo, Face.Top, Face.Bottom))
            {
                positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.z;
            }
            return(positionToAlignTo + extraOffset);
        }
Esempio n. 5
0
        public static CsgObject CreateFillet(CsgObject objectA, Face faceA, CsgObject objectB, Face faceB, double radius, double extraDimension = defaultExtraDimension)
        {
            int centralAxis = 0; // we start defaulted to x

            switch ((Edge)(faceA | faceB))
            {
            case Edge.LeftTop:
            case Edge.LeftBottom:
            case Edge.RightTop:
            case Edge.RightBottom:
                centralAxis = 1;     // y axis
                break;

            case Edge.LeftFront:
            case Edge.LeftBack:
            case Edge.RightFront:
            case Edge.RightBack:
                centralAxis = 2;     // z axis
                break;
            }

            AxisAlignedBoundingBox boundsA = objectA.GetAxisAlignedBoundingBox();
            AxisAlignedBoundingBox boundsB = objectB.GetAxisAlignedBoundingBox();

            double maxMin = Math.Max(boundsA.minXYZ[centralAxis], boundsB.minXYZ[centralAxis]);
            double minMax = Math.Min(boundsA.maxXYZ[centralAxis], boundsB.maxXYZ[centralAxis]);

            if (maxMin >= minMax)
            {
                throw new ArgumentException("Your two objects must overlap to have a fillet be created.");
            }

            Vector3 size = new Vector3(radius, radius, radius);

            size[centralAxis] = minMax - maxMin;
            Round newFilletRound = new Round(size);

            Face faceToGetBevelFor = CsgObject.GetOposite(faceA) | CsgObject.GetOposite(faceB);

            newFilletRound.RoundEdge((Edge)faceToGetBevelFor, radius, extraDimension);

            CsgObject newFillet = new SetCenter(newFilletRound, objectA.GetCenter());

            newFillet = new Align(newFillet, CsgObject.GetOposite(faceA), objectA, faceA);
            newFillet = new Align(newFillet, CsgObject.GetOposite(faceB), objectB, faceB);

            return(newFillet);
        }
Esempio n. 6
0
		public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "")
			: base(objectToCenter, offset, name)
		{
			AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox();
			Vector3 center = (bounds.maxXYZ + bounds.minXYZ) / 2;

			Vector3 origin = Vector3.Zero; // zero out anything we don't want
			if (onX)
			{
				origin.x = offset.x - center.x;
			}
			if (onY)
			{
				origin.y = offset.y - center.y;
			}
			if (onZ)
			{
				origin.z = offset.z - center.z;
			}

			base.Translation = origin;
		}
Esempio n. 7
0
        public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "")
            : base(objectToCenter, offset, name)
        {
            AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox();
            Vector3 center = (bounds.maxXYZ + bounds.minXYZ) / 2;

            Vector3 origin = Vector3.Zero;             // zero out anything we don't want

            if (onX)
            {
                origin.x = offset.x - center.x;
            }
            if (onY)
            {
                origin.y = offset.y - center.y;
            }
            if (onZ)
            {
                origin.z = offset.z - center.z;
            }

            base.Translation = origin;
        }
Esempio n. 8
0
        public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "")
            : base(objectToCenter, offset, name)
        {
            AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox();
            Vector3 center = (bounds.MaxXYZ + bounds.MinXYZ) / 2;

            Vector3 origin = Vector3.Zero;             // zero out anything we don't want

            if (onX)
            {
                origin.X = offset.X - center.X;
            }
            if (onY)
            {
                origin.Y = offset.Y - center.Y;
            }
            if (onZ)
            {
                origin.Z = offset.Z - center.Z;
            }

            base.Translation = origin;
        }
Esempio n. 9
0
		public static CsgObject CreateFillet(CsgObject objectA, Face faceA, CsgObject objectB, Face faceB, double radius, double extraDimension = defaultExtraDimension)
		{
			int centralAxis = 0; // we start defaulted to x
			switch ((Edge)(faceA | faceB))
			{
				case Edge.LeftTop:
				case Edge.LeftBottom:
				case Edge.RightTop:
				case Edge.RightBottom:
					centralAxis = 1; // y axis
					break;

				case Edge.LeftFront:
				case Edge.LeftBack:
				case Edge.RightFront:
				case Edge.RightBack:
					centralAxis = 2; // z axis
					break;
			}

			AxisAlignedBoundingBox boundsA = objectA.GetAxisAlignedBoundingBox();
			AxisAlignedBoundingBox boundsB = objectB.GetAxisAlignedBoundingBox();

			double maxMin = Math.Max(boundsA.minXYZ[centralAxis], boundsB.minXYZ[centralAxis]);
			double minMax = Math.Min(boundsA.maxXYZ[centralAxis], boundsB.maxXYZ[centralAxis]);
			if (maxMin >= minMax)
			{
				throw new ArgumentException("Your two objects must overlap to have a fillet be created.");
			}

			Vector3 size = new Vector3(radius, radius, radius);
			size[centralAxis] = minMax - maxMin;
			Round newFilletRound = new Round(size);

			Face faceToGetBevelFor = CsgObject.GetOposite(faceA) | CsgObject.GetOposite(faceB);
			newFilletRound.RoundEdge((Edge)faceToGetBevelFor, radius, extraDimension);

			CsgObject newFillet = new SetCenter(newFilletRound, objectA.GetCenter());
			newFillet = new Align(newFillet, CsgObject.GetOposite(faceA), objectA, faceA);
			newFillet = new Align(newFillet, CsgObject.GetOposite(faceB), objectB, faceB);

			return newFillet;
		}
Esempio n. 10
0
 public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox()
 {
     return(AxisAlignedBoundingBox.Intersection(a.GetAxisAlignedBoundingBox(), b.GetAxisAlignedBoundingBox()));
 }
Esempio n. 11
0
 public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox()
 {
     return(primary.GetAxisAlignedBoundingBox());
 }
Esempio n. 12
0
        public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox()
        {
            AxisAlignedBoundingBox childBounds = objectToTransform.GetAxisAlignedBoundingBox();

            return(childBounds.NewTransformed(transform));
        }
Esempio n. 13
0
		public static Vector3 GetPositionToAlignTo(CsgObject objectToAlignTo, Face boundingFacesToAlignTo, Vector3 extraOffset)
		{
			Vector3 positionToAlignTo = new Vector3();
			if (IsSet(boundingFacesToAlignTo, Face.Left, Face.Right))
			{
				positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.x;
			}
			if (IsSet(boundingFacesToAlignTo, Face.Right, Face.Left))
			{
				positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.x;
			}
			if (IsSet(boundingFacesToAlignTo, Face.Front, Face.Back))
			{
				positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.y;
			}
			if (IsSet(boundingFacesToAlignTo, Face.Back, Face.Front))
			{
				positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.y;
			}
			if (IsSet(boundingFacesToAlignTo, Face.Bottom, Face.Top))
			{
				positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.z;
			}
			if (IsSet(boundingFacesToAlignTo, Face.Top, Face.Bottom))
			{
				positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.z;
			}
			return positionToAlignTo + extraOffset;
		}