using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public class Mesure : MonoBehaviour { static bool _active; static Dictionary mesures = new Dictionary(); public void Click(bool toggle) { _G.MesureONOFF = toggle; if (_G.MesureONOFF) { if (SceneModeManager.SelectedName != "") { OnUpdate(); } } else { Hide(); } } public static void OnUpdate(bool needUpdate = false) { if (_G.CAMSET.HasFlag(CamSettings.Ortho)) { Hide(); return; } if (!_G.MesureONOFF) { Hide(); return; } if (needUpdate) { Hide(); } if (SceneModeManager.CompareSceneMode(SceneModes.Follow)) { if (_active) { Hide(); } } else { Show(); HandleRotation(); } } public static void HandleRotation() { GameObject[] Mesures; Mesures = GameObject.FindGameObjectsWithTag("mesure"); Camera CAM = Camera.main; float scaleFactor = 0.003f; float minDistanceToCamera = 24; float distanceFromCameraForMeasure = 20; foreach (GameObject Mesure in Mesures) { GameObject Sel = SceneModeManager.Selected; Vector3 SelPos = Sel.transform.position; Vector3 MesurePos = Mesure.transform.position; Vector3 CamPos = CAM.transform.position; float disCamSel = Vector3.Distance(CamPos, SelPos); float disCamMesure = Vector3.Distance(CamPos, MesurePos); Mesure.transform.rotation = CAM.transform.rotation; Vector3 dir = (MesurePos - CamPos).normalized; float dis = Vector3.Distance(CamPos, MesurePos) * scaleFactor; Mesure.transform.localScale = new(dis, dis, dis); if (Mesure.name == "MPBL" || Mesure.name == "MPBR" || disCamSel + minDistanceToCamera > disCamMesure){ Mesure.transform.position = Camera.main.transform.position + distanceFromCameraForMeasure * dir; dis = 0.10f; Mesure.transform.localScale = new(dis, dis, dis); } } } public static void Show() { _active = true; GameObject Sel = SceneModeManager.Selected; if (Sel == null) { Hide(); return; } int nO = Get.GetObjectIndex(SceneModeManager.SelectedName); string AttachedToName = _G.OBJs[nO][22]; string C2 = _G.OBJs[nO][2]; //Vector3 Opos=Sel.transform.position; Vector3 Opos = Sel.transform.Find("CENTER").transform.position; Vector3 PL = Sel.transform.Find("MPL").transform.position; Vector3 PR = Sel.transform.Find("MPR").transform.position; Vector3 PT = Sel.transform.Find("MPT").transform.position; Vector3 PU = Sel.transform.Find("MPU").transform.position; Vector3 PBL = Sel.transform.Find("MPBL").transform.position; Vector3 PBR = Sel.transform.Find("MPBR").transform.position; Vector3 PF = Sel.transform.Find("MPF").transform.position; Vector3 PB = Sel.transform.Find("MPB").transform.position; if (_G.MeasureFromCenter) { PBL = Vector3.Lerp(PBL, PBR, 0.5f); PBR = PBL; } Vector3 dirL = (PL - Opos).normalized; Vector3 dirR = (PR - Opos).normalized; Vector3 dirU = (PU - Opos).normalized; Vector3 dirT = (PT - Opos).normalized; Vector3 dirF = (PF - Opos).normalized; Vector3 dirB = (PB - Opos).normalized; Vector3 hitR_O = CheckHit(C2,"Objects", PR, dirR); Vector3 hitL_O = CheckHit(C2,"Objects", PL, dirL); Vector3 hitR = CheckHit(C2,"All", PR, dirR); Vector3 hitL = CheckHit(C2,"All", PL, dirL); Vector3 hitU = CheckHit(C2,"All", PU, dirU); Vector3 hitT = CheckHit(C2,"All", PT, dirT); Vector3 hitB = CheckHit(C2,"All", PB, dirB); Vector3 hitF = CheckHit(C2,"Objects", PF, dirF); if (DOIT.ConvertStringToNumber(_G.OBJs[nO][7]) >36) { Vector3 PLT = Sel.transform.Find("MPLT").transform.position; Vector3 PLB = Sel.transform.Find("MPLB").transform.position; Vector3 PRT = Sel.transform.Find("MPRT").transform.position; Vector3 PRB = Sel.transform.Find("MPRB").transform.position; Vector3 hitRT_O = CheckHit(C2,"Objects", PRT, dirR); Vector3 hitRB_O = CheckHit(C2,"Objects", PRB, dirR); Vector3 hitLT_O = CheckHit(C2,"Objects", PLT, dirL); Vector3 hitLB_O = CheckHit(C2,"Objects", PLB, dirL); //if distance PL != PLT float distanceL = Vector3.Distance(PL, hitL); float distanceLT = Vector3.Distance(PLT, hitLT_O ); float distanceLB = Vector3.Distance(PLB, hitLB_O ); if(distanceL != distanceLT){ Add("MPLT", PLT, hitLT_O);} if(distanceL != distanceLB){ Add("MPLT", PLB, hitLB_O);} float distanceR = Vector3.Distance(PR, hitR); float distanceRT = Vector3.Distance(PRT, hitRT_O ); float distanceRB = Vector3.Distance(PRB, hitRB_O ); if(distanceR != distanceRT){ Add("MPRT", PRT, hitRT_O);} if(distanceR != distanceRB){ Add("MPRT", PRB, hitRB_O);} // float distanceL = Vector3.Distance(PL, hitL); // float distanceLT = Vector3.Distance(PLT, hitLT_O ); // if(distanceL!= distanceLT)Add("MPLT", PLT, hitLT_O); // Add("MPLB", PLB, hitLB_O); // Add("MPRT", PRT, hitRT_O); // Add("MPRB", PRB, hitRB_O); // } } // print("Sel====" + Sel + " AttachedToName====" + AttachedToName); if (Sel != null && AttachedToName != SceneModeManager.Floor.name && AttachedToName != SceneModeManager.Ceil.name) { int wallNumber = int.Parse(AttachedToName[1..]) - 1; float wallWideness = _G.WallsWidth[wallNumber]; Transform wall = SceneModeManager.GetObjectInRoom(AttachedToName); Vector3 wallCenterPosition = wall.position; Vector3 startingPoint1 = wallCenterPosition - wallWideness * 0.5f * wall.transform.right; Vector3 endingPoint1 = startingPoint1 + wallWideness * wall.transform.right; Vector3 PWS = startingPoint1;//Point wall start Vector3 PWE = endingPoint1;//Point wall end Vector3 dirEnd = (PWE - PWS).normalized; Vector3 dirStart = (PWS - PWE).normalized; float disEnd = Vector3.Dot(dirEnd, PWE - PBR); float disStart = Vector3.Dot(dirStart, PWS - PBL); Vector3 EndWall = PBR + disEnd * dirEnd; Vector3 StartWall = PBL + disStart * dirStart; Add("MPBR", PBR, EndWall); Add("MPBL", PBL, StartWall); Add("MPR", PR, hitR_O); Add("MPL", PL, hitL_O); } else { Add("MPF", PF, hitF); Add("MPB", PB, hitB); Add("MPR", PR, hitR); Add("MPL", PL, hitL); } Add("MPU", PU, hitU); if (_G.OBJs[nO][5] == "WA") { Add("MPT", PT, hitT); } } public static void Hide(bool destroyAll = false) { _active = false; ClearMesure(destroyAll); // DOIT.DELETEAllObjectChild(Get.o2("MESURES", "ShowMesures")); } private static void ClearMesure(bool destroyAll) { for(int i = mesures.Count - 1; i >= 0 ; i--) { if(destroyAll) { GameObject go = mesures.ElementAt(i).Key; mesures.Remove(go); Destroy(go); } else if(mesures.ElementAt(i).Value == false) { GameObject go = mesures.ElementAt(i).Key; mesures.Remove(go); Destroy(go); } } } public static void Add(string name, Vector3 R, Vector3 L, bool isDistanceBetweenObjects = false) { GameObject measureGameObject = Get.o2("MESURES/ShowMesures", name); if (measureGameObject == null) { measureGameObject = Instantiate(Get.o2("MESURES", "MesureTool")); measureGameObject.name = name; measureGameObject.transform.SetParent(Get.o2("MESURES", "ShowMesures").transform); measureGameObject.transform.Find("Dimension/Btn/Mesure").name = name; measureGameObject.transform.Find("Dimension/Btn").name = name; measureGameObject.transform.Find("Dimension").name = name; } float OS = 0.25f; if (name == "MPBR" || name == "MPBL") OS = 0; float distance = Vector3.Distance(L, R); if (distance +OS > 0.25f) { measureGameObject.SetActive(true); measureGameObject.transform.Find("Arrows_L").transform.position = L; measureGameObject.transform.Find("Arrows_R").transform.position = R; measureGameObject.transform.Find(name + "/" + name + "/" + name).GetComponent().text = DOIT.ConvertNumberToString(distance+OS ); Vector3 Center = (L + R) * 0.5f; Vector3 dir1 = (R - L).normalized; Vector3 LC = Center - dir1 * 9; Vector3 dir2 = (L - R).normalized; Vector3 RC = Center - dir2 * 9; Vector3[] positionsL = new Vector3[2] { LC, L }; Vector3[] positionsR = new Vector3[2] { RC, R }; addLine(measureGameObject, "LineL", positionsL); addLine(measureGameObject, "LineR", positionsR); measureGameObject.transform.Find(name).transform.position = LerpByDistance(vectorA: L, vectorB: R, amount: 0.5f); } if (!mesures.ContainsKey(measureGameObject)) { mesures.Add(measureGameObject, isDistanceBetweenObjects); } } public static void addLine(GameObject M, string linename, Vector3[] positions) { LineRenderer lineRenderer = M.transform.Find(linename).GetComponent(); lineRenderer.positionCount = 2; lineRenderer.SetPositions(positions); lineRenderer.startWidth = 0.5f; lineRenderer.endWidth = 0.5f; } public static Vector3 LerpByDistance(Vector3 vectorA, Vector3 vectorB, float amount) { return vectorA + amount * (vectorB - vectorA); } //Ray cast public static Vector3 CheckHit(string C2,string cat, Vector3 From, Vector3 direction) { float offset = 1f; if(C2=="Panel"){offset = 0f;} Vector3 newFrom = From - offset * direction; Ray ray = new(newFrom, direction); if (Physics.Raycast(ray, out RaycastHit hit)) { Transform ParentToHitObject = hit.transform.parent; if (cat == "Objects" && ParentToHitObject == SceneModeManager.Room || cat == "Objects" && ParentToHitObject.name[..1] == "w") { return From; } //if (cat == "Objects" && hit.transform.name[..2] == "st") { return From; } float DistanceHit = Vector3.Distance(hit.point, newFrom + (offset-0.25f )* direction); //print("DistanceHit===="+DistanceHit +" name "+hit.transform.name); if(DistanceHit<0.1f){ return From; } return hit.point; } return From; } public static void Reposition(string name, float Oldvalue, float Newvalue) { // print("=========================================================================================="+name); // print("name=="+name); // print("Oldvaluee=="+Oldvalue); // print("Newvalue=="+Newvalue); GameObject RAY = Get.o2("MESURES/ShowMesures", name); //print("=========================================================================================="+name); string objecname = SceneModeManager.SelectedName; GameObject Oject = SceneModeManager.Selected; Vector3 PointStart = RAY.transform.Find("Arrows_L").transform.position;//84.64623 84.35404===0.29219 Vector3 PointEnd = RAY.transform.Find("Arrows_R").transform.position; Vector3 dir = (PointStart - PointEnd).normalized; Vector3 newposition = Oject.transform.position + dir * (Oldvalue - Newvalue); Oject.GetComponent().MoveObjectToPos(newposition); Show(); CheckifON(objecname); if (new List { "wind", "pati", "open", "door" }.Contains(objecname[..4])) { HOLE.RefreshAllWalls(); } } public static void CheckifON(string objecname) { if (_G.MesureONOFF && objecname != "") { SceneModeManager.SelectedName = objecname; SceneModeManager.Selected.GetComponent().material = _G.GGT; Show(); } else { Hide(); } } public static void Addpoints(string cat, GameObject BASE) { //float backbox=CenterBox.z Vector3 BaseDimension=BASE.transform.localScale; Vector3 BaseCenter=BASE.transform.position; Vector3 PositionBack = BaseCenter+(BaseDimension.z-0.5f)*0.5f*BASE.transform.forward; Vector3 PositionFront = BaseCenter-(BaseDimension.z-0.5f)*0.5f*BASE.transform.forward; Vector3 PositionRight = BaseCenter+(BaseDimension.x-0.5f)*0.5f*BASE.transform.right; Vector3 PositionLeft = BaseCenter-(BaseDimension.x-0.5f)*0.5f*BASE.transform.right; Vector3 PositionUnder = BaseCenter-(BaseDimension.y-0.5f)*0.5f*BASE.transform.up; Vector3 PositionTop = BaseCenter+(BaseDimension.y-0.5f)*0.5f*BASE.transform.up; float offset =0f; if (new List() { "wind", "open", "pati", "door" }.Contains(BASE.name[..4])) { offset = 11; } CREATE.EmptyPoint(BASE, "MPL", PositionLeft);//Mesure Point left CREATE.EmptyPoint(BASE, "MPR", PositionRight);//Mesure Point right CREATE.EmptyPoint(BASE, "MPB", PositionBack);//Mesure Point back CREATE.EmptyPoint(BASE, "MPF", PositionFront);//Mesure Point front CREATE.EmptyPoint(BASE, "MPU", PositionUnder);//Mesure Point under if (BaseDimension.y-0.5f >= 36) { CREATE.EmptyPoint(BASE, "MPLT", PositionLeft.x, BaseCenter.y * 0.25f, PositionLeft.z);//Mesure Point left CREATE.EmptyPoint(BASE, "MPRT", PositionRight.x, BaseCenter.y * 0.25f, PositionRight.z);//Mesure Point right CREATE.EmptyPoint(BASE, "MPLB", PositionLeft.x, -BaseCenter.y * 0.25f, PositionLeft.z);//Mesure Point left CREATE.EmptyPoint(BASE, "MPRB", PositionRight.x, -BaseCenter.y * 0.25f,PositionRight.z);//Mesure Point right } CREATE.EmptyPoint(BASE, "MPT", BaseCenter.x, PositionTop.y , PositionBack.z-offset);//Mesure Point top CREATE.EmptyPoint(BASE, "MPBL", PositionLeft.x, PositionTop.y + 1f, PositionBack.z - 1f - offset);//Mesure Back left CREATE.EmptyPoint(BASE, "MPBR", PositionRight.x, PositionTop.y + 1f, PositionBack.z - 1f - offset);//Mesure Back right CREATE.EmptyPoint(BASE, "CENTER", BaseCenter.x, 0, BaseCenter.z - offset);//Mesure Point center ofset for Wall } public static void TwoObjectDistance() { GameObject Sel = SceneModeManager.Selected; GameObject Tar = Get.o1(_G.TARGET); Vector3 Opos = Sel.transform.position; Vector3 Tpos = Tar.transform.position; float distShow = 0; float dis; dis = HitDistance(Sel, "MPL"); if (dis > 0.05f) { distShow = dis; } dis = HitDistance(Sel, "MPR"); if (dis > 0.05f) { distShow = dis; } dis = HitDistance(Sel, "MPT"); if (dis > 0.05f) { distShow = dis; } dis = HitDistance(Sel, "MPU"); if (dis > 0.05f) { distShow = dis; } dis = HitDistance(Sel, "MPF"); if (dis > 0.05f) { distShow = dis; } dis = HitDistance(Sel, "MPB"); if (dis > 0.05f) { distShow = dis; } int nO = Get.GetObjectIndex(SceneModeManager.SelectedName); if (_G.OBJs[nO][4] == "T1") { dis = HitDistance(Sel, "MPLT"); if (dis > 0.05f) { distShow = dis; } //print("object is realy a T1=1==" + distShow); dis = HitDistance(Sel, "MPLB"); if (dis > 0.05f) { distShow = dis; } //print("object is realy a T1=2==" + distShow); dis = HitDistance(Sel, "MPRT"); if (dis > 0.05f) { distShow = dis; } //print("object is realy a T1=3==" + distShow); dis = HitDistance(Sel, "MPRB"); if (dis > 0.05f) { distShow = dis; } //print("object is realy a T1=4==" + distShow); //print("object is realy a T1===" + distShow); } if (distShow <= 0.05f) { HitDistanceDiagonal(Opos, Tpos); } } public static float HitDistance(GameObject Sel, string point) { Vector3 Opos = Sel.transform.position; Vector3 Point = Sel.transform.Find(point).transform.position; Vector3 OposXZ = new(Opos.x, Point.y, Opos.z); Vector3 dir = (Point - OposXZ).normalized; Vector3 hit = CheckHitDistance(Point, dir, _G.TARGET); float dis = Vector3.Distance(Point, hit); if (dis > 0.05f) { Hide(); Add("Distance", Point, hit, true); } return dis; } public static void HitDistanceDiagonal(Vector3 Opos, Vector3 Tpos) { Vector3 DirT = (Tpos - Opos).normalized; Vector3 hitT = CheckHitDistance(Opos, DirT, _G.TARGET); Vector3 DirO = (Opos - Tpos).normalized; Vector3 hitS = CheckHitDistance(Tpos, DirO,SceneModeManager.SelectedName); float dis = Vector3.Distance(hitT, hitS); if (dis > 0.05f) { Hide(); Add("DistanceCC", hitT, hitS, true); } } public static Vector3 CheckHitDistance(Vector3 From, Vector3 direction, string TAR) { RaycastHit[] hits = Physics.RaycastAll(From, direction, 300.0F); for (int i = 0; i < hits.Length; i++) { RaycastHit hit = hits[i]; Renderer rend = hit.transform.GetComponent(); if (rend) { //print("hit.transform.name===="+hit.transform.name); Transform parentToHitObject = hit.transform.parent; if (parentToHitObject == SceneModeManager.Room || hit.transform.name[..1] == "s") { } if (hit.transform.name == TAR) { return hit.point; } } } return From; } }