예제 #1
0
 /// <summary>
 /// @brief コンストラクタ
 /// </summary>
 /// <param name="collider">コライダ</param>
 public Element(Collider collider)
 {
     Object = collider;
 }
예제 #2
0
 /// <summary>
 /// @brief 衝突処理
 /// </summary>
 /// <param name="target">衝突処理対象</param>
 /// <returns>衝突していればtrue</returns>
 internal override bool IsCollision(Collider target)
 {
     return target.IsCollision(this);
 }
예제 #3
0
 /// <summary>
 /// @brief 衝突処理
 /// </summary>
 /// <param name="target">衝突処理対象</param>
 /// <returns>衝突していればtrue</returns>
 internal abstract bool IsCollision(Collider target);
예제 #4
0
 /// <summary>
 /// @brief コンストラクタ
 /// </summary>
 /// <param name="left"></param>
 /// <param name="right"></param>
 public CollisionPair(Collider left, Collider right)
 {
     Pair = new Collider[2];
     Pair[0] = left;
     Pair[1] = right;
 }
예제 #5
0
        /// <summary>
        /// @brief モートン番号を取得する
        /// </summary>
        /// <param name="aabb">座標</param>
        /// <returns></returns>
        private ulong GetMortonNumber(ref Collider.AABB aabb)
        {
            ulong lt = GetPointElem(aabb.Left, aabb.Top);
            ulong rb = GetPointElem(aabb.Right, aabb.Bottom);

            // 空間番号の排他的論理輪から所属レベルを算出
            ulong def = rb ^ lt;
            int hiLevel = 0;
            for (var i = 0; i < Level; ++i)
            {
                ulong check = (def >> (i * 2)) & 0x3;
                if (check != 0)
                {
                    hiLevel = i + 1;
                }
            }
            ulong spaceNum = rb >> (hiLevel * 2);
            ulong addNum = (Power[Level - hiLevel] - 1) / 3;
            spaceNum += addNum;

            if (spaceNum > CellNum) return 0xffffffff;

            return spaceNum;
        }
예제 #6
0
        /// <summary>
        /// @brief 要素を登録する
        /// </summary>
        /// <param name="elem">登録するコライダ</param>
        /// <returns>成功すればtrue</returns>
        internal bool Regist(Collider elem)
        {
            Collider.AABB aabb = elem.BoundingBox;
            // オブジェクトの境界範囲からモートン番号を算出
            ulong mortonNum = GetMortonNumber(ref aabb);

            // モートン番号が領域をはみ出していなければ
            if (mortonNum < CellNum)
            {
                // 空間が存在していなければ作成する
                if (CellArray[mortonNum] == null)
                {
                    CreateNewCell(mortonNum);
                }
                var e = new Element(elem);

                // 衝突リスト作成後に空間から削除する
                ElementList.Add(e);
                return CellArray[mortonNum].Push(e);
            }
            return false;
        }