Exemplo n.º 1
0
        internal List <GeoTerrainTriangle> GetTrianglesForHitbox(Hitbox hb, Vector3 offset, Vector3 collisionOffset)
        {
            resultlist.Clear();
            coarse.Clear();

            hbTestVector.X = hb.GetCenter().X + collisionOffset.X;
            hbTestVector.Y = 0;
            hbTestVector.Z = hb.GetCenter().Z + collisionOffset.Z;
            collisionSectors.Clear();
            fineSectors.Clear();

            foreach (Sector coarseSector in mSectorsCoarse)
            {
                if (hbTestVector.X >= coarseSector.Left + offset.X &&
                    hbTestVector.X <= coarseSector.Right + offset.X &&
                    hbTestVector.Z >= coarseSector.Back + offset.Z &&
                    hbTestVector.Z <= coarseSector.Front + offset.Z)
                {
                    if (!coarse.Contains(coarseSector))
                    {
                        coarse.Add(coarseSector);
                    }
                }
            }

            if (coarse.Count > 0)
            {
                foreach (Sector cs in coarse)
                {
                    fineSectors.AddRange(mSectorCoarseMap[cs]);
                    foreach (Sector fineSector in fineSectors)
                    {
                        if (hbTestVector.X >= fineSector.Left + offset.X &&
                            hbTestVector.X <= fineSector.Right + offset.X &&
                            hbTestVector.Z >= fineSector.Back + offset.Z &&
                            hbTestVector.Z <= fineSector.Front + offset.Z)
                        {
                            foreach (GeoTerrainTriangle t in mSectorTriangleMap[fineSector.ID])
                            {
                                if (hbTestVector.X >= t.boundLeft + offset.X && hbTestVector.X <= t.boundRight + offset.X &&
                                    hbTestVector.Z >= t.boundBack + offset.Z && hbTestVector.Z <= t.boundFront + offset.Z)
                                {
                                    resultlist.Add(t);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                throw new Exception("No coarse sector found for hitbox of " + hb.Owner.Name);
            }
            return(resultlist);
        }