//------------------------------------------------------------------------ // currection method //------------------------------------------------------------------------ public ML.LineSegment3 CorrectionLineSegment(MonoDrop srcDrop , ML.LineSegment3 lineSeg3) { if (null == srcDrop) return lineSeg3; //Correction value //PairInt parameter is array index(0 start , 1 is not ). //Index2 startPos = PairInt.Start_C5_R0; Vector3 putPos_left_up = m_boardInfo.GetPositionAt_ViewLeftUp () + Single.UIRoot.transform.position; Vector3 putPos_right_up = m_boardInfo.GetPositionAt_ViewRightUp () + Single.UIRoot.transform.position; Vector3 putPos_left_bottom = m_boardInfo.GetPositionAt_ViewLeftBottom () + Single.UIRoot.transform.position; Vector3 putPos_right_bottom = m_boardInfo.GetPositionAt_ViewRightBottom () + Single.UIRoot.transform.position; //Vector3 putPos_left_up = GetPositionOfPutDrop (new PairInt (0, 0)); //Vector3 putPos_right_up = GetPositionOfPutDrop (new PairInt (0, (int)ConstBoard.Max_Row-1)); //Vector3 putPos_left_bottom = GetPositionOfPutDrop (new PairInt ((int)ConstBoard.Max_Column-1, 0)); //Vector3 putPos_right_bottom = GetPositionOfPutDrop (new PairInt ((int)ConstBoard.Max_Column-1, (int)ConstBoard.Max_Row-1)); #if UNITY_EDITOR //------------------------------------------------------------------------- //20140906 chamto test //------------------------------------------------------------------------- Single.MonoDebug.cube_LeftUp.transform.position = putPos_left_up; Single.MonoDebug.cube_RightUp.transform.position = putPos_right_up; Single.MonoDebug.cube_LeftBottom.transform.position = putPos_left_bottom; Single.MonoDebug.cube_RightBottom.transform.position = putPos_right_bottom; //------------------------------------------------------------------------- #endif Bounds bob = m_boardInfo.GetBoundaryOfView (Single.UIRoot.transform.position); ML.LineSegment3 result = new ML.LineSegment3(); result.origin = srcDrop.gotoWorldPosition; result.last = lineSeg3.last; //CDefine.DebugLog ("Bounds " + bob + bob.min + bob.max); if (lineSeg3.last.y >= bob.max.y) { //------------- correction up ------------- //CDefine.DebugLog("----correction up"); result.last_y = putPos_left_up.y; if(lineSeg3.last.x <= bob.min.x) { //correction left-up result.last = putPos_left_up; //CDefine.DebugLog("----correction left up" + putPos_left_up); } if(lineSeg3.last.x >= bob.max.x) { //correction right-up result.last = putPos_right_up; //CDefine.DebugLog("----correction right up"); } }else if (lineSeg3.last.y <= bob.min.y) { ////------------- correction bottom ------------- //CDefine.DebugLog("----correction bottom"); result.last_y = putPos_left_bottom.y; if(lineSeg3.last.x <= bob.min.x) { //correction left-bottom result.last = putPos_left_bottom; //CDefine.DebugLog("----correction left bottom"+putPos_left_bottom); } if(lineSeg3.last.x >= bob.max.x) { //correction right-bottom result.last = putPos_right_bottom; //CDefine.DebugLog("----correction right bottom"); } }else if(lineSeg3.last.x <= bob.min.x) { ////------------- correction left ------------- result.last_x = putPos_left_up.x; //CDefine.DebugLog("----correction left"); }else if(lineSeg3.last.x >= bob.max.x) { ////------------- correction right ------------- result.last_x = putPos_right_up.x; //CDefine.DebugLog("----correction right"); }else { ////------------- correction is not required //CDefine.DebugLog("----correction is not required"); return lineSeg3; } //CDefine.DebugLog ("Correction LineSegement : " + result); return result; }
//new multi CCD collision functuon - 20140619 chamto public List<MonoDrop> CalcCCDCollision(MonoDrop srcDrop, float nonCollision_minDistance) { if (null == srcDrop) return null; //1.터치드래그한 선분을 구한다. ML.LineSegment3 ls3 = new ML.LineSegment3 (); //ls3.origin = srcDrop.transform.position; ls3.origin = srcDrop.gotoWorldPosition; ls3.last = Input_Unity.GetTouchWorldPos (); //1.1.드롭판을 벗어난 터치선을 보정한다. ls3 = this.CorrectionLineSegment (srcDrop, ls3); //1.2.터치선이 2차원 상에 있게 한다. ls3.origin.z = 0; ls3.direction.z = 0; #if UNITY_EDITOR //------------------------------------------------------------------------- //20140906 chamto - test //------------------------------------------------------------------------- Single.MonoDebug.lineRender.SetWidth (0.1f, 0.4f); Single.MonoDebug.lineRender.SetPosition (0, ls3.origin); Single.MonoDebug.lineRender.SetPosition (1, ls3.direction + ls3.origin); Single.MonoDebug.lineRender.useWorldSpace = false; //------------------------------------------------------------------------- #endif //2. 3. 모든드롭에 대해 전수 조사한다. (선분 근처 드롭만 조사하게 최적화 필요) //SortedDictionary<float , MonoDrop> collisionDtnr = new Dictionary<float , MonoDrop> (); List<MonoDrop> collisionList = new List<MonoDrop> (); float t_c = 0.0f; foreach (MonoDrop dstDrop in m_mapDrop.DtnrId.Values) { //self exclusion if(srcDrop == dstDrop) continue; if((nonCollision_minDistance * nonCollision_minDistance) > ls3.MinimumDistanceSquared(dstDrop.gotoWorldPosition,out t_c)) { //20140907 chamto test // float dist = ls3.MinimumDistanceSquared(dstDrop.gotoWorldPosition,out t_c); // { // CDefine.DebugLog("object : "+dstDrop +" mSqrtDist : "+dist + " noncSqrtDist : " + nonCollision_minDistance * nonCollision_minDistance + " gotowp : "+dstDrop.gotoWorldPosition + " t_c : " + t_c); // } //Input collision list collisionList.Add(dstDrop); } } //4.선분과 충돌한 드롭목록을 “선분의 시작점에서 충돌드롭의 중점 까지의 거리”를 기준으로 오름차순 정렬한다. // collisionDtnr = (from pairObj in collisionDtnr // orderby pairObj.Key ascending // select pairObj).ToDictionary (v1 => v1.Key,v1 => v1.Value); List<MonoDrop> result = (from dstDrop in collisionList orderby GetSqrDistance(srcDrop.gotoWorldPosition,dstDrop.gotoWorldPosition) ascending select dstDrop).ToList(); // CDefine.DebugLog ("----- line ----- ori :" + ls3.origin + " last : " + ls3.last + " dict : " + ls3.direction); //chamto test //20150331 chamto test if (0 != result.Count) { string sss = ""; foreach(MonoDrop mm in result) { sss += mm.index2D.ToString() + " | "; } CDefine.DebugLog (sss); } return result; }