public void Init(Vector3 cStart, float cHalfLen, float cRadius, Quaternion rot, Vector3 delta, uint flags = 0xffffffff, bool ray = false) { Start.Init(cStart, cHalfLen, cRadius, rot); Delta = delta; ChkFlags = flags; StartSolid = false; Fraction = 1.0f; HitObject = null; HitFlags = 0u; HitPoints.size = 0; HitPoints.a = 0; HitPoints.b = 0; HitPoints.c = 0; Normal = Vector3.zero; Bound.Clear(); Bound.Encapsulate(Start.P0); Bound.Encapsulate(Start.P1); Bound.Encapsulate(Start.P0 + Delta); Bound.Encapsulate(Start.P1 + Delta); Bound.Expand(Start.Radius); Bound.Expand(Epsilon); }
public void Export(CDBrush cdBrush) { if (cdBrush == null) { return; } cdBrush.Release(); for (int i = 0; i < GetFaceNum(); i++) { CDSide side = new CDSide(); HalfSpace HS = new HalfSpace(); HS.Normal = GetFace(i).Normal; HS.Dist = GetFace(i).Dist; side.Init(HS, false); cdBrush.LstSides.Add(side); cdBrush.cd = this; } Bounds tmpAABB; GetAABB(out tmpAABB); if (tmpAABB != null) { cdBrush.BoundAABB = tmpAABB; } cdBrush.Flags = Flags; }
public CDBrush(CDBrush src) { BoundAABB = src.BoundAABB; LstSides = new List <CDSide>(); for (int i = 0; i < src.LstSides.Count; i++) { CDSide side = new CDSide(src.LstSides[i].Plane, src.LstSides[i].Bevel); LstSides.Add(side); } Flags = src.Flags; }
public CapsuleTraceBrushInfo() { Start.Init(Vector3.zero, 0, 0, Quaternion.identity); Delta = Vector3.zero; Bound.Clear(); ChkFlags = 0u; Epsilon = 1E-5f; StartSolid = false; Fraction = 1.0f; HitObject = null; HitFlags = 0u; HitPoints.size = 0; HitPoints.a = 0; HitPoints.b = 0; HitPoints.c = 0; Normal = Vector3.zero; }
private void Remove(CollisioinTreeNode pNode, CDBrush brush) { for (int i = 0; i < 8; ++i) { if (pNode.Children.Length > i) { Split(pNode.Children[i]); } } for (int i = 0; i < pNode.LstCDBrush.Count; ++i) { if (pNode.LstCDBrush[i] == brush) { pNode.LstCDBrush.RemoveAt(i); break; } } }
public void ResetCollisionMap() { List <CDBrush> list = new List <CDBrush>(); if (_ConvexCollection != null) { foreach (ConvexData cd in _ConvexCollection.ConvexDatas) { cd.GetAABB(); CDBrush pCDBrush = new CDBrush(); cd.Export(pCDBrush); list.Add(pCDBrush); } } if (list.Count != 0) { _Tree.Build(list); } }
public bool _PointInBrush(CollisioinTreeNode pNode, Vector3 p, float offset) { if (null == pNode) { return(false); } if (!pNode.AABB.IsPointIn(p, offset)) { return(false); } if (pNode.IsLeaf()) { int i; for (i = 0; i < (int)pNode.LstCDBrush.Count; ++i) { CDBrush pBrush = pNode.LstCDBrush[i]; if (pBrush.PointInBrush(p, offset)) { return(true); } } } else { for (int j = 0; j < 8; j++) { if (_PointInBrush(pNode.Children[j], p, offset)) { return(true); } } } return(false); }
public CDBrush Clone(CDBrush src) { return(new CDBrush(src)); }
private bool _CapsuleTraceBrush(CollisioinTreeNode pNode, CapsuleTraceBrushInfo pInfo) { if (null == pNode || null == pInfo) { return(false); } if (!BoundsExtansions.AABBAABBOverlap(pNode.AABB, pInfo.Bound)) { return(false); } bool bCollide = false; bool bStartSolid = false; CDBrush HitObject = null; CollidePoints HitPoints = new CollidePoints(); Vector3 normal = Vector3.zero; float fFraction = 100.0f; if (pNode.IsLeaf()) { int i; for (i = 0; i < (int)pNode.LstCDBrush.Count; ++i) { CDBrush pBrush = pNode.LstCDBrush[i]; if (pBrush.CapsuleTraceBrush(pInfo) && (pInfo.Fraction < fFraction)) { //update the saving info bStartSolid = pInfo.StartSolid; fFraction = pInfo.Fraction; HitObject = pInfo.HitObject; HitPoints = pInfo.HitPoints; normal = pInfo.Normal; bCollide = true; //if (pInfo.Fraction == 0.0f) //{ // break; //} } } } else { for (int j = 0; j < 8; j++) { if (_CapsuleTraceBrush(pNode.Children[j], pInfo) && pInfo.Fraction < fFraction) { bStartSolid = pInfo.StartSolid; fFraction = pInfo.Fraction; HitObject = pInfo.HitObject; HitPoints = pInfo.HitPoints; normal = pInfo.Normal; bCollide = true; //if (pInfo.Fraction == 0.0f) //{ // break; //} } } } if (bCollide) { //set back pInfo.StartSolid = bStartSolid; pInfo.Fraction = fFraction; pInfo.HitObject = HitObject; pInfo.HitPoints = HitPoints; pInfo.Normal = normal; } return(bCollide); }