Exemplo n.º 1
0
        public ObstructionType Obstructs(BoundingBox box)
        {
            if (!bbox.Intersects(box))
            {
                return(ObstructionType.None);
            }

            foreach (Structure h in Structures)
            {
                ObstructionType t = h.Obstructs(box);
                if (t != ObstructionType.None)
                {
                    return(t);
                }
            }

            foreach (Road r in Roads)
            {
                Vector3 d = r.B - r.A;
                d.Normalize();
                Ray   ray = new Ray(r.A, d);
                float?f   = ray.Intersects(box);
                if (f.HasValue && f.Value < Vector3.Distance(r.A, r.B))
                {
                    return(ObstructionType.Virtual);
                }
            }

            return(ObstructionType.None);
        }
Exemplo n.º 2
0
        public ObstructionType Obstructs(BoundingBox box, Matrix transform)
        {
            foreach (Structure h in Structures)
            {
                ObstructionType t = h.Obstructs(box, transform);
                if (t != ObstructionType.None)
                {
                    return(t);
                }
            }

            foreach (Road r in Roads)
            {
                Vector3 a = Vector3.Transform(r.A, Matrix.Invert(transform));
                Vector3 b = Vector3.Transform(r.B, Matrix.Invert(transform));
                Vector3 d = b - a;
                d.Normalize();
                Ray   ray = new Ray(r.A, d);
                float?f   = ray.Intersects(box);
                if (f.HasValue && f.Value < Vector3.Distance(r.A, r.B))
                {
                    return(ObstructionType.Virtual);
                }
            }

            return(ObstructionType.None);
        }
Exemplo n.º 3
0
 public void GetObstruction()
 {
     Collider[] hits = Physics.OverlapBox(transform.position + Vector3.up, Vector3.one * 0.25f, Quaternion.identity, obstructionMask);
     if (hits.Length > 1)
     {
         Debug.LogError("Reduce extents or check tile: Too many obstructions");
         return;
     }
     obstructionOBJ = hits[0].gameObject;
     obstructionOBJ.transform.parent = this.transform;
     obstruction = ObstructionType.SomethingToBeAdded;
 }
Exemplo n.º 4
0
        public ObstructionType Obstructs(Vector3 point)
        {
            if (bbox.Contains(point) != ContainmentType.Contains)
            {
                return(ObstructionType.None);
            }

            foreach (Structure s in Structures)
            {
                ObstructionType t = s.Obstructs(point);
                if (t != ObstructionType.None)
                {
                    return(t);
                }
            }

            foreach (Road r in Roads)
            {
                Vector3     mid  = (r.A + r.B) * .5f;
                float       d    = Vector3.Distance(r.B, r.A);
                BoundingBox bbox = new BoundingBox(new Vector3(-2, -1, -d / 2), new Vector3(2, 1, d / 2));

                Vector3 dir = r.B - r.A;
                dir.Normalize();
                Vector3 fxz = r.B - r.A;
                fxz.Y = 0;
                fxz.Normalize();
                Vector3 right = Vector3.Cross(Vector3.Up, fxz);
                Vector3 up    = Vector3.Cross(right, dir);
                Matrix  rot   = Matrix.CreateWorld(Vector3.Zero, dir, up);

                Vector3 p2 = Vector3.Transform(point, Matrix.CreateTranslation(-mid) * Matrix.Invert(rot) * Matrix.CreateTranslation(mid));
                if (bbox.Contains(p2) != ContainmentType.Disjoint)
                {
                    return(ObstructionType.Virtual);
                }
            }

            return(ObstructionType.None);
        }