/// <summary> /// @brief コンストラクタ /// </summary> /// <param name="collider">コライダ</param> public Element(Collider collider) { Object = collider; }
/// <summary> /// @brief 衝突処理 /// </summary> /// <param name="target">衝突処理対象</param> /// <returns>衝突していればtrue</returns> internal override bool IsCollision(Collider target) { return target.IsCollision(this); }
/// <summary> /// @brief 衝突処理 /// </summary> /// <param name="target">衝突処理対象</param> /// <returns>衝突していればtrue</returns> internal abstract bool IsCollision(Collider target);
/// <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; }
/// <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; }
/// <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; }