Example #1
0
 public StaticObject(Model model, ObjectStats.StaticObjectStats staticObjectStats)
     : base(model, staticObjectStats)
 {
     PhysicalTransforms = Matrix.Identity;
     OOBoundingBox = new OOBoundingBox(new Vector3(0,0,0), new Vector3(0,0,0));
     PositionChanged += OnPositionChanged;
     AngleChanged += OnAngleChanged;
 }
Example #2
0
        public Building(Model model, ObjectStats.BuildingStats buildingStats)
            : base(model, buildingStats)
        {
            PhysicalTransforms = Matrix.Identity;

            Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
            Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue);
            for (int i = 0; i < Model.Meshes.Count; ++i)
            {
                BoundingBox bb;
                BoundingBoxTools.CalculateBoundingBox(Model.Meshes[i], out bb);
                if (min.X > bb.Min.X)
                {
                    min.X = bb.Min.X;
                }
                if (min.Y > bb.Min.Y)
                {
                    min.Y = bb.Min.Y;
                }
                if (min.Z > bb.Min.Z)
                {
                    min.Z = bb.Min.Z;
                }
                if (max.X < bb.Max.X)
                {
                    max.X = bb.Max.X;
                }
                if (max.Y < bb.Max.Y)
                {
                    max.Y = bb.Max.Y;
                }
                if (max.Z < bb.Max.Z)
                {
                    max.Z = bb.Max.Z;
                }
            }
            BoundingBox = new BoundingBox(min, max);
            OOBoundingBox = new OOBoundingBox(BoundingBox, scale);

            Length = scale * (BoundingBox.Max.Z - BoundingBox.Min.Z);
            Width = scale * (BoundingBox.Max.Y - BoundingBox.Min.Y);
            Height = scale * (BoundingBox.Max.X - BoundingBox.Min.X);
            PhysicalTransforms = Matrix.Identity;
            PositionChanged += OnPositionChanged;
            AngleChanged += OnAngleChanged;
        }
Example #3
0
        /// <summary>
        /// Sprawdza, czy dwa OOBoundingBox'y koliduja.
        /// </summary>
        /// <param name="boundingBox">OOBoundingBox, kolizja z ktorym jest sprawdzana</param>
        /// <returns></returns>
        public bool Intersects(OOBoundingBox boundingBox)
        {
            if (AxisOverlap(NormalX, boundingBox))
                return true;
            if (AxisOverlap(NormalY, boundingBox))
                return true;
            if (AxisOverlap(NormalZ, boundingBox))
                return true;

            if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalX), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalY), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalZ), boundingBox))
                return true;

            if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalX), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalY), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalZ), boundingBox))
                return true;

            if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalX), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalY), boundingBox))
                return true;
            if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalZ), boundingBox))
                return true;

            return false;
        }
Example #4
0
        private bool AxisOverlap(Vector3 Axis, OOBoundingBox boundingBox)
        {
            float min0, max0;
            float min1, max1;
            ComputeSpan(Axis, out min0, out max0);
            boundingBox.ComputeSpan(Axis, out min1, out max1);

            return SpanOverlap(min0, max0, min1, max1);
        }